2 #include "nvitem_common.h"
\r
3 #include "nvitem_os.h"
\r
4 #include "nvitem_config.h"
\r
5 #include "nvitem_buf.h"
\r
6 #include "nvitem_fs.h"
\r
10 uint8* diskbuf; // ramdisk buf
\r
11 uint32 dirty[RAMNV_DIRTYTABLE_MAXSIZE]; // dirty bits, one bits indicate one sect
\r
16 // disk partition id
\r
18 uint32 sctNum; // total number of sector in current disk
\r
20 _RAMNV_BUF_CTRL fromChannel;
\r
21 _RAMNV_BUF_CTRL backup;
\r
22 _RAMNV_BUF_CTRL toDisk;
\r
24 RAMDISK_HANDLE fdhandle;
\r
30 _RAMNV_PART_CTRL part[RAMNV_NUM];
\r
33 static _RAMNV_CTL ramNvCtl;
\r
36 //----------------------------
\r
37 // init buffer module
\r
38 //----------------------------
\r
42 const RAM_NV_CONFIG* config;
\r
44 ramNvCtl.partNum = 0;
\r
45 for(i = 0; i < RAMNV_NUM; i++)
\r
47 ramNvCtl.part[i].sctNum = 0;
\r
48 for(k = 0; k < RAMNV_DIRTYTABLE_MAXSIZE; k++)
\r
50 ramNvCtl.part[i].fromChannel.dirty[k] = 0;
\r
51 ramNvCtl.part[i].backup.dirty[k] = 0;
\r
52 ramNvCtl.part[i].toDisk.dirty[k] = 0;
\r
56 config = ramDisk_Init();
\r
59 while(config->partId)
\r
61 //------------------------------------------------------------
\r
62 ramNvCtl.part[i].fdhandle = ramDisk_Open(config->partId);
\r
63 //------------------------------------------------------------
\r
64 if(0 == ramNvCtl.part[i].fdhandle)
\r
69 ramNvCtl.part[i].partId = config->partId;
\r
70 ramNvCtl.part[i].sctNum = config->image_size/RAMNV_SECT_SIZE;
\r
71 ramNvCtl.part[i].fromChannel.diskbuf = malloc(config->image_size+512);
\r
72 ramNvCtl.part[i].backup.diskbuf = malloc(config->image_size+512);
\r
73 ramNvCtl.part[i].toDisk.diskbuf = malloc(config->image_size+512);
\r
75 memset(ramNvCtl.part[i].fromChannel.diskbuf, 0, config->image_size);
\r
77 //------------------------------------------------------------
\r
78 if(!ramDisk_Read(ramNvCtl.part[i].fdhandle, ramNvCtl.part[i].fromChannel.diskbuf, config->image_size))
\r
79 //------------------------------------------------------------
\r
81 free(ramNvCtl.part[i].fromChannel.diskbuf);
\r
82 free(ramNvCtl.part[i].backup.diskbuf);
\r
83 free(ramNvCtl.part[i].toDisk.diskbuf);
\r
87 memcpy(ramNvCtl.part[i].backup.diskbuf,ramNvCtl.part[i].fromChannel.diskbuf,config->image_size+512);
\r
88 memcpy(ramNvCtl.part[i].toDisk.diskbuf,ramNvCtl.part[i].fromChannel.diskbuf,config->image_size+512);
\r
96 //----------------------------
\r
97 // uninit buffer module
\r
98 //----------------------------
\r
99 void uninitBuf(void)
\r
103 for(i = 0; i < ramNvCtl.partNum; i++)
\r
105 ramDisk_Close(ramNvCtl.part[i].fdhandle);
\r
106 ramNvCtl.part[i].sctNum = 0;
\r
107 // for(k = 0; k < RAMNV_DIRTYTABLE_MAXSIZE; k++)
\r
109 // ramNvCtl.part[i].fromChannel.dirty[k] = 0;
\r
110 // ramNvCtl.part[i].backup.dirty[k] = 0;
\r
111 // ramNvCtl.part[i].toDisk.dirty[k] = 0;
\r
113 if(ramNvCtl.part[i].fromChannel.diskbuf) {free(ramNvCtl.part[i].fromChannel.diskbuf);}
\r
114 if(ramNvCtl.part[i].backup.diskbuf) {free(ramNvCtl.part[i].backup.diskbuf);}
\r
115 if(ramNvCtl.part[i].toDisk.diskbuf) {free(ramNvCtl.part[i].toDisk.diskbuf);}
\r
117 ramNvCtl.partNum = 0;
\r
120 //----------------------------
\r
121 // partId to index of control array
\r
122 //----------------------------
\r
123 uint32 getCtlId(uint32 partId)
\r
127 for(i = 0; i < ramNvCtl.partNum; i++)
\r
129 if(partId == ramNvCtl.part[i].partId)
\r
136 //----------------------------
\r
137 // to "fromChannel" buffer
\r
139 //----------------------------
\r
141 #define _U32MASK ((uint32)(-1)) // 0xFFFFFFFF
\r
142 #define _DIRTY_TABLE (ramNvCtl.part[id].fromChannel.dirty)
\r
143 void _markDirtyInfo(uint32 id, /*IN*/uint32 start, /*IN*/uint32 scts)
\r
148 _bytes = start >> 5; // _bytes = start/32;
\r
149 _bits = start - (_bytes<<5); // _bits = start%32;
\r
151 while((32-_bits) < scts)
\r
153 _DIRTY_TABLE[_bytes] |= (_U32MASK << _bits);
\r
154 scts -= (32-_bits);
\r
158 _DIRTY_TABLE[_bytes] |= ((_U32MASK>>(32-scts))<<_bits);
\r
160 #undef _DIRTY_TABLE
\r
162 #define _DIRTY_TABLE (ramNvCtl.part[id].backup.dirty)
\r
163 static BOOLEAN __ifHasDirty(uint32 id)
\r
166 for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)
\r
168 if(_DIRTY_TABLE[i])
\r
175 #undef _DIRTY_TABLE
\r
177 //----------------------------
\r
178 // to "fromChannel" buffer
\r
180 //----------------------------
\r
181 void writeData(uint32 id, uint32 start, uint32 bytesLen, uint8* buf)
\r
185 memcpy(&ramNvCtl.part[id].fromChannel.diskbuf[start], buf, bytesLen);
\r
189 //----------------------------
\r
190 // fromChannel -> backup
\r
191 //----------------------------
\r
192 BOOLEAN backupData(uint32 id)
\r
198 memcpy(ramNvCtl.part[id].backup.diskbuf, ramNvCtl.part[id].fromChannel.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);
\r
199 for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)
\r
201 ramNvCtl.part[id].backup.dirty[i] |= ramNvCtl.part[id].fromChannel.dirty[i] ;
\r
209 return ramDisk_Write(ramNvCtl.part[id].fdhandle, ramNvCtl.part[id].toDisk.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);
\r
214 //----------------------------
\r
215 // backup -> fromChannel
\r
216 //----------------------------
\r
217 void restoreData(uint32 id)
\r
221 memcpy(ramNvCtl.part[id].fromChannel.diskbuf, ramNvCtl.part[id].backup.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);
\r
222 memcpy(ramNvCtl.part[id].fromChannel.dirty, ramNvCtl.part[id].backup.dirty, RAMNV_DIRTYTABLE_MAXSIZE*sizeof(uint32));
\r
228 //----------------------------
\r
229 // backup -> toDisk
\r
230 //----------------------------
\r
231 void __getData(uint32 id)
\r
237 memcpy(ramNvCtl.part[id].toDisk.diskbuf, ramNvCtl.part[id].backup.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum);
\r
238 for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)
\r
240 ramNvCtl.part[id].toDisk.dirty[i] |= ramNvCtl.part[id].backup.dirty[i] ;
\r
241 ramNvCtl.part[id].backup.dirty[i] = 0;
\r
248 void saveToDisk(void)
\r
252 for(id = 0; id <ramNvCtl.partNum; id++)
\r
254 if(__ifHasDirty(id))
\r
257 if(ramDisk_Write(ramNvCtl.part[id].fdhandle, ramNvCtl.part[id].toDisk.diskbuf, RAMNV_SECT_SIZE*ramNvCtl.part[id].sctNum))
\r
259 // clean dirty bit of toDiskBuf
\r
260 for(i = 0; i < RAMNV_DIRTYTABLE_MAXSIZE; i++)
\r
262 ramNvCtl.part[id].toDisk.dirty[i] = 0;
\r