FileSys.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. u8 *pBuf;
  14. pBuf=(u8 *)&g_sutFilesList;
  15. sFlash_Read(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST));
  16. }
  17. /******************************************************************
  18. FileSysSaveIndex
  19. *******************************************************************/
  20. void FileSysSaveIndex(void)
  21. {
  22. u8 *pBuf;
  23. pBuf=(u8 *)&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. printf("Format File System!");
  40. FileSysSaveIndex();
  41. return 1;
  42. }else{//不需要格式化
  43. return 0;
  44. }
  45. }
  46. /**********************************************************************
  47. *检查文件MD5是否正确
  48. 正确 -- return 1
  49. 失败 -- return 0
  50. ***********************************************************************/
  51. int FileCheckMD5(int FileIndex)
  52. {
  53. MD5_CTX mdContext;
  54. unsigned char data[1024];
  55. int i;
  56. uint32_t FileLen;
  57. uint32_t FileAddr;
  58. uint32_t Addr,len;
  59. FileLen=g_sutFilesList.FileInfo[FileIndex].FileLen;
  60. FileAddr=g_sutFilesList.FileInfo[FileIndex].FileAddr;
  61. //读取文件数据并计算MD5
  62. Addr=FileAddr;
  63. len=FileLen;
  64. MD5Init(&mdContext);//初始化MD5
  65. while(len){
  66. if(len>1024){
  67. sFlash_Read(data,Addr,1024);
  68. MD5Update(&mdContext,data,1024);
  69. Addr+=1024;
  70. len-=1024;
  71. }else{
  72. sFlash_Read(data,Addr,len);
  73. MD5Update(&mdContext,data,len);
  74. len=0;
  75. }
  76. }
  77. MD5Final(&mdContext);
  78. //比较文件数据的MD5计数值是否与文件信息头的MD5相同
  79. for(i=0;i<16;i++){
  80. if(g_sutFilesList.FileInfo[FileIndex].FileMD5[i]!=mdContext.digest[i])return 0;
  81. }
  82. return 1;
  83. }
  84. /***********************************************************
  85. *获取文件索引
  86. ************************************************************/
  87. int GetFileIndex(const char *filename)
  88. {
  89. int i;
  90. for(i=0;i<g_sutFilesList.FileCount;i++){
  91. if(0==strcmp(g_sutFilesList.FileInfo[i].FileName,filename)){
  92. return i;
  93. }
  94. }
  95. return -1;
  96. }
  97. /***********************************************************
  98. *获取文件长度
  99. ************************************************************/
  100. int GetFileLen(int FileIndex)
  101. {
  102. int len;
  103. if(FileIndex<0)return 0;
  104. len=g_sutFilesList.FileInfo[FileIndex].FileLen;
  105. if(len<0 || len>(FILE_DATA_ADDR_END-FILE_DATA_ADDR))return 0;
  106. else return len;
  107. }
  108. /***********************************************************
  109. 读取文件数据
  110. 返回实际读取字节数
  111. ************************************************************/
  112. int ReadFileData(int FileIndex,u32 startAddr,u32 readLen,unsigned char *pData)
  113. {
  114. int len;
  115. u32 addr;
  116. if(FileIndex<0)return 0;
  117. if(FileIndex>=g_sutFilesList.FileCount)return 0;
  118. if((startAddr+readLen)>g_sutFilesList.FileInfo[FileIndex].FileLen){
  119. len=g_sutFilesList.FileInfo[FileIndex].FileLen-startAddr;
  120. }else{
  121. len=readLen;
  122. }
  123. addr=g_sutFilesList.FileInfo[FileIndex].FileAddr + startAddr;
  124. sFlash_Read(pData,addr,len);
  125. return len;
  126. }
  127. /********************************************
  128. *串口打印所有资源文件信息
  129. **********************************************/
  130. void PrintfAllRFile(void)
  131. {
  132. int i;
  133. printf("=============RFile list=============\r\n");
  134. printf("FilesNumber=%lu\r\n",g_sutFilesList.FileCount);
  135. printf("FileName\tFileLength\r\n");
  136. printf("------------------------------------\r\n");
  137. for(i=0;i<g_sutFilesList.FileCount;i++){
  138. printf("%s\t%lu\r\n",g_sutFilesList.FileInfo[i].FileName,g_sutFilesList.FileInfo[i].FileLen);
  139. }
  140. printf("====================================\r\n");
  141. }