00001
00007 #ifndef UFFS_DEVICE_H
00008 #define UFFS_DEVICE_H
00009
00010
00011 #include "uffs/uffs_types.h"
00012 #include "uffs/uffs_config.h"
00013 #include "uffs/uffs_buf.h"
00014 #include "uffs/uffs_blockInfo.h"
00015 #include "uffs/ubuffer.h"
00016 #include "uffs/uffs_tree.h"
00017 #include "uffs/uffs_mem.h"
00018
00019 #ifdef __cplusplus
00020 extern "C"{
00021 #endif
00022
00023
00028 struct uffs_FlashOpsSt {
00029 URET (*LoadPageSpare)(uffs_Device *dev, int block, int page, uffs_Tags *tag);
00030 URET (*WritePageSpare)(uffs_Device *dev, int block, int page, uffs_Tags *tag);
00031 URET (*MakePageValid)(uffs_Device *dev, int block, int page, uffs_Tags *tag);
00032 int (*GetEccSize)(uffs_Device *dev);
00033 void (*MakeEcc)(uffs_Device *dev, void *data, void *ecc);
00034 int (*EccCollect)(uffs_Device *dev, void *data, void *read_ecc, const void *test_ecc);
00035 UBOOL (*IsBlockBad)(uffs_Device *dev, uffs_blockInfo *bc);
00036 URET (*MakeBadBlockMark)(uffs_Device *dev, int block);
00037 };
00038
00043 struct uffs_FlashClassSt {
00044 const char *className;
00045 int maker;
00046 int *id_list;
00047 struct uffs_FlashOpsSt *flash;
00048 };
00049
00054 struct uffs_DeviceOpsSt {
00055 URET (*Reset)(uffs_Device *dev);
00056 UBOOL (*IsBlockBad)(uffs_Device *dev, u32 block);
00057 URET (*EraseBlock)(uffs_Device *dev, u32 block);
00058 URET (*WritePage)(uffs_Device *dev, u32 block, u32 pageNum, const u8 *page, const u8 *spare);
00059 URET (*WritePageData)(uffs_Device *dev, u32 block, u32 pageNum, const u8 *page, int ofs, int len);
00060 URET (*WritePageSpare)(uffs_Device *dev, u32 block, u32 pageNum, const u8 *spare, int ofs, int len);
00061 URET (*ReadPage)(uffs_Device *dev, u32 block, u32 pageNum, u8 *page, u8 *spare);
00062 URET (*ReadPageData)(uffs_Device *dev, u32 block, u32 pageNum, u8 *page, int ofs, int len);
00063 URET (*ReadPageSpare)(uffs_Device *dev, u32 block, u32 pageNum, u8 *spare, int ofs, int len);
00064 };
00065
00066
00067
00069 #define UFFS_DEV_NULL 0
00070 #define UFFS_DEV_NAND 1
00071 #define UFFS_DEV_SM 2
00072 #define UFFS_DEV_RAM 3
00073 #define UFFS_DEV_ROM 4
00074 #define UFFS_DEV_EMU 5
00075
00076
00081 struct uffs_storageAttrSt {
00082 u32 dev_type;
00083 int maker;
00084 int id;
00085 u32 total_blocks;
00086 u32 block_data_size;
00087 u16 page_data_size;
00088 u16 spare_size;
00089 u16 pages_per_block;
00090 };
00091
00092
00097 struct uffs_blockInfoCacheSt {
00098 uffs_blockInfo *head;
00099 uffs_blockInfo *tail;
00100 int maxBlockCached;
00101 void *internalBufHead;
00102 };
00103
00108 struct uffs_partitionSt {
00109 u16 start;
00110 u16 end;
00111 };
00112
00117 struct uffs_lockSt {
00118 u32 sem;
00119 u32 task_id;
00120 };
00121
00125 struct uffs_pageBufsSt {
00126 uffs_Buf *bufHead;
00127 uffs_Buf *bufTail;
00128 uffs_Buf *dirty;
00129 int maxBuf;
00130 int maxDirtyBuf;
00131 int dirtyCount;
00132 void *pool;
00133 };
00134
00135
00141 struct uffs_commInfoSt {
00142 u32 pgDataSize;
00143 u32 eccSize;
00144 u32 pgSize;
00145 };
00146
00147
00148 struct uffs_newBadBlockSt {
00149 u16 block;
00150 };
00151
00153 typedef struct {
00154 int blockEraseCount;
00155 int pageWriteCount;
00156 int pageReadCount;
00157 int spareWriteCount;
00158 int spareReadCount;
00159 } uffs_stat;
00160
00161
00167 struct uffs_DeviceSt {
00168 URET (*Init)(uffs_Device *dev);
00169 URET (*Release)(uffs_Device *dev);
00170 void *private;
00171
00172 struct uffs_storageAttrSt attr;
00173 struct uffs_partitionSt par;
00174 struct uffs_FlashOpsSt *flash;
00175 struct uffs_DeviceOpsSt *ops;
00176 struct uffs_blockInfoCacheSt bc;
00177 struct uffs_lockSt lock;
00178 struct uffs_pageBufsSt buf;
00179 struct uffs_commInfoSt com;
00180 struct uffs_treeSt tree;
00181 struct uffs_newBadBlockSt bad;
00182 uffs_stat st;
00183 struct uffs_memAllocatorSt *mem;
00184 u32 refCount;
00185 };
00186
00187 URET uffs_DeviceInitLock(uffs_Device *dev);
00188 URET uffs_DeviceLock(uffs_Device *dev);
00189 URET uffs_DeviceUnLock(uffs_Device *dev);
00190 uffs_Device * uffs_GetDevice(const char *mountPoint);
00191 const char * uffs_GetDeviceMountPoint(uffs_Device *dev);
00192 void uffs_PutDevice(uffs_Device *dev);
00193
00194
00195
00196 #ifdef __cplusplus
00197 }
00198 #endif
00199
00200
00201 #endif
00202