Browse Source

Use BOARD_EEPROM_WP_CTRL signal to control EEPROM WP signal if defined

Erases and write operations will use the BOARD_EEPROM_WP_CTRL
  macro to remove the Write protection and restore it.
sbg
David Sidrane 8 years ago committed by Lorenz Meier
parent
commit
487fbdf009
  1. 11
      src/systemcmds/mtd/24xxxx_mtd.c

11
src/systemcmds/mtd/24xxxx_mtd.c

@ -203,6 +203,8 @@ static int at24c_eraseall(FAR struct at24c_dev_s *priv)
memset(&buf[2], 0xff, priv->pagesize); memset(&buf[2], 0xff, priv->pagesize);
BOARD_EEPROM_WP_CTRL(false);
for (startblock = 0; startblock < priv->npages; startblock++) { for (startblock = 0; startblock < priv->npages; startblock++) {
uint16_t offset = startblock * priv->pagesize; uint16_t offset = startblock * priv->pagesize;
buf[1] = offset & 0xff; buf[1] = offset & 0xff;
@ -214,6 +216,8 @@ static int at24c_eraseall(FAR struct at24c_dev_s *priv)
} }
} }
BOARD_EEPROM_WP_CTRL(true);
return OK; return OK;
} }
@ -389,6 +393,8 @@ static ssize_t at24c_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t
finfo("startblock: %08lx nblocks: %d\n", (long)startblock, (int)nblocks); finfo("startblock: %08lx nblocks: %d\n", (long)startblock, (int)nblocks);
BOARD_EEPROM_WP_CTRL(false);
while (blocksleft-- > 0) { while (blocksleft-- > 0) {
uint16_t offset = startblock * priv->pagesize; uint16_t offset = startblock * priv->pagesize;
unsigned tries = CONFIG_AT24XX_WRITE_TIMEOUT_MS; unsigned tries = CONFIG_AT24XX_WRITE_TIMEOUT_MS;
@ -415,6 +421,7 @@ static ssize_t at24c_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t
*/ */
if (--tries == 0) { if (--tries == 0) {
perf_count(priv->perf_errors); perf_count(priv->perf_errors);
BOARD_EEPROM_WP_CTRL(true);
return ERROR; return ERROR;
} }
} }
@ -423,6 +430,8 @@ static ssize_t at24c_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t
buffer += priv->pagesize; buffer += priv->pagesize;
} }
BOARD_EEPROM_WP_CTRL(true);
#if CONFIG_AT24XX_MTD_BLOCKSIZE > AT24XX_PAGESIZE #if CONFIG_AT24XX_MTD_BLOCKSIZE > AT24XX_PAGESIZE
return nblocks / (CONFIG_AT24XX_MTD_BLOCKSIZE / AT24XX_PAGESIZE); return nblocks / (CONFIG_AT24XX_MTD_BLOCKSIZE / AT24XX_PAGESIZE);
#else #else
@ -565,6 +574,8 @@ FAR struct mtd_dev_s *at24c_initialize(FAR struct i2c_master_s *dev)
} }
}; };
BOARD_EEPROM_WP_CTRL(true);
perf_begin(priv->perf_transfers); perf_begin(priv->perf_transfers);
int ret = I2C_TRANSFER(priv->dev, &msgv[0], 2); int ret = I2C_TRANSFER(priv->dev, &msgv[0], 2);
perf_end(priv->perf_transfers); perf_end(priv->perf_transfers);

Loading…
Cancel
Save