From a9295f4074c6430c3a4ea61c3853aea2bfddb7bb Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Wed, 20 Dec 2006 18:19:52 +0000 Subject: [PATCH] MFp4: Add timeout to eeprom access for lame eeprom that go awol --- sys/boot/arm/at91/libat91/eeprom.c | 10 +++++++--- sys/boot/arm/at91/libat91/lib.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sys/boot/arm/at91/libat91/eeprom.c b/sys/boot/arm/at91/libat91/eeprom.c index 5f5fafd0317c..8af411ba31fe 100644 --- a/sys/boot/arm/at91/libat91/eeprom.c +++ b/sys/boot/arm/at91/libat91/eeprom.c @@ -82,11 +82,12 @@ InitEEPROM(void) * This function does not utilize the page read mode to simplify the code. * .KB_C_FN_DEFINITION_END */ -void +int ReadEEPROM(unsigned ee_off, char *data_addr, unsigned size) { const AT91PS_TWI twiPtr = AT91C_BASE_TWI; unsigned int status; + unsigned int count; status = twiPtr->TWI_SR; status = twiPtr->TWI_RHR; @@ -104,10 +105,12 @@ ReadEEPROM(unsigned ee_off, char *data_addr, unsigned size) status = twiPtr->TWI_SR; while (size-- > 1){ - // Wait RHR Holding register is full - while (!(twiPtr->TWI_SR & AT91C_TWI_RXRDY)) + count = 1000000; + while (!(twiPtr->TWI_SR & AT91C_TWI_RXRDY) && --count > 0) continue; + if (count <= 0) + return -1; // Read byte *(data_addr++) = twiPtr->TWI_RHR; @@ -123,6 +126,7 @@ ReadEEPROM(unsigned ee_off, char *data_addr, unsigned size) // Read last byte *data_addr = twiPtr->TWI_RHR; + return 0; } diff --git a/sys/boot/arm/at91/libat91/lib.h b/sys/boot/arm/at91/libat91/lib.h index d88b791e88e3..a0ef8ecf332d 100644 --- a/sys/boot/arm/at91/libat91/lib.h +++ b/sys/boot/arm/at91/libat91/lib.h @@ -34,7 +34,7 @@ void printf(const char *fmt,...); /* The following function write eeprom at ee_addr using data */ /* from data_add for size bytes. */ -void ReadEEPROM(unsigned eeoff, char *data_addr, unsigned size); +int ReadEEPROM(unsigned eeoff, char *data_addr, unsigned size); void WriteEEPROM(unsigned eeoff, char *data_addr, unsigned size); void InitEEPROM(void);