00001
00007 #ifndef UFFS_PUBLIC_H
00008 #define UFFS_PUBLIC_H
00009
00010 #include "uffs/uffs_types.h"
00011 #include "uffs/uffs_config.h"
00012
00013 #ifdef __cplusplus
00014 extern "C"{
00015 #endif
00016
00017
00025 struct uffs_TagsSt {
00026 u8 dirty:1;
00027 u8 valid:1;
00028 u8 type:4;
00029 u8 blockTimeStamp:2;
00030
00031 u8 pageID;
00032 u16 father;
00033 u16 serial;
00034
00035 u16 dataLength;
00036 u16 dataSum;
00037 u8 checkSum;
00038 u8 blockStatus;
00039
00040 };
00041
00043 #define TAG_VALID 0
00044 #define TAG_INVALID 1
00045
00047 #define TAG_DIRTY 0
00048 #define TAG_CLEAR 1
00049
00050
00051 int uffs_GetFirstBlockTimeStamp(void);
00052 int uffs_GetNextBlockTimeStamp(int prev);
00053 UBOOL uffs_IsSrcNewerThanObj(int src, int obj);
00054
00055
00056
00061 #define MAX_FILENAME_LENGTH 128
00062
00063 #define FILE_ATTR_DIR (1 << 24)
00064 #define FILE_ATTR_WRITE (1 << 0)
00065
00066
00068 struct uffs_fileInfoSt {
00069 u32 attr;
00070 u32 createTime;
00071 u32 lastModify;
00072 u32 access;
00073 u32 reserved;
00074 u32 name_len;
00075 char name[MAX_FILENAME_LENGTH];
00076 };
00077
00078 typedef struct uffs_fileInfoSt uffs_fileInfo;
00079
00080 #include "uffs_device.h"
00081
00082
00083
00084 #define UFFS_DISK_MARK 0x53464655 //'UFFS'
00085 #define UFFS_DISK_INFO_SIZE 64
00086 #define UFFS_PARTITION_INFO_SIZE 32
00087
00088
00089
00090
00091 struct uffs_DiskInfoSt {
00092 u32 uffs_mark;
00093 u32 version;
00094 u32 reserved[16];
00095 u32 status;
00096 u32 partitions;
00097 u32 alternate;
00098 };
00099
00100 struct uffs_PartitionInfoSt {
00101 u32 status;
00102 u32 createTime;
00103 u32 lastModified;
00104 u32 block_begin;
00105 u32 block_end;
00106 u32 access;
00107 };
00108
00109
00110 struct uffs_StorageSt {
00111 int mainBlock;
00112 struct uffs_DiskInfoSt main;
00113 int partsNum;
00114 struct uffs_PartitionInfoSt *parts;
00115 };
00116
00117
00118 typedef struct uffs_mountTableSt {
00119 uffs_Device *dev;
00120 int startBlock;
00121 int endBlock;
00122 char *mountPoint;
00123 } uffs_mountTable;
00124
00125
00126
00127 #define UFFS_ERR_NOISY -1
00128 #define UFFS_ERR_NORMAL 0
00129 #define UFFS_ERR_SERIOUS 1
00130 #define UFFS_ERR_DEAD 2
00131
00132
00133 #define UFFS_DBG_LEVEL UFFS_ERR_NOISY
00134
00135 void uffs_Perror( int level, const char *errFmt, ... );
00136
00137
00138
00139 URET uffs_LoadPageSpare(uffs_Device *dev, int block, int page, uffs_Tags *tag);
00140 URET uffs_WritePageSpare(uffs_Device *dev, int block, int page, uffs_Tags *tag);
00141 URET uffs_MakePageValid(uffs_Device *dev, int block, int page, uffs_Tags *tag);
00142 UBOOL uffs_IsBlockBad(uffs_Device *dev, uffs_blockInfo *bc);
00143
00144
00149 #define UFFS_ALL_PAGES (0xffff)
00150
00155 #define UFFS_INVALID_PAGE (0xfffe)
00156 #define UFFS_INVALID_BLOCK (0xfffe)
00157
00158 #define UFFS_INVALID_SERIAL 0xffff
00159
00160
00161 URET uffs_NewBlock(uffs_Device *dev, u16 block, uffs_Tags *tag, uffs_Buf *buf);
00162 URET uffs_BlockRecover(uffs_Device *dev, uffs_blockInfo *old, u16 newBlock);
00163 URET uffs_PageRecover(uffs_Device *dev,
00164 uffs_blockInfo *bc,
00165 u16 oldPage,
00166 u16 newPage,
00167 uffs_Buf *buf);
00168 int uffs_FindFreePageInBlock(uffs_Device *dev, uffs_blockInfo *bc);
00169 u8 uffs_CalTagCheckSum(uffs_Tags *tag);
00170 u16 uffs_FindBestPageInBlock(uffs_Device *dev, uffs_blockInfo *bc, u16 page);
00171 u16 uffs_FindFirstValidPage(uffs_Device *dev, uffs_blockInfo *bc);
00172 u16 uffs_FindFirstFreePage(uffs_Device *dev, uffs_blockInfo *bc, u16 pageFrom);
00173 u16 uffs_FindPageInBlockWithPageId(uffs_Device *dev, uffs_blockInfo *bc, u16 pageID);
00174
00175 u8 uffs_MakeSum8(void *p, int len);
00176 u16 uffs_MakeSum16(void *p, int len);
00177 URET uffs_CreateNewFile(uffs_Device *dev, u16 father, u16 serial, uffs_blockInfo *bc, uffs_fileInfo *fi);
00178
00179 int uffs_GetBlockFileDataLength(uffs_Device *dev, uffs_blockInfo *bc, u8 type);
00180 UBOOL uffs_IsPageErased(uffs_Device *dev, uffs_blockInfo *bc, u16 page);
00181 int uffs_GetFreePagesCount(uffs_Device *dev, uffs_blockInfo *bc);
00182 UBOOL uffs_IsDataBlockReguFull(uffs_Device *dev, uffs_blockInfo *bc);
00183
00184 int uffs_GetBlockTimeStamp(uffs_Device *dev, uffs_blockInfo *bc);
00185
00186 URET uffs_WriteDataToNewPage(uffs_Device *dev,
00187 u16 block,
00188 u16 page,
00189 uffs_Tags *tag,
00190 uffs_Buf *buf);
00191
00192
00193 int uffs_GetDeviceUsed(uffs_Device *dev);
00194 int uffs_GetDeviceFree(uffs_Device *dev);
00195 int uffs_GetDeviceTotal(uffs_Device *dev);
00196
00197
00198
00199
00200
00201
00202
00203 URET uffs_InitDevice(uffs_Device *dev);
00204 URET uffs_ReleaseDevice(uffs_Device *dev);
00205 URET uffs_initMountTable(struct uffs_mountTableSt *tbl);
00206 URET uffs_releaseMountTable(struct uffs_mountTableSt *tbl);
00207
00208 URET uffs_InitFlashClass(uffs_Device *dev);
00209
00210
00211
00212
00213 uffs_mountTable * uffs_GetMountTable(void);
00214
00215
00216 #ifdef __cplusplus
00217 }
00218 #endif
00219
00220
00221
00222 #endif