mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 15:12:36 +02:00
The delay loop is probably one of the oldest pieces of code
Clean up code duplication and measure timing of 10/100/1000/10000 us delays. Corresponding to flashrom svn r986. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Maciej Pijanka <maciej.pijanka@gmail.com>
This commit is contained in:
parent
4e3d0b3a24
commit
b811461abb
42
udelay.c
42
udelay.c
@ -2,6 +2,7 @@
|
|||||||
* This file is part of the flashrom project.
|
* This file is part of the flashrom project.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000 Silicon Integrated System Corporation
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -19,6 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
#include "flash.h"
|
#include "flash.h"
|
||||||
|
|
||||||
// count to a billion. Time it. If it's < 1 sec, count to 10B, etc.
|
// 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++) ;
|
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)
|
void myusec_calibrate_delay(void)
|
||||||
{
|
{
|
||||||
int count = 1000;
|
int count = 1000;
|
||||||
unsigned long timeusec;
|
unsigned long timeusec;
|
||||||
struct timeval start, end;
|
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|
||||||
printf("Calibrating delay loop... ");
|
printf("Calibrating delay loop... ");
|
||||||
|
|
||||||
while (!ok) {
|
while (!ok) {
|
||||||
gettimeofday(&start, 0);
|
timeusec = measure_delay(count);
|
||||||
myusec_delay(count);
|
|
||||||
gettimeofday(&end, 0);
|
|
||||||
timeusec = 1000000 * (end.tv_sec - start.tv_sec) +
|
|
||||||
(end.tv_usec - start.tv_usec);
|
|
||||||
count *= 2;
|
count *= 2;
|
||||||
if (timeusec < 1000000 / 4)
|
if (timeusec < 1000000 / 4)
|
||||||
continue;
|
continue;
|
||||||
@ -53,14 +65,18 @@ void myusec_calibrate_delay(void)
|
|||||||
|
|
||||||
// compute one microsecond. That will be count / time
|
// compute one microsecond. That will be count / time
|
||||||
micro = count / timeusec;
|
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");
|
printf("OK.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user