From: Tomas Vanek Date: Wed, 21 Sep 2022 04:32:21 +0000 (+0200) Subject: flash/nor/rp2040: fix flash erase timeout X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=53611d8055d1130a925010b3feb39c7c8fa20a14;hp=84d73d0225407594ed9cf646fa3dd8a5752df7ad;p=fw%2Fopenocd flash/nor/rp2040: fix flash erase timeout SPI flash erase often takes longer than the fixed timeout 3 seconds. Introduce a configurable timeout_ms parameter to rp2040_call_rom_func(). Compute the erase timeout from the number of blocks to be erased. While on it make the timeouts shorter for connect flash, flush cache and enter/exit xip (1 second is enough). Change-Id: I552bfa317ee17064de3a54ec2f0c63e84ba87222 Signed-off-by: Tomas Vanek Reviewed-on: https://review.openocd.org/c/openocd/+/7214 Tested-by: jenkins Reviewed-by: Antonio Borneo Reviewed-by: Jonathan Bell --- diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c index ce09fea08..7cc6434ff 100644 --- a/src/flash/nor/rp2040.c +++ b/src/flash/nor/rp2040.c @@ -87,7 +87,7 @@ static uint32_t rp2040_lookup_symbol(struct target *target, uint32_t tag, uint16 } static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank *priv, - uint16_t func_offset, uint32_t argdata[], unsigned int n_args) + uint16_t func_offset, uint32_t argdata[], unsigned int n_args, int timeout_ms) { char *regnames[4] = { "r0", "r1", "r2", "r3" }; @@ -127,7 +127,7 @@ static int rp2040_call_rom_func(struct target *target, struct rp2040_flash_bank 0, NULL, /* No memory arguments */ n_args + 1, args, /* User arguments + r7 */ priv->jump_debug_trampoline, priv->jump_debug_trampoline_end, - 3000, /* 3s timeout */ + timeout_ms, &alg_info ); for (unsigned int i = 0; i < n_args + 2; ++i) @@ -153,14 +153,14 @@ static int rp2040_finalize_stack_free(struct flash_bank *bank) * chip select following a rp2040_flash_exit_xip(). */ LOG_DEBUG("Flushing flash cache after write behind"); - int err = rp2040_call_rom_func(target, priv, priv->jump_flush_cache, NULL, 0); + int err = rp2040_call_rom_func(target, priv, priv->jump_flush_cache, NULL, 0, 1000); if (err != ERROR_OK) { LOG_ERROR("Failed to flush flash cache"); /* Intentionally continue after error and try to setup xip anyway */ } LOG_DEBUG("Configuring SSI for execute-in-place"); - err = rp2040_call_rom_func(target, priv, priv->jump_enter_cmd_xip, NULL, 0); + err = rp2040_call_rom_func(target, priv, priv->jump_enter_cmd_xip, NULL, 0, 1000); if (err != ERROR_OK) LOG_ERROR("Failed to set SSI to XIP mode"); @@ -189,14 +189,14 @@ static int rp2040_stack_grab_and_prep(struct flash_bank *bank) } LOG_DEBUG("Connecting internal flash"); - err = rp2040_call_rom_func(target, priv, priv->jump_connect_internal_flash, NULL, 0); + err = rp2040_call_rom_func(target, priv, priv->jump_connect_internal_flash, NULL, 0, 1000); if (err != ERROR_OK) { LOG_ERROR("Failed to connect internal flash"); return err; } LOG_DEBUG("Kicking flash out of XIP mode"); - err = rp2040_call_rom_func(target, priv, priv->jump_flash_exit_xip, NULL, 0); + err = rp2040_call_rom_func(target, priv, priv->jump_flash_exit_xip, NULL, 0, 1000); if (err != ERROR_OK) { LOG_ERROR("Failed to exit flash XIP mode"); return err; @@ -243,7 +243,8 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui bounce->address, /* data */ write_size /* count */ }; - err = rp2040_call_rom_func(target, priv, priv->jump_flash_range_program, args, ARRAY_SIZE(args)); + err = rp2040_call_rom_func(target, priv, priv->jump_flash_range_program, + args, ARRAY_SIZE(args), 3000); if (err != ERROR_OK) { LOG_ERROR("Failed to invoke flash programming code on target"); break; @@ -292,7 +293,9 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig an optional larger "block" (size and command provided in args). */ - err = rp2040_call_rom_func(bank->target, priv, priv->jump_flash_range_erase, args, ARRAY_SIZE(args)); + int timeout_ms = 2000 * (last - first) + 1000; + err = rp2040_call_rom_func(bank->target, priv, priv->jump_flash_range_erase, + args, ARRAY_SIZE(args), timeout_ms); cleanup: rp2040_finalize_stack_free(bank);