From 863d7fa98407e35057721cf03447382c4f2c11e9 Mon Sep 17 00:00:00 2001 From: imp Date: Wed, 20 Dec 2006 18:19:52 +0000 Subject: 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 5f5fafd..8af411b 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 d88b791..a0ef8ec 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); -- cgit v1.1