flash.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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 static uint32_t UserAddress;
  12. typedef void (*fptr)(void);
  13. fptr jump_to_app;
  14. uint32_t jump_addr;
  15. void Jump_App(void){
  16. __HAL_RCC_TIM6_CLK_DISABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙占�??占쏙옙?占쏙옙?占쏙옙
  17. printf("boot loader start\n"); //硫붿꽭占�? 異쒕젰
  18. jump_addr = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  19. jump_to_app = (fptr) jump_addr;
  20. /* init user app's sp */
  21. printf("jump!\n");
  22. __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  23. jump_to_app();
  24. }
  25. void FLASH_If_Init(void)
  26. {
  27. /* Unlock the Program memory */
  28. HAL_FLASH_Unlock();
  29. /* Clear all FLASH flags */
  30. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
  31. /* Unlock the Program memory */
  32. HAL_FLASH_Lock();
  33. }
  34. void Flash_InitRead(void) // ?占쏙옙湲고븿?占쏙옙
  35. {
  36. uint32_t Address = 0;
  37. Address = FLASH_USER_START_ADDR - 128;
  38. for(uint32_t i = 0; i < 300; i++ ){
  39. printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
  40. Address++;
  41. }
  42. #if 0 // PYJ.2019.03.27_BEGIN --
  43. for(uint32_t i = 0; i < 13848; i++ ){
  44. printf("%08x : %02X \n",Address ,*(uint8_t*)Address);
  45. Address++;
  46. }
  47. Address = StartAddr;
  48. for(uint32_t i = 0; i < 13848; i++ ){
  49. printf("%02X ",*(uint8_t*)Address);
  50. Address++;
  51. }
  52. #endif // PYJ.2019.03.27_END --
  53. }
  54. #if 1 // PYJ.2020.05.20_BEGIN --
  55. uint8_t Flash_RGB_Data_Write(uint8_t* data){
  56. uint16_t Firmdata = 0;
  57. uint8_t ret = 0;
  58. for(int i = 0; i < data[bluecell_length] - 2; i+=2){
  59. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x00FF);
  60. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0xFF00);
  61. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address , (uint16_t)Firmdata) != HAL_OK){
  62. printf("HAL NOT OK \n");
  63. ret = 1;
  64. }
  65. Address += 2;
  66. //if(!(i%FirmwareUpdateDelay))
  67. // HAL_Delay(1);
  68. }
  69. return ret;
  70. }
  71. uint8_t Flash_Data_Write(uint8_t* data){
  72. uint16_t Firmdata = 0;
  73. uint8_t ret = 0;
  74. int i = 0;
  75. static uint32_t Curr_Download_DataIndex = 0;
  76. static uint32_t Prev_Download_DataIndex = 0;
  77. Curr_Download_DataIndex = data[MBIC_PAYLOADSTART + 4] << 24;
  78. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 5] << 16;
  79. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 6] << 8;
  80. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 7];
  81. // data[MBIC_PAYLOADSTART + 12 +i];
  82. returntoFirst:
  83. UserAddress -= i;
  84. for(i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
  85. Firmdata = ((data[MBIC_PAYLOADSTART + 12 +i]) & 0x00FF);
  86. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0xFF00);
  87. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,UserAddress , (uint16_t)Firmdata) != HAL_OK){
  88. printf("HAL NOT OK \n");
  89. ret = 1;
  90. HAL_Delay(1000);
  91. goto returntoFirst;
  92. }else{
  93. UserAddress += 2;
  94. }
  95. }
  96. Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
  97. return ret;
  98. }
  99. uint8_t Flash_Data_WriteTest(uint8_t* data){
  100. uint32_t Firmdata = 0;
  101. uint8_t ret = 0;
  102. static uint32_t Curr_Download_DataIndex = 0;
  103. static uint32_t Prev_Download_DataIndex = 0;
  104. Curr_Download_DataIndex = data[MBIC_PAYLOADSTART + 4] << 24;
  105. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 5] << 16;
  106. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 6] << 8;
  107. Curr_Download_DataIndex += data[MBIC_PAYLOADSTART + 7];
  108. for(int i= 0; i <= Curr_Download_DataIndex - Prev_Download_DataIndex; i+=2){
  109. Firmdata = ((data[MBIC_PAYLOADSTART + 12 +i + 0]) & 0x000000FF);
  110. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 1] << 8) & 0x0000FF00);
  111. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 2] << 16) & 0x00FF0000);
  112. Firmdata += ((data[MBIC_PAYLOADSTART + 12 +i + 3] << 24) & 0xFF000000);
  113. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,UserAddress , (uint32_t)Firmdata) != HAL_OK){
  114. printf("HAL NOT OK \n");
  115. ret = 1;
  116. }
  117. UserAddress += 4;
  118. }
  119. Prev_Download_DataIndex = Curr_Download_DataIndex + 1;
  120. return ret;
  121. }
  122. #if 0 // PYJ.2020.06.17_BEGIN --
  123. uint8_t Flash_Data_Write(uint8_t* data){
  124. uint64_t Firmdata = 0;
  125. uint8_t ret = 0;
  126. uint8_t Length = data[bluecell_length] - 2;
  127. uint8_t Length_remainder = Length % 8;
  128. uint8_t Length_ans = Length / 8;
  129. for(int i = 0; i < Length; i+=8){
  130. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x00000000000000FF);
  131. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0x000000000000FF00);
  132. Firmdata += ((data[(bluecell_length + 1) + (i + 2)] << 16) & 0x0000000000FF0000);
  133. Firmdata += ((data[(bluecell_length + 1) + (i + 3)] << 24) & 0x00000000FF000000);
  134. Firmdata += ((data[(bluecell_length + 1) + (i + 4)] << 32) & 0x000000FF00000000);
  135. Firmdata += ((data[(bluecell_length + 1) + (i + 5)] << 40) & 0x0000FF0000000000);
  136. Firmdata += ((data[(bluecell_length + 1) + (i + 6)] << 48) & 0x00FF000000000000);
  137. Firmdata += ((data[(bluecell_length + 1) + (i + 7)] << 56) & 0xFF00000000000000);
  138. if(Length_remainder > 0 && Length_ans > i){
  139. for(int a = 0; a < Length_remainder; a += 2){
  140. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address , (uint16_t)Firmdata) != HAL_OK){
  141. printf("HAL NOT OK \n");
  142. ret = 1;
  143. }
  144. Address += 2;
  145. }
  146. }
  147. else{
  148. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,Address , (uint64_t)Firmdata) != HAL_OK){
  149. printf("HAL NOT OK \n");
  150. ret = 1;
  151. }
  152. Address += 8;
  153. }
  154. //if(!(i%FirmwareUpdateDelay))
  155. // HAL_Delay(1);
  156. }
  157. return ret;
  158. }
  159. #endif // PYJ.2020.06.17_END --
  160. #endif // PYJ.2020.06.10_END --
  161. uint8_t Flash_DataTest_Write(uint8_t* data){
  162. uint32_t Firmdata = 0;
  163. uint8_t ret = 0;
  164. uint8_t Length = data[bluecell_length] - 2;
  165. uint8_t Length_remainder = Length % 4;
  166. uint8_t Length_ans = Length / 4;
  167. for(int i = 0; i < data[bluecell_length] - 2; i+=4){
  168. if(Length_remainder > 0 && Length_ans > i){
  169. for(int a = 0; a < Length_remainder; a += 2){
  170. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x00FF);
  171. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0xFF00);
  172. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Address , (uint16_t)Firmdata) != HAL_OK){
  173. printf("HAL NOT OK \n");
  174. ret = 1;
  175. }
  176. Address += 2;
  177. }
  178. }
  179. else{
  180. Firmdata = ((data[(bluecell_length + 1) + i]) & 0x000000FF);
  181. Firmdata += ((data[(bluecell_length + 1) + (i + 1)] << 8) & 0x0000FF00);
  182. Firmdata += ((data[(bluecell_length + 1) + (i + 2)] << 16) & 0x00FF0000);
  183. Firmdata += ((data[(bluecell_length + 1) + (i + 3)] << 24) & 0xFF000000);
  184. if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Address , (uint32_t)Firmdata) != HAL_OK){
  185. printf("HAL NOT OK \n");
  186. ret = 1;
  187. }
  188. Address += 4;
  189. }
  190. //if(!(i%FirmwareUpdateDelay))
  191. // HAL_Delay(1);
  192. }
  193. return ret;
  194. }
  195. uint8_t Flash_write(uint8_t* data) // ?占쏙옙湲고븿?占쏙옙
  196. {
  197. /*Variable used for Erase procedure*/
  198. static FLASH_EraseInitTypeDef EraseInitStruct;
  199. static uint32_t PAGEError = 0;
  200. uint8_t ret = 0;
  201. /* Fill EraseInit structure*/
  202. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  203. EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
  204. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
  205. // __HAL_RCC_TIM6_CLK_DISABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙占�??占쏙옙?占쏙옙?占쏙옙
  206. HAL_FLASH_Unlock(); // lock ??占�?
  207. if(flashinit == 0){
  208. flashinit= 1;
  209. //FLASH_PageErase(StartAddr);
  210. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
  211. printf("Erase Failed \r\n");
  212. }
  213. }
  214. // FLASH_If_Erase();
  215. ret = Flash_RGB_Data_Write(&data[bluecell_stx]);
  216. // ret = Flash_DataTest_Write(&data[bluecell_stx]);
  217. HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
  218. // __HAL_RCC_TIM6_CLK_ENABLE(); // 留ㅼ씤???占쏙옙癒몌옙?? ?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙?占쏙옙
  219. return ret;
  220. }
  221. uint8_t Bank_Flash_write(uint8_t* data,uint32_t StartBankAddress) // ?占쏙옙湲고븿?占쏙옙
  222. {
  223. /*Variable used for Erase procedure*/
  224. static FLASH_EraseInitTypeDef EraseInitStruct;
  225. static uint32_t PAGEError = 0;
  226. uint8_t ret = 0;
  227. HAL_FLASH_Unlock(); // lock ??占�?
  228. if(flashinit == 0){
  229. flashinit= 1;
  230. /* Fill EraseInit structure*/
  231. switch(StartBankAddress){
  232. case FLASH_USER_START_ADDR:
  233. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  234. EraseInitStruct.PageAddress = FLASH_USER_START_ADDR - 128;
  235. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
  236. break;
  237. case FLASH_USER_BANK1_START_ADDR:
  238. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  239. EraseInitStruct.PageAddress = FLASH_USER_BANK1_START_ADDR - 128;
  240. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_BANK1_START_ADDR) / FLASH_PAGE_SIZE;
  241. break;
  242. case FLASH_USER_BANK2_START_ADDR:
  243. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  244. EraseInitStruct.PageAddress = FLASH_USER_BANK2_START_ADDR - 128;
  245. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_BANK2_START_ADDR) / FLASH_PAGE_SIZE;
  246. break;
  247. case FLASH_USER_TEMPBANK_START_ADDR:
  248. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  249. EraseInitStruct.PageAddress = FLASH_USER_TEMPBANK_START_ADDR - 128;
  250. EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_TEMPBANK_START_ADDR) / FLASH_PAGE_SIZE;
  251. break;
  252. }
  253. UserAddress = EraseInitStruct.PageAddress;
  254. //FLASH_PageErase(StartAddr);
  255. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
  256. printf("Erase Failed \r\n");
  257. }
  258. }
  259. ret = Flash_Data_Write(&data[MBIC_PREAMBLE_0]);
  260. HAL_FLASH_Lock(); // lock ?占쏙옙洹멸린
  261. return ret;
  262. }