MBIC_Bootloader.c 12 KB

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