bootloader.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "main.h"
  2. #include "bootloader.h"
  3. #include "xtea.h"
  4. #include <string.h>
  5. __attribute__((section(".noinit"))) volatile uint32_t boot_magic;
  6. extern UART_HandleTypeDef huart1;
  7. extern TIM_HandleTypeDef htim6;
  8. static uint32_t flash_start_page = 16;
  9. static const uint32_t XTEA_KEY[4] = {
  10. 0xA56BABCD, 0x0000FFFF, 0xABCDEF12, 0x13572468
  11. };
  12. void Bootloader_Deinit_All(void) {
  13. // Deinit ALL
  14. HAL_TIM_Base_Stop(&htim6);
  15. HAL_TIM_Base_DeInit(&htim6);
  16. HAL_UART_DeInit(&huart1);
  17. GPIO_InitTypeDef GPIO_InitStruct = {0};
  18. GPIO_InitStruct.Pin = LED_Pin;
  19. HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
  20. GPIO_InitStruct.Pin = KEY_Pin;
  21. HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);
  22. }
  23. static void Flash_erase(void)
  24. {
  25. uint32_t PageError = 0;
  26. FLASH_EraseInitTypeDef EraseInitStruct;
  27. HAL_FLASH_Unlock();
  28. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  29. EraseInitStruct.Banks = 0;
  30. EraseInitStruct.Page = flash_start_page;
  31. EraseInitStruct.NbPages = FLASH_PAGE_NB - flash_start_page;
  32. if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) == HAL_OK)
  33. {
  34. }
  35. HAL_FLASH_Lock();
  36. }
  37. uint8_t Bootloader_flag(void) {
  38. if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET) {
  39. return 1;
  40. } else {
  41. return (boot_magic == BOOT_MAGIC_VALUE);
  42. }
  43. }
  44. void Bootloader_flag_reset(void) {
  45. boot_magic = 0;
  46. }
  47. void Bootloader_check_protection(void) {
  48. FLASH_OBProgramInitTypeDef FLASH_OBInitStruct;
  49. HAL_FLASH_Unlock();
  50. HAL_FLASH_OB_Unlock();
  51. HAL_FLASHEx_OBGetConfig(&FLASH_OBInitStruct);
  52. if (FLASH_OBInitStruct.RDPLevel != OB_RDP_LEVEL_1) {
  53. FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;
  54. FLASH_OBInitStruct.RDPLevel = OB_RDP_LEVEL_1;
  55. HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
  56. FLASH_OBInitStruct.OptionType = OPTIONBYTE_USER;
  57. FLASH_OBInitStruct.USERType = OB_USER_BOR_LEV;
  58. FLASH_OBInitStruct.USERConfig = OB_BOR_LEVEL_2;
  59. HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
  60. HAL_FLASH_OB_Launch();
  61. }
  62. HAL_FLASH_OB_Lock();
  63. HAL_FLASH_Lock();
  64. }
  65. static void Flash_write(uint32_t addr, uint8_t *data, uint32_t len)
  66. {
  67. HAL_FLASH_Unlock();
  68. for (uint32_t i = 0; i < len; i += 8) {
  69. uint64_t d;
  70. memcpy(&d, data + i, 8);
  71. HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr + i, d);
  72. }
  73. HAL_FLASH_Lock();
  74. }
  75. void Bootloader_cmd(void)
  76. {
  77. uint8_t rx[1], tx;
  78. while (1) {
  79. tx = '$';
  80. HAL_UART_Transmit(&huart1, &tx, 1, 100);
  81. HAL_UART_Receive(&huart1, rx, 1, HAL_MAX_DELAY);
  82. // Erase Chip
  83. if (rx[0] == 'e') {
  84. tx = '?';
  85. HAL_UART_Transmit(&huart1, &tx, 1, 100);
  86. HAL_UART_Receive(&huart1, rx, 1, 1000);
  87. if (rx[0] == 'y') {
  88. // Erase
  89. Flash_erase();
  90. }
  91. }
  92. if (rx[0] == 'u') {
  93. // Ordinary uploading
  94. tx = '>';
  95. HAL_UART_Transmit(&huart1, &tx, 1, 100);
  96. Bootloader_run(0);
  97. }
  98. if (rx[0] == 'c') {
  99. // Encrypted uploading
  100. tx = '>';
  101. HAL_UART_Transmit(&huart1, &tx, 1, 100);
  102. Bootloader_run(1);
  103. }
  104. if (rx[0] == 'r') {
  105. // Run App
  106. Bootloader_Deinit_All();
  107. Bootloader_jump_to_app();
  108. }
  109. }
  110. }
  111. void Bootloader_run(uint8_t decrypt)
  112. {
  113. uint8_t rx[PACKET_SIZE];
  114. HAL_StatusTypeDef Status;
  115. uint32_t flash_addr = APP_ADDRESS;
  116. //HAL_FLASH_Unlock();
  117. while (1) {
  118. Status = HAL_UART_Receive(&huart1, rx, PACKET_SIZE, 1000);
  119. if (Status == HAL_OK) {
  120. if (decrypt == 1) {
  121. for (int i = 0; i < PACKET_SIZE; i += 8) {
  122. uint32_t block[2];
  123. memcpy(block, &rx[i], 8);
  124. xtea_decrypt(block, XTEA_KEY);
  125. memcpy(&rx[i], block, 8);
  126. }
  127. }
  128. Flash_write(flash_addr, rx, PACKET_SIZE);
  129. flash_addr += PACKET_SIZE;
  130. uint8_t ack = 0x7F;
  131. HAL_UART_Transmit(&huart1, &ack, 1, 100);
  132. } else {
  133. if (Status == HAL_TIMEOUT) {
  134. break;
  135. }
  136. }
  137. }
  138. //HAL_FLASH_Lock();
  139. }
  140. void Bootloader_jump_to_app(void)
  141. {
  142. uint32_t appJumpAddress;
  143. void (*GoToApp)(void);
  144. appJumpAddress = *((volatile uint32_t*)(APP_ADDRESS + 4));
  145. GoToApp = (void (*)(void))appJumpAddress;
  146. SCB->VTOR = APP_ADDRESS;
  147. __set_MSP(*((volatile uint32_t*) APP_ADDRESS)); //stack pointer (to RAM) for USER app in this address
  148. GoToApp();
  149. }