From c3c76ef3d50f71a7bef2994df462c5add11658d9 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Mon, 29 Oct 2012 09:44:59 +0100 Subject: Hardened the EEPROM attach routine for param storage --- apps/systemcmds/eeprom/24xxxx_mtd.c | 27 +++++++++++++++++++++++++++ apps/systemcmds/eeprom/eeprom.c | 14 ++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/apps/systemcmds/eeprom/24xxxx_mtd.c b/apps/systemcmds/eeprom/24xxxx_mtd.c index 79149caa0..781b01065 100644 --- a/apps/systemcmds/eeprom/24xxxx_mtd.c +++ b/apps/systemcmds/eeprom/24xxxx_mtd.c @@ -502,6 +502,33 @@ FAR struct mtd_dev_s *at24c_initialize(FAR struct i2c_dev_s *dev) { priv->perf_write_errors = perf_alloc(PC_COUNT, "EEPROM write errors"); } + /* attempt to read to validate device is present */ + unsigned char buf[5]; + uint8_t addrbuf[2] = {0, 0}; + + struct i2c_msg_s msgv[2] = { + { + .addr = priv->addr, + .flags = 0, + .buffer = &addrbuf[0], + .length = sizeof(addrbuf), + }, + { + .addr = priv->addr, + .flags = I2C_M_READ, + .buffer = &buf[0], + .length = sizeof(buf), + } + }; + + perf_begin(priv->perf_reads); + int ret = I2C_TRANSFER(priv->dev, &msgv[0], 2); + perf_end(priv->perf_reads); + + if (ret < 0) { + return NULL; + } + /* Return the implementation-specific state structure as the MTD device */ fvdbg("Return %p\n", priv); diff --git a/apps/systemcmds/eeprom/eeprom.c b/apps/systemcmds/eeprom/eeprom.c index 19a14aa02..b4257cda9 100644 --- a/apps/systemcmds/eeprom/eeprom.c +++ b/apps/systemcmds/eeprom/eeprom.c @@ -118,9 +118,19 @@ eeprom_attach(void) if (i2c == NULL) errx(1, "failed to locate I2C bus"); - /* start the MTD driver */ - eeprom_mtd = at24c_initialize(i2c); + /* start the MTD driver, attempt 5 times */ + for (int i = 0; i < 5; i++) { + eeprom_mtd = at24c_initialize(i2c); + if (eeprom_mtd) { + /* abort on first valid result */ + if (i > 0) { + warnx("warning: EEPROM needed %d attempts to attach", i+1); + } + break; + } + } + /* if last attempt is still unsuccessful, abort */ if (eeprom_mtd == NULL) errx(1, "failed to initialize EEPROM driver"); -- cgit v1.2.3