/********************************************************************************** * 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){//不够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; } /***********************************************************************************/