loader.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. /*
  2. *
  3. */
  4. #include "configprotocal.h"
  5. #include "main.h"
  6. #include "flash.h"
  7. #if defined(STM32F405_BOOTLOADER)
  8. #define BOOTLOADER_HEAD_LENGTH 4
  9. #define BOOTLOADER_CHECKSUM_LENGTH 2
  10. #define BOOTLOADER_MIN_LENGTH 3
  11. #define BOOTLOADER_HEAD_FLAG 0x02
  12. #define BOOTLOADER_START_INDEX 0
  13. #define BOOTLOADER_LENLOW_INDEX 1
  14. #define BOOTLOADER_LENHIGH_INDEX 2
  15. #define BOOTLOADER_CMD_INDEX 3
  16. #define BOOTLOADER_DATASTART_INDEX 4
  17. extern char dbgBuffer[256];
  18. typedef struct _bl_status_
  19. {
  20. uint8_t state;
  21. uint8_t temp;
  22. uint16_t status;
  23. }stBootLoaderStatus;
  24. stBootLoaderStatus blStatus = {0};
  25. extern stWriteMemoryStatus writeMemoryStatus;
  26. int32_t DataPackageHeadHandler(uint8_t* buf, uint32_t len)
  27. {
  28. if( len < BOOTLOADER_HEAD_LENGTH)
  29. {//Continue
  30. return 0;
  31. }
  32. //if(Inactive == blStatus.state)
  33. {
  34. if( CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_START_INDEX] &&
  35. CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENLOW_INDEX] &&
  36. CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENHIGH_INDEX] &&
  37. CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_CMD_INDEX])
  38. {
  39. blStatus.state = Active;
  40. SaveRunStatus(0, 1);
  41. SaveRunStatus2(0, 1);
  42. ReportString("Enter bootloader mode~~~~\r\n\r\n");
  43. return 1;
  44. }
  45. }
  46. //else
  47. {
  48. uint16_t datalen = (uint16_t)(((buf[BOOTLOADER_LENHIGH_INDEX]&0x0f)<<8)+buf[BOOTLOADER_LENLOW_INDEX]);
  49. if((PROTOCAL_HEAD_FLAG == buf[PROTOCAL_START_INDEX] || PROTOCAL_HEAD_ENCRYPT_FLAG == buf[PROTOCAL_START_INDEX]) &&
  50. BOOTLOADER_MIN_LENGTH <= datalen)//STX & LEN
  51. {//succedd
  52. cmdStartTime = HAL_GetTick();
  53. return 1;
  54. }
  55. else
  56. { //Failed: bad head of package
  57. return -2;
  58. }
  59. }
  60. }
  61. int32_t DataPackageCompleteHandler(uint8_t* buf, uint32_t len, uint8_t* retbuf, uint32_t* retlen)
  62. {
  63. *retlen = 0;
  64. if(buf==NULL || retbuf==NULL || retlen == NULL)
  65. {//Failed: unavailible arguments
  66. return -1;
  67. }
  68. if( CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_START_INDEX] &&
  69. CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENLOW_INDEX] &&
  70. CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_LENHIGH_INDEX]&&
  71. CFG_COMMAND_STARTLOADER == buf[BOOTLOADER_CMD_INDEX])
  72. {
  73. blStatus.state = Active;
  74. SaveRunStatus(0, 1);
  75. SaveRunStatus2(0, 1);
  76. retbuf[BOOTLOADER_START_INDEX] = CFG_COMMAND_STARTLOADER;
  77. retbuf[BOOTLOADER_LENLOW_INDEX] = CFG_COMMAND_STARTLOADER;
  78. retbuf[BOOTLOADER_LENHIGH_INDEX] = CFG_COMMAND_STARTLOADER;
  79. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_STARTLOADER;
  80. *retlen = BOOTLOADER_HEAD_LENGTH;
  81. return 1;
  82. }
  83. uint16_t buflen = (uint16_t)(((buf[BOOTLOADER_LENHIGH_INDEX]&0x0f)<<8) + buf[BOOTLOADER_LENLOW_INDEX]);
  84. buflen += BOOTLOADER_HEAD_LENGTH - 1;
  85. if(len < buflen)
  86. {//Continue
  87. uint32_t curtick = HAL_GetTick();
  88. if(cmdStartTime > curtick)
  89. {
  90. cmdStartTime = curtick;
  91. }
  92. if(curtick - cmdStartTime > COMMAND_FRAME_TIMEOUT)
  93. {
  94. BuildSettingResponse(buf[PROTOCAL_CMD_INDEX], -3, retbuf, retlen);
  95. return -3;
  96. }
  97. return 0;
  98. }
  99. uint16_t checkval = CalculateCRC16(buf, buflen - BOOTLOADER_CHECKSUM_LENGTH);
  100. uint16_t checksum = (uint16_t)(buf[buflen-2] + (buf[buflen-1]<<8));
  101. if(checkval != checksum)
  102. { //Failed: check error
  103. return -2;
  104. }
  105. uint8_t headerSign = buf[PROTOCAL_START_INDEX];
  106. if (PROTOCAL_HEAD_ENCRYPT_FLAG == headerSign)
  107. {
  108. DecryptTEA(buf, PROTOCAL_DATASTART_INDEX, len - PROTOCAL_HEAD_LENGTH - PROTOCAL_CHECKSUM_LENGTH);
  109. }
  110. int retval=0;
  111. int rx = 0;
  112. uConverterUint2Bytes ubConvert;
  113. uint16_t datalen = buflen - BOOTLOADER_CHECKSUM_LENGTH - BOOTLOADER_HEAD_LENGTH;//datalen in frame
  114. switch(buf[BOOTLOADER_CMD_INDEX])
  115. {
  116. case CFG_COMMAND_GETINFORM:
  117. {
  118. BuildResponse(CFG_COMMAND_GETINFORM, retbuf, retlen);
  119. retval=1;
  120. }
  121. break;
  122. case CFG_COMMAND_TIMESET:
  123. {
  124. rtcTime.tm_year = buf[PROTOCAL_DATASTART_INDEX+0];
  125. rtcTime.tm_mon = buf[PROTOCAL_DATASTART_INDEX+1];
  126. rtcTime.tm_mday = buf[PROTOCAL_DATASTART_INDEX+2];
  127. rtcTime.tm_hour = buf[PROTOCAL_DATASTART_INDEX+3];
  128. rtcTime.tm_min = buf[PROTOCAL_DATASTART_INDEX+4];
  129. rtcTime.tm_sec = buf[PROTOCAL_DATASTART_INDEX+5];
  130. if (rtcTime.tm_mon > 0)
  131. {
  132. ExcuteTimeSettingCommand();
  133. }
  134. BuildSettingResponse(CFG_COMMAND_TIMESET, 0, retbuf, retlen);
  135. buflen = 1;
  136. }
  137. break;
  138. case CFG_COMMAND_GETCONFIGRANGE: //DMW
  139. {
  140. BuildResponse(CFG_COMMAND_GETCONFIGRANGE, retbuf, retlen);
  141. buflen = 1;
  142. }
  143. break;
  144. case CFG_COMMAND_GETCONFIGETHDBGSERVER: //ETH DBG SERVER IPPORT
  145. {
  146. BuildResponse(CFG_COMMAND_GETCONFIGETHDBGSERVER, retbuf, retlen);
  147. buflen = 1;
  148. }
  149. break;
  150. case CFG_COMMAND_GETCONFIGETHSERVER: //ETH SERVER IPPORT
  151. {
  152. BuildResponse(CFG_COMMAND_GETCONFIGETHSERVER, retbuf, retlen);
  153. buflen = 1;
  154. }
  155. break;
  156. case CFG_COMMAND_GETCONFIGETHLOCAL: //ETH LOCAL IPPORT...
  157. {
  158. BuildResponse(CFG_COMMAND_GETCONFIGETHLOCAL, retbuf, retlen);
  159. buflen = 1;
  160. }
  161. break;
  162. case CFG_COMMAND_GETCONFIGETHMAC: //ETHMAC
  163. {
  164. BuildResponse(CFG_COMMAND_GETCONFIGETHMAC, retbuf, retlen);
  165. buflen = 1;
  166. }
  167. break;
  168. case CFG_COMMAND_GETCONFIGAPSSID: //WIFI SSID
  169. {
  170. BuildResponse(CFG_COMMAND_GETCONFIGAPSSID, retbuf, retlen);
  171. buflen = 1;
  172. }
  173. break;
  174. case CFG_COMMAND_GETCONFIGAPPSWD: //WIFI PSWD
  175. {
  176. BuildResponse(CFG_COMMAND_GETCONFIGAPPSWD, retbuf, retlen);
  177. buflen = 1;
  178. }
  179. break;
  180. case CFG_COMMAND_GETCONFIGWIFISERVER: //WIFI SERVER IP/PORT
  181. {
  182. BuildResponse(CFG_COMMAND_GETCONFIGWIFISERVER, retbuf, retlen);
  183. buflen = 1;
  184. }
  185. break;
  186. case CFG_COMMAND_GETCONFIGWIFILOCAL: //WIFI LOCAL IP/PORT...
  187. {
  188. BuildResponse(CFG_COMMAND_GETCONFIGWIFILOCAL, retbuf, retlen);
  189. buflen = 1;
  190. }
  191. break;
  192. case CFG_COMMAND_CONFIGRANGE://address
  193. {
  194. buflen = SaveDwmConfig( buf + PROTOCAL_DATASTART_INDEX);
  195. //Build response
  196. BuildSettingResponse(CFG_COMMAND_CONFIGRANGE, buflen, retbuf, retlen);
  197. buflen = 1;
  198. }
  199. break;
  200. /*case 0xc1://
  201. buflen = 0;
  202. break;
  203. case 0xc2://
  204. buflen = 0;
  205. break;*/
  206. case CFG_COMMAND_CONFIGETHDBGSERVER://Server IP&Port
  207. {
  208. buflen = SaveEthernetDbgServerConfig(buf+PROTOCAL_DATASTART_INDEX);
  209. //Build response
  210. BuildSettingResponse(CFG_COMMAND_CONFIGETHDBGSERVER, buflen, retbuf, retlen);
  211. buflen = 1;
  212. }
  213. break;
  214. case CFG_COMMAND_CONFIGETHSERVER://Server IP&Port
  215. {
  216. buflen = SaveEthernetServerConfig(buf+PROTOCAL_DATASTART_INDEX);
  217. //Build response
  218. BuildSettingResponse(CFG_COMMAND_CONFIGETHSERVER, buflen, retbuf, retlen);
  219. buflen = 1;
  220. }
  221. break;
  222. case CFG_COMMAND_CONFIGETHLOCAL://Ethernet localIP, subnetmask, gateway
  223. {
  224. buflen = SaveEthernetLocalConfig(buf+PROTOCAL_DATASTART_INDEX);
  225. //Build response
  226. BuildSettingResponse(CFG_COMMAND_CONFIGETHLOCAL, buflen, retbuf, retlen);
  227. buflen = 1;
  228. }
  229. break;
  230. case CFG_COMMAND_CONFIGETHMAC://Etherne MAC
  231. {
  232. buflen = SaveEthernetMacAddressConfig(buf+PROTOCAL_DATASTART_INDEX);
  233. //Build response
  234. BuildSettingResponse(CFG_COMMAND_CONFIGETHMAC, buflen, retbuf, retlen);
  235. buflen = 1;
  236. }
  237. break;
  238. /*case 0xc7://NA
  239. buflen = 0;
  240. break;*/
  241. case CFG_COMMAND_CONFIGAPSSID://AP SSID
  242. {
  243. buflen = (uint16_t)(buf[PROTOCAL_LENLOW_INDEX]+((buf[PROTOCAL_LENHIGH_INDEX]&0x0f)<<8));
  244. buflen = buflen - PROTOCAL_CHECKSUM_LENGTH - 1;
  245. buflen = SaveWifiApNameConfig(buf+PROTOCAL_DATASTART_INDEX, buflen);
  246. //Build response
  247. BuildSettingResponse(CFG_COMMAND_CONFIGAPSSID, buflen, retbuf, retlen);
  248. buflen = 1;
  249. }
  250. break;
  251. case CFG_COMMAND_CONFIGAPPSWD://AP Password
  252. {
  253. buflen = (uint16_t)(buf[PROTOCAL_LENLOW_INDEX]+((buf[PROTOCAL_LENHIGH_INDEX]&0x0f)<<8));
  254. buflen = buflen - PROTOCAL_CHECKSUM_LENGTH - 1;
  255. buflen = SaveWifiApPasswordConfig(buf+PROTOCAL_DATASTART_INDEX, buflen);
  256. //Build response
  257. BuildSettingResponse(CFG_COMMAND_CONFIGAPPSWD, buflen, retbuf, retlen);
  258. buflen = 1;
  259. }
  260. break;
  261. case CFG_COMMAND_CONFIGWIFISERVER://Wifi Server IP&port
  262. {
  263. buflen = SaveWifiServerConfig( buf + PROTOCAL_DATASTART_INDEX);
  264. //Build response
  265. BuildSettingResponse(CFG_COMMAND_CONFIGWIFISERVER, buflen, retbuf, retlen);
  266. buflen = 1;
  267. }
  268. break;
  269. case CFG_COMMAND_CONFIGWIFILOCAL: //WIFI localIP, subnetmask, gateway
  270. {
  271. buflen = SaveWifiNetworkConfig(buf + PROTOCAL_DATASTART_INDEX);
  272. //Build response
  273. BuildSettingResponse(CFG_COMMAND_CONFIGWIFILOCAL, buflen, retbuf, retlen);
  274. buflen = 1;
  275. }
  276. break;
  277. case CFG_COMMAND_GETRDPROTECTION:
  278. break;
  279. case CFG_COMMAND_READMEMORY:
  280. break;
  281. case CFG_COMMAND_GOAPP:
  282. {
  283. rx = 0;
  284. retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG;
  285. checksum = rx + BOOTLOADER_CHECKSUM_LENGTH+1;
  286. retbuf[BOOTLOADER_LENLOW_INDEX] = checksum;
  287. retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8;
  288. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_GOAPP;
  289. checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH);
  290. retbuf[rx + PROTOCAL_HEAD_LENGTH] = checkval;
  291. retbuf[rx + PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  292. *retlen = rx +PROTOCAL_HEAD_LENGTH +BOOTLOADER_CHECKSUM_LENGTH;
  293. blStatus.state = GoApp;
  294. retval=1;
  295. }
  296. break;
  297. case CFG_COMMAND_RESET:
  298. {
  299. resetFlag = buf[PROTOCAL_DATASTART_INDEX+0];
  300. resetFlag += (buf[PROTOCAL_DATASTART_INDEX+1] << 8);
  301. checksum = 2;
  302. //Build response
  303. memset(retbuf, 0, MAX_MESSAGE_LEN);
  304. retbuf[PROTOCAL_START_INDEX] = PROTOCAL_HEAD_FLAG;
  305. checkval = checksum + PROTOCAL_CHECKSUM_LENGTH + 1;
  306. retbuf[PROTOCAL_LENLOW_INDEX] = checkval;
  307. retbuf[PROTOCAL_LENHIGH_INDEX] = checkval>>8;
  308. retbuf[PROTOCAL_CMD_INDEX] = CFG_COMMAND_RESET;
  309. retbuf[PROTOCAL_DATASTART_INDEX+0] = resetFlag;//
  310. retbuf[PROTOCAL_DATASTART_INDEX+1] = resetFlag>>8;//
  311. checkval = CalculateCRC16(retbuf, checksum + PROTOCAL_HEAD_LENGTH);
  312. retbuf[checksum + PROTOCAL_HEAD_LENGTH] = checkval;
  313. retbuf[checksum + PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  314. *retlen = checksum + PROTOCAL_HEAD_LENGTH + PROTOCAL_CHECKSUM_LENGTH;
  315. buflen = 1;
  316. }
  317. break;
  318. case CFG_COMMAND_WRITESTART:
  319. {
  320. blStatus.state = Active;
  321. writeMemoryStatus.fileAddress = APP_ADDRESS;
  322. ubConvert.u8Data[0] = buf[BOOTLOADER_DATASTART_INDEX+0];
  323. ubConvert.u8Data[1] = buf[BOOTLOADER_DATASTART_INDEX+1];
  324. ubConvert.u8Data[2] = buf[BOOTLOADER_DATASTART_INDEX+2];
  325. ubConvert.u8Data[3] = buf[BOOTLOADER_DATASTART_INDEX+3];
  326. writeMemoryStatus.fileTotalLength = ubConvert.u32Data;
  327. ubConvert.u8Data[0] = buf[BOOTLOADER_DATASTART_INDEX+4];
  328. ubConvert.u8Data[1] = buf[BOOTLOADER_DATASTART_INDEX+5];
  329. ubConvert.u8Data[2] = buf[BOOTLOADER_DATASTART_INDEX+6];
  330. ubConvert.u8Data[3] = buf[BOOTLOADER_DATASTART_INDEX+7];
  331. writeMemoryStatus.datapackLength = ubConvert.u32Data;
  332. writeMemoryStatus.fileLength = 0;
  333. writeMemoryStatus.datapackIndex = 0;
  334. ClearFlashWriteProtect();
  335. rx = EraseFlashProgram(writeMemoryStatus.fileAddress, writeMemoryStatus.fileTotalLength);
  336. if( rx > 0)
  337. {
  338. rx = 6;
  339. retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG;
  340. checksum = rx+BOOTLOADER_CHECKSUM_LENGTH+1;
  341. retbuf[BOOTLOADER_LENLOW_INDEX] = checksum;
  342. retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8;
  343. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITESTART;
  344. ubConvert.u32Data = writeMemoryStatus.datapackIndex;
  345. retbuf[BOOTLOADER_DATASTART_INDEX+0] = ubConvert.u8Data[0];
  346. retbuf[BOOTLOADER_DATASTART_INDEX+1] = ubConvert.u8Data[1];
  347. retbuf[BOOTLOADER_DATASTART_INDEX+2] = ubConvert.u8Data[2];
  348. retbuf[BOOTLOADER_DATASTART_INDEX+3] = ubConvert.u8Data[3];
  349. checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH);
  350. retbuf[rx+PROTOCAL_HEAD_LENGTH] = checkval;
  351. retbuf[rx+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  352. *retlen = rx+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH;
  353. writeMemoryStatus.fileAddress = APP_ADDRESS;
  354. int tLen = sprintf((char*)dbgBuffer,"CFG_COMMAND_WRITESTART FileTotLength=%d\n", writeMemoryStatus.fileTotalLength);
  355. ReportMessage(dbgBuffer,tLen);
  356. retval=1;
  357. }
  358. }
  359. break;
  360. case CFG_COMMAND_WRITEMEMORY:
  361. {
  362. ubConvert.u8Data[0] = buf[BOOTLOADER_DATASTART_INDEX+0];
  363. ubConvert.u8Data[1] = buf[BOOTLOADER_DATASTART_INDEX+1];
  364. ubConvert.u8Data[2] = buf[BOOTLOADER_DATASTART_INDEX+2];
  365. ubConvert.u8Data[3] = buf[BOOTLOADER_DATASTART_INDEX+3];
  366. writeMemoryStatus.datapackIndex = ubConvert.u32Data;
  367. writeMemoryStatus.fileAddress = APP_ADDRESS + writeMemoryStatus.datapackIndex * writeMemoryStatus.datapackLength;
  368. if(writeMemoryStatus.datapackIndex * writeMemoryStatus.datapackLength + datalen - 4 <= writeMemoryStatus.fileTotalLength )
  369. {
  370. rx = WriteData2FlashProgram(writeMemoryStatus.fileAddress, buf + BOOTLOADER_DATASTART_INDEX + 4, datalen - 4 );
  371. if(rx>0)
  372. {
  373. writeMemoryStatus.fileLength = writeMemoryStatus.datapackIndex * writeMemoryStatus.datapackLength + datalen - 4;
  374. rx=8;
  375. retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG;
  376. checksum = rx+BOOTLOADER_CHECKSUM_LENGTH+1;
  377. retbuf[BOOTLOADER_LENLOW_INDEX] = checksum;
  378. retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8;
  379. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEMEMORY;
  380. ubConvert.u32Data = writeMemoryStatus.datapackIndex;
  381. retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0];
  382. retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1];
  383. retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2];
  384. retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3];
  385. ubConvert.u32Data = writeMemoryStatus.fileLength;
  386. retbuf[BOOTLOADER_DATASTART_INDEX + 4] = ubConvert.u8Data[0];
  387. retbuf[BOOTLOADER_DATASTART_INDEX + 5] = ubConvert.u8Data[1];
  388. retbuf[BOOTLOADER_DATASTART_INDEX + 6] = ubConvert.u8Data[2];
  389. retbuf[BOOTLOADER_DATASTART_INDEX + 7] = ubConvert.u8Data[3];
  390. checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH);
  391. retbuf[rx+PROTOCAL_HEAD_LENGTH] = checkval;
  392. retbuf[rx+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  393. *retlen = rx+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH;
  394. int tLen = sprintf((char*)dbgBuffer,"CFG_COMMAND_WRITEMEMORY %d\n", writeMemoryStatus.datapackIndex);
  395. ReportMessage(dbgBuffer,tLen);
  396. //writeMemoryStatus.datapackIndex++;
  397. retval=1;
  398. }
  399. else
  400. {
  401. retval=1;
  402. }
  403. }
  404. else
  405. {
  406. rx=8;
  407. retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG;
  408. checksum = rx + BOOTLOADER_CHECKSUM_LENGTH + 1;
  409. retbuf[BOOTLOADER_LENLOW_INDEX] = checksum;
  410. retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8;
  411. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEMEMORY;
  412. ubConvert.u32Data = 0xffffffff;
  413. retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0];
  414. retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1];
  415. retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2];
  416. retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3];
  417. ubConvert.u32Data = writeMemoryStatus.fileLength;
  418. retbuf[BOOTLOADER_DATASTART_INDEX + 4] = ubConvert.u8Data[0];
  419. retbuf[BOOTLOADER_DATASTART_INDEX + 5] = ubConvert.u8Data[1];
  420. retbuf[BOOTLOADER_DATASTART_INDEX + 6] = ubConvert.u8Data[2];
  421. retbuf[BOOTLOADER_DATASTART_INDEX + 7] = ubConvert.u8Data[3];
  422. checkval = CalculateCRC16(retbuf, rx + PROTOCAL_HEAD_LENGTH);
  423. retbuf[rx+PROTOCAL_HEAD_LENGTH] = checkval;
  424. retbuf[rx+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  425. *retlen = rx+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH;
  426. retval=1;
  427. }
  428. }
  429. break;
  430. case CFG_COMMAND_WRITEFINISH:
  431. {
  432. checksum = (uint16_t)(buf[BOOTLOADER_DATASTART_INDEX + 0] + (buf[BOOTLOADER_DATASTART_INDEX + 1]<<8));
  433. checkval = CalculateCRC16((uint8_t*)APP_ADDRESS, writeMemoryStatus.fileTotalLength);
  434. rx = (checksum == checkval);
  435. FinishFlashProgram(APP_ADDRESS, writeMemoryStatus.fileTotalLength);
  436. SetFlashWriteProtect();
  437. int tLen = sprintf((char*)dbgBuffer,"CFG_COMMAND_WRITEFINISH chksum=%d, chkval=%d\n, totLen=%d, len=%d", checksum, checkval, writeMemoryStatus.fileTotalLength, writeMemoryStatus.fileLength);
  438. ReportMessage(dbgBuffer,tLen);
  439. datalen = 6;
  440. retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG;
  441. checksum = datalen + BOOTLOADER_CHECKSUM_LENGTH + 1;
  442. retbuf[BOOTLOADER_LENLOW_INDEX] = checksum;
  443. retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8;
  444. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEFINISH;
  445. ubConvert.u32Data = writeMemoryStatus.fileLength;
  446. retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0];
  447. retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1];
  448. retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2];
  449. retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3];
  450. retbuf[BOOTLOADER_DATASTART_INDEX + 4] = (rx);
  451. retbuf[BOOTLOADER_DATASTART_INDEX + 5] = (rx >> 8);
  452. checkval = CalculateCRC16(retbuf, datalen + PROTOCAL_HEAD_LENGTH);
  453. retbuf[datalen+PROTOCAL_HEAD_LENGTH] = checkval;
  454. retbuf[datalen+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  455. *retlen = datalen+PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH;
  456. retval=1;
  457. if (rx)
  458. {
  459. blStatus.state = GoApp;
  460. }
  461. }
  462. break;
  463. case CFG_COMMAND_EARSEPAGE:
  464. break;
  465. case CFG_COMMAND_WRITEPROTECT:
  466. break;
  467. case CFG_COMMAND_WRITEUNPROTECT:
  468. break;
  469. case CFG_COMMAND_READOUTPROTECT:
  470. break;
  471. case CFG_COMMAND_READOUTUNPROTECT:
  472. break;
  473. case CFG_COMMAND_WRITEINFORMATION:
  474. {
  475. rx = SaveInformation(buf + BOOTLOADER_DATASTART_INDEX, datalen);
  476. datalen = 4;
  477. retbuf[BOOTLOADER_START_INDEX] = BOOTLOADER_HEAD_FLAG;
  478. checksum = datalen + BOOTLOADER_CHECKSUM_LENGTH + 1;
  479. retbuf[BOOTLOADER_LENLOW_INDEX] = checksum;
  480. retbuf[BOOTLOADER_LENHIGH_INDEX] = checksum>>8;
  481. retbuf[BOOTLOADER_CMD_INDEX] = CFG_COMMAND_WRITEINFORMATION;
  482. ubConvert.u32Data = rx;
  483. retbuf[BOOTLOADER_DATASTART_INDEX + 0] = ubConvert.u8Data[0];
  484. retbuf[BOOTLOADER_DATASTART_INDEX + 1] = ubConvert.u8Data[1];
  485. retbuf[BOOTLOADER_DATASTART_INDEX + 2] = ubConvert.u8Data[2];
  486. retbuf[BOOTLOADER_DATASTART_INDEX + 3] = ubConvert.u8Data[3];
  487. checkval = CalculateCRC16(retbuf, datalen + PROTOCAL_HEAD_LENGTH);
  488. retbuf[datalen+PROTOCAL_HEAD_LENGTH] = checkval;
  489. retbuf[datalen+PROTOCAL_HEAD_LENGTH + 1] = checkval>>8;
  490. *retlen = datalen + PROTOCAL_HEAD_LENGTH + BOOTLOADER_CHECKSUM_LENGTH;
  491. retval=1;
  492. }
  493. break;
  494. case CFG_COMMAND_HELP:
  495. break;
  496. }
  497. return retval;
  498. }
  499. uint32_t GetBootloaderStatus(void)
  500. {
  501. return blStatus.state;
  502. }
  503. void SetBootloaderStatus(uint8_t status)
  504. {
  505. blStatus.state = status;
  506. }
  507. #endif