Extend the AT24Cxx MTD driver with support for -04,-08 and -16 parts.
These parts utilize the same one-byte-address in the I2C protocol as the -02, but requires different I2C addresses for different banks of the EEPROM. Signed-off-by: Marten Svanfeldt <marten@intuitiveaerial.com>
This commit is contained in:
parent
337798f1be
commit
af9590eef7
1 changed files with 25 additions and 7 deletions
|
@ -81,10 +81,22 @@
|
|||
|
||||
/* Get the part configuration based on the size configuration */
|
||||
|
||||
#if CONFIG_AT24XX_SIZE == 2 /* AT24C32: 2Kbits = 256; 16 * 16 = 256 */
|
||||
#if CONFIG_AT24XX_SIZE == 2 /* AT24C02: 2Kbits = 256; 16 * 16 = 256 */
|
||||
# define AT24XX_NPAGES 16
|
||||
# define AT24XX_PAGESIZE 16
|
||||
# define AT24XX_ADDRSIZE 1
|
||||
#elif CONFIG_AT24XX_SIZE == 4 /* AT24C04: 4Kbits = 512B; 32 * 16 = 512 */
|
||||
# define AT24XX_NPAGES 32
|
||||
# define AT24XX_PAGESIZE 16
|
||||
# define AT24XX_ADDRSIZE 1
|
||||
#elif CONFIG_AT24XX_SIZE == 8 /* AT24C08: 8Kbits = 1KiB; 64 * 16 = 1024 */
|
||||
# define AT24XX_NPAGES 64
|
||||
# define AT24XX_PAGESIZE 16
|
||||
# define AT24XX_ADDRSIZE 1
|
||||
#elif CONFIG_AT24XX_SIZE == 16 /* AT24C16: 16Kbits = 2KiB; 128 * 16 = 2048 */
|
||||
# define AT24XX_NPAGES 128
|
||||
# define AT24XX_PAGESIZE 16
|
||||
# define AT24XX_ADDRSIZE 1
|
||||
#elif CONFIG_AT24XX_SIZE == 32 /* AT24C32: 32Kbits = 4KiB; 128 * 32 = 4096 */
|
||||
# define AT24XX_NPAGES 128
|
||||
# define AT24XX_PAGESIZE 32
|
||||
|
@ -185,12 +197,13 @@ static int at24c_eraseall(FAR struct at24c_dev_s *priv)
|
|||
|
||||
for (startblock = 0; startblock < priv->npages; startblock++)
|
||||
{
|
||||
#if AT24XX_ADDRSIZE == 2
|
||||
uint16_t offset = startblock * priv->pagesize;
|
||||
#if AT24XX_ADDRSIZE == 2
|
||||
buf[1] = offset & 0xff;
|
||||
buf[0] = (offset >> 8) & 0xff;
|
||||
#else
|
||||
buf[0] = startblock * priv->pagesize;
|
||||
buf[0] = offset & 0xff;
|
||||
I2C_SETADDRESS(priv->dev, priv->addr | ((offset >> 8) & 0x07), 7);
|
||||
#endif
|
||||
|
||||
while (I2C_WRITE(priv->dev, buf, AT24XX_ADDRSIZE) < 0)
|
||||
|
@ -228,7 +241,6 @@ static ssize_t at24c_read_internal(FAR struct at24c_dev_s *priv, off_t offset,
|
|||
fvdbg("offset: %lu nbytes: %lu address: %02x\n",
|
||||
(unsigned long)offset, (unsigned long)nbytes, address);
|
||||
|
||||
I2C_SETADDRESS(priv->dev, address, 7);
|
||||
I2C_SETFREQUENCY(priv->dev, 100000);
|
||||
|
||||
/* "Random Read: A Random Read requires a dummy byte write sequence to load in the
|
||||
|
@ -247,8 +259,12 @@ static ssize_t at24c_read_internal(FAR struct at24c_dev_s *priv, off_t offset,
|
|||
#if AT24XX_ADDRSIZE == 2
|
||||
buf[1] = offset & 0xff;
|
||||
buf[0] = (offset >> 8) & 0xff;
|
||||
|
||||
I2C_SETADDRESS(priv->dev, address, 7);
|
||||
#else
|
||||
buf[0] = (uint8_t)offset;
|
||||
buf[0] = offset & 0xff;
|
||||
|
||||
I2C_SETADDRESS(priv->dev, address | ((offset >> 8) & 0x07), 7);
|
||||
#endif
|
||||
|
||||
while (I2C_WRITE(priv->dev, buf, AT24XX_ADDRSIZE) < 0)
|
||||
|
@ -356,12 +372,14 @@ static ssize_t at24c_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t
|
|||
|
||||
while (blocksleft-- > 0)
|
||||
{
|
||||
#if AT24XX_ADDRSIZE == 2
|
||||
uint16_t offset = startblock * priv->pagesize;
|
||||
#if AT24XX_ADDRSIZE == 2
|
||||
buf[1] = offset & 0xff;
|
||||
buf[0] = (offset >> 8) & 0xff;
|
||||
#else
|
||||
buf[0] = startblock * priv->pagesize;
|
||||
buf[0] = offset & 0xff;
|
||||
|
||||
I2C_SETADDRESS(priv->dev, address | ((offset >> 8) & 0x07), 7);
|
||||
#endif
|
||||
|
||||
while (I2C_WRITE(priv->dev, buf, AT24XX_ADDRSIZE) < 0)
|
||||
|
|
Loading…
Reference in a new issue