MBIC_Bootloader.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. /*
  2. * MBIC_Bootloader.c
  3. *
  4. * Created on: 2020. 5. 18.
  5. * Author: parkyj
  6. */
  7. #include <stdio.h>
  8. #include <stdint.h>
  9. #include <stdbool.h>
  10. #include "main.h"
  11. #include "MBIC_Bootloader.h"
  12. #include "flash.h"
  13. #include "CRC.h"
  14. #include "uart.h"
  15. extern __IO bool EraseInit;
  16. extern uint8_t Bank_Flash_write(uint8_t* data,uint32_t StartBankAddress);
  17. extern void MBIC_DataErase_Func(uint8_t bank_num);
  18. extern uint8_t MBIC_APIFLASH_Func(uint8_t* data,uint32_t size,uint8_t bank_num);
  19. extern void MBIC_DataBankWrite(uint8_t BankNum);
  20. BootLoaderDataCheck_st MBIC_FileDataCheck(uint8_t* data){
  21. BootLoaderDataCheck_st ret = {0,0,false};
  22. int8_t MBIC_Mark[9] = "JT-NRDAS ";
  23. int8_t MBIC_FileName1[] = "jhfs-mbic-nrdas-v";
  24. int8_t MBIC_FileName2[] = "v00.00.04.mbc";
  25. uint8_t MBIC_type = 0x20;
  26. uint8_t MBIC_FileType = 0x00;
  27. int i = 0;
  28. /***
  29. MARK Check
  30. ***/
  31. for(i = MARK_START_POSITION; i < TYPE_START_POSITION; i++){
  32. if(MBIC_Mark[i] != data[i]){
  33. printf("Data Diff \r\n");
  34. return ret;
  35. }else{
  36. printf("MARK Data Success \r\n");
  37. }
  38. }
  39. /***
  40. TYPE Check
  41. ***/
  42. for(i = TYPE_START_POSITION; i < FILE_TYPE_START_POSITION; i++){
  43. if(MBIC_type != data[i]){
  44. printf("Data Diff \r\n");
  45. return ret;
  46. }
  47. else
  48. printf("Type Data Success \r\n");
  49. }
  50. /***
  51. File Type Check
  52. ***/
  53. for(i = FILE_TYPE_START_POSITION; i < VERSION_START_POSITION; i++){
  54. if(MBIC_FileType != data[i]){
  55. printf("Data Diff \r\n");
  56. return ret;
  57. }
  58. else
  59. printf("File Type Data Success \r\n");
  60. }
  61. /***
  62. Version Check
  63. ***/
  64. for(i = VERSION_START_POSITION; i < FILENAME_START_POSITION; i++){
  65. printf("Version Data Success Version %x\r\n",data[i]);
  66. }
  67. /***
  68. File Name Check
  69. ***/
  70. for(i = FILENAME_START_POSITION; i < 30; i++){
  71. if(MBIC_FileName1[i-14] != data[i]){
  72. printf("Data Diff \r\n");
  73. printf("MBIC_FileName1[%d] : %x, data[%d] : %x\r\n",i - 14,MBIC_FileName1[i - 14],i,data[i]);
  74. return ret;
  75. }
  76. else
  77. printf("File Name Data Success %c\r\n",data[i]);
  78. }
  79. for(i = i; i < 43; i++){
  80. if(MBIC_FileName2[i-30] != data[i]){
  81. // printf("Data Diff %c\r\n",data[i]);
  82. // printf("MBIC_FileName2[%d] : %x, data[%d] : %x\r\n",i - 30,MBIC_FileName2[i - 30],i,data[i]);
  83. // return ret;
  84. }
  85. else
  86. printf("File Name Data Success %c\r\n",data[i]);
  87. }
  88. for(i = i; i < 49; i++){
  89. printf("Creation Success %x\r\n",data[i]);
  90. }
  91. for(i = i; i < 55; i++){
  92. printf("Creation Success data[%d] : %x\r\n",i,data[i]);
  93. }
  94. printf(" %d",data[i++]);
  95. printf(" -%02d",data[i++]);
  96. printf(" -%02d",data[i++]);
  97. printf(" -%02d",data[i++]);
  98. printf(" -%02d",data[i++]);
  99. printf(" -%02d\r\n",data[i++]);
  100. ret.Length = ((data[i++] << 8) & 0xFF00);
  101. ret.Length += (data[i++]);
  102. printf("data[%d] : %d\r\n",i - 1,ret.Length);
  103. printf("data[%d] : %d\r\n",i - 1,ret.Length);
  104. ret.Crcchk = ((data[i++] << 8) & 0xFF00);
  105. ret.Crcchk += (data[i++]);
  106. /*ONLY DATA CRC*/
  107. printf("CRC_H[%d] : %x\r\n",i,ret.Crcchk);
  108. printf("CRC_L[%d] : %x\r\n",i,ret.Crcchk);
  109. ret.FileChk = true;
  110. return ret;
  111. }
  112. /*
  113. MBIC Basic Header merge function
  114. Data : Response Data
  115. Length : Response Data Length
  116. CRCINDEX : CRC INDEX Number
  117. */
  118. uint8_t* MBIC_HeaderMergeFunction(uint8_t* data,uint16_t Length )
  119. {
  120. uint8_t ret[Length + 22 + 3];/*Data Length + Header Length + Tail Length*/
  121. uint16_t CRCData = CRC16_Generate(data,Length);
  122. /*CRC Create*/
  123. ret[MBIC_PAYLOADSTART + Length + 0] = ((CRCData & 0xFF00) >> 8);
  124. ret[MBIC_PAYLOADSTART + Length + 1] = ((CRCData & 0x00FF));
  125. ret[MBIC_PAYLOADSTART + Length + 2] = 0x03;
  126. /*Data Mark Create*/
  127. ret[MBIC_PREAMBLE_0] = MBIC_PREAMBLE0;
  128. ret[MBIC_PREAMBLE_1] = MBIC_PREAMBLE1;
  129. ret[MBIC_PREAMBLE_2] = MBIC_PREAMBLE2;
  130. ret[MBIC_PREAMBLE_3] = MBIC_PREAMBLE3;
  131. /*Data Subid Create*/
  132. ret[MBIC_SUBUID_0] = MBIC_SUBUID0;
  133. ret[MBIC_SUBUID_1] = MBIC_SUBUID1;
  134. ret[MBIC_RCODE_0] = data[MBIC_RCODE_0];
  135. ret[MBIC_TRID_0] = data[MBIC_TRID_0];
  136. ret[MBIC_TRID_1] = data[MBIC_TRID_1];
  137. ret[MBIC_SEQSUM_0] = data[MBIC_SEQSUM_0];
  138. ret[MBIC_TTL_0] = data[MBIC_TTL_0];
  139. ret[MBIC_TIME_0] = data[MBIC_TIME_0];
  140. ret[MBIC_TIME_1] = data[MBIC_TIME_1];
  141. ret[MBIC_TIME_2] = data[MBIC_TIME_2];
  142. ret[MBIC_TIME_3] = data[MBIC_TIME_3];
  143. ret[MBIC_TIME_4] = data[MBIC_TIME_4];
  144. ret[MBIC_TIME_5] = data[MBIC_TIME_5];
  145. ret[MBIC_ERRRESPONSE_0] = MBIC_ERRRESPONSE;
  146. ret[MBIC_CMD_0] = data[MBIC_CMD_0];
  147. ret[MBIC_LENGTH_0] = (Length & 0xFF00) >> 8;
  148. ret[MBIC_LENGTH_1] = Length & 0x00FF;
  149. ret[MBIC_HEADERCHECKSUM_0] = Chksum_Create(ret);
  150. /*Data Move*/
  151. // for(int i = 0; i < Length; i++){
  152. // data[MBIC_PAYLOADSTART + i] = data[i];
  153. // }
  154. /*
  155. MBIC Header Data input
  156. */
  157. for(int i = 0; i < MBIC_HEADER_SIZE; i++){
  158. if(i == MBIC_CMD_0) /*cmd exception*/
  159. continue;
  160. data[i] = ret[i];
  161. }
  162. /*
  163. MBIC Tail Data input
  164. */
  165. for(int i = MBIC_HEADER_SIZE + Length; i < MBIC_HEADER_SIZE + MBIC_TAIL_SIZE + Length; i++){
  166. data[i] = ret[i];
  167. }
  168. // for(uint16_t i = 0; i < Length; i ++)
  169. // ret[MBIC_PAYLOADSTART + i] = data[i];
  170. // for(int i = 0; i < Length; i++)
  171. // printf("MBIC : %x \r\n",data[i]);
  172. return data;
  173. }
  174. extern uint32_t MBIC_Address;
  175. uint8_t MBIC_Resp[2048];
  176. void MBIC_Bootloader_FirmwareUpdate(uint8_t* data){
  177. uint8_t MBIC_DownLoadData[0xFFFF];
  178. uint8_t cmd = data[MBIC_CMD_0];
  179. static uint8_t Download_Option = 0;
  180. uint16_t index = 0;
  181. static uint32_t Curr_Download_DataIndex = 0;
  182. static uint32_t Prev_Download_DataIndex = 0;
  183. uint32_t TotalFrame = 0;
  184. uint32_t CurrFrame = 0;
  185. uint32_t PrevFrame = 0 ;
  186. static uint32_t prevFrame = 0xFF;
  187. uint16_t DataLength = 0;
  188. uint16_t Crcret = 0;
  189. uint16_t RecvCrc = 0;
  190. uint32_t i = 0 ;
  191. uint32_t FirmFile_Length = 0;
  192. uint32_t CurrApiAddress = 0,Bank1Address=0,Bank2Address = 0;
  193. static uint8_t BankNum = 0;
  194. static bool CRCERR = false;
  195. CurrApiAddress = FLASH_MBICUSER_START_ADDR;
  196. Bank1Address = FLASH_USER_BANK1_START_ADDR;
  197. Bank2Address = FLASH_USER_BANK2_START_ADDR;
  198. uint8_t* Currdata = (uint8_t*)CurrApiAddress;
  199. uint8_t* Bank1data = (uint8_t*)Bank1Address;
  200. uint8_t* Bank2data = (uint8_t*)Bank2Address;
  201. #if 0 // PYJ.2020.06.04_BEGIN --
  202. uint8_t dataTest[1024] = {
  203. 0x4A,0x54,0x2D,0x4E,0x52,0x44,0x41,0x53,0x20,0x20,0x00,0x00,
  204. 0x00,0x01,0x6A,0x68,0x66,0x73,0x2D,0x6D,0x62,0x69,0x63,0x2D,
  205. 0x6E,0x72,0x64,0x61,0x73,0x2D,0x76,0x30,0x30,0x2E,0x30,0x30,0x2E,
  206. 0x30,0x31,0x2E,0x6D,0x62,0x63,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  207. 0x20,0x20,0x20,0x20,0x20,0x14,0x06,0x03,0x10,0x1F,0xC4,0x3C,0x49,
  208. 0x42,0x98,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  209. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  210. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  211. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  212. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  213. };
  214. #endif // PYJ.2020.06.04_END --
  215. // printf("RX");
  216. // for(int i = 0; i < 128; i++)
  217. // printf("%c",*data++);
  218. switch(cmd){
  219. case MBIC_Notice_REQ:
  220. Download_Option = 0;
  221. Curr_Download_DataIndex = 0;
  222. Prev_Download_DataIndex = 0;
  223. printf("MBIC DOWNLOAD REQUEST \r\n");
  224. cmd = MBIC_Notice_RSP;
  225. CRCERR = false;
  226. EraseInit = false;
  227. /*TOTAL FRAME NUMBER*/
  228. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
  229. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];
  230. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
  231. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];
  232. /*DOWNLOAD OPTION*/
  233. data[MBIC_PAYLOADSTART + index++] = 1;
  234. Download_Option = data[MBIC_PAYLOADSTART + 4];
  235. /*DOWNLOAD DELAY REQUEST*/
  236. data[MBIC_PAYLOADSTART + index++] = 10;
  237. /*DOWNLOAD Reserve*/
  238. data[MBIC_PAYLOADSTART + index++] = 0;
  239. data[MBIC_PAYLOADSTART + index++] = 0;
  240. data[MBIC_PAYLOADSTART + index++] = 0;
  241. data[MBIC_PAYLOADSTART + index++] = 0;
  242. data[MBIC_PAYLOADSTART + index++] = 0;
  243. data[MBIC_PAYLOADSTART + index++] = 0;
  244. // MBIC_DataBankWrite(1);
  245. //if()
  246. // MBIC_DataErase_Func(bluecell_Currdatastatus.CPU_Bank_Select);
  247. // HAL_Delay(10);
  248. // printf("ccc\r\n");
  249. break;
  250. case MBIC_Download_DATA_REQ:
  251. TotalFrame = data[MBIC_PAYLOADSTART + 0] << 24
  252. |data[MBIC_PAYLOADSTART + 1] << 16
  253. |data[MBIC_PAYLOADSTART + 2] << 8
  254. |data[MBIC_PAYLOADSTART + 3] << 0;
  255. CurrFrame = data[MBIC_PAYLOADSTART + 4] << 24
  256. |data[MBIC_PAYLOADSTART + 5] << 16
  257. |data[MBIC_PAYLOADSTART + 6] << 8
  258. |data[MBIC_PAYLOADSTART + 7] << 0;
  259. // MBIC_FileDataCheck(data);
  260. cmd = MBIC_Download_DATA_RSP;
  261. /*TOTAL FRAME NUMBER*/
  262. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
  263. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 1];
  264. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
  265. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];
  266. /*Current Download Frame Number*/
  267. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
  268. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 5];
  269. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 6];
  270. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 7];
  271. Curr_Download_DataIndex = data[MBIC_PAYLOADSTART + 4] << 24;
  272. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 5] << 16;
  273. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 6] << 8;
  274. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 7];
  275. /*DOWNLOAD Reserve*/
  276. data[MBIC_PAYLOADSTART + index++] = 0;
  277. data[MBIC_PAYLOADSTART + index++] = 0;
  278. data[MBIC_PAYLOADSTART + index++] = 0;
  279. data[MBIC_PAYLOADSTART + index++] = 0;
  280. #if 0 // PYJ.2020.06.24_BEGIN --
  281. for(i = 0; i < Curr_Download_DataIndex - Prev_Download_DataIndex; i++){
  282. MBIC_DownLoadData[i] = ;
  283. // printf("%02x ",MBIC_DownLoadData[i]);
  284. }
  285. #endif // PYJ.2020.06.24_END --
  286. // printf("Data End\r\n");
  287. // Bank_Flash_write(data,FLASH_USER_BANK1_START_ADDR);
  288. if(Currdata[MBIC_BOOT_VERSION + 3] == Bank1data[MBIC_BOOT_VERSION + 3]){
  289. BankNum = HFR_BANK2;
  290. }else{
  291. BankNum = HFR_BANK1;
  292. }
  293. MBIC_APIFLASH_Func(&data[MBIC_PAYLOADSTART + 12],1024,BankNum);
  294. printf("Bank1data[MBIC_BOOT_MARK] : %d \r\n",Bank2data[MBIC_BOOT_MARK]);
  295. // if(BankNum == HFR_BANK1)
  296. // Crcret = CRC16_Generate(&Bank1data[MBIC_BOOT_MARK], TotalFrame);
  297. // else
  298. // Crcret = CRC16_Generate(&Bank2data[MBIC_BOOT_MARK], TotalFrame);
  299. printf("CurrFrame : %d ,FirmFile_Length : %d \r\n",CurrFrame,TotalFrame);
  300. printf("FILE CRC RET : %x \r\n",Crcret);
  301. // HAL_Delay(100);
  302. Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
  303. prevFrame = CurrFrame;
  304. break;
  305. case MBIC_Download_Confirm_REQ:
  306. EraseInit = true;
  307. cmd = MBIC_Download_Confirm_RSP;
  308. /*TOTAL FRAME NUMBER*/
  309. if(BankNum == HFR_BANK1){
  310. FirmFile_Length = (Bank1data[MBIC_BOOT_LENGTH + 0] << 24)
  311. | Bank1data[MBIC_BOOT_LENGTH + 1] << 16
  312. | Bank1data[MBIC_BOOT_LENGTH + 2] << 8
  313. | Bank1data[MBIC_BOOT_LENGTH + 3];
  314. Crcret = CRC16_Generate(&Bank1data[MBIC_BOOT_MARK], FirmFile_Length);
  315. printf("Bank 1 CRC Calc\r\n");
  316. }
  317. else {
  318. FirmFile_Length = (Bank2data[MBIC_BOOT_LENGTH + 0] << 24)
  319. | Bank2data[MBIC_BOOT_LENGTH + 1] << 16
  320. | Bank2data[MBIC_BOOT_LENGTH + 2] << 8
  321. | Bank2data[MBIC_BOOT_LENGTH + 3];
  322. Crcret = CRC16_Generate(&Bank2data[MBIC_BOOT_MARK], FirmFile_Length - 1);
  323. printf("Bank 2 CRC Calc\r\n");
  324. }
  325. RecvCrc = data[MBIC_PAYLOADSTART] << 8 | data[MBIC_PAYLOADSTART + 1];
  326. printf("FirmFile_Length : %x \r\n",FirmFile_Length);
  327. printf("FILE CRC RET : %x \r\n",Crcret);
  328. data[MBIC_PAYLOADSTART + index++] = ((Crcret & 0xFF00) >> 8);
  329. data[MBIC_PAYLOADSTART + index++] = ((Crcret & 0x00FF));
  330. #if 0 // PYJ.2020.06.29_BEGIN --
  331. if(Crcret != RecvCrc){
  332. CRCERR = true;
  333. printf("CRC ERROR : MBIC : %x / MDOC : %x \r\n",Crcret,RecvCrc);
  334. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2] = 0;
  335. }else{
  336. CRCERR = false;
  337. printf("CRC Success : MBIC : %x / MDOC : %x \r\n",Crcret,RecvCrc);
  338. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2] = 1;
  339. }
  340. #endif // PYJ.2020.06.29_END --
  341. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3] = 1;
  342. /*DOWNLOAD OPTION*/
  343. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4] = 0;
  344. data[MBIC_PAYLOADSTART + index++] = 0;
  345. data[MBIC_PAYLOADSTART + index++] = 0;
  346. data[MBIC_PAYLOADSTART + index++] = 0;
  347. break;
  348. case MBIC_Complete_Notice_REQ_REQ:
  349. cmd = MBIC_Complete_Notice_RSP;
  350. if(CRCERR == false){
  351. data[MBIC_PAYLOADSTART + index++] = 1;
  352. }else{
  353. data[MBIC_PAYLOADSTART + index++] = 0;
  354. }
  355. data[MBIC_PAYLOADSTART + index++] = 1;
  356. break;
  357. case MBIC_Reboot_Notice_REQ:
  358. cmd = MBIC_Reboot_Notice_RSP;
  359. /*TOTAL FRAME NUMBER*/
  360. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 0];
  361. data[MBIC_PAYLOADSTART + index++] = 0;
  362. /*DOWNLOAD OPTION*/
  363. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 2];
  364. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 3];
  365. data[MBIC_PAYLOADSTART + index++] = data[MBIC_PAYLOADSTART + 4];
  366. break;
  367. default:
  368. return;
  369. }
  370. data[MBIC_CMD_0] = cmd;
  371. data = MBIC_HeaderMergeFunction(data,index); // reponse
  372. for(int i =0; i < 22 + 3 + index; i++){
  373. MBIC_Resp[i] = data[i];
  374. }
  375. DataLength = 22 + 3 + index;
  376. Crcret =CRC16_Generate(&data[MBIC_PAYLOADSTART], DataLength - 25);
  377. MBIC_Resp[(DataLength - 1) - 2] = (Crcret & 0xFF00) >> 8;
  378. MBIC_Resp[(DataLength - 1) - 1] = (Crcret & 0x00FF);
  379. Uart1_Data_Send(MBIC_Resp ,22 + 3 + index);
  380. MBIC_DataErase_Func(BankNum);
  381. }