| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /**********************************************************************************
- * File Name: Msg.c
- * Function Describe:
- * Relate Module:
- * Explain:
- * Writer: ShiLiangWen
- * Date: 2015.2.10
- **********************************************************************************/
- #include "includes.h"
- //空中升级需要用到外部SPI FLASH作为临时存储。先下载到外部FLASH,再拷贝到MCU FLASH。
- //MCU FLASH 总空间64KB,其中APP最多48KB,外部FALSH临时空间分16KB+48KB 其中16KB用于存储临时参数,比如文件大小,文件名,升级次数等信息,后面48K才是APP数据临时存放区
- //#define EX_FLASH_SIZE (4*1024*1024) //外部FLASH 容量总大小 4M
- #define EX_FLASH_PARAM_ADDR (EX_FLASH_SIZE-64*1024) //外部FLASH,用于存储升级过程需要的参数起始地址
- #define EX_FLASH_APP_ADDR (EX_FLASH_PARAM_ADDR+16*1024) //外部FLASH,用于存储APP数据的起始地址
- SUT_MSG sutMsg;
- unsigned char g_ucTask;
- unsigned char g_ucLastTask;
- unsigned long g_ulTickCt=0;
- unsigned long g_ulTick500Ct=0;
- int g_iPcTaCt=0;
- int g_iPcTaFlag=0;
- /***********************************************************************************
- *NewTask
- ************************************************************************************/
- void NewTask(unsigned char Task)
- {
- g_ucLastTask=g_ucTask;
- g_ucTask=Task;
- sutMsg.TaskStart=1;
- }
- /**************************************************************
- 将APP代码数据从外部FLASH拷贝到MCU
- ***************************************************************/
- int CopyAppToMcu(uint32_t FileLen)
- {
- uint32_t i,j;
- unsigned char data[1024];
- if(FileLen%2!=0)return 0;
- i=0;
- printf("APP FileLen=%d\r\n",FileLen);
- while(i<FileLen){
- printf("[Upgrading...]=%d\r\n",i);
- if((i+1024)>=FileLen){//不够1K
- j=FileLen-i;
- sFlash_Read(data,EX_FLASH_APP_ADDR+i,j);
- WritePageData(FLASH_APP1_ADDR+i,data,j);
- break;
- }else{//剩余数超过1K
- sFlash_Read(data,EX_FLASH_APP_ADDR+i,1024);
- WritePageData(FLASH_APP1_ADDR+i,data,1024);
- i+=1024;
- }
- }
-
- return 1;
- }
- /***********************************************************************************
- *StartMsg
- ************************************************************************************/
- void StartMsg(void)
- {
- int i;
- char buf[30];
-
- g_ulTick500Ct=0;
- g_ulTickCt=0;
-
- switch(g_ucTask){
- case TASK_MODEM_UPDATE:
- IapTrace("EXFLASH_UPDATE!\r\n");
- for(i=0;i<3;i++)
- {
- IapTrace("Copy App data To Mcu...\r\n");
- //校验成功,拷贝到MCU FLASH
- switch(CopyApp2Mcu(sutProductPara.ExAddr, FLASH_APP1_ADDR, sutProductPara.AppLen, sutProductPara.MD5))
- {
- case 0:IapTrace("CopyAppToMcu OK!\r\n");NewTask(TASK_GOTO_APP);return;
- case -1:sprintf(buf, "ExtAddrErr");break;
- case -2:sprintf(buf, "IntAddrErr");break;
- case -3:sprintf(buf, "Md5Err");break;
- case -4:sprintf(buf, "UnMatchData");break;
- default:sprintf(buf, "OtherErr");break;
- }
- strcat(buf, "\r\n");
- IapTrace(buf);
- }
- //连续拷贝3次都失败,可能是FLASH坏了
- IapTrace("CopyAppToMcu Fail!!!\r\n");
- NewTask(TASK_GOTO_APP);
- break;
- case TASK_GOTO_APP:
- ReadFlashData(APP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA));
- if(0 != memcmp("FTOK", sutProductPara.FoTaMark,4)){
- memcpy(&sutProductPara.FoTaMark, "FTOK", 4);
- WriteData(APP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(sutProductPara));
- }
- iap_jump_app_s();
- break;
- }
- }
- /*********************************************************************
- *Tick500Msg
- **********************************************************************/
- void Tick500Msg(void)
- {
- if(g_ulTick500Ct<0xffffffff)g_ulTick500Ct++;
- if(TASK_WAIT==g_ucTask){
-
- if(g_ulTick500Ct<4)return;
- ReadFlashData(APP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA));
- if(0==memcmp("FoTa", sutProductPara.FoTaMark,4)) NewTask(TASK_MODEM_UPDATE);
- else {
- NewTask(TASK_GOTO_APP);
- }
-
- }else if(TASK_PC_UPDATE==g_ucTask){
- if(++g_iPcTaCt>2){
- g_iPcTaCt=0;
- if(1==g_iPcTaFlag || 2==g_iPcTaFlag){
- IapGetUpdateData(PCTA_MAGIC,g_ulOffset);
- }
- }
- }else if(TASK_MODEM_UPDATE==g_ucTask){
- }else if(TASK_GOTO_APP==g_ucTask){
- if(g_ulTick500Ct<4)return;
- if(g_ulTick500Ct&0x00000001)IapTrace("No App!\r\n");
- }
- }
- /**********************************************************************************
- SlwStrCmp
- 判断str是否属于msg的字串,且从位置处于str的开头
- ***********************************************************************************/
- int SlwStrCmp(char *msg,char *str)
- {
- char *p1=str;
- char *p2=msg;
- while(*p1!=0){
- if(*p1!=*p2)return 1;
- p1++;
- p2++;
- }
- return 0;
- }
- /***********************************************************************************
- *Use for PC
- ************************************************************************************/
- void Uart1Msg(void)
- {
- int flag;
- if(TASK_WAIT==g_ucTask){
- if(0==SlwStrCmp((char *)IapRxBuf,"DOWNLOAD_APP")){
- IapTrace("DOWNLOAD_APP\r\n");
- IapGetUpdateVersion(PCTA_MAGIC);
- IapTrace("\r\n");
- return;
- }
- }
-
- flag=IapRecvMsgHandle(IapRxBuf,IapRxLen);
-
- // printf("flag=%d\r\n",flag);
- if(0==flag){
- IapTrace("Completed!");
- NewTask(TASK_GOTO_APP);
- return;
- }
-
- if(flag<-2 && flag>-6){
- IapTrace("IAP Stop!\r\n");
- // printf("error_flag=%d\r\n",flag);
- NewTask(TASK_GOTO_APP);
- }
- g_iPcTaCt=0;
- g_iPcTaFlag=flag;
- }
- /***********************************************************************************/
|