From a71a6f48cbc996bdc30216e4c452d8db8db053ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Redon?= Date: Tue, 24 Jul 2018 09:54:12 +0200 Subject: I2C: return error after failed write The previous mechanism of retrying a failed write could become a infinite blocking loop (until watchdog tiemout). Also the array size is used to know how much data to write and verify instead of a constant. Change-Id: I8d2d090c5f4d1195f4c7eb29b3958a7bb05f56ec --- firmware/libboard/qmod/source/board_qmod.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/firmware/libboard/qmod/source/board_qmod.c b/firmware/libboard/qmod/source/board_qmod.c index 7ae1978..47a4cb6 100644 --- a/firmware/libboard/qmod/source/board_qmod.c +++ b/firmware/libboard/qmod/source/board_qmod.c @@ -70,8 +70,6 @@ const unsigned char __eeprom_bin[256] = { #include "i2c.h" static int write_hub_eeprom(void) { - const unsigned int __eeprom_bin_len = 256; - int i; /* wait */ @@ -79,16 +77,18 @@ static int write_hub_eeprom(void) TRACE_INFO("Writing EEPROM...\n\r"); /* write the EEPROM once */ - for (i = 0; i < 256; i++) { + for (i = 0; i < ARRAY_SIZE(__eeprom_bin); i++) { int rc = eeprom_write_byte(0x50, i, __eeprom_bin[i]); - /* if the result was negative, repeat that write */ - if (rc < 0) - i--; + if (rc < 0) { + TRACE_ERROR("Writing EEPROM failed at byte %u: 0x%02x\n\r", + i, __eeprom_bin[i]); + return 1; + } } /* then pursue re-reading it again and again */ TRACE_INFO("Verifying EEPROM...\n\r"); - for (i = 0; i < 256; i++) { + for (i = 0; i < ARRAY_SIZE(__eeprom_bin); i++) { int byte = eeprom_read_byte(0x50, i); TRACE_INFO("0x%02x: %02x\n\r", i, byte); if (byte != __eeprom_bin[i]) -- cgit v1.2.3