mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-31 02:01:35 +08:00
tools/bootloader: add force-erase option
If the STM32H7 fails to program or erase a full chunk of 256 bytes, the ECC check will trigger a busfault when trying to read from it. To speed up erasing and optimize wear, we read before erasing to check if it actually needs erasing. That's when a busfault happens and the erase time outs. The workaround is to add an option to do a full erase without check. Credit goes to: https://github.com/ArduPilot/ardupilot/pull/22090 And the protocol option added to the bootloader is the same as for ArduPilot, so compatible. Signed-off-by: Julian Oes <julian@oes.ch>
This commit is contained in:
@@ -114,6 +114,7 @@
|
||||
#define PROTO_RESERVED_0X37 0x37 // Reserved
|
||||
#define PROTO_RESERVED_0X38 0x38 // Reserved
|
||||
#define PROTO_RESERVED_0X39 0x39 // Reserved
|
||||
#define PROTO_CHIP_FULL_ERASE 0x40 // Full erase, without any flash wear optimization
|
||||
|
||||
#define PROTO_PROG_MULTI_MAX 64 // maximum PROG_MULTI size
|
||||
#define PROTO_READ_MULTI_MAX 255 // size of the size field
|
||||
@@ -649,6 +650,8 @@ bootloader(unsigned timeout)
|
||||
|
||||
led_on(LED_ACTIVITY);
|
||||
|
||||
bool full_erase = false;
|
||||
|
||||
// handle the command byte
|
||||
switch (c) {
|
||||
|
||||
@@ -728,6 +731,10 @@ bootloader(unsigned timeout)
|
||||
// success reply: INSYNC/OK
|
||||
// erase failure: INSYNC/FAILURE
|
||||
//
|
||||
case PROTO_CHIP_FULL_ERASE:
|
||||
full_erase = true;
|
||||
|
||||
// Fallthrough
|
||||
case PROTO_CHIP_ERASE:
|
||||
|
||||
/* expect EOC */
|
||||
@@ -755,17 +762,18 @@ bootloader(unsigned timeout)
|
||||
arch_flash_unlock();
|
||||
|
||||
for (int i = 0; flash_func_sector_size(i) != 0; i++) {
|
||||
flash_func_erase_sector(i);
|
||||
flash_func_erase_sector(i, full_erase);
|
||||
}
|
||||
|
||||
// disable the LED while verifying the erase
|
||||
led_set(LED_OFF);
|
||||
|
||||
// verify the erase
|
||||
for (address = 0; address < board_info.fw_size; address += 4)
|
||||
for (address = 0; address < board_info.fw_size; address += 4) {
|
||||
if (flash_func_read_word(address) != 0xffffffff) {
|
||||
goto cmd_fail;
|
||||
}
|
||||
}
|
||||
|
||||
address = 0;
|
||||
SET_BL_STATE(STATE_PROTO_CHIP_ERASE);
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
/*****************************************************************************
|
||||
* Generic bootloader functions.
|
||||
*/
|
||||
@@ -105,7 +107,7 @@ extern void board_deinit(void);
|
||||
extern uint32_t board_get_devices(void);
|
||||
extern void clock_deinit(void);
|
||||
extern uint32_t flash_func_sector_size(unsigned sector);
|
||||
extern void flash_func_erase_sector(unsigned sector);
|
||||
extern void flash_func_erase_sector(unsigned sector, bool force);
|
||||
extern void flash_func_write_word(uintptr_t address, uint32_t word);
|
||||
extern uint32_t flash_func_read_word(uintptr_t address);
|
||||
extern uint32_t flash_func_read_otp(uintptr_t address);
|
||||
|
||||
Reference in New Issue
Block a user