dataflash.h
Go to the documentation of this file.
00001
00045 #ifndef DRV_DATAFLASH_H
00046 #define DRV_DATAFLASH_H
00047 
00048 #include <cfg/compiler.h>
00049
00050 #include <io/kfile.h>
00051 #include <fs/battfs.h>
00052
00057 typedef uint32_t dataflash_page_t;
00058 typedef uint32_t dataflash_offset_t;
00059 typedef uint32_t dataflash_size_t;
00060 /*\}*/
00061
00065 typedef void (dataflash_setReset_t)(bool);
00066 typedef void (dataflash_setCS_t)(bool);
00067
00076 typedef enum DataflashType
00077 {
00078     DFT_AT45DB041B = 0,
00079     DFT_AT45DB081D,
00080     DFT_AT45DB161D,
00081     DFT_AT45DB642D,
00082     DFT_CNT
00083 } DataflashType;
00084
00085
00089 typedef struct DataFlash
00090 {
00091     KFile fd;
00092     KFile *channel;
00093     DataflashType dev;
00094     dataflash_page_t current_page;
00095     bool page_dirty;
00096     dataflash_setReset_t *setReset;
00097     dataflash_setCS_t *setCS;
00098 } DataFlash;
00099
00103 #define KFT_DATAFLASH MAKE_ID('D', 'F', 'L', 'H')
00104 
00108 INLINE DataFlash * DATAFLASH_CAST(KFile *fd)
00109 {
00110     ASSERT(fd->_type == KFT_DATAFLASH);
00111     return (DataFlash *)fd;
00112 }
00113
00114 #define RESET_PULSE_WIDTH     10 ///< Width of reset pulse in usec.
00115 #define BUSY_BIT            0x80 ///< Select a busy bit in status register.
00116 #define CMP_BIT             0x40 ///< Select a compare bit in status register.
00117 
00123 #define GET_ID_DESITY_DEVICE(reg_stat) (((reg_stat) & 0x3C) >> 2)
00124 
00128 typedef enum DataFlashOpcode {
00133     DFO_READ_FLASH_MEM_BYTE_D  = 0x0B,
00134     DFO_READ_FLASH_MEM_BYTE_B  = 0xE8,
00135
00136     DFO_READ_FLASH_MEM       = 0xD2,
00137     DFO_READ_BUFF1           = 0xD4,
00138     DFO_READ_BUFF2           = 0xD6,
00139     /* \}*/
00140
00145     DFO_WRITE_BUFF1          =  0x84,
00146     DFO_WRITE_BUFF2          =  0x87,
00147     DFO_WRITE_BUFF1_TO_MEM_E =  0x83,
00148     DFO_WRITE_BUFF2_TO_MEM_E =  0x86,
00149     DFO_WRITE_BUFF1_TO_MEM   =  0x88,
00150     DFO_WRITE_BUFF2_TO_MEM   =  0x89,
00151     DFO_ERASE_PAGE           =  0x81,
00152     DFO_ERASE_BLOCK          =  0x50,
00153     DFO_ERASE_SECTOR         =  0x7C,
00154     DFO_WRITE_MEM_TR_BUFF1   =  0x82,
00155     DFO_WRITE_MEM_TR_BUFF2   =  0x85,
00156     /* \}*/
00157
00162     DFO_MOV_MEM_TO_BUFF1     =  0x53,
00163     DFO_MOV_MEM_TO_BUFF2     =  0x55,
00164     DFO_CMP_MEM_TO_BUFF1     =  0x60,
00165     DFO_CMP_MEM_TO_BUFF2     =  0x61,
00166     DFO_ARW_MEM_TR_BUFF1     =  0x58,
00167     DFO_ARW_MEM_TR_BUFF2     =  0x59,
00168     DFO_PWR_DOWN             =  0xB9,
00169     DFO_RESUME_PWR_DOWN      =  0xAB,
00170     DFO_READ_STATUS          =  0xD7,
00171     DFO_ID_DEV               =  0x9F
00172     /* \}*/
00173 } DataFlashOpcode;
00174
00175
00179 typedef struct DataflashInfo
00180 {
00181     uint8_t density_id;
00182     dataflash_size_t page_size;
00183     uint8_t page_bits;
00184     uint16_t page_cnt;
00185     DataFlashOpcode read_cmd;
00186 } DataflashInfo;
00187
00188
00189 bool dataflash_init(DataFlash *fd, KFile *ch, DataflashType type, dataflash_setCS_t *setCS, dataflash_setReset_t *setReset);
00190 bool dataflash_diskInit(struct BattFsSuper *d, DataFlash *fd, pgcnt_t *page_array);
00191
00199 int dataflash_testSetup(void);
00200 /* For backward compatibility */
00201 #define dataflash_testSetUp() dataflash_testSetup()
00202 int dataflash_testRun(void);
00203 int dataflash_testTearDown(void);
00204
00205 #endif /* DRV_DATAFLASH_H */