From e612ab92ff8a687494d695913c77a3fad0a9b860 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 28 Oct 2019 10:48:00 +1100 Subject: [PATCH] AP_Bootloader: added error codes for failing to load app use the vendor code to indicate failure reason --- Tools/AP_Bootloader/bl_protocol.cpp | 1 + Tools/AP_Bootloader/can.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Tools/AP_Bootloader/bl_protocol.cpp b/Tools/AP_Bootloader/bl_protocol.cpp index 1dae1c64ac..15844f1caf 100644 --- a/Tools/AP_Bootloader/bl_protocol.cpp +++ b/Tools/AP_Bootloader/bl_protocol.cpp @@ -240,6 +240,7 @@ jump_to_app() // indicate that it has been running OK for 30s then we will stay // in bootloader stm32_watchdog_init(); + stm32_watchdog_pat(); #endif flash_set_keep_unlocked(false); diff --git a/Tools/AP_Bootloader/can.cpp b/Tools/AP_Bootloader/can.cpp index f0ba1ab029..16e14c31dc 100644 --- a/Tools/AP_Bootloader/can.cpp +++ b/Tools/AP_Bootloader/can.cpp @@ -33,6 +33,7 @@ #include "bl_protocol.h" #include #include "app_comms.h" +#include #include @@ -77,6 +78,14 @@ static struct { uint32_t sector_ofs; } fw_update; +enum { + FAIL_REASON_NO_APP_SIG = 10, + FAIL_REASON_BAD_LENGTH = 11, + FAIL_REASON_BAD_BOARD_ID = 12, + FAIL_REASON_BAD_CRC = 13, + FAIL_REASON_IN_UPDATE = 14, + FAIL_REASON_WATCHDOG = 15, +}; /* get cpu unique ID @@ -556,6 +565,7 @@ bool can_check_firmware(void) { if (fw_update.node_id != 0) { // we're doing an update, don't boot this fw + node_status.vendor_specific_status_code = FAIL_REASON_IN_UPDATE; return false; } const uint8_t sig[8] = { 0x40, 0xa2, 0xe4, 0xf1, 0x64, 0x68, 0x91, 0x06 }; @@ -564,16 +574,19 @@ bool can_check_firmware(void) const app_descriptor *ad = (const app_descriptor *)memmem(flash, flash_size-sizeof(app_descriptor), sig, sizeof(sig)); if (ad == nullptr) { // no application signature + node_status.vendor_specific_status_code = FAIL_REASON_NO_APP_SIG; printf("No app sig\n"); return false; } // check length if (ad->image_size > flash_size) { + node_status.vendor_specific_status_code = FAIL_REASON_BAD_LENGTH; printf("Bad fw length %u\n", ad->image_size); return false; } if (ad->board_id != APJ_BOARD_ID) { + node_status.vendor_specific_status_code = FAIL_REASON_BAD_BOARD_ID; printf("Bad board_id %u should be %u\n", ad->board_id, APJ_BOARD_ID); return false; } @@ -584,6 +597,7 @@ bool can_check_firmware(void) uint32_t crc1 = crc32_small(0, flash, len1); uint32_t crc2 = crc32_small(0, (const uint8_t *)&ad->version_major, len2); if (crc1 != ad->image_crc1 || crc2 != ad->image_crc2) { + node_status.vendor_specific_status_code = FAIL_REASON_BAD_CRC; printf("Bad app CRC 0x%08x:0x%08x 0x%08x:0x%08x\n", ad->image_crc1, ad->image_crc2, crc1, crc2); return false; } @@ -629,6 +643,10 @@ void can_start() send_next_node_id_allocation_request_at_ms = AP_HAL::millis() + UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_ALLOCATION_MIN_REQUEST_PERIOD_MS + (uint32_t)(getRandomFloat() * UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_ALLOCATION_MAX_FOLLOWUP_DELAY_MS); + + if (stm32_was_watchdog_reset()) { + node_status.vendor_specific_status_code = FAIL_REASON_WATCHDOG; + } }