1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #include "iap.h"
- #include "CommandsDefine.h"
- #include "ProjectConfig.h"
- #include "usart.h"
- #include "string.h"
- #include "Helper.h"
- /* 进行更新,传送更新代码
- 正确的响应:烧写传过来的代码
- 发送格式:
- 包起始标识
- +CMD0x06_Request_UpdateSend
- +[2字节的数据长度,=200或最后一帧的数据个数]
- +200字节的程序代码
- +包尾标识
-
- 返回:握手包。
- 包起始标识
- +CMD0xC0_Readback_CMDOK
- +[2字节的数据长度,=1]
- +CMD0x06_Request_UpdateSend
- +包尾标识
- 异常:如果程序在APP中,可能返回错误 Error0x01_CannotRunAtApp
- */
- void CMD0x08_Request_UpdateSend_process(u8 *pData,u16 dataLen,u8 bIsContentBitInverted_Recv,u8 bIsContentBitInverted_SendBack)
- {
- #ifdef RUNNING_WHERE_AT_BOOT
- if(Updating==0)
- {
- Command_SendbackErrorMessage(Error0x06_CMD_UpdateNotStart,1);
- return ;
- }
- u8 responseResult=0;
- //write at
- u32 flashContentBytes=dataLen - sizeof(u32)-sizeof(u32);//format data...+offsetBytes[4bytes]+crcCode[4bytes]
- u32 offsetStartIndex=flashContentBytes;
- u32 offsetBytes=pData[offsetStartIndex] + (pData[offsetStartIndex+1]<<8) + (pData[offsetStartIndex+2]<<16)+ (pData[offsetStartIndex+3]<<24);;
-
- //Crc
- u32 CRCStartIndex = flashContentBytes + sizeof(u32);
- u32 getCRC32 = pData[CRCStartIndex] + (pData[CRCStartIndex+1]<<8) + (pData[CRCStartIndex+2]<<16)+ (pData[CRCStartIndex+3]<<24);
-
- u32 calcCRC32 = Helper_CRC_CalcBlockCRC8(pData,CRCStartIndex);
- if(getCRC32!=calcCRC32)
- {
- responseResult=0xff;
- }
- else
- {
- if (UpdateWhat==RUNNING_AT_APP)
- iap_write_appbin_at_tempArea(offsetBytes,pData,flashContentBytes);
- else
- iap_write_bootbin(offsetBytes,pData,flashContentBytes);
- UpdateRecvedContentBytes+=flashContentBytes;
- responseResult=0x00;
- }
- //response!!!
- u8 dataBytes=1;
- USART_WR_BUF[0]=responseResult;
- USART6_Send(CMD0x08_Request_UpdateSend,dataBytes,bIsContentBitInverted_SendBack);
- #else
- Command_SendbackErrorMessage(Error0x01_CannotRunAtApp,1);
- #endif
- }
|