2 #include "nvitem_common.h"
\r
3 #include "nvitem_fs.h"
\r
4 #include "nvitem_config.h"
\r
6 #define CRC_16_L_SEED 0x80
\r
7 #define CRC_16_L_POLYNOMIAL 0x8000
\r
8 #define CRC_16_POLYNOMIAL 0x1021
\r
9 unsigned short __crc_16_l_calc (uint8 *buf_ptr,uint32 len)
\r
12 unsigned short crc = 0;
\r
15 for (i = CRC_16_L_SEED; i !=0 ; i = i>>1){
\r
16 if ( (crc & CRC_16_L_POLYNOMIAL) !=0){
\r
18 crc = crc ^ CRC_16_POLYNOMIAL;
\r
23 if ( (*buf_ptr & i) != 0){
\r
24 crc = crc ^ CRC_16_POLYNOMIAL;
\r
32 static unsigned short calc_checksum(unsigned char *dat, unsigned long len)
\r
34 unsigned short num = 0;
\r
35 unsigned long chkSum = 0;
\r
37 num = (unsigned short)(*dat);
\r
39 num |= (((unsigned short)(*dat))<<8);
\r
41 chkSum += (unsigned long)num;
\r
47 chkSum = (chkSum >> 16) + (chkSum & 0xffff);
\r
48 chkSum += (chkSum >> 16);
\r
58 BOOLEAN _chkEcc(uint8* buf, uint32 size)
\r
61 // crc = __crc_16_l_calc(buf, size-2);
\r
62 // crcOri = (uint16)((((uint16)buf[size-2])<<8) | ((uint16)buf[size-1]) );
\r
64 crc = calc_checksum(buf,size-4);
\r
65 crcOri = (uint16)((((uint16)buf[size-3])<<8) | ((uint16)buf[size-4]) );
\r
67 return (crc == crcOri);
\r
71 void _makEcc(uint8* buf, uint32 size)
\r
74 //crc = __crc_16_l_calc(buf, size-2);
\r
75 crc = calc_checksum(buf,size-4);
\r
76 buf[size-4] = (uint8)(0xFF&crc);
\r
77 buf[size-3] = (uint8)(0xFF&(crc>>8));
\r
85 #ifdef CONFIG_EMMC_BOOT
\r
86 static block_dev_desc_t *s_block_dev = 0;
\r
88 static RAM_NV_CONFIG _ramdiskCfg[RAMNV_NUM+1] =
\r
90 {1, L"fixnv1", L"fixnv2", 0x20000 },
\r
91 {2, L"runtimenv1",L"runtimenv2",0x40000 },
\r
95 const RAM_NV_CONFIG* ramDisk_Init(void)
\r
97 s_block_dev = get_dev("mmc", 1);
\r
101 RAMDISK_HANDLE ramDisk_Open(uint32 partId)
\r
103 return (RAMDISK_HANDLE)partId;
\r
106 int _getIdx(RAMDISK_HANDLE handle)
\r
109 uint32 partId = (uint32)handle;
\r
111 for(i = 0; i < sizeof(_ramdiskCfg)/sizeof(RAM_NV_CONFIG); i++){
\r
112 if(0 == _ramdiskCfg[i].partId){
\r
115 else if(partId == _ramdiskCfg[i].partId){
\r
123 1 read imagPath first, if succes return , then
\r
124 2 read imageBakPath, if fail , return, then
\r
128 first imagePath then imageBakPath
\r
130 BOOLEAN ramDisk_Read(RAMDISK_HANDLE handle, uint8* buf, uint32 size)
\r
133 disk_partition_t info;
\r
134 wchar_t *firstName, *secondName;
\r
136 idx = _getIdx(handle);
\r
142 printf("NVITEM partId%x:image read error!\n",_ramdiskCfg[idx].partId);
\r
145 // 0 get read order
\r
147 firstName = _ramdiskCfg[idx].image_path;
\r
148 secondName = _ramdiskCfg[idx].imageBak_path;
\r
151 secondName = _ramdiskCfg[idx].image_path;
\r
152 firstName = _ramdiskCfg[idx].imageBak_path;
\r
154 // 1 read origin image
\r
155 memset(buf, 0xFF, size);
\r
156 if(!get_partition_info_by_name(s_block_dev, firstName, &info)){
\r
157 if(Emmc_Read(PARTITION_USER, info.start, (size>>9)+1, (uint8*)buf)){
\r
159 if(_chkEcc(buf, size)){
\r
160 printf("NVITEM partId%x:%s read success!\n",_ramdiskCfg[idx].partId,firstName);
\r
163 printf("NVITEM partId%x:%s ECC error!\n",_ramdiskCfg[idx].partId,firstName);
\r
166 printf("NVITEM partId%x:%s read error!\n",_ramdiskCfg[idx].partId,firstName);
\r
167 // 2 read bakup image
\r
168 memset(buf, 0xFF, size);
\r
169 if(get_partition_info_by_name(s_block_dev, secondName, &info)){
\r
170 printf("NVITEM partId%x:%s read error!\n",_ramdiskCfg[idx].partId,secondName);
\r
173 if(!Emmc_Read(PARTITION_USER, info.start, (size>>9), (uint8*)buf))
\r
175 printf("NVITEM partId%x:%s read error!\n",_ramdiskCfg[idx].partId,secondName);
\r
177 if(!_chkEcc(buf, size)){
\r
178 printf("NVITEM partId%x:%s ECC error!\n",_ramdiskCfg[idx].partId,secondName);
\r
182 if(!get_partition_info_by_name(s_block_dev, firstName, &info)){
\r
183 Emmc_Write(PARTITION_USER, info.start, (size>>9), (uint8*)buf);
\r
186 printf("NVITEM partId%x:%s read success!\n",_ramdiskCfg[idx].partId,secondName);
\r
194 2 write imageBakPath
\r
198 first imageBakPath then imagePath
\r
200 BOOLEAN ramDisk_Write(RAMDISK_HANDLE handle, uint8* buf, uint32 size)
\r
203 BOOLEAN oriRet,bakRet;
\r
204 disk_partition_t info;
\r
206 idx = _getIdx(handle);
\r
211 printf("NVITEM partId%x:image write fail!\n",_ramdiskCfg[idx].partId);
\r
215 _makEcc( buf, size);
\r
216 // 2 write bakup image
\r
218 if(!get_partition_info_by_name(s_block_dev, _ramdiskCfg[idx].imageBak_path, &info)){
\r
219 if(Emmc_Write(PARTITION_USER, info.start, (size>>9), (uint8*)buf)){
\r
224 printf("NVITEM partId%x:bakup image write fail!\n",_ramdiskCfg[idx].partId);
\r
226 // 3 write origin image
\r
228 if(!get_partition_info_by_name(s_block_dev, _ramdiskCfg[idx].image_path, &info)){
\r
229 if(Emmc_Write(PARTITION_USER, info.start, (size>>9), (uint8*)buf)){
\r
234 printf("NVITEM partId%x:origin image write fail!\n",_ramdiskCfg[idx].partId);
\r
236 printf("NVITEM partId%x:image write finished %d!\n",_ramdiskCfg[idx].partId,(bakRet && oriRet));
\r
237 return (bakRet && oriRet);
\r
241 void ramDisk_Close(RAMDISK_HANDLE handle)
\r
248 static RAM_NV_CONFIG _ramdiskCfg[RAMNV_NUM+1] =
\r
250 {3, "/productinfo/productinfo.bin", "/productinfo/productinfobkup.bin", 0x4000 },
251 {1, "/fixnv/fixnv.bin", "/backupfixnv/fixnv.bin", 0x20000 },
\r
252 {2, "/runtimenv/runtimenv.bin", "/runtimenv/runtimenvbkup.bin", 0x40000 },
\r
256 static void _getPath(/*IN*/char *totalPath, /*OUT*/char *path)
\r
259 strcpy(path,totalPath);
\r
261 ch = path[strlen(path)-1];
\r
262 while(ch&&('/' != ch)&&('\\' != ch))
\r
264 path[strlen(path)-1] = '\0';
\r
265 ch = path[strlen(path)-1];
\r
269 const RAM_NV_CONFIG* ramDisk_Init(void)
\r
271 return _ramdiskCfg;
\r
274 RAMDISK_HANDLE ramDisk_Open(uint32 partId)
\r
276 return (RAMDISK_HANDLE)partId;
\r
279 int _getIdx(RAMDISK_HANDLE handle)
\r
282 uint32 partId = (uint32)handle;
\r
284 for(i = 0; i < sizeof(_ramdiskCfg)/sizeof(RAM_NV_CONFIG); i++){
\r
285 if(0 == _ramdiskCfg[i].partId){
\r
288 else if(partId == _ramdiskCfg[i].partId){
\r
296 1 read imagPath first, if succes return , then
\r
297 2 read imageBakPath, if fail , return, then
\r
301 first imagePath then imageBakPath
\r
303 BOOLEAN ramDisk_Read(RAMDISK_HANDLE handle, uint8* buf, uint32 size)
\r
307 char *firstName, *secondName;
\r
309 idx = _getIdx(handle);
\r
313 // 0 get read order
\r
315 firstName = _ramdiskCfg[idx].image_path;
\r
316 secondName = _ramdiskCfg[idx].imageBak_path;
\r
319 secondName = _ramdiskCfg[idx].image_path;
\r
320 firstName = _ramdiskCfg[idx].imageBak_path;
\r
322 // 1 read origin image
\r
323 memset(buf, 0xFF, size);
\r
324 _getPath(firstName,path);
\r
325 cmd_yaffs_mount(path);
\r
326 cmd_yaffs_mread_file(firstName, buf);
\r
327 // cmd_yaffs_umount(path);
\r
330 if(_chkEcc(buf, size)){
\r
331 printf("NVITEM partId%x:%s read success!\n",_ramdiskCfg[idx].partId,firstName);
\r
334 printf("NVITEM partId%x:%s ECC error......!\n",_ramdiskCfg[idx].partId,firstName);
\r
335 // 2 read bakup image
\r
336 memset(buf, 0xFF, size);
\r
337 _getPath(secondName,path);
\r
338 printf("secondName : %s path: %s\n",secondName,path);
339 // cmd_yaffs_mount(path);
\r
340 cmd_yaffs_mread_file(secondName, buf);
\r
341 // cmd_yaffs_umount(path);
\r
343 if(!_chkEcc(buf, size)){
\r
344 printf("NVITEM partId%x:%s ECC error!\n",_ramdiskCfg[idx].partId,secondName);
\r
348 _getPath(firstName,path);
\r
349 cmd_yaffs_mount(path);
\r
350 cmd_yaffs_mwrite_file(firstName, (char*)buf, _ramdiskCfg[idx].image_size);
\r
351 cmd_yaffs_umount(path);
\r
353 printf("NVITEM partId%x:%s read success!\n",_ramdiskCfg[idx].partId,secondName);
\r
361 2 write imageBakPath
\r
365 first imageBakPath then imagePath
\r
367 BOOLEAN ramDisk_Write(RAMDISK_HANDLE handle, uint8* buf, uint32 size)
\r
372 idx = _getIdx(handle);
\r
377 _makEcc( buf, size);
\r
378 // 2 write bakup image
\r
379 _getPath(_ramdiskCfg[idx].imageBak_path,path);
\r
380 cmd_yaffs_mount(path);
\r
381 cmd_yaffs_mwrite_file(_ramdiskCfg[idx].imageBak_path, (char*)buf, _ramdiskCfg[idx].image_size);
\r
382 cmd_yaffs_umount(path);
\r
383 // 3 write origin image
\r
384 _getPath(_ramdiskCfg[idx].image_path,path);
\r
385 cmd_yaffs_mount(path);
\r
386 cmd_yaffs_mwrite_file(_ramdiskCfg[idx].image_path, (char*)buf, _ramdiskCfg[idx].image_size);
\r
387 cmd_yaffs_umount(path);
\r
392 void ramDisk_Close(RAMDISK_HANDLE handle)
\r