|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:44:50
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via d29c1c6d6df31f64ae5593babc65cfdffa312def (commit)
from 9fce121366c86e77e84b9d20c7d1c7dbb38710d5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit d29c1c6d6df31f64ae5593babc65cfdffa312def
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 17:43:13 2024 +0200
flash/nor/rp2xxx: minor code improvements
Add error messages and proper error propagation.
Type cleaning.
Use saved chip id.
Cosmetics: separating lines added.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I151e684e1fbfc9476ec429036caf85f4c9329547
Reviewed-on: https://review.openocd.org/c/openocd/+/8457
Tested-by: jenkins
Reviewed-by: Jonathan Bell <jon...@ra...>
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index e58fc8a29..909d3f14d 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -233,11 +233,13 @@ static int rp2040_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
err = target_read_u16(target, ptr_to_entry, &entry_tag);
if (err != ERROR_OK)
return err;
+
if (entry_tag == tag) {
/* 16 bit symbol is next */
err = target_read_u16(target, ptr_to_entry + 2, symbol_out);
if (err != ERROR_OK)
return err;
+
LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
return ERROR_OK;
}
@@ -277,10 +279,12 @@ static int rp2350_a0_lookup_symbol(struct target *target, uint16_t tag, uint16_t
err = target_read_u16(target, ptr_to_entry, &entry_tag);
if (err != ERROR_OK)
return err;
+
if (entry_tag == tag) {
err = target_read_u16(target, ptr_to_entry + 2, symbol_out);
if (err != ERROR_OK)
return err;
+
LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
return ERROR_OK;
}
@@ -303,9 +307,10 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
while (true) {
uint16_t entry_tag, entry_flags;
- uint32_t err = target_read_u16(target, ptr_to_entry, &entry_tag);
+ int err = target_read_u16(target, ptr_to_entry, &entry_tag);
if (err != ERROR_OK)
return err;
+
if (entry_tag == 0) {
*symbol_out = 0;
return ERROR_FAIL;
@@ -315,6 +320,7 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
err = target_read_u16(target, ptr_to_entry, &entry_flags);
if (err != ERROR_OK)
return err;
+
ptr_to_entry += 2;
uint16_t matching_flags = flags & entry_flags;
@@ -338,6 +344,7 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
err = target_read_u16(target, ptr_to_entry, symbol_out);
if (err != ERROR_OK)
return err;
+
LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
return ERROR_OK;
}
@@ -426,18 +433,23 @@ static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xx
// From this point are optional functions which do not exist on e.g. RP2040
// or pre-production RP2350 ROM versions:
+ if (IS_RP2040(priv->id)) {
+ priv->jump_bootrom_reset_state = 0;
+ priv->jump_flash_reset_address_trans = 0;
+ return ERROR_OK;
+ }
err = rp2xxx_lookup_rom_symbol(target, FUNC_BOOTROM_STATE_RESET, symtype_func, &priv->jump_bootrom_reset_state);
if (err != ERROR_OK) {
priv->jump_bootrom_reset_state = 0;
- LOG_WARNING("Function FUNC_BOOTROM_STATE_RESET not found in RP2xxx ROM. (probably an RP2040 or an RP2350 A0)");
+ LOG_WARNING("Function FUNC_BOOTROM_STATE_RESET not found in RP2xxx ROM. (probably an RP2350 A0)");
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_RESET_ADDRESS_TRANS,
symtype_func, &priv->jump_flash_reset_address_trans);
if (err != ERROR_OK) {
priv->jump_flash_reset_address_trans = 0;
- LOG_WARNING("Function FUNC_FLASH_RESET_ADDRESS_TRANS not found in RP2xxx ROM. (probably an RP2040 or an RP2350 A0)");
+ LOG_WARNING("Function FUNC_FLASH_RESET_ADDRESS_TRANS not found in RP2xxx ROM. (probably an RP2350 A0)");
}
return ERROR_OK;
}
@@ -465,7 +477,7 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash
for (unsigned int i = 0; i < n_calls; ++i) {
LOG_DEBUG(" func @ %" PRIx32, calls[i].pc);
LOG_DEBUG(" sp = %" PRIx32, calls[i].sp);
- for (int j = 0; j < 4; ++j)
+ for (unsigned int j = 0; j < 4; ++j)
LOG_DEBUG(" a%d = %" PRIx32, j, calls[i].args[j]);
}
LOG_DEBUG("Calling on core \"%s\"", target->cmd_name);
@@ -607,14 +619,22 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2xxx_flash_bank
// Flash algorithms (and the RCP init stub called by this function) must
// run in the Secure state, so flip the state now before attempting to
// execute any code on the core.
+ int retval;
uint32_t dscsr;
- (void)target_read_u32(target, DCB_DSCSR, &dscsr);
+ retval = target_read_u32(target, DCB_DSCSR, &dscsr);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("RP2350 init ARM core: DSCSR read failed");
+ return retval;
+ }
+
LOG_DEBUG("DSCSR: %08x\n", dscsr);
if (!(dscsr & DSCSR_CDS)) {
LOG_DEBUG("Setting Current Domain Secure in DSCSR\n");
- (void)target_write_u32(target, DCB_DSCSR, (dscsr & ~DSCSR_CDSKEY) | DSCSR_CDS);
- (void)target_read_u32(target, DCB_DSCSR, &dscsr);
- LOG_DEBUG("DSCSR*: %08x\n", dscsr);
+ retval = target_write_u32(target, DCB_DSCSR, (dscsr & ~DSCSR_CDSKEY) | DSCSR_CDS);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("RP2350 init ARM core: DSCSR read failed");
+ return retval;
+ }
}
if (!priv->stack) {
@@ -682,8 +702,7 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
}
}
- // hacky RP2350 check -- either RISC-V or v8-M
- if (is_arm(target_to_arm(target)) ? target_to_arm(target)->arch == ARM_ARCH_V8M : true) {
+ if (IS_RP2350(priv->id)) {
err = rp2350_init_accessctrl(target);
if (err != ERROR_OK) {
LOG_ERROR("Failed to init ACCESSCTRL before ROM call");
@@ -861,16 +880,16 @@ static int rp2xxx_flash_erase(struct flash_bank *bank, unsigned int first, unsig
return ERROR_TARGET_NOT_HALTED;
}
- uint32_t start_addr = bank->sectors[first].offset;
- uint32_t length = bank->sectors[last].offset + bank->sectors[last].size - start_addr;
- LOG_DEBUG("erase %d bytes starting at 0x%" PRIx32, length, start_addr);
+ uint32_t offset_start = bank->sectors[first].offset;
+ uint32_t offset_last = bank->sectors[last].offset + bank->sectors[last].size;
+ uint32_t length = offset_last - offset_start;
+ LOG_DEBUG("erase %d bytes starting at 0x%" PRIx32, length, offset_start);
int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
goto cleanup_and_return;
- uint32_t offset_next = bank->sectors[first].offset;
- uint32_t offset_last = bank->sectors[last].offset + bank->sectors[last].size;
+ uint32_t offset_next = offset_start;
/* Break erase into multiple calls to avoid timeout on large erase. Choose 128k chunk which has
fairly low ROM call overhead and empirically seems to avoid the default keep_alive() limit
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2xxx.c | 49 ++++++++++++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 15 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|