# Copyright 2011 The ChromiumOS Authors # 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[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[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[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 !