uffs_tree.h

Go to the documentation of this file.
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     //u8 pagID;     //not used in this version, where only one dir on one block, and always pageID = 0
00033     //u8 ofs;
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 //UFFS TreeNode (16 bytes)
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 //TODO: UFFS2 Tree structures
00068 /*
00069 struct fdataSt {
00070     u32 len;
00071 };
00072 
00073 struct filebSt {
00074     u16 bls;        //how many blocks this file contents ...
00075     u8 offs;        //the offset of this file header on FILE block
00076     u8 sum;         //short sum of file name
00077 };
00078 
00079 //Extra data structure for storing file length information
00080 struct filehSt {
00081     u32 len;
00082 };
00083 
00084 //UFFS2 TreeNode (12 bytes)
00085 typedef struct uffs_treeNodeSt {
00086     u16 nextIdx;
00087     u16 block;
00088     u16 father;
00089     u16 serial;
00090     union {
00091         struct filehSt h;
00092         struct filedSt file;
00093         struct data;
00094     } u;
00095 } TreeNode;
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 

Generated on Sat Mar 17 15:45:44 2007 for uffs-doc by  doxygen 1.5.0