aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2012-10-29 09:44:59 +0100
committerLorenz Meier <lm@inf.ethz.ch>2012-10-29 09:44:59 +0100
commitc3c76ef3d50f71a7bef2994df462c5add11658d9 (patch)
tree896f37ba323ff6a365e399ed495ba435d50d5d93
parent1a70b2f4ed0feffd9c57721db3661f15e64af5cb (diff)
downloadpx4-firmware-c3c76ef3d50f71a7bef2994df462c5add11658d9.tar.gz
px4-firmware-c3c76ef3d50f71a7bef2994df462c5add11658d9.tar.bz2
px4-firmware-c3c76ef3d50f71a7bef2994df462c5add11658d9.zip
Hardened the EEPROM attach routine for param storage
-rw-r--r--apps/systemcmds/eeprom/24xxxx_mtd.c27
-rw-r--r--apps/systemcmds/eeprom/eeprom.c14
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");