From fa5e69e3be505a4c7b95095620085dfd6e23b4ea Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Mon, 15 Feb 2021 12:05:48 +0100 Subject: [PATCH] RP 2040: Special handling for rescue DP As the rescue DP provided no AP, trigger the reset with attach(). However attach will indicate failure also reset/halt has succeeded. --- src/target/rp.c | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/target/rp.c b/src/target/rp.c index 0787c64..4bae5f9 100644 --- a/src/target/rp.c +++ b/src/target/rp.c @@ -42,21 +42,35 @@ #include "target_internal.h" #include "cortexm.h" +#define BOOTROM_MAGIC ('M' | ('u' << 8) | (0x01 << 16)) +#define BOOTROM_MAGIC_ADDR 0x00000010 + bool rp_probe(target *t) { + /* Check bootrom magic*/ + uint32_t boot_magic = target_mem_read32(t, BOOTROM_MAGIC_ADDR); + if ((boot_magic & 0x00ffffff) != BOOTROM_MAGIC) { + DEBUG_WARN("Wrong Bootmagic %08" PRIx32 " found\n!", boot_magic); + return false; + } t->driver = "Raspberry RP2040"; target_add_ram(t, 0x20000000, 0x40000); return true; } +static bool rp_rescue_do_reset(target *t) +{ + ADIv5_AP_t *ap = (ADIv5_AP_t *)t->priv; + ap->dp->low_access(ap->dp, ADIV5_LOW_WRITE, ADIV5_DP_CTRLSTAT, + ADIV5_DP_CTRLSTAT_CDBGPWRUPREQ); + ap->dp->low_access(ap->dp, ADIV5_LOW_WRITE, ADIV5_DP_CTRLSTAT, 0); + return false; +} -static bool rp_rescue_reset(target *t, int argc, const char **argv); - -const struct command_s rp_rescue_cmd_list[] = { - {"rescue_reset", (cmd_handler)rp_rescue_reset, "Hard reset to bootrom and halt"}, - {NULL, NULL, NULL} -}; - +/* The RP Pico rescue DP provides no AP, so we need special handling + * + * Attach to this DP will do the reset, but will fail to attach! + */ void rp_rescue_probe(ADIv5_AP_t *ap) { target *t = target_new(); @@ -65,20 +79,9 @@ void rp_rescue_probe(ADIv5_AP_t *ap) } adiv5_ap_ref(ap); + t->attach = (void*)rp_rescue_do_reset; t->priv = ap; t->priv_free = (void*)adiv5_ap_unref; - t->driver = "Raspberry RP2040 Rescue"; + t->driver = "Raspberry RP2040 Rescue(Attach to reset!)"; - target_add_commands(t, rp_rescue_cmd_list, t->driver); -} - -static bool rp_rescue_reset(target *t, int argc, const char **argv) -{ - (void)argc; - (void)argv; - ADIv5_AP_t *ap = (ADIv5_AP_t *)t->priv; - ap->dp->low_access(ap->dp, ADIV5_LOW_WRITE, ADIV5_DP_CTRLSTAT, - ADIV5_DP_CTRLSTAT_CDBGPWRUPREQ); - ap->dp->low_access(ap->dp, ADIV5_LOW_WRITE, ADIV5_DP_CTRLSTAT, 0); - return true; }