/***************************************************************************** FileSys.c *****************************************************************************/ #define THIS_FILE_ID 20 /* Includes ------------------------------------------------------------------*/ #include "includes.h" SUT_FILE_LIST g_sutFilesList; /***************************************************************** FileSysReadIndex ******************************************************************/ void FileSysReadIndex(void) { #ifdef USE_NEW_FILE_SYSTEM #if((FILE_INDEX_ADDR%4096)||(FILE_DATA_ADDR_END+1)%4096) #error "文件列表存储区首地址必须为页首(4K的整数倍)" #endif /* 因为涉及到PC工具,这里不对PC工具作修改,因此,只修改IAP(后续APP也要修改),PC传输协议不变更; 以前是先从存储区读出文件列表信息,同时存储区也是有实际的文件列表信息区域的; 变更后,存储区没有总体的文件列表信息区域了,这里读取出来的文件信息区域则是能过扫描整个文件列表区来获取并整理出文件列表信息结构体; 具体新的文件存储结构则是N个文件依次存储起来,每个文件的存储格式如下: 每个文件分页头(PAGE HEAD)及页身(PAGE BODY),页头只有一个,页身有N个,每个页占4K; 页头: unsigned char fName[];本页头所描述的文件名字 unsigned char md5[16];本页头所描述的文件内容的md5 unsigned int fLength;//本页所描述的文件内容共占多少个字节数 unsigned int nextFileHeadAddr;//如果本页为有效文件的页头,且本值不为0时,则指向的是一下个文件的页头地址 unsigned int mark; 表示此页是否是合法的页头信息,否则为数据页或无效页 */ int i,fnum; SUT_FILE_PAGE_HEAD pageInfo; memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST)); fnum=0; for(i=FILE_INDEX_ADDR;i1024){ sFlash_Read(data,Addr,1024); MD5Update(&mdContext,data,1024); Addr+=1024; len-=1024; }else{ sFlash_Read(data,Addr,len); MD5Update(&mdContext,data,len); len=0; } } MD5Final(&mdContext); //比较文件数据的MD5计数值是否与文件信息头的MD5相同 for(i=0;i<16;i++){ if(g_sutFilesList.FileInfo[FileIndex].FileMD5[i]!=mdContext.digest[i])return 0; } return 1; }