X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Feeprom.h;h=5bd834af6441222c4db44c0968617ee645dd322c;hb=911d2706a86d326786bfe721dcc3d63aeade7f28;hp=f8233a6a4c6ec325a900d0b148b61bbc7153ab93;hpb=d62963b4a64efe8d2917f489fefaf586a9a99126;p=bertos.git diff --git a/bertos/drv/eeprom.h b/bertos/drv/eeprom.h index f8233a6a..5bd834af 100644 --- a/bertos/drv/eeprom.h +++ b/bertos/drv/eeprom.h @@ -30,38 +30,67 @@ * All Rights Reserved. * --> * - * \brief Driver for the 24xx16 and 24xx256 I2C EEPROMS (interface) - * - * \version $Id$ + * \brief Driver for the 24xx16 and 24xx256 I2C EEPROMS. * * \author Stefano Fedrigo - * \author Bernardo Innocenti + * \author Bernie Innocenti * + * $WIZ$ module_name = "eeprom" + * $WIZ$ module_depends = "kfile", "i2c" */ #ifndef DRV_EEPROM_H #define DRV_EEPROM_H -#include #include +#include + + +/** + * Values for Eeprom types. + */ +typedef enum EepromType +{ + EEPROM_24XX08, + EEPROM_24XX16, + EEPROM_24XX256, + EEPROM_24XX512, + EEPROM_24XX1024, + EEPROM_CNT, +} EepromType; + +/** + * On the same I2C bus can live more than one EEPROM + * device. Each device can be addressed by one or more + * pins. + */ +typedef uint8_t e2dev_addr_t; + +/** + * Describe an EEPROM context, used by the driver to + * access the single device. + */ +typedef struct Eeprom +{ + KFile fd; ///< File descriptor. + EepromType type; ///< EEPROM type + e2dev_addr_t addr; ///< Device address. +} Eeprom; + /** - * \name Values for CONFIG_EEPROM_TYPE - * \{ + * ID for eeproms. */ -#define EEPROM_24XX16 1 -#define EEPROM_24XX256 2 -/*\}*/ - -#if CONFIG_EEPROM_TYPE == EEPROM_24XX16 - #define EEPROM_BLKSIZE 0x10 ///< Eeprom block size (16byte) - #define EEPROM_SIZE 0x800 ///< Eeprom total size (2kB) -#elif CONFIG_EEPROM_TYPE == EEPROM_24XX256 - #define EEPROM_BLKSIZE 0x40 ///< Eeprom block size (64byte) - #define EEPROM_SIZE 0x8000 ///< Eeprom total size (32kB) -#else - #error Unsupported EEPROM type. -#endif +#define KFT_EEPROM MAKE_ID('E', 'E', 'P', 'R') + +/** + * Convert + ASSERT from generic KFile to Eeprom. + */ +INLINE Eeprom * EEPROM_CAST(KFile *fd) +{ + ASSERT(fd->_type == KFT_EEPROM); + return (Eeprom *)fd; +} /// Type for EEPROM addresses typedef uint16_t e2addr_t; @@ -77,13 +106,29 @@ typedef uint16_t e2addr_t; */ #define e2addr(type, field) ((e2addr_t)&(((type *)0)->field)) +/** + * Type for EEPROM block size. + */ +typedef uint16_t e2blk_size_t; + +/** + * Type for accessing EEPROM whole size. + */ +typedef uint32_t e2_size_t; + +/** + * Descrive all EEPROM informations + * needed by the driver. + */ +typedef struct EepromInfo +{ + bool has_dev_addr; ///< true if memory is device addressable (its A0, A1, A2 pin are used by memory). + e2blk_size_t blk_size; ///< block size + e2_size_t e2_size; ///< eeprom size +} EepromInfo; -bool eeprom_write(e2addr_t addr, const void *buf, size_t count); -bool eeprom_read(e2addr_t addr, void *buf, size_t count); -bool eeprom_write_char(e2addr_t addr, char c); -int eeprom_read_char(e2addr_t addr); -void eeprom_erase(e2addr_t addr, size_t count); -void eeprom_init(void); -void eeprom_test(void); +bool eeprom_erase(Eeprom *fd, e2addr_t addr, e2_size_t count); +bool eeprom_verify(Eeprom *fd, const void *buf, size_t count); +void eeprom_init(Eeprom *fd, EepromType, e2dev_addr_t, bool verify); #endif /* DRV_EEPROM_H */