00001 00007 #include "uffs/uffs_types.h" 00008 #include "uffs/uffs_public.h" 00009 #include "uffs/uffs_config.h" 00010 #include "uffs/uffs_tree.h" 00011 #include "uffs/uffs_fs.h" 00012 #include "uffs/uffs_badblock.h" 00013 #include <string.h> 00014 00015 #define PFX "init:" 00016 00017 URET uffs_InitDevice(uffs_Device *dev) 00018 { 00019 URET ret; 00020 00021 memset(&(dev->st), 0, sizeof(uffs_stat)); 00022 uffs_InitBadBlock(dev); 00023 00024 if(uffs_InitFlashClass(dev) != U_SUCC) { 00025 uffs_Perror(UFFS_ERR_SERIOUS, PFX"Can't initialize flash class!\n"); 00026 } 00027 00028 uffs_Perror(UFFS_ERR_NOISY, PFX"init page buf\n"); 00029 ret = uffs_BufInit(dev, MAX_PAGE_BUFFERS, MAX_DIRTY_PAGES_IN_A_BLOCK); 00030 if(ret != U_SUCC) { 00031 uffs_Perror(UFFS_ERR_DEAD, PFX"Initialize page buffers fail\n"); 00032 return U_FAIL; 00033 } 00034 uffs_Perror(UFFS_ERR_NOISY, PFX"init block info cache\n"); 00035 ret = uffs_InitBlockInfoCache(dev, MAX_CACHED_BLOCK_INFO); 00036 if(ret != U_SUCC) { 00037 uffs_Perror(UFFS_ERR_DEAD, PFX"Initialize block info fail\n"); 00038 return U_FAIL; 00039 } 00040 00041 ret = uffs_InitTreeBuf(dev); 00042 if(ret != U_SUCC) { 00043 uffs_Perror(UFFS_ERR_SERIOUS, PFX"fail to init tree buffers\n"); 00044 return U_FAIL; 00045 } 00046 00047 ret = uffs_BuildTree(dev); 00048 if(ret != U_SUCC) { 00049 uffs_Perror(UFFS_ERR_SERIOUS, PFX"fail to build tree\n"); 00050 return U_FAIL; 00051 } 00052 00053 return U_SUCC; 00054 } 00055 00056 URET uffs_ReleaseDevice(uffs_Device *dev) 00057 { 00058 URET ret; 00059 00060 ret = uffs_ReleaseBlockInfoCache(dev); 00061 if(ret != U_SUCC) { 00062 uffs_Perror(UFFS_ERR_SERIOUS, PFX "fail to release block info.\n"); 00063 return U_FAIL; 00064 } 00065 00066 ret = uffs_BufReleaseAll(dev); 00067 if(ret != U_SUCC) { 00068 uffs_Perror(UFFS_ERR_SERIOUS, PFX "fail to release page buffers\n"); 00069 return U_FAIL; 00070 } 00071 00072 ret = uffs_ReleaseTreeBuf(dev); 00073 if(ret != U_SUCC) { 00074 uffs_Perror(UFFS_ERR_SERIOUS, PFX"fail to release tree buffers!\n"); 00075 return U_FAIL; 00076 } 00077 00078 return ret; 00079 00080 } 00081 00082 URET uffs_initMountTable(struct uffs_mountTableSt *tbl) 00083 { 00084 struct uffs_mountTableSt *work; 00085 00086 uffs_InitObjectBuf(); 00087 00088 for(work = tbl; work->dev != NULL; work++) { 00089 if(work->dev->Init(work->dev) == U_FAIL) { 00090 return U_FAIL; 00091 } 00092 00093 work->dev->par.start = work->startBlock; 00094 if(work->endBlock < 0) { 00095 work->dev->par.end = work->dev->attr.total_blocks + work->endBlock; 00096 } 00097 else { 00098 work->dev->par.end = work->endBlock; 00099 } 00100 uffs_Perror(UFFS_ERR_NOISY, PFX"mount partiton: %d,%d\n", 00101 work->dev->par.start, work->dev->par.end); 00102 uffs_InitDevice(work->dev); 00103 } 00104 return U_SUCC; 00105 } 00106 00107 URET uffs_releaseMountTable(struct uffs_mountTableSt *tbl) 00108 { 00109 struct uffs_mountTableSt *work; 00110 for(work = tbl; work->dev != NULL; work++) { 00111 uffs_ReleaseDevice(work->dev); 00112 work->dev->Release(work->dev); 00113 } 00114 return U_SUCC; 00115 } 00116