diff --git a/Core/Src/main.c b/Core/Src/main.c index ed1037d..f8e0a4c 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -47,7 +47,7 @@ typedef enum { #define STDERR_FILENO 2 #define BOOTLOADER_RCC_CSR_ENTRY_MASK (RCC_CSR_WWDGRSTF | RCC_CSR_IWDGRSTF | RCC_CSR_SFTRSTF | RCC_CSR_PINRSTF) -#define BOOTLOADER_SIZE (20 * 1024) +#define BOOTLOADER_SIZE 0x4C00 #define USER_PROGRAM (FLASH_BASE + BOOTLOADER_SIZE) /* USER CODE END PD */ @@ -127,95 +127,6 @@ void start_user_program() { uint8_t ack[] = {0x01}; uint8_t nack[] = {0xFE}; -void receive() { - UpdateTarget target; - - HAL_UART_Receive(&huart1, &target, 1, 1000); - HAL_UART_Transmit(&huart1, ack, sizeof(ack), HAL_MAX_DELAY); - - uint8_t length_buffer[2]; - HAL_UART_Receive(&huart1, length_buffer, sizeof(length_buffer), HAL_MAX_DELAY); - HAL_UART_Transmit(&huart1, length_buffer, sizeof(length_buffer), HAL_MAX_DELAY); - uint16_t length = length_buffer[0] + (length_buffer[1] << 8); - - uint8_t* data = malloc(length); - HAL_UART_Receive(&huart1, data, length, 1000); - - // Calculate the CRC of the data and send it back - // @todo Figure how we can actually use the hardware crc - /* uint32_t crc = HAL_CRC_Calculate(&hcrc, (uint32_t*)data, length); */ - uint32_t crc = crc32(data, length); - uint8_t c[] = {crc, crc >> 8, crc >> 16, crc >> 24}; - HAL_UART_Transmit(&huart1, c, sizeof(c), HAL_MAX_DELAY); - - switch (target) { - case TARGET_I2C: { - // Unlock flash - HAL_FLASH_Unlock(); - HAL_UART_Transmit(&huart1, ack, sizeof(ack), HAL_MAX_DELAY); - - // Erase flash - uint32_t error = 0; - FLASH_EraseInitTypeDef erase = { - .TypeErase = FLASH_TYPEERASE_PAGES, - .PageAddress = (uint32_t)0x8005000, - .NbPages = ceil(length/1024.0f), - }; - HAL_FLASHEx_Erase(&erase, &error); - - // Write to flash - for (int i = 0; i < length/2; ++i) { - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8005000 + i*2, ((uint16_t*)data)[i])) { - return; - } - uint8_t progress[] = {(i*2) & 0xFF, (i*2) >> 8}; - HAL_UART_Transmit(&huart1, progress, sizeof(progress), HAL_MAX_DELAY); - } - uint8_t progress[] = {(length) & 0xFF, (length) >> 8}; - HAL_UART_Transmit(&huart1, progress, sizeof(progress), HAL_MAX_DELAY); - - // Done - HAL_FLASH_Lock(); - HAL_UART_Transmit(&huart1, ack, sizeof(ack), HAL_MAX_DELAY); - - should_start_user_program = 1; - - break; - } - - default: - printf("Target not implemented!\n\r"); - break; - - } -} - -uint8_t byte; -void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { - if (huart->Instance == USART1) { - static uint8_t command_mode = 0; - - if (command_mode) { - switch (byte) { - // Upload firmware - case 'u': - HAL_UART_Transmit(&huart1, ack, sizeof(ack), HAL_MAX_DELAY); - receive(); - break; - - default: - HAL_UART_Transmit(&huart1, nack, sizeof(nack), HAL_MAX_DELAY); - break; - } - command_mode = 0; - } else if (byte == 0xFF) { - command_mode = 1; - HAL_UART_Transmit(&huart1, ack, sizeof(ack), HAL_MAX_DELAY); - } - - HAL_UART_Receive_IT(&huart1, &byte, 1); - } -} uint8_t i2c_data; void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) { @@ -266,14 +177,14 @@ void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) { uint32_t error = 0; FLASH_EraseInitTypeDef erase = { .TypeErase = FLASH_TYPEERASE_PAGES, - .PageAddress = (uint32_t)0x8005000, + .PageAddress = (uint32_t)USER_PROGRAM, .NbPages = ceil(length/1024.0f), }; HAL_FLASHEx_Erase(&erase, &error); // Write to flash for (int i = 0; i < length/2; ++i) { - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, 0x8005000 + i*2, ((uint16_t*)data)[i])) { + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, USER_PROGRAM + i*2, ((uint16_t*)data)[i])) { break; } } @@ -452,7 +363,6 @@ int main(void) } printf("\tAwaiting command\n\r"); - HAL_UART_Receive_IT(&huart1, &byte, 1); HAL_I2C_Slave_Receive_IT(&hi2c1, &i2c_data, 1); // Run the bootloader diff --git a/Makefile b/Makefile index 6958ab4..02eb4f4 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ TARGET = bootloader # building variables ###################################### # debug build? -DEBUG = 1 +DEBUG = 0 # optimization OPT = -Os