diff options
author | hailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2010-03-27 16:16:01 +0000 |
---|---|---|
committer | hailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1> | 2010-03-27 16:16:01 +0000 |
commit | c6b896c619f504caef69eeb03369c1d9e02f8fc2 (patch) | |
tree | 23c529184ba0c0aa7732e44e8ba9b380935e48b3 | |
parent | cd9db428bb574940d458abad7a413b628c0e5166 (diff) | |
download | flashrom-c6b896c619f504caef69eeb03369c1d9e02f8fc2.tar.gz |
The delay loop is probably one of the oldest pieces of code in flashrom.
Clean up code duplication and measure timing of 10/100/1000/10000 us
delays.
Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Maciej Pijanka <maciej.pijanka@gmail.com>
git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@986 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r-- | udelay.c | 42 |
1 files changed, 29 insertions, 13 deletions
@@ -2,6 +2,7 @@ * This file is part of the flashrom project. * * Copyright (C) 2000 Silicon Integrated System Corporation + * Copyright (C) 2009,2010 Carl-Daniel Hailfinger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +20,8 @@ */ #include <sys/time.h> +#include <stdlib.h> +#include <limits.h> #include "flash.h" // count to a billion. Time it. If it's < 1 sec, count to 10B, etc. @@ -30,21 +33,30 @@ void myusec_delay(int usecs) for (i = 0; i < usecs * micro; i++) ; } +unsigned long measure_delay(int usecs) +{ + unsigned long timeusec; + struct timeval start, end; + + gettimeofday(&start, 0); + myusec_delay(usecs); + gettimeofday(&end, 0); + timeusec = 1000000 * (end.tv_sec - start.tv_sec) + + (end.tv_usec - start.tv_usec); + + return timeusec; +} + void myusec_calibrate_delay(void) { int count = 1000; unsigned long timeusec; - struct timeval start, end; int ok = 0; printf("Calibrating delay loop... "); while (!ok) { - gettimeofday(&start, 0); - myusec_delay(count); - gettimeofday(&end, 0); - timeusec = 1000000 * (end.tv_sec - start.tv_sec) + - (end.tv_usec - start.tv_usec); + timeusec = measure_delay(count); count *= 2; if (timeusec < 1000000 / 4) continue; @@ -53,14 +65,18 @@ void myusec_calibrate_delay(void) // compute one microsecond. That will be count / time micro = count / timeusec; + msg_pdbg("%ldM loops per second, ", micro); + + /* We're interested in the actual precision. */ + timeusec = measure_delay(10); + msg_pdbg("10 myus = %ld us, ", timeusec); + timeusec = measure_delay(100); + msg_pdbg("100 myus = %ld us, ", timeusec); + timeusec = measure_delay(1000); + msg_pdbg("1000 myus = %ld us, ", timeusec); + timeusec = measure_delay(10000); + msg_pdbg("10000 myus = %ld us, ", timeusec); - gettimeofday(&start, 0); - myusec_delay(100); - gettimeofday(&end, 0); - timeusec = 1000000 * (end.tv_sec - start.tv_sec) + - (end.tv_usec - start.tv_usec); - printf_debug("%ldM loops per second, 100 myus = %ld us. ", - (unsigned long)micro, timeusec); printf("OK.\n"); } |