summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2010-03-27 16:16:01 +0000
committerhailfinger <hailfinger@2b7e53f0-3cfb-0310-b3e9-8179ed1497e1>2010-03-27 16:16:01 +0000
commitc6b896c619f504caef69eeb03369c1d9e02f8fc2 (patch)
tree23c529184ba0c0aa7732e44e8ba9b380935e48b3
parentcd9db428bb574940d458abad7a413b628c0e5166 (diff)
downloadflashrom-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.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/udelay.c b/udelay.c
index f61d793..ac58017 100644
--- a/udelay.c
+++ b/udelay.c
@@ -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");
}