From 934dfdf645175fa150ffa037a231bd8be2433444 Mon Sep 17 00:00:00 2001 From: Antoine Juckler <6445757+ajuckler@users.noreply.github.com> Date: Thu, 3 Jul 2025 13:36:36 +0900 Subject: [PATCH] drivers/eeprom: Retrieve the geometry Add EEPIOC_GEOMETRY IOCTL command to retrieve the EEPROM geometry. Signed-off-by: Antoine Juckler <6445757+ajuckler@users.noreply.github.com> --- .../components/drivers/block/eeprom.rst | 97 -------- .../components/drivers/block/index.rst | 1 - .../components/drivers/character/eeprom.rst | 169 ++++++++++++++ .../components/drivers/character/index.rst | 1 + Documentation/components/drivers/index.rst | 16 +- .../components/drivers/special/mtd.rst | 28 ++- drivers/eeprom/i2c_xx24xx.c | 32 ++- drivers/eeprom/spi_xx25xx.c | 208 ++++++++++-------- drivers/mtd/at25ee.c | 6 + include/nuttx/eeprom/eeprom.h | 69 ++++++ include/nuttx/eeprom/spi_xx25xx.h | 11 +- include/nuttx/fs/ioctl.h | 10 +- 12 files changed, 425 insertions(+), 223 deletions(-) delete mode 100644 Documentation/components/drivers/block/eeprom.rst create mode 100644 Documentation/components/drivers/character/eeprom.rst create mode 100644 include/nuttx/eeprom/eeprom.h diff --git a/Documentation/components/drivers/block/eeprom.rst b/Documentation/components/drivers/block/eeprom.rst deleted file mode 100644 index 9d4d253cddd..00000000000 --- a/Documentation/components/drivers/block/eeprom.rst +++ /dev/null @@ -1,97 +0,0 @@ -====== -EEPROM -====== - -EEPROMs are a form of Memory - Technology Device (MTD). EEPROMs are non-volatile memory like FLASH, but - differ in underlying memory technology and differ in usage in many respects: - They may not be organized into blocks (at least from the standpoint of the - user) and it is not necessary to erase the EEPROM memory before re-writing - it. In addition, EEPROMs tend to be much smaller than FLASH parts, usually - only a few kilobytes vs megabytes for FLASH. EEPROM tends to be used to - retain a small amount of device configuration information; FLASH tends - to be used for program or massive data storage. For these reasons, it may - not be convenient to use the more complex MTD interface but instead use - the simple character interface provided by the EEPROM drivers. - -EEPROM Device Support -===================== - -drivers/eeprom/spi_xx25xx.c ---------------------------- - -This is a driver for SPI EEPROMs that use the same commands as the -25AA160:: - - Manufacturer Device Bytes PgSize AddrLen - Microchip - 25xx010A 128 16 1 - 25xx020A 256 16 1 - 25AA02UID 256 16 1 - 25AA02E48 256 16 1 - 25AA02E64 256 16 1 - 25xx040 512 16 1+bit - 25xx040A 512 16 1+bit - 25xx080 1024 16 1 - 25xx080A 1024 16 2 - 25xx080B 1024 32 2 - 25xx080C 1024 16 x - 25xx080D 1024 32 x - 25xx160 2048 16 2 - 25xx160A/C 2048 16 2 TESTED - 25xx160B/D 2048 32 2 - 25xx160C 2048 16 2 - 25xx160D 2048 32 2 - 25xx320 4096 32 2 - 25xx320A 4096 32 2 - 25xx640 8192 32 2 - 25xx640A 8192 32 2 - 25xx128 16384 64 2 - 25xx256 32768 64 2 - 25xx512 65536 128 2 - 25xx1024 131072 256 3 - Atmel - AT25010B 128 8 1 - AT25020B 256 8 1 - AT25040B 512 8 1+bit - AT25080B 1024 32 2 - AT25160B 2048 32 2 - AT25320B 4096 32 2 - AT25640B 8192 32 2 - AT25128B 16384 64 2 - AT25256B 32768 64 2 - AT25512 65536 128 2 - AT25M01 131072 256 3 - -drivers/mtd/at24xx.c --------------------- - -This is a driver for I2C-based at24cxx EEPROM (at24c32, at24c64, at24c128, -at24c256, at24c512). This driver is currently provided as an MTD driver -but could easily be modified to support the character driver interface. - -File Systems -============ - -Most EEPROM parts are too small to be candidates for use with a file -system. The character driver interface is optimal for these small parts -because you can open and access the EEPROM part as if it were a single, -fixed size file. - -It is also possible to use these character drivers with a file system. -The character driver can converted to a block device using the NuttX loop -device. The loop device can be found the file drivers/loop.c. Interface -function prototypes can be found in include/nuttx/fs/fs.h:: - - int losetup(FAR const char *devname, FAR const char *filename, - uint16_t sectsize, off_t offset, bool readonly); - -Given a file or character devices at 'filename', losetup will create the -block device 'devname' using a bogus sector size of sectsize. 'offset' is -normally zero but can be used to provide an offset into the EEPROM where -the block driver data starts; The EEPROM block driver can also be read- -only. - -There is a corresponding function that will destroy the loop device:: - - int loteardown(FAR const char *devname); diff --git a/Documentation/components/drivers/block/index.rst b/Documentation/components/drivers/block/index.rst index ffd45b04db3..4e29a17bf15 100644 --- a/Documentation/components/drivers/block/index.rst +++ b/Documentation/components/drivers/block/index.rst @@ -5,7 +5,6 @@ Block Device Drivers .. toctree:: :maxdepth: 1 - eeprom.rst ramdisk.rst diff --git a/Documentation/components/drivers/character/eeprom.rst b/Documentation/components/drivers/character/eeprom.rst new file mode 100644 index 00000000000..25c2813bb2f --- /dev/null +++ b/Documentation/components/drivers/character/eeprom.rst @@ -0,0 +1,169 @@ +====== +EEPROM +====== + +.. warning:: + + This page describes EEPROM interfacing using a character driver. For the + more standard MTD interface, refer to the + :doc:`MTD documentation <../special/mtd>`. + See `MTD vs character driver `_ for when to use each interface. + +EEPROMs are a form of Memory Technology Device (MTD). + +EEPROMs are non-volatile memory like FLASH, but differ in underlying memory +technology and differ in usage in many respects: They may not be organized into +blocks (at least from the standpoint of the user) and it is not necessary to +erase the EEPROM memory before re-writing it. + +In addition, EEPROMs tend to be much smaller than FLASH parts, usually only a +few kilobytes vs megabytes for FLASH. EEPROM tends to be used to retain a small +amount of device configuration information; FLASH tends to be used for program +or massive data storage. For these reasons, it may not be convenient to use the +more complex MTD interface but instead use the simple character interface +provided by the EEPROM drivers. + +.. _mtd_vs_char: + +MTD driver vs character driver +============================== + +MTD driver + Used when the EEPROM should appear as a block device (`/dev/mtdX`) and is + intended to be mounted with a filesystem. The MTD layer handles erase, read + and write granularity. + +Character driver + Used when direct, random-access reads and writes to the raw EEPROM are + desired, without the overhead of a filesystem. This is suitable for storing a + handful of configuration parameters, calibration data, or any small blob that + does not justify a full filesystem. + +EEPROM Device Support +===================== + +drivers/eeprom/spi_xx25xx.c +--------------------------- + +This is a driver for SPI EEPROMs that use the same commands as the +25AA160:: + + Manufacturer Device Bytes PgSize SecSize AddrLen + Microchip + 25xx010A 128 16 16 1 + 25xx020A 256 16 16 1 + 25AA02UID 256 16 16 1 + 25AA02E48 256 16 16 1 + 25AA02E64 256 16 16 1 + 25xx040 512 16 16 1+bit + 25xx040A 512 16 16 1+bit + 25xx080 1024 16 16 1 + 25xx080A 1024 16 16 2 + 25xx080B 1024 32 32 2 + 25xx080C 1024 16 16 x + 25xx080D 1024 32 32 x + 25xx160 2048 16 16 2 + 25xx160A/C 2048 16 16 2 + 25xx160B/D 2048 32 32 2 + 25xx160C 2048 16 16 2 + 25xx160D 2048 32 32 2 + 25xx320 4096 32 32 2 + 25xx320A 4096 32 32 2 + 25xx640 8192 32 32 2 + 25xx640A 8192 32 32 2 + 25xx128 16384 64 64 2 + 25xx256 32768 64 64 2 + 25xx512 65536 128 16384 2 + 25xx1024 131072 256 32768 3 + Atmel + AT25010B 128 8 8 1 + AT25020B 256 8 8 1 + AT25040B 512 8 8 1+bit + AT25080B 1024 32 32 2 + AT25160B 2048 32 32 2 + AT25320B 4096 32 32 2 + AT25640B 8192 32 32 2 + AT25128B 16384 64 64 2 + AT25256B 32768 64 64 2 + AT25512 65536 128 128 2 + AT25M01 131072 256 256 3 + ST Microelectronics + M95010 128 16 16 1 + M95020 256 16 16 1 + M95040 512 16 16 1+bit + M95080 1024 32 32 2 + M95160 2048 32 32 2 + M95320 4096 32 32 2 + M95640 8192 32 32 2 + M95128 16384 64 64 2 + M95256 32768 64 64 2 + M95512 65536 128 128 2 + M95M01 131072 256 256 3 + M95M02 262144 256 256 3 + +drivers/eeprom/i2c_xx24xx.c +--------------------------- + +This is a driver for I2C EEPROMs that use the same commands as the xx24xx:: + + Manufacturer Device Bytes PgSize AddrLen DevAddr + Microchip + 24xx00 16 1 1 1010000 Special case + 24xx01 128 8 1 1010000 + 24xx02 256 8 1 1010000 + 24xx04 512 16 1 101000P + 24xx08 1024 16 1 10100PP + 24xx16 2048 16 1 1010PPP + 24xx32 4096 32 2 1010AAA + 24xx64 8192 32 2 1010AAA + 24xx128 16384 64 2 1010AAA + 24xx256 32768 64 2 1010AAA + 24xx512 65536 128 2 1010AAA + 24xx1025 131072 128 2 1010PAA Special case: address + bit is shifted. + 24xx1026 131072 128 2 1010AAP + Atmel + AT24C01 128 8 1 1010AAA + AT24C02 256 8 1 1010AAA + AT24C04 512 16 1 1010AAP P bits = word address + AT24C08 1024 16 1 1010APP + AT24C16 2048 16 1 1010PPP + AT24C32 4096 32 2 1010AAA + AT24C64 8192 32 2 1010AAA + AT24C128 16384 64 2 10100AA + AT24C256 32768 64 2 10100AA + AT24C512 65536 128 2 10100AA + AT24C1024 131072 256 2 10100AP + ST Microelectronics + M24C01 128 16 1 1010AAA + M24C02 256 16 1 1010AAA + M24C04 512 16 1 1010AAP + M24C08 1024 16 1 1010APP + M24C16 2048 16 1 1010PPP + M24C32 4096 32 2 1010AAA ID pages supported + as a separate device + M24C64 8192 32 2 1010AAA + M24128 16384 64 2 1010AAA + M24256 32768 64 2 1010AAA + M24512 65536 128 2 1010AAA + M24M01 131072 256 2 1010AAP + M24M02 262144 256 2 1010APP + +IOCTL Commands +============== + +The full list of ``ioctl()`` commands can be found in +``include/nuttx/eeprom/eeprom.h``. + +- ``EEPIOC_GEOMETRY``: Get the EEPROM geometry + +File Systems +============ + +Most EEPROM parts are too small to be candidates for use with a file +system. The character driver interface is optimal for these small parts +because you can open and access the EEPROM part as if it were a single, +fixed size file. + +To use them with a file system, it is preferable to use the +:doc:`MTD driver <../special/mtd>`. diff --git a/Documentation/components/drivers/character/index.rst b/Documentation/components/drivers/character/index.rst index ff6d746f268..6bf18ac0256 100644 --- a/Documentation/components/drivers/character/index.rst +++ b/Documentation/components/drivers/character/index.rst @@ -60,6 +60,7 @@ Character device drivers have these properties: can.rst contactless.rst crypto/index.rst + eeprom.rst efuse.rst i2s.rst input/index.rst diff --git a/Documentation/components/drivers/index.rst b/Documentation/components/drivers/index.rst index b1e35e10255..e5dfd879ac8 100644 --- a/Documentation/components/drivers/index.rst +++ b/Documentation/components/drivers/index.rst @@ -84,20 +84,10 @@ Subdirectories of ``nuttx/drivers`` DMA drivers support. -* ``eeprom/`` :doc:`block/eeprom` +* ``eeprom/`` :doc:`character/eeprom` - An EEPROM is a form of Memory Technology Device (see ``drivers/mtd``). - EEPROMs are non-volatile memory like FLASH, but differ in underlying - memory technology and differ in usage in many respects: They may not - be organized into blocks (at least from the standpoint of the user) - and it is not necessary to erase the EEPROM memory before re-writing - it. In addition, EEPROMs tend to be much smaller than FLASH parts, - usually only a few kilobytes vs megabytes for FLASH. EEPROM tends to - be used to retain a small amount of device configuration information; - FLASH tends to be used for program or massive data storage. For these - reasons, it may not be convenient to use the more complex MTD - interface but instead use the simple character interface provided by - the EEPROM drivers. + EEPROM support as character drivers. Support as Memory Technology Device + (MTD) is located in the ``mtd/`` directory. * ``efuse/`` :doc:`character/efuse` diff --git a/Documentation/components/drivers/special/mtd.rst b/Documentation/components/drivers/special/mtd.rst index 28807be6962..5f56de240bc 100644 --- a/Documentation/components/drivers/special/mtd.rst +++ b/Documentation/components/drivers/special/mtd.rst @@ -127,17 +127,23 @@ FTL behavior: EEPROM ====== -EEPROMs are a form of Memory Technology Device (MTD). EEPROMs are non- -volatile memory like FLASH, but differ in underlying memory technology and -differ in usage in many respects: They may not be organized into blocks -(at least from the standpoint of the user) and it is not necessary to -erase the EEPROM memory before re-writing it. In addition, EEPROMs tend -to be much smaller than FLASH parts, usually only a few kilobytes vs -megabytes for FLASH. EEPROM tends to be used to retain a small amount of -device configuration information; FLASH tends to be used for program or -massive data storage. For these reasons, it may not be convenient to use -the more complex MTD interface but instead use the simple character -interface provided by the EEPROM drivers. See drivers/eeprom. +SPI EEPROMs using the same commands as the Microchip 25xxxx family, and I2C +EEPROMs using the same commands as the Microchip 24xxxx family can be +interfaced using the `drivers/mtd/at25ee.c` and `drivers/mtd/at24xx.c` driver +respectively. + +Refer to the :doc:`EEPROM character driver reference <../character/eeprom>` +for + +- the differences between EEPROM and FLASH memory; +- the list of supported EEPROM variants; +- interfacing EEPROM using a character driver. + +The MTD interface should be preferred over the character driver interface in +most cases, unless finer control is desired over the EEPROM operations. The +character driver interface may also be preferred to reduce footprint or for +very trivial usage of the EEPROM (e.g. storing parameters without having to +rely on a filesystem). CFI FLASH ========= diff --git a/drivers/eeprom/i2c_xx24xx.c b/drivers/eeprom/i2c_xx24xx.c index 12ea5dc531c..8806dcd20ec 100644 --- a/drivers/eeprom/i2c_xx24xx.c +++ b/drivers/eeprom/i2c_xx24xx.c @@ -84,12 +84,13 @@ #include #include #include -#include +#include +#include +#include +#include #include #include -#include -#include /**************************************************************************** * Pre-processor Definitions @@ -605,7 +606,7 @@ static ssize_t at24cs_read_uuid(FAR struct file *filep, FAR char *buffer, /* Write data address */ - finfo("READ %d bytes at pos %d\n", len, filep->f_pos); + finfo("READ %zu bytes at pos %" PRIdOFF "\n", len, filep->f_pos); regindx = 0x80; /* reg index of UUID[0] */ @@ -779,14 +780,33 @@ static int ee24xx_ioctl(FAR struct file *filep, int cmd, unsigned long arg) { FAR struct ee24xx_dev_s *eedev; FAR struct inode *inode = filep->f_inode; - int ret = 0; + int ret = -EINVAL; DEBUGASSERT(inode->i_private); eedev = inode->i_private; - UNUSED(eedev); switch (cmd) { + case EEPIOC_GEOMETRY: + { + FAR struct eeprom_geometry_s *geo = + (FAR struct eeprom_geometry_s *)arg; + if (geo != NULL) + { + geo->npages = 0; + geo->pagesize = eedev->pgsize; + geo->sectsize = eedev->pgsize; + + if (eedev->pgsize > 0) + { + geo->npages = eedev->size / eedev->pgsize; + } + + ret = OK; + } + } + break; + default: ret = -ENOTTY; } diff --git a/drivers/eeprom/spi_xx25xx.c b/drivers/eeprom/spi_xx25xx.c index 48c754f65df..04b9a1238b7 100644 --- a/drivers/eeprom/spi_xx25xx.c +++ b/drivers/eeprom/spi_xx25xx.c @@ -43,58 +43,58 @@ * * The following devices should be supported: * - * Manufacturer Device Bytes PgSize AddrLen + * Manufacturer Device Bytes PgSize SecSize AddrLen * Microchip - * 25xx010A 128 16 1 - * 25xx020A 256 16 1 - * 25AA02UID 256 16 1 - * 25AA02E48 256 16 1 - * 25AA02E64 256 16 1 - * 25xx040 512 16 1+bit - * 25xx040A 512 16 1+bit - * 25xx080 1024 16 1 - * 25xx080A 1024 16 2 - * 25xx080B 1024 32 2 - * 25xx080C 1024 16 x - * 25xx080D 1024 32 x - * 25xx160 2048 16 2 - * 25xx160A/C 2048 16 2 TESTED - * 25xx160B/D 2048 32 2 - * 25xx160C 2048 16 2 - * 25xx160D 2048 32 2 - * 25xx320 4096 32 2 - * 25xx320A 4096 32 2 - * 25xx640 8192 32 2 - * 25xx640A 8192 32 2 - * 25xx128 16384 64 2 - * 25xx256 32768 64 2 - * 25xx512 65536 128 2 - * 25xx1024 131072 256 3 + * 25xx010A 128 16 16 1 + * 25xx020A 256 16 16 1 + * 25AA02UID 256 16 16 1 + * 25AA02E48 256 16 16 1 + * 25AA02E64 256 16 16 1 + * 25xx040 512 16 16 1+bit + * 25xx040A 512 16 16 1+bit + * 25xx080 1024 16 16 1 + * 25xx080A 1024 16 16 2 + * 25xx080B 1024 32 32 2 + * 25xx080C 1024 16 16 x + * 25xx080D 1024 32 32 x + * 25xx160 2048 16 16 2 + * 25xx160A/C 2048 16 16 2 + * 25xx160B/D 2048 32 32 2 + * 25xx160C 2048 16 16 2 + * 25xx160D 2048 32 32 2 + * 25xx320 4096 32 32 2 + * 25xx320A 4096 32 32 2 + * 25xx640 8192 32 32 2 + * 25xx640A 8192 32 32 2 + * 25xx128 16384 64 64 2 + * 25xx256 32768 64 64 2 + * 25xx512 65536 128 16384 2 + * 25xx1024 131072 256 32768 3 * Atmel - * AT25010B 128 8 1 - * AT25020B 256 8 1 - * AT25040B 512 8 1+bit - * AT25080B 1024 32 2 - * AT25160B 2048 32 2 - * AT25320B 4096 32 2 - * AT25640B 8192 32 2 - * AT25128B 16384 64 2 - * AT25256B 32768 64 2 - * AT25512 65536 128 2 - * AT25M01 131072 256 3 + * AT25010B 128 8 8 1 + * AT25020B 256 8 8 1 + * AT25040B 512 8 8 1+bit + * AT25080B 1024 32 32 2 + * AT25160B 2048 32 32 2 + * AT25320B 4096 32 32 2 + * AT25640B 8192 32 32 2 + * AT25128B 16384 64 64 2 + * AT25256B 32768 64 64 2 + * AT25512 65536 128 128 2 + * AT25M01 131072 256 256 3 * ST Microelectronics - * M95010 128 16 1 - * M95020 256 16 1 - * M95040 512 16 1+bit - * M95080 1024 32 2 - * M95160 2048 32 2 - * M95320 4096 32 2 - * M95640 8192 32 2 - * M95128 16384 64 2 - * M95256 32768 64 2 - * M95512 65536 128 2 - * M95M01 131072 256 3 - * M95M02 262144 256 3 + * M95010 128 16 16 1 + * M95020 256 16 16 1 + * M95040 512 16 16 1+bit + * M95080 1024 32 32 2 + * M95160 2048 32 32 2 + * M95320 4096 32 32 2 + * M95640 8192 32 32 2 + * M95128 16384 64 64 2 + * M95256 32768 64 64 2 + * M95512 65536 128 128 2 + * M95M01 131072 256 256 3 + * M95M02 262144 256 256 3 */ /**************************************************************************** @@ -107,8 +107,10 @@ #include #include #include -#include +#include +#include +#include #include #include #include @@ -165,6 +167,7 @@ struct ee25xx_geom_s { uint8_t bytes : 4; /* Power of two of 128 bytes (0:128 1:256 2:512 etc) */ uint8_t pagesize : 4; /* Power of two of 8 bytes (0:8 1:16 2:32 3:64 etc) */ + uint8_t secsize : 4; /* Power of two of the page size */ uint8_t addrlen : 4; /* Number of bytes in command address field */ uint8_t flags : 4; /* Special address management for 25xx040, 1=A8 in inst */ }; @@ -176,6 +179,7 @@ struct ee25xx_dev_s struct spi_dev_s *spi; /* SPI device where the EEPROM is attached */ uint32_t size; /* in bytes, expanded from geometry */ uint16_t pgsize; /* write block size, in bytes, expanded from geometry */ + uint32_t secsize; /* write sector size, in bytes, expanded from geometry */ uint16_t addrlen; /* number of BITS in data addresses */ mutex_t lock; /* file access serialization */ uint8_t refs; /* The number of times the device has been opened */ @@ -210,62 +214,68 @@ static const struct ee25xx_geom_s g_ee25xx_devices[] = /* Microchip devices */ { - 0, 1, 1, 0 - }, /* 25xx010A 128 16 1 */ + 0, 1, 0, 1, 0 + }, /* 25xx010A 128 16 16 1 */ { - 1, 1, 1, 0 - }, /* 25xx020A 256 16 1 */ + 1, 1, 0, 1, 0 + }, /* 25xx020A 256 16 16 1 */ { - 2, 1, 1, 1 - }, /* 25xx040 512 16 1+bit */ + 2, 1, 0, 1, 1 + }, /* 25xx040 512 16 16 1+bit */ { - 3, 1, 1, 0 - }, /* 25xx080 1024 16 1 */ + 3, 1, 0, 1, 0 + }, /* 25xx080 1024 16 16 1 */ { - 3, 2, 2, 0 - }, /* 25xx080B 1024 32 2 */ + 3, 2, 0, 2, 0 + }, /* 25xx080B 1024 32 32 2 */ { - 4, 1, 2, 0 - }, /* 25xx160 2048 16 2 */ + 4, 1, 0, 2, 0 + }, /* 25xx160 2048 16 16 2 */ { - 4, 2, 2, 0 - }, /* 25xx160B/D 2048 32 2 */ + 4, 2, 0, 2, 0 + }, /* 25xx160B/D 2048 32 32 2 */ { - 5, 2, 2, 0 - }, /* 25xx320 4096 32 2 */ + 5, 2, 0, 2, 0 + }, /* 25xx320 4096 32 32 2 */ { - 6, 2, 2, 0 - }, /* 25xx640 8192 32 2 */ + 6, 2, 0, 2, 0 + }, /* 25xx640 8192 32 32 2 */ { - 7, 3, 2, 0 - }, /* 25xx128 16384 64 2 */ + 7, 3, 0, 2, 0 + }, /* 25xx128 16384 64 64 2 */ { - 8, 3, 2, 0 - }, /* 25xx256 32768 64 2 */ + 8, 3, 0, 2, 0 + }, /* 25xx256 32768 64 64 2 */ { - 9, 4, 2, 0 - }, /* 25xx512 65536 128 2 */ + 9, 4, 7, 2, 0 + }, /* 25xx512 65536 128 16384 2 */ { - 10, 5, 3, 0 - }, /* 25xx1024 131072 256 3 */ + 10, 5, 7, 3, 0 + }, /* 25xx1024 131072 256 32768 3 */ /* Atmel devices */ { - 0, 0, 1, 0 - }, /* AT25010B 128 8 1 */ + 0, 0, 0, 1, 0 + }, /* AT25010B 128 8 8 1 */ { - 1, 0, 1, 0 - }, /* AT25020B 256 8 1 */ + 1, 0, 0, 1, 0 + }, /* AT25020B 256 8 8 1 */ { - 2, 0, 1, 1 - }, /* AT25040B 512 8 1+bit */ + 2, 0, 0, 1, 1 + }, /* AT25040B 512 8 8 1+bit */ + { + 9, 4, 0, 2, 0 + }, /* AT25512 65536 128 128 2 */ + { + 10, 5, 0, 3, 0 + }, /* AT25M01 131072 256 256 3 */ /* STM devices */ { - 11, 5, 3, 0 - }, /* M95M02 262144 256 3 */ + 11, 5, 0, 3, 0 + }, /* M95M02 262144 256 256 3 */ }; /* Driver operations */ @@ -765,14 +775,33 @@ static int ee25xx_ioctl(FAR struct file *filep, int cmd, unsigned long arg) { FAR struct ee25xx_dev_s *eedev; FAR struct inode *inode = filep->f_inode; - int ret = 0; + int ret = -EINVAL; DEBUGASSERT(inode->i_private); eedev = inode->i_private; - UNUSED(eedev); switch (cmd) { + case EEPIOC_GEOMETRY: + { + FAR struct eeprom_geometry_s *geo = + (FAR struct eeprom_geometry_s *)arg; + if (geo != NULL) + { + geo->npages = 0; + geo->pagesize = eedev->pgsize; + geo->sectsize = eedev->secsize; + + if (eedev->pgsize > 0) + { + geo->npages = eedev->size / eedev->pgsize; + } + + ret = OK; + } + } + break; + default: ret = -ENOTTY; } @@ -816,9 +845,10 @@ int ee25xx_initialize(FAR struct spi_dev_s *dev, FAR char *devname, nxmutex_init(&eedev->lock); eedev->spi = dev; - eedev->size = 128 << g_ee25xx_devices[devtype].bytes; - eedev->pgsize = 8 << g_ee25xx_devices[devtype].pagesize; - eedev->addrlen = g_ee25xx_devices[devtype].addrlen << 3; + eedev->size = 128 << g_ee25xx_devices[devtype].bytes; + eedev->pgsize = 8 << g_ee25xx_devices[devtype].pagesize; + eedev->secsize = eedev->pgsize << g_ee25xx_devices[devtype].secsize; + eedev->addrlen = g_ee25xx_devices[devtype].addrlen << 3; if ((g_ee25xx_devices[devtype].flags & 1)) { eedev->addrlen = 9; diff --git a/drivers/mtd/at25ee.c b/drivers/mtd/at25ee.c index 952659c3e03..8794c3f1300 100644 --- a/drivers/mtd/at25ee.c +++ b/drivers/mtd/at25ee.c @@ -221,6 +221,12 @@ static const struct at25ee_geom_s g_at25ee_devices[] = { 2, 0, 1, 1 }, /* AT25040B 512 8 1+bit */ + { + 9, 4, 2, 0 + }, /* AT25512 65536 128 2 */ + { + 10, 5, 3, 0 + }, /* AT25M01 131072 256 3 */ /* STM devices */ diff --git a/include/nuttx/eeprom/eeprom.h b/include/nuttx/eeprom/eeprom.h new file mode 100644 index 00000000000..b64a93aa776 --- /dev/null +++ b/include/nuttx/eeprom/eeprom.h @@ -0,0 +1,69 @@ +/************************************************************************************ + * include/nuttx/eeprom/eeprom.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * EEPROM IOCTL commands + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ************************************************************************************/ + +/* This file includes common definitions to be used in all EEPROM drivers + * (when applicable). + */ + +#ifndef __INCLUDE_NUTTX_EEPROM_EEPROM_H +#define __INCLUDE_NUTTX_EEPROM_EEPROM_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include + +#include +#include + +#include + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/* EEPROM IOCTL Commands ************************************************************/ + +#define EEPIOC_GEOMETRY _EEPIOC(0x000) /* Similar to BIOC_GEOMETRY: + * Return the geometry of the EEPROM + * device. + * IN: Pointer to writable instance of + * struct eeprom_geometry_s in which + * to return the geometry. + * OUT: Data return in user-provided + * buffer. */ + +/************************************************************************************ + * Type Definitions + ************************************************************************************/ + +struct eeprom_geometry_s +{ + blkcnt_t npages; /* Number of pages on the device */ + blksize_t sectsize; /* Size of one sector in bytes */ + blksize_t pagesize; /* Size of one page in bytes */ +}; + +#endif /* __INCLUDE_NUTTX_EEPROM_EEPROM_H */ diff --git a/include/nuttx/eeprom/spi_xx25xx.h b/include/nuttx/eeprom/spi_xx25xx.h index a9eb252a589..5586b085330 100644 --- a/include/nuttx/eeprom/spi_xx25xx.h +++ b/include/nuttx/eeprom/spi_xx25xx.h @@ -46,14 +46,16 @@ enum eeprom_25xx_e EEPROM_25XX640, EEPROM_25XX128, EEPROM_25XX256, - EEPROM_25XX512, - EEPROM_25XX1024, + EEPROM_25XX512, /* Additional erase commands */ + EEPROM_25XX1024, /* Additional erase commands */ /* Atmel geometries */ EEPROM_AT25010B, EEPROM_AT25020B, EEPROM_AT25040B, + EEPROM_AT25512, + EEPROM_AT25M01, /* STM geometries */ @@ -67,7 +69,6 @@ enum eeprom_25xx_e EEPROM_AT25640B = EEPROM_25XX640, EEPROM_AT25128B = EEPROM_25XX128, EEPROM_AT225256B = EEPROM_25XX256, - EEPROM_AT25512 = EEPROM_25XX512, EEPROM_AT25M02 = EEPROM_25XX1024, EEPROM_M95010 = EEPROM_25XX010, EEPROM_M95020 = EEPROM_25XX020, @@ -78,8 +79,8 @@ enum eeprom_25xx_e EEPROM_M95640 = EEPROM_25XX640, EEPROM_M95128 = EEPROM_25XX128, EEPROM_M95256 = EEPROM_25XX256, - EEPROM_M95512 = EEPROM_25XX512, - EEPROM_M95M01 = EEPROM_25XX1024, + EEPROM_M95512 = EEPROM_AT25512, + EEPROM_M95M01 = EEPROM_AT25M01, }; /**************************************************************************** diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h index a4f49ff4444..8ca85dc779b 100644 --- a/include/nuttx/fs/ioctl.h +++ b/include/nuttx/fs/ioctl.h @@ -111,6 +111,7 @@ #define _MSIOCBASE (0x4300) /* Mouse ioctl commands */ #define _I2SOCBASE (0x4400) /* I2S driver ioctl commands */ #define _1WIREBASE (0x4500) /* 1WIRE ioctl commands */ +#define _EEPIOCBASE (0x4600) /* EEPROM driver ioctl commands */ #define _WLIOCBASE (0x8b00) /* Wireless modules ioctl network commands */ /* boardctl() commands share the same number space */ @@ -247,7 +248,7 @@ * OUT: None */ -/* NuttX file system ioctl definitions **************************************/ +/* NuttX character driver ioctl definitions *********************************/ #define _DIOCVALID(c) (_IOC_TYPE(c)==_DIOCBASE) #define _DIOC(nr) _IOC(_DIOCBASE,nr) @@ -791,6 +792,13 @@ #define _1WIREIOCVALID(c) (_IOC_TYPE(c)==_1WIREBASE) #define _1WIREIOC(nr) _IOC(_1WIREBASE,nr) +/* EEPROM driver ioctl definitions ******************************************/ + +/* (see nuttx/include/eeprom/eeprom.h */ + +#define _EEPIOCVALID(c) (_IOC_TYPE(c)==_EEPIOCBASE) +#define _EEPIOC(nr) _IOC(_EEPIOCBASE,nr) + /**************************************************************************** * Public Type Definitions ****************************************************************************/