/* * */ #include "configprotocal.h" #include "main.h" #include "flash.h" #if defined(STM32F405_BOOTLOADER) #define BOOTLOADER_HEAD_LENGTH 4 #define BOOTLOADER_CHECKSUM_LENGTH 2 #define BOOTLOADER_MIN_LENGTH 3 #define BOOTLOADER_HEAD_FLAG 0x02 #define BOOTLOADER_START_INDEX 0 #define BOOTLOADER_LENLOW_INDEX 1 #define BOOTLOADER_LENHIGH_INDEX 2 #define BOOTLOADER_CMD_INDEX 3 #define BOOTLOADER_DATASTART_INDEX 4 extern char dbgBuffer[256]; typedef struct _bl_status_ { uint8_t state; uint8_t temp; uint16_t status; }stBootLoaderStatus; stBootLoaderStatus blStatus = {0}; extern stWriteMemoryStatus writeMemoryStatus; int32_t DataPackageHeadHandler(uint8_t* buf, uint32_t len) { if( len < BOOTLOADER_HEAD_LENGTH) {//Continue return 0; } //if(Inactive == blStatus.state) { if( CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_START_INDEX] && CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENLOW_INDEX] && CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENHIGH_INDEX] && CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_CMD_INDEX]) { blStatus.state = Active; SaveRunStatus(0, 1); SaveRunStatus2(0, 1); ReportString("Enter bootloader mode~~~~\r\n\r\n"); return 1; } } //else { uint16_t datalen = (uint16_t)(((buf[BOOTLOADER_LENHIGH_INDEX]&0x0f)<<8)+buf[BOOTLOADER_LENLOW_INDEX]); if((PROTOCAL_HEAD_FLAG == buf[PROTOCAL_START_INDEX] || PROTOCAL_HEAD_ENCRYPT_FLAG == buf[PROTOCAL_START_INDEX]) && BOOTLOADER_MIN_LENGTH <= datalen)//STX & LEN {//succedd cmdStartTime = HAL_GetTick(); return 1; } else { //Failed: bad head of package return -2; } } } int32_t DataPackageCompleteHandler(uint8_t* buf, uint32_t len, uint8_t* retbuf, uint32_t* retlen) { *retlen = 0; if(buf==NULL || retbuf==NULL || retlen == NULL) {//Failed: unavailible arguments return -1; } if( CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_START_INDEX] && CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENLOW_INDEX] && CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENHIGH_INDEX]&& CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_CMD_INDEX]) { blStatus.state = Active; SaveRunStatus(0, 1); SaveRunStatus2(0, 1); retbuf[BOOTLOADER_START_INDEX] = CFG_COMMAND_STARTLOADER; retbuf[BOOTLOADER_LENLOW_INDEX] = CFG_COMMAND_STARTLOADER; retbuf[BOOTLOADER_LENHIGH_INDEX] = CFG_COMMAND_STARTLOADER; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_STARTLOADER; *retlen = BOOTLOADER_HEAD_LENGTH; return 1; } uint16_t buflen = (uint16_t)(((buf[BOOTLOADER_LENHIGH_INDEX]&0x0f)<<8) + buf[BOOTLOADER_LENLOW_INDEX]); buflen += BOOTLOADER_HEAD_LENGTH - 1; if(len < buflen) {//Continue uint32_t curtick = HAL_GetTick(); if(cmdStartTime > curtick) { cmdStartTime = curtick; } if(curtick - cmdStartTime > COMMAND_FRAME_TIMEOUT) { BuildSettingResponse(buf[PROTOCAL_CMD_INDEX], -3, retbuf, retlen); return -3; } return 0; } uint16_t checkval = CalculateCRC16(buf, buflen - BOOTLOADER_CHECKSUM_LENGTH); uint16_t checksum = (uint16_t)(buf[buflen-2] + (buf[buflen-1]<<8)); if(checkval != checksum) { //Failed: check error return -2; } uint8_t headerSign = buf[PROTOCAL_START_INDEX]; if (PROTOCAL_HEAD_ENCRYPT_FLAG == headerSign) { DecryptTEA(buf, PROTOCAL_DATASTART_INDEX, len - PROTOCAL_HEAD_LENGTH - PROTOCAL_CHECKSUM_LENGTH); } int retval=0; int rx = 0; uConverterUint2Bytes ubConvert; uint16_t datalen = buflen - BOOTLOADER_CHECKSUM_LENGTH - BOOTLOADER_HEAD_LENGTH;//datalen in frame switch(buf[BOOTLOADER_CMD_INDEX]) { case CFG_COMMAND_GETINFORM: { BuildResponse(CFG_COMMAND_GETINFORM, retbuf, retlen); retval=1; } break; case CFG_COMMAND_TIMESET: { rtcTime.tm_year = buf[PROTOCAL_DATASTART_INDEX+0]; rtcTime.tm_mon = buf[PROTOCAL_DATASTART_INDEX+1]; rtcTime.tm_mday = buf[PROTOCAL_DATASTART_INDEX+2]; rtcTime.tm_hour = buf[PROTOCAL_DATASTART_INDEX+3]; rtcTime.tm_min = buf[PROTOCAL_DATASTART_INDEX+4]; rtcTime.tm_sec = buf[PROTOCAL_DATASTART_INDEX+5]; if (rtcTime.tm_mon > 0) { ExcuteTimeSettingCommand(); } BuildSettingResponse(CFG_COMMAND_TIMESET, 0, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGRANGE: //DMW { BuildResponse(CFG_COMMAND_GETCONFIGRANGE, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGETHDBGSERVER: //ETH DBG SERVER IPPORT { BuildResponse(CFG_COMMAND_GETCONFIGETHDBGSERVER, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGETHSERVER: //ETH SERVER IPPORT { BuildResponse(CFG_COMMAND_GETCONFIGETHSERVER, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGETHLOCAL: //ETH LOCAL IPPORT... { BuildResponse(CFG_COMMAND_GETCONFIGETHLOCAL, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGETHMAC: //ETHMAC { BuildResponse(CFG_COMMAND_GETCONFIGETHMAC, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGAPSSID: //WIFI SSID { BuildResponse(CFG_COMMAND_GETCONFIGAPSSID, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGAPPSWD: //WIFI PSWD { BuildResponse(CFG_COMMAND_GETCONFIGAPPSWD, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGWIFISERVER: //WIFI SERVER IP/PORT { BuildResponse(CFG_COMMAND_GETCONFIGWIFISERVER, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETCONFIGWIFILOCAL: //WIFI LOCAL IP/PORT... { BuildResponse(CFG_COMMAND_GETCONFIGWIFILOCAL, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGRANGE://address { buflen = SaveDwmConfig( buf + PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGRANGE, buflen, retbuf, retlen); buflen = 1; } break; /*case 0xc1:// buflen = 0; break; case 0xc2:// buflen = 0; break;*/ case CFG_COMMAND_CONFIGETHDBGSERVER://Server IP&Port { buflen = SaveEthernetDbgServerConfig(buf+PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGETHDBGSERVER, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGETHSERVER://Server IP&Port { buflen = SaveEthernetServerConfig(buf+PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGETHSERVER, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGETHLOCAL://Ethernet localIP, subnetmask, gateway { buflen = SaveEthernetLocalConfig(buf+PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGETHLOCAL, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGETHMAC://Etherne MAC { buflen = SaveEthernetMacAddressConfig(buf+PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGETHMAC, buflen, retbuf, retlen); buflen = 1; } break; /*case 0xc7://NA buflen = 0; break;*/ case CFG_COMMAND_CONFIGAPSSID://AP SSID { buflen = (uint16_t)(buf[PROTOCAL_LENLOW_INDEX]+((buf[PROTOCAL_LENHIGH_INDEX]&0x0f)<<8)); buflen = buflen - PROTOCAL_CHECKSUM_LENGTH - 1; buflen = SaveWifiApNameConfig(buf+PROTOCAL_DATASTART_INDEX, buflen); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGAPSSID, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGAPPSWD://AP Password { buflen = (uint16_t)(buf[PROTOCAL_LENLOW_INDEX]+((buf[PROTOCAL_LENHIGH_INDEX]&0x0f)<<8)); buflen = buflen - PROTOCAL_CHECKSUM_LENGTH - 1; buflen = SaveWifiApPasswordConfig(buf+PROTOCAL_DATASTART_INDEX, buflen); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGAPPSWD, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGWIFISERVER://Wifi Server IP&port { buflen = SaveWifiServerConfig( buf + PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGWIFISERVER, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_CONFIGWIFILOCAL: //WIFI localIP, subnetmask, gateway { buflen = SaveWifiNetworkConfig(buf + PROTOCAL_DATASTART_INDEX); //Build response BuildSettingResponse(CFG_COMMAND_CONFIGWIFILOCAL, buflen, retbuf, retlen); buflen = 1; } break; case CFG_COMMAND_GETRDPROTECTION: break; case CFG_COMMAND_READMEMORY: break; case CFG_COMMAND_GOAPP: { rx = 0; retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG; checksum = rx + BOOTLOADER_CHECKSUM_LENGTH+1; retbuf[BOOTLOADER_LENLOW_INDEX] = checksum; retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_GOAPP; checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH); retbuf[rx + PROTOCAL_HEAD_LENGTH] = checkval; retbuf[rx + PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = rx +PROTOCAL_HEAD_LENGTH +BOOTLOADER_CHECKSUM_LENGTH; blStatus.state = GoApp; retval=1; } break; case CFG_COMMAND_RESET: { resetFlag = buf[PROTOCAL_DATASTART_INDEX+0]; resetFlag += (buf[PROTOCAL_DATASTART_INDEX+1] << 8); checksum = 2; //Build response memset(retbuf, 0, MAX_MESSAGE_LEN); retbuf[PROTOCAL_START_INDEX] = PROTOCAL_HEAD_FLAG; checkval = checksum + PROTOCAL_CHECKSUM_LENGTH + 1; retbuf[PROTOCAL_LENLOW_INDEX] = checkval; retbuf[PROTOCAL_LENHIGH_INDEX] = checkval>>8; retbuf[PROTOCAL_CMD_INDEX] = CFG_COMMAND_RESET; retbuf[PROTOCAL_DATASTART_INDEX+0] = resetFlag;// retbuf[PROTOCAL_DATASTART_INDEX+1] = resetFlag>>8;// checkval = CalculateCRC16(retbuf, checksum + PROTOCAL_HEAD_LENGTH); retbuf[checksum + PROTOCAL_HEAD_LENGTH] = checkval; retbuf[checksum + PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = checksum + PROTOCAL_HEAD_LENGTH + PROTOCAL_CHECKSUM_LENGTH; buflen = 1; } break; case CFG_COMMAND_WRITESTART: { blStatus.state = Active; writeMemoryStatus.fileAddress = APP_ADDRESS; ubConvert.u8Data[0] = buf[BOOTLOADER_DATASTART_INDEX+0]; ubConvert.u8Data[1] = buf[BOOTLOADER_DATASTART_INDEX+1]; ubConvert.u8Data[2] = buf[BOOTLOADER_DATASTART_INDEX+2]; ubConvert.u8Data[3] = buf[BOOTLOADER_DATASTART_INDEX+3]; writeMemoryStatus.fileTotalLength = ubConvert.u32Data; ubConvert.u8Data[0] = buf[BOOTLOADER_DATASTART_INDEX+4]; ubConvert.u8Data[1] = buf[BOOTLOADER_DATASTART_INDEX+5]; ubConvert.u8Data[2] = buf[BOOTLOADER_DATASTART_INDEX+6]; ubConvert.u8Data[3] = buf[BOOTLOADER_DATASTART_INDEX+7]; writeMemoryStatus.datapackLength = ubConvert.u32Data; writeMemoryStatus.fileLength = 0; writeMemoryStatus.datapackIndex = 0; ClearFlashWriteProtect(); rx = EraseFlashProgram(writeMemoryStatus.fileAddress, writeMemoryStatus.fileTotalLength); if( rx > 0) { rx = 6; retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG; checksum = rx+BOOTLOADER_CHECKSUM_LENGTH+1; retbuf[BOOTLOADER_LENLOW_INDEX] = checksum; retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITESTART; ubConvert.u32Data = writeMemoryStatus.datapackIndex; retbuf[BOOTLOADER_DATASTART_INDEX+0] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX+1] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX+2] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX+3] = ubConvert.u8Data[3]; checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH); retbuf[rx+PROTOCAL_HEAD_LENGTH] = checkval; retbuf[rx+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = rx+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH; writeMemoryStatus.fileAddress = APP_ADDRESS; int tLen = sprintf((char*)dbgBuffer,"CFG_COMMAND_WRITESTART FileTotLength=%d\n", writeMemoryStatus.fileTotalLength); ReportMessage(dbgBuffer,tLen); retval=1; } } break; case CFG_COMMAND_WRITEMEMORY: { ubConvert.u8Data[0] = buf[BOOTLOADER_DATASTART_INDEX+0]; ubConvert.u8Data[1] = buf[BOOTLOADER_DATASTART_INDEX+1]; ubConvert.u8Data[2] = buf[BOOTLOADER_DATASTART_INDEX+2]; ubConvert.u8Data[3] = buf[BOOTLOADER_DATASTART_INDEX+3]; writeMemoryStatus.datapackIndex = ubConvert.u32Data; writeMemoryStatus.fileAddress = APP_ADDRESS + writeMemoryStatus.datapackIndex * writeMemoryStatus.datapackLength; if(writeMemoryStatus.datapackIndex * writeMemoryStatus.datapackLength + datalen - 4 <= writeMemoryStatus.fileTotalLength ) { rx = WriteData2FlashProgram(writeMemoryStatus.fileAddress, buf + BOOTLOADER_DATASTART_INDEX + 4, datalen - 4 ); if(rx>0) { writeMemoryStatus.fileLength = writeMemoryStatus.datapackIndex * writeMemoryStatus.datapackLength + datalen - 4; rx=8; retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG; checksum = rx+BOOTLOADER_CHECKSUM_LENGTH+1; retbuf[BOOTLOADER_LENLOW_INDEX] = checksum; retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEMEMORY; ubConvert.u32Data = writeMemoryStatus.datapackIndex; retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3]; ubConvert.u32Data = writeMemoryStatus.fileLength; retbuf[BOOTLOADER_DATASTART_INDEX + 4] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX + 5] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX + 6] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX + 7] = ubConvert.u8Data[3]; checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH); retbuf[rx+PROTOCAL_HEAD_LENGTH] = checkval; retbuf[rx+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = rx+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH; int tLen = sprintf((char*)dbgBuffer,"CFG_COMMAND_WRITEMEMORY %d\n", writeMemoryStatus.datapackIndex); ReportMessage(dbgBuffer,tLen); //writeMemoryStatus.datapackIndex++; retval=1; } else { retval=1; } } else { rx=8; retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG; checksum = rx + BOOTLOADER_CHECKSUM_LENGTH + 1; retbuf[BOOTLOADER_LENLOW_INDEX] = checksum; retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEMEMORY; ubConvert.u32Data = 0xffffffff; retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3]; ubConvert.u32Data = writeMemoryStatus.fileLength; retbuf[BOOTLOADER_DATASTART_INDEX + 4] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX + 5] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX + 6] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX + 7] = ubConvert.u8Data[3]; checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH); retbuf[rx+PROTOCAL_HEAD_LENGTH] = checkval; retbuf[rx+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = rx+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH; retval=1; } } break; case CFG_COMMAND_WRITEFINISH: { checksum = (uint16_t)(buf[BOOTLOADER_DATASTART_INDEX + 0] + (buf[BOOTLOADER_DATASTART_INDEX + 1]<<8)); checkval = CalculateCRC16((uint8_t*)APP_ADDRESS, writeMemoryStatus.fileTotalLength); rx = (checksum == checkval); FinishFlashProgram(APP_ADDRESS, writeMemoryStatus.fileTotalLength); SetFlashWriteProtect(); int tLen = sprintf((char*)dbgBuffer,"CFG_COMMAND_WRITEFINISH chksum=%d, chkval=%d\n, totLen=%d, len=%d", checksum, checkval, writeMemoryStatus.fileTotalLength, writeMemoryStatus.fileLength); ReportMessage(dbgBuffer,tLen); datalen = 6; retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG; checksum = datalen + BOOTLOADER_CHECKSUM_LENGTH + 1; retbuf[BOOTLOADER_LENLOW_INDEX] = checksum; retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEFINISH; ubConvert.u32Data = writeMemoryStatus.fileLength; retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3]; retbuf[BOOTLOADER_DATASTART_INDEX + 4] = (rx); retbuf[BOOTLOADER_DATASTART_INDEX + 5] = (rx >> 8); checkval = CalculateCRC16(retbuf, datalen + PROTOCAL_HEAD_LENGTH); retbuf[datalen+PROTOCAL_HEAD_LENGTH] = checkval; retbuf[datalen+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = datalen+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH; retval=1; if (rx) { blStatus.state = GoApp; } } break; case CFG_COMMAND_EARSEPAGE: break; case CFG_COMMAND_WRITEPROTECT: break; case CFG_COMMAND_WRITEUNPROTECT: break; case CFG_COMMAND_READOUTPROTECT: break; case CFG_COMMAND_READOUTUNPROTECT: break; case CFG_COMMAND_WRITEINFORMATION: { rx = SaveInformation(buf + BOOTLOADER_DATASTART_INDEX, datalen); datalen = 4; retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG; checksum = datalen + BOOTLOADER_CHECKSUM_LENGTH + 1; retbuf[BOOTLOADER_LENLOW_INDEX] = checksum; retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8; retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEINFORMATION; ubConvert.u32Data = rx; retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0]; retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1]; retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2]; retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3]; checkval = CalculateCRC16(retbuf, datalen + PROTOCAL_HEAD_LENGTH); retbuf[datalen+PROTOCAL_HEAD_LENGTH] = checkval; retbuf[datalen+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8; *retlen = datalen + PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH; retval=1; } break; case CFG_COMMAND_HELP: break; } return retval; } uint32_t GetBootloaderStatus(void) { return blStatus.state; } void SetBootloaderStatus(uint8_t status) { blStatus.state = status; } #endif