FileSys.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. int i,j;
  36. FileSysReadIndex();//读索引
  37. if(g_sutFilesList.Mark!=STORAGE_MARK){//需要格式化
  38. memset(&g_sutFilesList,0,sizeof(SUT_FILE_LIST));
  39. g_sutFilesList.Mark=STORAGE_MARK;
  40. printf("Format File System!");
  41. FileSysSaveIndex();
  42. return 1;
  43. }else{
  44. // //检查文件系统是否有损坏,有损坏则格式化文件系统
  45. // for(i=0;i<g_sutFilesList.FileCount;i++){
  46. // FileCheckMD5(i);//if(0==FileCheckMD5(i))break;
  47. // }
  48. // if(i<g_sutFilesList.FileCount){//有文件损害,其后的文件均需格式化之
  49. // printf("File[%d] MD5 Fail!\r\n",i);
  50. // printf("Format File System!\r\n");
  51. // for(j=i;j<g_sutFilesList.FileCount;j++){
  52. // memset(&g_sutFilesList.FileInfo[j],0,sizeof(SUT_FILE_INFO));
  53. // }
  54. // g_sutFilesList.FileCount=i;
  55. // FileSysSaveIndex();
  56. // }
  57. //
  58. return 0;
  59. }
  60. }
  61. void UCharToStrByHex(char *str,unsigned char *data,int len)
  62. {
  63. int i;
  64. for(i=0;i<len;i++){
  65. sprintf(&str[i*2],"%02X",data[i]);
  66. }
  67. }
  68. int FileCheckMD5(int FileIndex)
  69. {
  70. MD5_CTX mdContext;
  71. unsigned char data[1024];
  72. int i;
  73. uint32_t FileLen;
  74. uint32_t FileAddr;
  75. uint32_t Addr,len;
  76. FileLen=g_sutFilesList.FileInfo[FileIndex].FileLen;
  77. FileAddr=g_sutFilesList.FileInfo[FileIndex].FileAddr;
  78. //读取文件数据并计算MD5
  79. Addr=FileAddr;
  80. len=FileLen;
  81. MD5Init(&mdContext);//初始化MD5
  82. while(len){
  83. if(len>1024){
  84. sFlash_Read(data,Addr,1024);
  85. MD5Update(&mdContext,data,1024);
  86. Addr+=1024;
  87. len-=1024;
  88. }else{
  89. sFlash_Read(data,Addr,len);
  90. MD5Update(&mdContext,data,len);
  91. len=0;
  92. }
  93. }
  94. MD5Final(&mdContext);
  95. //比较文件数据的MD5计数值是否与文件信息头的MD5相同
  96. for(i=0;i<16;i++){
  97. if(g_sutFilesList.FileInfo[FileIndex].FileMD5[i]!=mdContext.digest[i]){
  98. //不同的部分打印出来
  99. UCharToStrByHex((char *)data,g_sutFilesList.FileInfo[FileIndex].FileMD5,16);
  100. printf("Check File[%d] %s <> ",FileIndex,(char *)data);
  101. UCharToStrByHex((char *)data,mdContext.digest,16);
  102. printf("%s\r\n",(char *)data);
  103. return 0;
  104. }
  105. }
  106. //不同的部分打印出来
  107. // UCharToStrByHex((char *)data,g_sutFilesList.FileInfo[FileIndex].FileMD5,16);
  108. // printf("Check File[%d] %s == ",FileIndex,(char *)data);
  109. // UCharToStrByHex((char *)data,mdContext.digest,16);
  110. // printf("%s\r\n",(char *)data);
  111. return 1;
  112. }
  113. /***********************************************************
  114. *获取文件索引
  115. ************************************************************/
  116. int GetFileIndex(const char *filename)
  117. {
  118. int i;
  119. for(i=0;i<g_sutFilesList.FileCount;i++){
  120. if(0==strcmp(g_sutFilesList.FileInfo[i].FileName,filename)){
  121. return i;
  122. }
  123. }
  124. return -1;
  125. }
  126. /***********************************************************
  127. *获取文件长度
  128. ************************************************************/
  129. int GetFileLen(int FileIndex)
  130. {
  131. int len;
  132. if(FileIndex<0)return 0;
  133. len=g_sutFilesList.FileInfo[FileIndex].FileLen;
  134. if(len<0 || len>(FILE_DATA_ADDR_END-FILE_DATA_ADDR))return 0;
  135. else return len;
  136. }
  137. /***********************************************************
  138. 读取文件数据
  139. 返回实际读取字节数
  140. ************************************************************/
  141. int ReadFileData(int FileIndex,u32 startAddr,u32 readLen,unsigned char *pData)
  142. {
  143. int len;
  144. u32 addr;
  145. if(FileIndex<0)return 0;
  146. if(FileIndex>=g_sutFilesList.FileCount)return 0;
  147. if((startAddr+readLen)>g_sutFilesList.FileInfo[FileIndex].FileLen){
  148. len=g_sutFilesList.FileInfo[FileIndex].FileLen-startAddr;
  149. }else{
  150. len=readLen;
  151. }
  152. addr=g_sutFilesList.FileInfo[FileIndex].FileAddr + startAddr;
  153. sFlash_Read(pData,addr,len);
  154. return len;
  155. }
  156. /***************************************************************
  157. UpdateFileMD5
  158. *****************************************************************/
  159. void UpdateFileMD5(int FileIndex)
  160. {
  161. MD5_CTX mdContext;
  162. unsigned char data[1024];
  163. int i;
  164. uint32_t FileLen;
  165. uint32_t FileAddr;
  166. uint32_t Addr,len;
  167. FileLen=g_sutFilesList.FileInfo[FileIndex].FileLen;
  168. FileAddr=g_sutFilesList.FileInfo[FileIndex].FileAddr;
  169. //读取文件数据并计算MD5
  170. Addr=FileAddr;
  171. len=FileLen;
  172. MD5Init(&mdContext);//初始化MD5
  173. while(len){
  174. if(len>1024){
  175. sFlash_Read(data,Addr,1024);
  176. MD5Update(&mdContext,data,1024);
  177. Addr+=1024;
  178. len-=1024;
  179. }else{
  180. sFlash_Read(data,Addr,len);
  181. MD5Update(&mdContext,data,len);
  182. len=0;
  183. }
  184. }
  185. MD5Final(&mdContext);
  186. //比较文件数据的MD5计数值是否与文件信息头的MD5相同
  187. if(g_sutFilesList.FileInfo[FileIndex].FileMD5[FileIndex]!=mdContext.digest[FileIndex]){
  188. //更新文件索引对应文件的MD5
  189. for(i=0;i<16;i++){
  190. g_sutFilesList.FileInfo[FileIndex].FileMD5[i]=mdContext.digest[i];
  191. }
  192. FileSysSaveIndex();
  193. }
  194. return;
  195. }
  196. /*****************************************************************
  197. 修改文件
  198. *****************************************************************/
  199. //ModifyFileData(FileIndex,0,sizeof(SUT_LCD_PARAM),(unsigned char *)&sutLcdParam);
  200. int ModifyFileData(int FileIndex,u32 startAddr,u32 writeLen,unsigned char *pData)
  201. {
  202. int len;
  203. u32 addr;
  204. if(FileIndex<0)return 0;
  205. if(FileIndex>=g_sutFilesList.FileCount)return 0;
  206. if((startAddr+writeLen)>g_sutFilesList.FileInfo[FileIndex].FileLen){//防止修改长度越界。
  207. len=g_sutFilesList.FileInfo[FileIndex].FileLen-startAddr;
  208. //return;
  209. }else{
  210. len=writeLen;
  211. }
  212. addr=g_sutFilesList.FileInfo[FileIndex].FileAddr + startAddr;
  213. sFlash_Write(pData,addr,len);
  214. UpdateFileMD5(FileIndex);
  215. return len;
  216. }
  217. /********************************************
  218. *串口打印所有资源文件信息
  219. **********************************************/
  220. void PrintfAllRFileInfo(void)
  221. {
  222. char strMD5[35];
  223. int i;
  224. printf("=============================RFile list============================\r\n");
  225. printf("FilesNumber=%lu\r\n",g_sutFilesList.FileCount);
  226. printf("FileName Address Length FileMD5\r\n");
  227. printf("-------------------------------------------------------------------\r\n");
  228. for(i=0;i<g_sutFilesList.FileCount;i++){
  229. UCharToStrByHex(strMD5,g_sutFilesList.FileInfo[i].FileMD5,16);
  230. printf("%-16s0x%06x %-8lu%-s\r\n",g_sutFilesList.FileInfo[i].FileName,\
  231. (unsigned int)g_sutFilesList.FileInfo[i].FileAddr,g_sutFilesList.FileInfo[i].FileLen,strMD5);
  232. }
  233. printf("====================================================================\r\n");
  234. }