| # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # | |
| # Check timers behavior | |
| # | |
| import time | |
| def one_pass(helper): | |
| helper.wait_output("=== Timer calibration ===") | |
| res = helper.wait_output("back-to-back get_time : (?P<lat>[0-9]+) us", | |
| use_re=True)["lat"] | |
| minlat = int(res) | |
| helper.trace("get_time latency %d us\n" % minlat) | |
| helper.wait_output("sleep 1s") | |
| t0 = time.time() | |
| second = helper.wait_output("done. delay = (?P<second>[0-9]+) us", | |
| use_re=True)["second"] | |
| t1 = time.time() | |
| secondreal = t1 - t0 | |
| secondlat = int(second) - 1000000 | |
| helper.trace("1s timer latency %d us / real time %f s\n" % (secondlat, | |
| secondreal)) | |
| us = {} | |
| for pow2 in range(7): | |
| delay = 1 << (7-pow2) | |
| us[delay] = helper.wait_output("%d us => (?P<us>[0-9]+) us" % delay, | |
| use_re=True)["us"] | |
| helper.wait_output("Done.") | |
| return minlat, secondlat, secondreal | |
| def test(helper): | |
| one_pass(helper) | |
| helper.ec_command("reboot") | |
| helper.wait_output("--- UART initialized") | |
| # get the timing results on the second pass | |
| # to avoid binary translation overhead | |
| minlat, secondlat, secondreal = one_pass(helper) | |
| # check that the timings somewhat make sense | |
| if minlat > 220 or secondlat > 500 or abs(secondreal-1.0) > 0.200: | |
| helper.fail("imprecise timings " + | |
| "(get_time %d us sleep %d us / real time %.3f s)" % | |
| (minlat, secondlat, secondreal)) | |
| return True # PASS ! |