dataflash.h

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