FileSys.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*****************************************************************************
  2. FileSys.c
  3. *****************************************************************************/
  4. #define THIS_FILE_ID 20
  5. /* Includes ------------------------------------------------------------------*/
  6. #include "includes.h"
  7. SUT_FILE_LIST g_sutFilesList;
  8. /*****************************************************************
  9. FileSysReadIndex
  10. ******************************************************************/
  11. void FileSysReadIndex(void)
  12. {
  13. #ifdef USE_NEW_FILE_SYSTEM
  14. #if((FILE_INDEX_ADDR%4096)||(FILE_DATA_ADDR_END+1)%4096)
  15. #error "文件列表存储区首地址必须为页首(4K的整数倍)"
  16. #endif
  17. /*
  18. 因为涉及到PC工具,这里不对PC工具作修改,因此,只修改IAP(后续APP也要修改),PC传输协议不变更;
  19. 以前是先从存储区读出文件列表信息,同时存储区也是有实际的文件列表信息区域的;
  20. 变更后,存储区没有总体的文件列表信息区域了,这里读取出来的文件信息区域则是能过扫描整个文件列表区来获取并整理出文件列表信息结构体;
  21. 具体新的文件存储结构则是N个文件依次存储起来,每个文件的存储格式如下:
  22. 每个文件分页头(PAGE HEAD)及页身(PAGE BODY),页头只有一个,页身有N个,每个页占4K;
  23. 页头:
  24. unsigned char fName[];本页头所描述的文件名字
  25. unsigned char md5[16];本页头所描述的文件内容的md5
  26. unsigned int fLength;//本页所描述的文件内容共占多少个字节数
  27. unsigned int nextFileHeadAddr;//如果本页为有效文件的页头,且本值不为0时,则指向的是一下个文件的页头地址
  28. unsigned int mark; 表示此页是否是合法的页头信息,否则为数据页或无效页
  29. */
  30. int i,fnum;
  31. SUT_FILE_PAGE_HEAD pageInfo;
  32. memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST));
  33. fnum=0;
  34. for(i=FILE_INDEX_ADDR;i<FILE_DATA_ADDR_END;){
  35. sFlash_Read((uint8_t *)&pageInfo, i, sizeof(SUT_FILE_PAGE_HEAD));
  36. if(pageInfo.mark == FILE_HEAD_MARK){//这是一个有效的文件页
  37. memcpy(g_sutFilesList.FileInfo[fnum].FileName, pageInfo.fName, sizeof(g_sutFilesList.FileInfo[fnum].FileName));
  38. memcpy(g_sutFilesList.FileInfo[fnum].FileMD5, pageInfo.md5, sizeof(g_sutFilesList.FileInfo[fnum].FileMD5));
  39. g_sutFilesList.FileInfo[fnum].FileLen=pageInfo.fLength;
  40. g_sutFilesList.FileInfo[fnum].FileAddr=i;
  41. fnum++;
  42. if(pageInfo.nextFileHeadAddr != 0) i=pageInfo.nextFileHeadAddr;
  43. else{
  44. break;
  45. }
  46. }else i += 4096;
  47. }
  48. g_sutFilesList.FileCount=fnum;
  49. if(fnum != 0) g_sutFilesList.Mark=STORAGE_MARK;
  50. #else
  51. u8 *pBuf;
  52. pBuf=(u8 *)&g_sutFilesList;
  53. sFlash_Read(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST));
  54. #endif
  55. }
  56. /******************************************************************
  57. FileSysSaveIndex
  58. *******************************************************************/
  59. void FileSysSaveIndex(void)
  60. {
  61. u8 *pBuf;
  62. #ifdef USE_NEW_FILE_SYSTEM
  63. return;
  64. #endif
  65. pBuf=(u8 *)&g_sutFilesList;
  66. sFlash_Write(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST));
  67. }
  68. /******************************************************************
  69. FileSysInit
  70. 检查是否需要格式化,需要则格式化之,否则不格式化
  71. return:
  72. 1--format
  73. 0--no format
  74. *******************************************************************/
  75. int FileSysInit()
  76. {
  77. FileSysReadIndex();//读索引
  78. if(g_sutFilesList.Mark!=STORAGE_MARK){//需要格式化
  79. memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST));
  80. g_sutFilesList.Mark=STORAGE_MARK;
  81. FileSysSaveIndex();
  82. return 1;
  83. }else{//不需要格式化
  84. return 0;
  85. }
  86. }
  87. /**********************************************************************
  88. *检查文件MD5是否正确
  89. 正确 -- return 1
  90. 失败 -- return 0
  91. ***********************************************************************/
  92. int FileCheckMD5(int FileIndex)
  93. {
  94. MD5_CTX mdContext;
  95. unsigned char data[1024];
  96. int i;
  97. uint32_t FileLen;
  98. uint32_t FileAddr;
  99. uint32_t Addr,len;
  100. FileLen=g_sutFilesList.FileInfo[FileIndex].FileLen;
  101. FileAddr=g_sutFilesList.FileInfo[FileIndex].FileAddr;
  102. #ifdef USE_NEW_FILE_SYSTEM
  103. FileAddr += 4096;//偏移出文件页头
  104. #endif
  105. //读取文件数据并计算MD5
  106. Addr=FileAddr;
  107. len=FileLen;
  108. MD5Init(&mdContext);//初始化MD5
  109. while(len){
  110. if(len>1024){
  111. sFlash_Read(data,Addr,1024);
  112. MD5Update(&mdContext,data,1024);
  113. Addr+=1024;
  114. len-=1024;
  115. }else{
  116. sFlash_Read(data,Addr,len);
  117. MD5Update(&mdContext,data,len);
  118. len=0;
  119. }
  120. }
  121. MD5Final(&mdContext);
  122. //比较文件数据的MD5计数值是否与文件信息头的MD5相同
  123. for(i=0;i<16;i++){
  124. if(g_sutFilesList.FileInfo[FileIndex].FileMD5[i]!=mdContext.digest[i])return 0;
  125. }
  126. return 1;
  127. }