summaryrefslogtreecommitdiffstats
path: root/sys/boot/arm
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2007-03-28 22:40:37 +0000
committerimp <imp@FreeBSD.org>2007-03-28 22:40:37 +0000
commitfdf75b902074d70bcb83a0421e1e7a1ef8f5bed5 (patch)
tree507b2d214cf66e5e5c725d7626f0b447fdd7820e /sys/boot/arm
parentfeacfb6fad7a2822ad94c01ac0ad86ac3d17786d (diff)
downloadFreeBSD-src-fdf75b902074d70bcb83a0421e1e7a1ef8f5bed5.zip
FreeBSD-src-fdf75b902074d70bcb83a0421e1e7a1ef8f5bed5.tar.gz
RTC_TIMR's RTC_SEC field is BCD. That makes it unsuitable for
GetSeconds(). Instead, use CRTR register shifted right 15. This gives us a range of 32 seconds we can do for timeout. Shift to using == rather than < or > for calculating the timeout, since if we can't read the ST_CTRT register twice in a second we have even bigger problems to worry about, and == deals with the 'wrap' issue. This lets me type at the boot2 prompt again! Woo Hoo! Bogusness noticed by: tisco Pointy Hat to: That silly imp guy
Diffstat (limited to 'sys/boot/arm')
-rw-r--r--sys/boot/arm/at91/libat91/at91rm9200_lowlevel.c1
-rw-r--r--sys/boot/arm/at91/libat91/at91rm9200_lowlevel.h3
-rw-r--r--sys/boot/arm/at91/libat91/emac.c11
-rw-r--r--sys/boot/arm/at91/libat91/getc.c6
4 files changed, 13 insertions, 8 deletions
diff --git a/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.c b/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.c
index 6ea79e7..192815d 100644
--- a/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.c
+++ b/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.c
@@ -53,6 +53,7 @@ _init(void)
register unsigned value;
volatile sdram_size_t *p = (sdram_size_t *)SDRAM_BASE;
+ AT91C_BASE_ST->ST_RTMR = 1;
#ifdef BOOT_TSC
// For the TSC board, we turn ON the one LED we have while
// early in boot.
diff --git a/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.h b/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.h
index 13edbec..c706247 100644
--- a/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.h
+++ b/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.h
@@ -58,7 +58,8 @@ typedef unsigned int sdram_size_t;
/* Master clock frequency at power-up */
#define AT91C_MASTER_CLOCK 60000000
-#define GetSeconds() (AT91C_BASE_RTC->RTC_TIMR & AT91C_RTC_SEC)
+/* #define GetSeconds() (AT91C_BASE_RTC->RTC_TIMR & AT91C_RTC_SEC) */
+#define GetSeconds() (AT91C_BASE_ST->ST_CRTR >> 15)
extern void _init(void);
diff --git a/sys/boot/arm/at91/libat91/emac.c b/sys/boot/arm/at91/libat91/emac.c
index e82c613..392537c 100644
--- a/sys/boot/arm/at91/libat91/emac.c
+++ b/sys/boot/arm/at91/libat91/emac.c
@@ -412,7 +412,8 @@ MII_GetLinkSpeed(AT91PS_EMAC pEmac)
break;
printf(".");
sec = GetSeconds();
- while (GetSeconds() <= sec) continue;
+ while (GetSeconds() == sec)
+ continue;
}
if (stat2 & MII_STS_LINK_STAT)
break;
@@ -541,7 +542,7 @@ TFTP_Download(unsigned address, char *filename)
dlAddress = (char*)address;
lastSize = 0;
timeout = 10;
- thisSeconds = GetSeconds() + 1;
+ thisSeconds = (GetSeconds() + 2) % 32;
serverPort = SWAP16(69);
++localPort;
ackBlock = -1;
@@ -551,10 +552,10 @@ TFTP_Download(unsigned address, char *filename)
if (ackBlock == -2)
break;
timeout = 10;
- thisSeconds = GetSeconds() + 1;
- } else if (GetSeconds() > thisSeconds) {
+ thisSeconds = (GetSeconds() + 2) % 32;
+ } else if (GetSeconds() == thisSeconds) {
--timeout;
- thisSeconds = GetSeconds() + 1;
+ thisSeconds = (GetSeconds() + 2) % 32;
if (!serverMACSet)
GetServerAddress();
else if (ackBlock == -1)
diff --git a/sys/boot/arm/at91/libat91/getc.c b/sys/boot/arm/at91/libat91/getc.c
index e0a43b9..59e27a4 100644
--- a/sys/boot/arm/at91/libat91/getc.c
+++ b/sys/boot/arm/at91/libat91/getc.c
@@ -50,13 +50,15 @@ getc(int seconds)
AT91PS_USART pUSART = (AT91PS_USART)AT91C_BASE_DBGU;
unsigned thisSecond;
+ // Clamp to 20s
+ if (seconds > 20)
+ seconds = 20;
thisSecond = GetSeconds();
seconds = thisSecond + seconds;
-
do {
if ((pUSART->US_CSR & AT91C_US_RXRDY))
return (pUSART->US_RHR & 0xFF);
thisSecond = GetSeconds();
- } while (thisSecond < seconds);
+ } while (thisSecond != seconds);
return (-1);
}
OpenPOWER on IntegriCloud