00001 #ifndef _UFFS_TREE_H_
00002 #define _UFFS_TREE_H_
00003
00004 #include "uffs/uffs_types.h"
00005 #include "uffs/ubuffer.h"
00006
00007 #ifdef __cplusplus
00008 extern "C"{
00009 #endif
00010
00011
00012
00013 #define UFFS_TYPE_DIR 0
00014 #define UFFS_TYPE_FILE 1
00015 #define UFFS_TYPE_DATA 2
00016 #define UFFS_TYPE_RESV 3
00017
00018
00019 #define SERIAL_ROOT_DIR 0
00020
00021 struct blocklistSt {
00022 struct uffs_treeNodeSt * next;
00023 struct uffs_treeNodeSt * prev;
00024 u16 block;
00025 };
00026
00027 struct dirhSt {
00028 u16 checkSum;
00029 u16 block;
00030 u16 father;
00031 u16 serial;
00032
00033
00034 };
00035
00036
00037 struct filehSt {
00038 u16 block;
00039 u16 checkSum;
00040 u16 father;
00041 u16 serial;
00042 u32 len;
00043 };
00044
00045 struct fdataSt {
00046 u16 block;
00047 u16 father;
00048 u16 serial;
00049 u16 len;
00050 };
00051
00052
00053 typedef struct uffs_treeNodeSt {
00054 union {
00055 struct blocklistSt list;
00056 struct dirhSt dir;
00057 struct filehSt file;
00058 struct fdataSt data;
00059 } u;
00060 u16 hashNext;
00061 #ifdef TREE_NODE_USE_DOUBLE_LINK
00062 u16 hashPrev;
00063 #endif
00064 } TreeNode;
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 #define EMPTY_NODE 0xffff
00101
00102 #define ROOT_DIR_ID 0
00103
00104
00105 #define MAX_UFFS_SERIAL 0xfffe
00106 #define INVALID_UFFS_SERIAL 0xffff
00107
00108 #define DIR_NODE_HASH_MASK 0x1f
00109 #define DIR_NODE_ENTRY_LEN (DIR_NODE_HASH_MASK + 1)
00110
00111 #define FILE_NODE_HASH_MASK 0x3f
00112 #define FILE_NODE_ENTRY_LEN (FILE_NODE_HASH_MASK + 1)
00113
00114 #define DATA_NODE_HASH_MASK 0x1ff
00115 #define DATA_NODE_ENTRY_LEN (DATA_NODE_HASH_MASK + 1)
00116 #define FROM_IDX(idx, dis) ((TreeNode *)uBufGetBufByIndex(idx, dis))
00117 #define TO_IDX(p, dis) ((u16)uBufGetIndex((void *)p, dis))
00118
00119
00120 #define GET_FILE_HASH(serial) (serial & FILE_NODE_HASH_MASK)
00121 #define GET_DIR_HASH(serial) (serial & DIR_NODE_HASH_MASK)
00122 #define GET_DATA_HASH(father, serial) ((father + serial) & DATA_NODE_HASH_MASK)
00123
00124
00125 struct uffs_treeSt {
00126 TreeNode *erased;
00127 TreeNode *erased_tail;
00128 int erasedCount;
00129 TreeNode *bad;
00130 int badCount;
00131 u16 dirEntry[DIR_NODE_ENTRY_LEN];
00132 u16 fileEntry[FILE_NODE_ENTRY_LEN];
00133 u16 dataEntry[DATA_NODE_ENTRY_LEN];
00134 struct ubufm dis;
00135 u16 maxSerialNo;
00136 };
00137
00138
00139 URET uffs_InitTreeBuf(uffs_Device *dev);
00140 URET uffs_ReleaseTreeBuf(uffs_Device *dev);
00141 URET uffs_BuildTree(uffs_Device *dev);
00142 u16 uffs_FindFreeFsnSerial(uffs_Device *dev);
00143 TreeNode * uffs_FindFileNodeFromTree(uffs_Device *dev, u16 serial);
00144 TreeNode * uffs_FindFileNodeFromTreeWithFather(uffs_Device *dev, u16 father);
00145 TreeNode * uffs_FindDirNodeFromTree(uffs_Device *dev, u16 serial);
00146 TreeNode * uffs_FindDirNodeFromTreeWithFather(uffs_Device *dev, u16 father);
00147 TreeNode * uffs_FindFileNodeByName(uffs_Device *dev, const char *name, u32 len, u16 sum, u16 father);
00148 TreeNode * uffs_FindDirNodeByName(uffs_Device *dev, const char *name, u32 len, u16 sum, u16 father);
00149 TreeNode * uffs_FindDataNode(uffs_Device *dev, u16 father, u16 serial);
00150
00151
00152 TreeNode * uffs_FindDirNodeByBlock(uffs_Device *dev, u16 block);
00153 TreeNode * uffs_FindFileNodeByBlock(uffs_Device *dev, u16 block);
00154 TreeNode * uffs_FindDataNodeByBlock(uffs_Device *dev, u16 block);
00155 TreeNode * uffs_FindErasedNodeByBlock(uffs_Device *dev, u16 block);
00156 TreeNode * uffs_FindBadNodeByBlock(uffs_Device *dev, u16 block);
00157
00158 #define SEARCH_REGION_DIR 1
00159 #define SEARCH_REGION_FILE 2
00160 #define SEARCH_REGION_DATA 4
00161 #define SEARCH_REGION_BAD 8
00162 #define SEARCH_REGION_ERASED 16
00163 TreeNode * uffs_FindNodeByBlock(uffs_Device *dev, u16 block, int *region);
00164
00165
00166
00167 UBOOL uffs_CompareFileNameWithTreeNode(uffs_Device *dev, const char *name, u32 len, u16 sum, TreeNode *node, int type);
00168
00169 TreeNode * uffs_GetErased(uffs_Device *dev);
00170
00171 void uffs_InsertNodeToTree(uffs_Device *dev, u8 type, TreeNode *node);
00172 void uffs_InsertToErasedListHead(uffs_Device *dev, TreeNode *node);
00173 void uffs_InsertToErasedListTail(uffs_Device *dev, TreeNode *node);
00174 void uffs_InsertToBadBlockList(uffs_Device *dev, TreeNode *node);
00175
00176 void uffs_BreakFromEntry(uffs_Device *dev, u8 type, TreeNode *node);
00177
00178 void uffs_SetTreeNodeBlock(u8 type, TreeNode *node, u16 block);
00179
00180
00181
00182
00183
00184
00185 #ifdef __cplusplus
00186 }
00187 #endif
00188
00189
00190
00191 #endif
00192
00193