From 5109c5e4f51b45f914922285c0b664b9fa278507 Mon Sep 17 00:00:00 2001 From: crinq Date: Thu, 12 Apr 2018 01:23:35 +0200 Subject: [PATCH] hv bootloader fix --- f3_boot/src/main.c | 12 ++++++------ src/comps/hv.c | 31 ++++++++++++++++++++----------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/f3_boot/src/main.c b/f3_boot/src/main.c index 889b3854..0779fefb 100644 --- a/f3_boot/src/main.c +++ b/f3_boot/src/main.c @@ -137,12 +137,12 @@ void TIM8_UP_IRQHandler() { break; } - // if(status != HAL_OK){ - // tx_buf.header.flags.conf_addr = 1; - // } - // else{ - // tx_buf.header.flags.error = 0; - // } + if(status != HAL_OK){ + tx_buf.state = BOOTLOADER_STATE_NAK; + } + else{ + tx_buf.state = BOOTLOADER_STATE_OK; + } tx_buf.cmd = rx_buf.cmd; tx_buf.header.flags.counter = rx_buf.header.flags.counter; diff --git a/src/comps/hv.c b/src/comps/hv.c index 657453d5..d58be777 100644 --- a/src/comps/hv.c +++ b/src/comps/hv.c @@ -74,6 +74,7 @@ struct hv_ctx_t { uint16_t timeout; uint8_t conf_addr; uint8_t frt_slot; + uint8_t send_state; }; typedef enum { @@ -202,6 +203,7 @@ static void nrt_init(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) { PIN(dac) = 1560; send_to_bootloader = 0; flash_state = SLAVE_IN_APP; + ctx->send_state = 0; } static void rt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) { @@ -281,7 +283,7 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst case ERASE_FLASH: if(ctx->from_hv.packet_from_hv.header.slave_addr == 255 && ctx->from_hv.packet_from_hv.header.len == (sizeof(packet_bootloader_t) - sizeof(stmbl_talk_header_t)) / 4) { // from f3 bootloader - if(/*ctx->from_hv.packet_from_hv_bootloader.header.flags.error == 0 && */ ctx->from_hv.packet_from_hv_bootloader.cmd == BOOTLOADER_OPCODE_PAGEERASE) { + if(ctx->from_hv.packet_from_hv_bootloader.state == BOOTLOADER_STATE_OK && ctx->from_hv.packet_from_hv_bootloader.cmd == BOOTLOADER_OPCODE_PAGEERASE) { ctx->timeout = 0; flash_state = SEND_APP; } @@ -293,12 +295,13 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst case SEND_APP: if(ctx->from_hv.packet_from_hv.header.slave_addr == 255 && ctx->from_hv.packet_from_hv.header.len == (sizeof(packet_bootloader_t) - sizeof(stmbl_talk_header_t)) / 4) { // from f3 bootloader - if(/*ctx->from_hv.packet_from_hv_bootloader.header.flags.error == 0 && */ ctx->from_hv.packet_from_hv_bootloader.cmd == BOOTLOADER_OPCODE_WRITE && ctx->from_hv.packet_from_hv_bootloader.addr == 0x08004000 + ctx->addr * 4 && ctx->from_hv.packet_from_hv_bootloader.value == ((uint32_t *)&(_binary_obj_hvf3_hvf3_bin_start))[ctx->addr]) { + if(ctx->from_hv.packet_from_hv_bootloader.state == BOOTLOADER_STATE_OK && ctx->from_hv.packet_from_hv_bootloader.cmd == BOOTLOADER_OPCODE_WRITE && ctx->from_hv.packet_from_hv_bootloader.addr == 0x08004000 + ctx->addr * 4 && ctx->from_hv.packet_from_hv_bootloader.value == ((uint32_t *)&(_binary_obj_hvf3_hvf3_bin_start))[ctx->addr]) { ctx->timeout = 0; ctx->addr++; } if(ctx->addr > ((uint32_t) & (_binary_obj_hvf3_hvf3_bin_size)) / 4) { flash_state = CRC_CHECK; + // flash_state = SEND_TO_APP; } } else { // wrong packet len or slave addr @@ -308,7 +311,7 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst case CRC_CHECK: if(ctx->from_hv.packet_from_hv.header.slave_addr == 255 && ctx->from_hv.packet_from_hv.header.len == (sizeof(packet_bootloader_t) - sizeof(stmbl_talk_header_t)) / 4) { // from f3 bootloader - if(/*ctx->from_hv.packet_from_hv_bootloader.header.flags.error == 0 && */ ctx->from_hv.packet_from_hv_bootloader.cmd == BOOTLOADER_OPCODE_CRCCHECK) { + if(ctx->from_hv.packet_from_hv_bootloader.state == BOOTLOADER_STATE_OK && ctx->from_hv.packet_from_hv_bootloader.cmd == BOOTLOADER_OPCODE_CRCCHECK) { ctx->timeout = 0; flash_state = SEND_TO_APP; } @@ -442,7 +445,7 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst tx_size = sizeof(packet_bootloader_t); - if(ctx->timeout > 1000) { + if(ctx->timeout > 10) { ctx->timeout = 0; flash_state = FLASH_FAILED; } @@ -455,7 +458,7 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst tx_size = sizeof(packet_bootloader_t); - if(ctx->timeout > 1000) { + if(ctx->timeout > 2000) { ctx->timeout = 0; flash_state = FLASH_FAILED; } @@ -468,7 +471,7 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst tx_size = sizeof(packet_bootloader_t); - if(ctx->timeout > 1000) { + if(ctx->timeout > 2000) { ctx->timeout = 0; flash_state = SLAVE_IN_APP; } @@ -481,6 +484,12 @@ static void frt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst break; } + if(ctx->send_state > 1){ + tx_size = 0; + ctx->send_state = 0; + } + ctx->send_state++; + if(tx_size) { CRC_ResetDR(); ctx->to_hv.packet_to_hv.header.crc = CRC_CalcBlockCRC((uint32_t *)&(ctx->to_hv.packet_to_hv.header.slave_addr), tx_size / 4 - 1); @@ -521,6 +530,11 @@ static void nrt_func(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) { static flash_state_t last_flash_state = SLAVE_IN_APP; static uint32_t last_addr = 0; + if(ctx->addr >= last_addr + 1024) { + printf("hv_update: status: %i%%\n", (int)(100.0 * ctx->addr * 4. / (float)((uint32_t) & (_binary_obj_hvf3_hvf3_bin_size)))); + last_addr = ctx->addr; + } + if(last_flash_state != flash_state) { switch(flash_state) { case SLAVE_IN_APP: @@ -552,11 +566,6 @@ static void nrt_func(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) { } last_flash_state = flash_state; } - - if(ctx->addr >= last_addr + 1024) { - printf("hv_update: status: %i%%\n", (int)(100.0 * ctx->addr * 4. / (float)((uint32_t) & (_binary_obj_hvf3_hvf3_bin_size)))); - last_addr = ctx->addr; - } } hal_comp_t hv_comp_struct = {