Move kfile interface to the io/ directory.
[bertos.git] / bertos / drv / eeprom.h
index f8233a6a4c6ec325a900d0b148b61bbc7153ab93..5bd834af6441222c4db44c0968617ee645dd322c 100644 (file)
  * 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 <aleph@develer.com>
- * \author Bernardo Innocenti <bernie@develer.com>
+ * \author Bernie Innocenti <bernie@codewiz.org>
  *
+ * $WIZ$ module_name = "eeprom"
+ * $WIZ$ module_depends = "kfile", "i2c"
  */
 
 #ifndef DRV_EEPROM_H
 #define DRV_EEPROM_H
 
-#include <cfg/cfg_eeprom.h>
 #include <cfg/compiler.h>
 
+#include <io/kfile.h>
+
+
+/**
+ * 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 */