/***************************************************************************** FileSys.c *****************************************************************************/ #define THIS_FILE_ID 20 /* Includes ------------------------------------------------------------------*/ #include "includes.h" SUT_FILE_LIST g_sutFilesList; /***************************************************************** FileSysReadIndex ******************************************************************/ void FileSysReadIndex(void) { u8 *pBuf; pBuf=(u8 *)&g_sutFilesList; sFlash_Read(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST)); } /****************************************************************** FileSysSaveIndex *******************************************************************/ void FileSysSaveIndex(void) { u8 *pBuf; pBuf=(u8 *)&g_sutFilesList; sFlash_Write(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST)); } /****************************************************************** FileSysInit 检查是否需要格式化,需要则格式化之,否则不格式化 return: 1--format 0--no format *******************************************************************/ int FileSysInit() { int i,j; FileSysReadIndex();//读索引 if(g_sutFilesList.Mark!=STORAGE_MARK){//需要格式化 memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST)); g_sutFilesList.Mark=STORAGE_MARK; printf("Format File System!"); FileSysSaveIndex(); return 1; }else{ // //检查文件系统是否有损坏,有损坏则格式化文件系统 // for(i=0;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]){ //不同的部分打印出来 UCharToStrByHex((char *)data,g_sutFilesList.FileInfo[FileIndex].FileMD5,16); printf("Check File[%d] %s <> ",FileIndex,(char *)data); UCharToStrByHex((char *)data,mdContext.digest,16); printf("%s\r\n",(char *)data); return 0; } } //不同的部分打印出来 // UCharToStrByHex((char *)data,g_sutFilesList.FileInfo[FileIndex].FileMD5,16); // printf("Check File[%d] %s == ",FileIndex,(char *)data); // UCharToStrByHex((char *)data,mdContext.digest,16); // printf("%s\r\n",(char *)data); return 1; } /*********************************************************** *获取文件索引 ************************************************************/ int GetFileIndex(const char *filename) { int i; for(i=0;i(FILE_DATA_ADDR_END-FILE_DATA_ADDR))return 0; else return len; } /*********************************************************** 读取文件数据 返回实际读取字节数 ************************************************************/ int ReadFileData(int FileIndex,u32 startAddr,u32 readLen,unsigned char *pData) { int len; u32 addr; if(FileIndex<0)return 0; if(FileIndex>=g_sutFilesList.FileCount)return 0; if((startAddr+readLen)>g_sutFilesList.FileInfo[FileIndex].FileLen){ len=g_sutFilesList.FileInfo[FileIndex].FileLen-startAddr; }else{ len=readLen; } addr=g_sutFilesList.FileInfo[FileIndex].FileAddr + startAddr; sFlash_Read(pData,addr,len); return len; } /*************************************************************** UpdateFileMD5 *****************************************************************/ void UpdateFileMD5(int FileIndex) { MD5_CTX mdContext; unsigned char data[1024]; int i; uint32_t FileLen; uint32_t FileAddr; uint32_t Addr,len; FileLen=g_sutFilesList.FileInfo[FileIndex].FileLen; FileAddr=g_sutFilesList.FileInfo[FileIndex].FileAddr; //读取文件数据并计算MD5 Addr=FileAddr; len=FileLen; MD5Init(&mdContext);//初始化MD5 while(len){ if(len>1024){ 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相同 if(g_sutFilesList.FileInfo[FileIndex].FileMD5[FileIndex]!=mdContext.digest[FileIndex]){ //更新文件索引对应文件的MD5 for(i=0;i<16;i++){ g_sutFilesList.FileInfo[FileIndex].FileMD5[i]=mdContext.digest[i]; } FileSysSaveIndex(); } return; } /***************************************************************** 修改文件 *****************************************************************/ //ModifyFileData(FileIndex,0,sizeof(SUT_LCD_PARAM),(unsigned char *)&sutLcdParam); int ModifyFileData(int FileIndex,u32 startAddr,u32 writeLen,unsigned char *pData) { int len; u32 addr; if(FileIndex<0)return 0; if(FileIndex>=g_sutFilesList.FileCount)return 0; if((startAddr+writeLen)>g_sutFilesList.FileInfo[FileIndex].FileLen){//防止修改长度越界。 len=g_sutFilesList.FileInfo[FileIndex].FileLen-startAddr; //return; }else{ len=writeLen; } addr=g_sutFilesList.FileInfo[FileIndex].FileAddr + startAddr; sFlash_Write(pData,addr,len); UpdateFileMD5(FileIndex); return len; } /******************************************** *串口打印所有资源文件信息 **********************************************/ void PrintfAllRFileInfo(void) { char strMD5[35]; int i; printf("=============================RFile list============================\r\n"); printf("FilesNumber=%lu\r\n",g_sutFilesList.FileCount); printf("FileName Address Length FileMD5\r\n"); printf("-------------------------------------------------------------------\r\n"); for(i=0;i