CopyFile.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "includes.h"
  2. struct COPYFILE_DEF copyFilePara;
  3. static void CopyBinToUFlash(SUT_FILE_LIST *,uint8_t);
  4. static int CopyWriteFileData(uint32_t ,uint32_t ,uint8_t *);
  5. static void CopyDataToBlockOne(SUT_FILE_LIST *);
  6. void CopyFileInit(void)
  7. {
  8. copyFilePara.runFlag = 2;
  9. copyFilePara.userBuf = IapRxBuf;
  10. }
  11. void CopyFileHandle(void)
  12. {
  13. SUT_FILE_LIST sutFileList;
  14. uint8_t *pBuf;
  15. uint8_t time;
  16. int index;
  17. int i;
  18. if(copyFilePara.runFlag != 2) return;
  19. //1 check mark of block 2
  20. pBuf = (uint8_t *) &sutFileList;
  21. sFlash_Read(pBuf, APP_FILE_DATA_ADDR, sizeof(SUT_FILE_LIST));
  22. if(sutFileList.Mark == GOOD_UPDATE_STORAGE) // need to update app & res
  23. {
  24. index = GetFileIndexIAP(&sutFileList,"HS15\r\n", 0);
  25. if(index == -1) {
  26. //IapTrace("No xx.bin\r\n");
  27. return;
  28. }
  29. CopyBinToUFlash(&sutFileList,index);
  30. CopyDataToBlockOne(&sutFileList);
  31. ///////////////fix offset address//////////////////////
  32. for(i=0;i<sutFileList.FileCount;i++)
  33. sutFileList.FileInfo[i].FileAddr += 0x1000;
  34. sFlash_Write(pBuf,FILE_INDEX_ADDR,sizeof(SUT_FILE_LIST));
  35. /////////////////////////////////////
  36. //set mark of block 2 to UPDATE_STORAGE_ALREADY
  37. sutFileList.Mark = UPDATE_ALREADY;
  38. sFlash_Write(pBuf, APP_FILE_DATA_ADDR, 4);
  39. //set mark of block 1 to STORAGE_MARK
  40. sutFileList.Mark = STORAGE_MARK;
  41. sFlash_Write(pBuf, FILE_INDEX_ADDR, 4);
  42. //IapTrace("Fota OK!\r\n");
  43. }else
  44. {//IapTrace("no copy\r\n");
  45. }//do nothing
  46. }
  47. //type 0 找到.bin结尾的文件
  48. //type 1 正常查找
  49. int GetFileIndexIAP(SUT_FILE_LIST *sutfileList ,const char *filename,uint8_t type)
  50. {
  51. uint8_t i,j;
  52. for(i=0;i<sutfileList->FileCount;i++)
  53. {
  54. if(type){
  55. if(0==strcmp(sutfileList->FileInfo->FileName+i, filename)) return i;
  56. }
  57. else{
  58. //if(0 == strncmp(filename, sutfileList->FileInfo[i].FileName, 4)) return i;
  59. for(j=0;j<FILE_NAME_LEN_MAX;j++)
  60. {
  61. if(sutfileList->FileInfo[i].FileName[j] == '.')
  62. {
  63. if((FILE_NAME_LEN_MAX-j)>=3)
  64. {
  65. if((sutfileList->FileInfo[i].FileName[j+1] == 'B' || sutfileList->FileInfo[i].FileName[j+1] == 'b') &&
  66. (sutfileList->FileInfo[i].FileName[j+2] == 'I' || sutfileList->FileInfo[i].FileName[j+2] == 'i') &&
  67. (sutfileList->FileInfo[i].FileName[j+3] == 'N' || sutfileList->FileInfo[i].FileName[j+3] == 'n'))
  68. return i;
  69. }else break;
  70. }
  71. }
  72. }
  73. }
  74. return -1;
  75. }
  76. static void CopyBinToUFlash(SUT_FILE_LIST *sutfileList, uint8_t index)
  77. {
  78. uint32_t totalLen,addr,offset,copyLen;
  79. uint16_t copysize;
  80. uint8_t finished;
  81. totalLen = sutfileList->FileInfo[index].FileLen;
  82. addr = sutfileList->FileInfo[index].FileAddr;
  83. offset = 0;
  84. copyLen = 0;
  85. finished = 0;
  86. while(1)
  87. {
  88. if(totalLen - copyLen >= 2048)
  89. copysize = 2048;
  90. else{
  91. copysize = totalLen - copyLen;
  92. finished ++;
  93. }
  94. sFlash_Read(copyFilePara.userBuf, APP_FILE_DATA_ADDR+FILE_DATA_ADDR+addr+offset, copysize);//read
  95. CopyWriteFileData(offset, copysize, copyFilePara.userBuf);//write
  96. if(finished) return;
  97. copyLen += copysize;
  98. offset += copysize;
  99. }
  100. }
  101. static int CopyWriteFileData(uint32_t Offset,uint32_t Length,uint8_t *pData)
  102. {
  103. uint16_t i,temp;
  104. uint16_t len=0;
  105. if(0!=(Offset%2))return 0;
  106. WritePageData(FLASH_APP1_ADDR+Offset,pData,Length);
  107. return 1;
  108. }
  109. static void CopyDataToBlockOne(SUT_FILE_LIST *sutfileList)
  110. {
  111. uint32_t totalLen,offset,copyLen;
  112. uint16_t copysize;
  113. uint8_t i,finished;
  114. char buf[10];
  115. uint8_t persent,temp;
  116. totalLen = 0x1000;//4K
  117. for(i=0;i<sutfileList->FileCount;i++)
  118. totalLen += sutfileList->FileInfo[i].FileLen;
  119. offset = 0;
  120. copyLen = 0;
  121. finished = 0;
  122. while(1)
  123. {
  124. if(totalLen - copyLen >= 2048)
  125. copysize = 2048;
  126. else{
  127. copysize = totalLen - copyLen;
  128. finished ++;
  129. }
  130. sFlash_Read(copyFilePara.userBuf, offset+APP_FILE_DATA_ADDR, copysize);
  131. sFlash_Write(copyFilePara.userBuf, offset+FILE_INDEX_ADDR, copysize);
  132. offset += copysize;
  133. copyLen += copysize;
  134. temp = copyLen*100/totalLen;
  135. if(persent != temp)
  136. {
  137. persent = temp;
  138. sprintf(buf, "Copy %d \r\n", copyLen*100/totalLen);
  139. IapTrace(buf);
  140. }
  141. if(finished)
  142. break;
  143. }
  144. }