| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609 |
- /*
- *
- */
- #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
|