Removed UART bootloader code as that was just for testing
This commit is contained in:
parent
994a7fd526
commit
c967520030
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user