/***************************************************************************** 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() { FileSysReadIndex();//读索引 if(g_sutFilesList.Mark!=STORAGE_MARK){//需要格式化 memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST)); g_sutFilesList.Mark=STORAGE_MARK; FileSysSaveIndex(); return 1; }else{//不需要格式化 return 0; } } /********************************************************************** *检查文件MD5是否正确 正确 -- return 1 失败 -- return 0 ***********************************************************************/ int FileCheckMD5(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相同 for(i=0;i<16;i++){ if(g_sutFilesList.FileInfo[FileIndex].FileMD5[i]!=mdContext.digest[i])return 0; } return 1; }