Msg.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /**********************************************************************************
  2. * File Name: Msg.c
  3. * Function Describe:
  4. * Relate Module:
  5. * Explain:
  6. * Writer: ShiLiangWen
  7. * Date: 2015.2.10
  8. **********************************************************************************/
  9. #include "includes.h"
  10. //空中升级需要用到外部SPI FLASH作为临时存储。先下载到外部FLASH,再拷贝到MCU FLASH。
  11. //MCU FLASH 总空间64KB,其中APP最多48KB,外部FALSH临时空间分16KB+48KB 其中16KB用于存储临时参数,比如文件大小,文件名,升级次数等信息,后面48K才是APP数据临时存放区
  12. //#define EX_FLASH_SIZE (4*1024*1024) //外部FLASH 容量总大小 4M
  13. #define EX_FLASH_PARAM_ADDR (EX_FLASH_SIZE-64*1024) //外部FLASH,用于存储升级过程需要的参数起始地址
  14. #define EX_FLASH_APP_ADDR (EX_FLASH_PARAM_ADDR+16*1024) //外部FLASH,用于存储APP数据的起始地址
  15. SUT_MSG sutMsg;
  16. unsigned char g_ucTask;
  17. unsigned char g_ucLastTask;
  18. unsigned long g_ulTickCt=0;
  19. unsigned long g_ulTick500Ct=0;
  20. int g_iPcTaCt=0;
  21. int g_iPcTaFlag=0;
  22. /***********************************************************************************
  23. *NewTask
  24. ************************************************************************************/
  25. void NewTask(unsigned char Task)
  26. {
  27. g_ucLastTask=g_ucTask;
  28. g_ucTask=Task;
  29. sutMsg.TaskStart=1;
  30. }
  31. /**************************************************************
  32. 将APP代码数据从外部FLASH拷贝到MCU
  33. ***************************************************************/
  34. int CopyAppToMcu(uint32_t FileLen)
  35. {
  36. uint32_t i,j;
  37. unsigned char data[1024];
  38. if(FileLen%2!=0)return 0;
  39. i=0;
  40. printf("APP FileLen=%d\r\n",FileLen);
  41. while(i<FileLen){
  42. printf("[Upgrading...]=%d\r\n",i);
  43. if((i+1024)>=FileLen){//不够1K
  44. j=FileLen-i;
  45. sFlash_Read(data,EX_FLASH_APP_ADDR+i,j);
  46. WritePageData(FLASH_APP1_ADDR+i,data,j);
  47. break;
  48. }else{//剩余数超过1K
  49. sFlash_Read(data,EX_FLASH_APP_ADDR+i,1024);
  50. WritePageData(FLASH_APP1_ADDR+i,data,1024);
  51. i+=1024;
  52. }
  53. }
  54. return 1;
  55. }
  56. /***********************************************************************************
  57. *StartMsg
  58. ************************************************************************************/
  59. void StartMsg(void)
  60. {
  61. int i;
  62. char buf[30];
  63. g_ulTick500Ct=0;
  64. g_ulTickCt=0;
  65. switch(g_ucTask){
  66. case TASK_MODEM_UPDATE:
  67. IapTrace("EXFLASH_UPDATE!\r\n");
  68. for(i=0;i<3;i++)
  69. {
  70. IapTrace("Copy App data To Mcu...\r\n");
  71. //校验成功,拷贝到MCU FLASH
  72. switch(CopyApp2Mcu(sutProductPara.ExAddr, FLASH_APP1_ADDR, sutProductPara.AppLen, sutProductPara.MD5))
  73. {
  74. case 0:IapTrace("CopyAppToMcu OK!\r\n");NewTask(TASK_GOTO_APP);return;
  75. case -1:sprintf(buf, "ExtAddrErr");break;
  76. case -2:sprintf(buf, "IntAddrErr");break;
  77. case -3:sprintf(buf, "Md5Err");break;
  78. case -4:sprintf(buf, "UnMatchData");break;
  79. default:sprintf(buf, "OtherErr");break;
  80. }
  81. strcat(buf, "\r\n");
  82. IapTrace(buf);
  83. }
  84. //连续拷贝3次都失败,可能是FLASH坏了
  85. IapTrace("CopyAppToMcu Fail!!!\r\n");
  86. NewTask(TASK_GOTO_APP);
  87. break;
  88. case TASK_GOTO_APP:
  89. ReadFlashData(APP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA));
  90. if(0 != memcmp("FTOK", sutProductPara.FoTaMark,4)){
  91. memcpy(&sutProductPara.FoTaMark, "FTOK", 4);
  92. WriteData(APP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(sutProductPara));
  93. }
  94. iap_jump_app_s();
  95. break;
  96. }
  97. }
  98. /*********************************************************************
  99. *Tick500Msg
  100. **********************************************************************/
  101. void Tick500Msg(void)
  102. {
  103. if(g_ulTick500Ct<0xffffffff)g_ulTick500Ct++;
  104. if(TASK_WAIT==g_ucTask){
  105. if(g_ulTick500Ct<4)return;
  106. ReadFlashData(APP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA));
  107. if(0==memcmp("FoTa", sutProductPara.FoTaMark,4)) NewTask(TASK_MODEM_UPDATE);
  108. else {
  109. NewTask(TASK_GOTO_APP);
  110. }
  111. }else if(TASK_PC_UPDATE==g_ucTask){
  112. if(++g_iPcTaCt>2){
  113. g_iPcTaCt=0;
  114. if(1==g_iPcTaFlag || 2==g_iPcTaFlag){
  115. IapGetUpdateData(PCTA_MAGIC,g_ulOffset);
  116. }
  117. }
  118. }else if(TASK_MODEM_UPDATE==g_ucTask){
  119. }else if(TASK_GOTO_APP==g_ucTask){
  120. if(g_ulTick500Ct<4)return;
  121. if(g_ulTick500Ct&0x00000001)IapTrace("No App!\r\n");
  122. }
  123. }
  124. /**********************************************************************************
  125. SlwStrCmp
  126. 判断str是否属于msg的字串,且从位置处于str的开头
  127. ***********************************************************************************/
  128. int SlwStrCmp(char *msg,char *str)
  129. {
  130. char *p1=str;
  131. char *p2=msg;
  132. while(*p1!=0){
  133. if(*p1!=*p2)return 1;
  134. p1++;
  135. p2++;
  136. }
  137. return 0;
  138. }
  139. /***********************************************************************************
  140. *Use for PC
  141. ************************************************************************************/
  142. void Uart1Msg(void)
  143. {
  144. int flag;
  145. if(TASK_WAIT==g_ucTask){
  146. if(0==SlwStrCmp((char *)IapRxBuf,"DOWNLOAD_APP")){
  147. IapTrace("DOWNLOAD_APP\r\n");
  148. IapGetUpdateVersion(PCTA_MAGIC);
  149. IapTrace("\r\n");
  150. return;
  151. }
  152. }
  153. flag=IapRecvMsgHandle(IapRxBuf,IapRxLen);
  154. // printf("flag=%d\r\n",flag);
  155. if(0==flag){
  156. IapTrace("Completed!");
  157. NewTask(TASK_GOTO_APP);
  158. return;
  159. }
  160. if(flag<-2 && flag>-6){
  161. IapTrace("IAP Stop!\r\n");
  162. // printf("error_flag=%d\r\n",flag);
  163. NewTask(TASK_GOTO_APP);
  164. }
  165. g_iPcTaCt=0;
  166. g_iPcTaFlag=flag;
  167. }
  168. /***********************************************************************************/