FileSys.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. uint8_t *pBuf;
  14. pBuf=(uint8_t *)&g_sutFilesList;
  15. sFlash_Read(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST));
  16. }
  17. /******************************************************************
  18. FileSysSaveIndex
  19. *******************************************************************/
  20. void FileSysSaveIndex(void)
  21. {
  22. uint8_t *pBuf;
  23. pBuf=(uint8_t *)&g_sutFilesList;
  24. sFlash_Write(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST));
  25. }
  26. /******************************************************************
  27. FileSysInit
  28. 检查是否需要格式化,需要则格式化之,否则不格式化
  29. return:
  30. 1--format
  31. 0--no format
  32. *******************************************************************/
  33. int FileSysInit()
  34. {
  35. FileSysReadIndex();//读索引
  36. if(g_sutFilesList.Mark!=STORAGE_MARK){//需要格式化
  37. memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST));
  38. g_sutFilesList.Mark=STORAGE_MARK;
  39. FileSysSaveIndex();
  40. return 1;
  41. }else{//不需要格式化
  42. return 0;
  43. }
  44. }
  45. /**********************************************************************
  46. *检查文件MD5是否正确
  47. 正确 -- return 1
  48. 失败 -- return 0
  49. ***********************************************************************/
  50. int FileCheckMD5(int FileIndex)
  51. {
  52. MD5_CTX mdContext;
  53. unsigned char data[1024];
  54. int i;
  55. uint32_t FileLen;
  56. uint32_t FileAddr;
  57. uint32_t Addr,len;
  58. FileLen=g_sutFilesList.FileInfo[FileIndex].FileLen;
  59. FileAddr=g_sutFilesList.FileInfo[FileIndex].FileAddr;
  60. //读取文件数据并计算MD5
  61. Addr=FileAddr;
  62. len=FileLen;
  63. MD5Init(&mdContext);//初始化MD5
  64. while(len){
  65. if(len>1024){
  66. sFlash_Read(data,Addr,1024);
  67. MD5Update(&mdContext,data,1024);
  68. Addr+=1024;
  69. len-=1024;
  70. }else{
  71. sFlash_Read(data,Addr,len);
  72. MD5Update(&mdContext,data,len);
  73. len=0;
  74. }
  75. }
  76. MD5Final(&mdContext);
  77. //比较文件数据的MD5计数值是否与文件信息头的MD5相同
  78. for(i=0;i<16;i++){
  79. if(g_sutFilesList.FileInfo[FileIndex].FileMD5[i]!=mdContext.digest[i])return 0;
  80. }
  81. return 1;
  82. }