flash.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. /*
  2. * flash.c
  3. *
  4. * Created on: 2019. 7. 15.
  5. * Author: parkyj
  6. */
  7. #include "flash.h"
  8. #include "MBIC_Bootloader.h"
  9. uint8_t flashinit = 0;
  10. uint32_t Address = FLASH_USER_START_ADDR;
  11. volatile uint32_t UserAddress;
  12. uint8_t MBIC_BankBooting_Flash_write(uint8_t* data,uint32_t StartBankAddress);
  13. typedef void (*fptr)(void);
  14. fptr jump_to_app;
  15. uint32_t jump_addr;
  16. void Jump_App(void){
  17. __HAL_RCC_TIM6_CLK_DISABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙占�??占쏙옙?占쏙옙?占쏙옙
  18. printf("boot loader start\n"); //硫붿꽭占�? 異쒕젰
  19. jump_addr = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  20. jump_to_app = (fptr) jump_addr;
  21. /* init user app's sp */
  22. printf("jump!\n");
  23. __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  24. jump_to_app();
  25. }
  26. void FLASH_If_Init(void)
  27. {
  28. /* Unlock the Program memory */
  29. HAL_FLASH_Unlock();
  30. /* Clear all FLASH flags */
  31. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
  32. /* Unlock the Program memory */
  33. HAL_FLASH_Lock();
  34. }
  35. void Flash_InitRead(void) // ?占쏙옙湲고븿?占쏙옙
  36. {
  37. uint32_t Address = 0;
  38. Address = FLASH_USER_START_ADDR - 128;
  39. for(uint32_t i = 0; i < 300; i++ ){
  40. printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
  41. Address++;
  42. }
  43. #if 0 // PYJ.2019.03.27_BEGIN --
  44. for(uint32_t i = 0; i < 13848; i++ ){
  45. printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
  46. Address++;
  47. }
  48. Address = StartAddr;
  49. for(uint32_t i = 0; i < 13848; i++ ){
  50. printf("%02X ",*(uint8_t*)Address);
  51. Address++;
  52. }
  53. #endif // PYJ.2019.03.27_END --
  54. }
  55. #if 1 // PYJ.2020.05.20_BEGIN --
  56. uint8_t Flash_RGB_Data_Write(uint8_t* data){
  57. uint16_t Firmdata = 0;
  58. uint8_t ret = 0;
  59. for(int i = 0; i < data[bluecell_length] - 2; i+=2){
  60. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x00FF);
  61. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0xFF00);
  62. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address , (uint16_t)Firmdata) != HAL_OK){
  63. printf("HAL NOT OK \n");
  64. ret = 1;
  65. }
  66. Address += 2;
  67. //if(!(i%FirmwareUpdateDelay))
  68. // HAL_Delay(1);
  69. }
  70. return ret;
  71. }
  72. uint8_t Flash_Data_Write(uint8_t* data){
  73. uint16_t Firmdata = 0;
  74. uint8_t ret = 0;
  75. int i = 0;
  76. static uint32_t Curr_Download_DataIndex = 0;
  77. static uint32_t Prev_Download_DataIndex = 0;
  78. Curr_Download_DataIndex = data[MBIC_PAYLOADSTART + 4] << 24;
  79. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 5] << 16;
  80. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 6] << 8;
  81. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 7];
  82. // data[MBIC_PAYLOADSTART + 12 +i];
  83. for(i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
  84. Firmdata = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
  85. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0xFF00);
  86. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress , (uint16_t)Firmdata) != HAL_OK){
  87. printf("HAL NOT OK \n");
  88. ret = 1;
  89. HAL_Delay(1000);
  90. }else{
  91. UserAddress += 2;
  92. }
  93. }
  94. Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
  95. return ret;
  96. }
  97. uint8_t MBIC_Flash_Data_Write(uint8_t* data){
  98. #if 1 // PYJ.2020.06.24_BEGIN --
  99. int i = 0;
  100. uint32_t a = 0;
  101. uint8_t flashdata[1024] = {0,};
  102. uint32_t cnt = 0;
  103. uint32_t remind = 0;
  104. uint32_t WriteDataLength = data[61] << 24 | data[62] << 16 | data[63] << 8 | data[64] << 0;
  105. #if 0 // PYJ.2020.06.24_BEGIN --
  106. uint32_t Curr_Download_Data = 0;
  107. #else
  108. uint16_t Curr_Download_Data = 0;
  109. #endif // PYJ.2020.06.24_END --
  110. // printf("=====================Data Recv2================\r\n");
  111. // for(a = 0; a < 128; a++ ){
  112. // printf("%08x : %02X Index : %d \n",data ,*(uint8_t*)data,a );
  113. // data++;
  114. // }
  115. // data -= a;
  116. // printf("=====================Data Recv2================\r\n");
  117. // printf("Download Data Length :%d \r\n",WriteDataLength);
  118. // printf("Curr_Download_Data %x : i : %d\r\n",Curr_Download_Data,i);
  119. #if 0 // PYJ.2020.06.24_BEGIN --
  120. for(i= 0; i < 128; i+=4){
  121. Curr_Download_Data = 0;
  122. /*Curr_Download_Data = *(uint8_t*)(data+((i * 4)+ 0));
  123. Curr_Download_Data |= *(uint8_t*)(data+((i * 4)+ 1)) << 8;
  124. Curr_Download_Data |= *(uint8_t*)(data+((i * 4)+ 2)) << 16;
  125. Curr_Download_Data |= *(uint8_t*)(data+((i * 4)+ 3)) << 24; */
  126. printf("%02X ",data[i + 0]);
  127. printf("%02X ",data[i + 1]);
  128. printf("%02X ",data[i + 2]);
  129. printf("%02X ",data[i + 3]);
  130. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,UserAddress , Curr_Download_Data) != HAL_OK){
  131. printf("HAL NOT OK \n");
  132. HAL_Delay(1000);
  133. }else{
  134. UserAddress += 4;
  135. }
  136. }
  137. // printf("%02X ",flashdata[i*2 + 0]);
  138. // printf("%02X ",flashdata[i*2 + 1]);
  139. // HAL_Delay(1);
  140. #else
  141. cnt = (((WriteDataLength + 128)/1024));
  142. remind =(((WriteDataLength + 128)%1024));
  143. #if 0 // PYJ.2020.06.24_BEGIN --
  144. for(int b = 0; b < cnt; b++){
  145. for(i = 0; i < 1024; i+=2){
  146. flashdata[i*2] = data[(cnt*1024)+i*2];
  147. flashdata[i*2+1] = data[(cnt*1024)+i*2+1];
  148. Curr_Download_Data = (flashdata[i*2]) & 0x00FF;//*(uint8_t*)(data+((i * 2)+ 0));
  149. Curr_Download_Data |= flashdata[i*2+1] << 8;//(*(uint8_t*)(data+((i * 2)+ 1)) << 8);
  150. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress , Curr_Download_Data) != HAL_OK){
  151. printf("HAL NOT OK \n");
  152. HAL_Delay(1000);
  153. return;
  154. }
  155. UserAddress += 2;
  156. HAL_Delay(1);
  157. }
  158. }
  159. for(i = 0; i < remind; i+=2){
  160. flashdata[i*2] = data[(cnt*1024)+i*2];
  161. flashdata[i*2+1] = data[(cnt*1024)+i*2+1];
  162. Curr_Download_Data = (flashdata[i*2]) & 0x00FF;//*(uint8_t*)(data+((i * 2)+ 0));
  163. Curr_Download_Data |= flashdata[i*2+1] << 8;//(*(uint8_t*)(data+((i * 2)+ 1)) << 8);
  164. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress , Curr_Download_Data) != HAL_OK){
  165. printf("HAL NOT OK \n");
  166. HAL_Delay(1000);
  167. return;
  168. }
  169. UserAddress += 2;
  170. HAL_Delay(1);
  171. }
  172. #else
  173. for(i= 0; i <WriteDataLength + 128; i+=2){
  174. Curr_Download_Data = 0;
  175. // Curr_Download_Data = ; (*(uint8_t*)(data+((i * 4)+ 1)) << 8)
  176. // Curr_Download_Data |= ;
  177. uint16_t writedata = (*(uint8_t*)(data+((i)+ 1))) << 8 | (*(uint8_t*)(data+((i)+ 0)));
  178. printf("%02X ",writedata & 0xFF00 >> 8);
  179. printf("%02X ",writedata & 0x00FF);
  180. // printf("%02X ",(*(uint8_t*)(data+((i )+ 1))));
  181. // if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress , *(uint8_t*)(data+(i * 2)) | *(uint8_t*)data+((i * 2)+1) << 8) != HAL_OK){
  182. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress ,writedata /*(*(uint8_t*)(data+((i * 2)+ 0))) | (*(uint8_t*)(data+((i * 2)+ 1))) << 8*/) != HAL_OK){
  183. printf("HAL NOT OK \n");
  184. HAL_Delay(1000);
  185. }else{
  186. UserAddress += 2;
  187. }
  188. // HAL_Delay(5);
  189. }
  190. #endif // PYJ.2020.06.24_END --
  191. #endif // PYJ.2020.06.24_END --
  192. return 0;
  193. #else
  194. uint16_t Firmdata = 0;
  195. uint8_t ret = 0;
  196. int i = 0;
  197. uint32_t dataindex = 0;
  198. static uint32_t Curr_Download_DataIndex = 0;
  199. static uint32_t Prev_Download_DataIndex = 0;
  200. Curr_Download_DataIndex = data[dataindex + 0];
  201. Curr_Download_DataIndex += data[dataindex + 1] << 8;
  202. Curr_Download_DataIndex += data[dataindex + 2] << 16;
  203. Curr_Download_DataIndex += data[dataindex + 3] << 24;
  204. printf("Download Data Length :%d \r\n",Curr_Download_DataIndex);
  205. Firmdata = 0x12345678;
  206. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,UserAddress , (uint32_t)Firmdata) != HAL_OK){
  207. printf("HAL NOT OK \n");
  208. ret = 1;
  209. HAL_Delay(1000);
  210. }else{
  211. UserAddress += 4;
  212. }
  213. #if 0 // PYJ.2020.06.24_BEGIN --
  214. for(i= 0; i <= Curr_Download_DataIndex; i+=4){
  215. Firmdata = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
  216. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0xFF00);
  217. }
  218. #endif // PYJ.2020.06.24_END --
  219. Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
  220. #endif // PYJ.2020.06.24_END --
  221. }
  222. uint8_t Flash_Data_WriteTest(uint8_t* data){
  223. uint32_t Firmdata = 0;
  224. uint8_t ret = 0;
  225. static uint32_t Curr_Download_DataIndex = 0;
  226. static uint32_t Prev_Download_DataIndex = 0;
  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. for(int i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
  232. Firmdata = ((data[MBIC_PAYLOADSTART + 12 +i + 0]) & 0x000000FF);
  233. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0x0000FF00);
  234. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 2] << 16) & 0x00FF0000);
  235. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 3] << 24) & 0xFF000000);
  236. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,UserAddress , (uint32_t)Firmdata) != HAL_OK){
  237. printf("HAL NOT OK \n");
  238. ret = 1;
  239. }
  240. UserAddress += 4;
  241. }
  242. Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
  243. return ret;
  244. }
  245. #if 0 // PYJ.2020.06.17_BEGIN --
  246. uint8_t Flash_Data_Write(uint8_t* data){
  247. uint64_t Firmdata = 0;
  248. uint8_t ret = 0;
  249. uint8_t Length = data[bluecell_length] - 2;
  250. uint8_t Length_remainder = Length % 8;
  251. uint8_t Length_ans = Length / 8;
  252. for(int i = 0; i < Length; i+=8){
  253. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x00000000000000FF);
  254. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0x000000000000FF00);
  255. Firmdata += ((data[(bluecell_length + 1) + (i + 2)] << 16) & 0x0000000000FF0000);
  256. Firmdata += ((data[(bluecell_length + 1) + (i + 3)] << 24) & 0x00000000FF000000);
  257. Firmdata += ((data[(bluecell_length + 1) + (i + 4)] << 32) & 0x000000FF00000000);
  258. Firmdata += ((data[(bluecell_length + 1) + (i + 5)] << 40) & 0x0000FF0000000000);
  259. Firmdata += ((data[(bluecell_length + 1) + (i + 6)] << 48) & 0x00FF000000000000);
  260. Firmdata += ((data[(bluecell_length + 1) + (i + 7)] << 56) & 0xFF00000000000000);
  261. if(Length_remainder > 0 && Length_ans > i){
  262. for(int a = 0; a < Length_remainder; a += 2){
  263. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address , (uint16_t)Firmdata) != HAL_OK){
  264. printf("HAL NOT OK \n");
  265. ret = 1;
  266. }
  267. Address += 2;
  268. }
  269. }
  270. else{
  271. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,Address , (uint64_t)Firmdata) != HAL_OK){
  272. printf("HAL NOT OK \n");
  273. ret = 1;
  274. }
  275. Address += 8;
  276. }
  277. //if(!(i%FirmwareUpdateDelay))
  278. // HAL_Delay(1);
  279. }
  280. return ret;
  281. }
  282. #endif // PYJ.2020.06.17_END --
  283. #endif // PYJ.2020.06.10_END --
  284. uint8_t Flash_DataTest_Write(uint8_t* data){
  285. uint32_t Firmdata = 0;
  286. uint8_t ret = 0;
  287. uint8_t Length = data[bluecell_length] - 2;
  288. uint8_t Length_remainder = Length % 4;
  289. uint8_t Length_ans = Length / 4;
  290. for(int i = 0; i < data[bluecell_length] - 2; i+=4){
  291. if(Length_remainder > 0 && Length_ans > i){
  292. for(int a = 0; a < Length_remainder; a += 2){
  293. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x00FF);
  294. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0xFF00);
  295. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address , (uint16_t)Firmdata) != HAL_OK){
  296. printf("HAL NOT OK \n");
  297. ret = 1;
  298. }
  299. Address += 2;
  300. }
  301. }
  302. else{
  303. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x000000FF);
  304. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0x0000FF00);
  305. Firmdata += ((data[(bluecell_length + 1) + (i + 2)] << 16) & 0x00FF0000);
  306. Firmdata += ((data[(bluecell_length + 1) + (i + 3)] << 24) & 0xFF000000);
  307. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address , (uint32_t)Firmdata) != HAL_OK){
  308. printf("HAL NOT OK \n");
  309. ret = 1;
  310. }
  311. Address += 4;
  312. }
  313. //if(!(i%FirmwareUpdateDelay))
  314. // HAL_Delay(1);
  315. }
  316. return ret;
  317. }
  318. uint8_t Flash_write(uint8_t* data) // ?占쏙옙湲고븿?占쏙옙
  319. {
  320. /*Variable used for Erase procedure*/
  321. static FLASH_EraseInitTypeDef EraseInitStruct;
  322. static uint32_t PAGEError = 0;
  323. uint8_t ret = 0;
  324. /* Fill EraseInit structure*/
  325. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  326. EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
  327. EraseInitStruct.NbPages = (FLASH_USER_START_ADDR - ((uint32_t)0xFFFF)) / FLASH_PAGE_SIZE;
  328. // __HAL_RCC_TIM6_CLK_DISABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙占�??占쏙옙?占쏙옙?占쏙옙
  329. HAL_FLASH_Unlock(); // lock ??占�?
  330. if(flashinit == 0){
  331. flashinit= 1;
  332. //FLASH_PageErase(StartAddr);
  333. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
  334. printf("Erase Failed \r\n");
  335. }
  336. }
  337. // FLASH_If_Erase();
  338. ret = Flash_RGB_Data_Write(&data[bluecell_stx]);
  339. // ret = Flash_DataTest_Write(&data[bluecell_stx]);
  340. HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
  341. // __HAL_RCC_TIM6_CLK_ENABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙
  342. return ret;
  343. }
  344. uint8_t Bank_Flash_write(uint8_t* data,uint32_t StartBankAddress) // ?占쏙옙湲고븿?占쏙옙
  345. {
  346. #if 1 // PYJ.2020.06.24_BEGIN --
  347. #if 0 // PYJ.2020.06.24_BEGIN --
  348. #endif // PYJ.2020.06.24_END --
  349. /*Variable used for Erase procedure*/
  350. static FLASH_EraseInitTypeDef EraseInitStruct;
  351. static uint32_t PAGEError = 0;
  352. uint8_t ret = 0;
  353. HAL_FLASH_Unlock(); // lock ??占�?
  354. if(flashinit == 0){
  355. flashinit= 1;
  356. /* Fill EraseInit structure*/
  357. switch(StartBankAddress){
  358. case FLASH_USER_START_ADDR:
  359. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  360. EraseInitStruct.PageAddress = FLASH_USER_START_ADDR - 128;
  361. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
  362. break;
  363. case FLASH_USER_BANK1_START_ADDR:
  364. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  365. EraseInitStruct.PageAddress = FLASH_USER_BANK1_START_ADDR - 128;
  366. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_BANK1_START_ADDR) / FLASH_PAGE_SIZE;
  367. break;
  368. case FLASH_USER_BANK2_START_ADDR:
  369. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  370. EraseInitStruct.PageAddress = FLASH_USER_BANK2_START_ADDR - 128;
  371. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_BANK2_START_ADDR) / FLASH_PAGE_SIZE;
  372. break;
  373. }
  374. UserAddress = EraseInitStruct.PageAddress;
  375. //FLASH_PageErase(StartAddr);
  376. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
  377. printf("Erase Failed \r\n");
  378. }
  379. }
  380. ret = Flash_Data_Write(&data[0]);
  381. HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
  382. return ret;
  383. #else
  384. uint32_t Address = 0;
  385. Address = FLASH_USER_START_ADDR - 128;
  386. for(uint32_t i = 0; i < 128; i++ ){
  387. printf("%08x : %02X \n",data ,*(uint8_t*)data);
  388. data++;
  389. }
  390. #endif // PYJ.2020.06.24_END --
  391. }
  392. #if 0 // PYJ.2020.06.24_BEGIN --
  393. void MBIC_FlashErase()
  394. {
  395. static FLASH_EraseInitTypeDef EraseInitStruct;
  396. static uint32_t PAGEError = 0;
  397. if(EraseInit == false){
  398. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  399. EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
  400. EraseInitStruct.NbPages = ((FLASH_USER_START_ADDR + ((uint32_t)0xFFFF)) - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
  401. printf("Erase Start\r\n");
  402. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  403. {
  404. /*
  405. Error occurred while page erase.
  406. User can add here some code to deal with this error.
  407. PAGEError will contain the faulty page and then to know the code error on this page,
  408. user can call function 'HAL_FLASH_GetError()'
  409. */
  410. /* Infinite loop */
  411. while (1)
  412. {
  413. /* Make LED2 blink (100ms on, 2s off) to indicate error in Erase operation */
  414. printf("HAL_FLASHEx_Erase Error\r\n");
  415. HAL_Delay(2000);
  416. }
  417. }
  418. EraseInit = true;
  419. printf("Erase End\r\n");
  420. }
  421. }
  422. #endif // PYJ.2020.06.24_END --
  423. uint8_t MBIC_BankBooting_Flash_write(uint8_t* data,uint32_t StartBankAddress) // ?占쏙옙湲고븿?占쏙옙
  424. {
  425. #if 1 // PYJ.2020.06.24_BEGIN --
  426. #if 0 // PYJ.2020.06.24_BEGIN --
  427. #endif // PYJ.2020.06.24_END --
  428. /*Variable used for Erase procedure*/
  429. static FLASH_EraseInitTypeDef EraseInitStruct;
  430. static uint32_t PAGEError = 0;
  431. uint8_t ret = 0;
  432. uint32_t tmpdata = 0;
  433. uint32_t i = 0;
  434. printf("=====================Data Recv================\r\n");
  435. uint8_t datacnt = 0;
  436. if(data[0]!= 0x4A){
  437. printf("File ERRor\r\n");
  438. return;
  439. }
  440. for( i = 0; i < 128; i++ ){
  441. if(*(uint8_t*)data == 0xFF)
  442. datacnt++;
  443. printf("%08x : %02X Index : %d \n",data ,*(uint8_t*)data,i);
  444. data++;
  445. }
  446. if(datacnt > 100)
  447. return;
  448. data -=i;
  449. printf("=====================Data Recv================\r\n");
  450. // tmpdata = data[61] <<24 |data[62] <<16 |data[63] <<8 |data[64] <<0 ;
  451. // printf("data[01] : %x \r\n",data[01]);
  452. // printf("data[61] : %x \r\n",data[61]);
  453. // printf("data[62] : %x \r\n",data[62]);
  454. // printf("data[63] : %x \r\n",data[63]);
  455. // printf("data[64] : %x \r\n",data[64]);
  456. // printf("data Length %x / D %d ",tmpdata,tmpdata);
  457. // return;
  458. HAL_FLASH_Unlock(); // lock ??占�?
  459. if(flashinit == 0){
  460. flashinit= 1;
  461. /* Fill EraseInit structure*/
  462. printf("Download Erase Conifiguaration Start\r\n");
  463. switch(StartBankAddress){
  464. case FLASH_MBICUSER_START_ADDR:
  465. printf("User API Erase %x\r\n",StartBankAddress);
  466. #if 1 // PYJ.2020.06.24_BEGIN --
  467. /* Fill EraseInit structure*/
  468. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  469. EraseInitStruct.PageAddress = FLASH_MBICUSER_START_ADDR;
  470. EraseInitStruct.NbPages = ((FLASH_MBICUSER_END_ADDR - FLASH_MBICUSER_START_ADDR) / FLASH_PAGE_SIZE )+ 1;
  471. #else
  472. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  473. EraseInitStruct.PageAddress = FLASH_MBICUSER_START_ADDR;
  474. printf("PageAddress : %x \r\n",FLASH_MBICUSER_START_ADDR);
  475. EraseInitStruct.NbPages = (FLASH_MBICUSER_START_ADDR - ((uint32_t)0xFFFF + 128))) / FLASH_PAGE_SIZE;
  476. #endif // PYJ.2020.06.24_END --
  477. UserAddress = FLASH_MBICUSER_START_ADDR;
  478. break;
  479. }
  480. printf("Download Erase Conifiguaration END\r\n");
  481. //FLASH_PageErase(StartAddr);
  482. printf("Download Erase start\r\n");
  483. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
  484. printf("Erase Failed \r\n");
  485. }
  486. printf("Download Erase END\r\n");
  487. }
  488. printf("Download Start \r\n");
  489. ret = MBIC_Flash_Data_Write((uint32_t*)data);
  490. printf("Download END \r\n");
  491. HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
  492. return ret;
  493. #else
  494. uint32_t Address = 0;
  495. Address = FLASH_USER_START_ADDR - 128;
  496. for(uint32_t i = 0; i < 128; i++ ){
  497. printf("%08x : %02X \n",data ,*(uint8_t*)data);
  498. data++;
  499. }
  500. #endif // PYJ.2020.06.24_END --
  501. }