MBIC_Bootloader.c 13 KB

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