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.
This commit is contained in:
parent
ea92c8b8c8
commit
fa5e69e3be
@ -42,21 +42,35 @@
|
|||||||
#include "target_internal.h"
|
#include "target_internal.h"
|
||||||
#include "cortexm.h"
|
#include "cortexm.h"
|
||||||
|
|
||||||
|
#define BOOTROM_MAGIC ('M' | ('u' << 8) | (0x01 << 16))
|
||||||
|
#define BOOTROM_MAGIC_ADDR 0x00000010
|
||||||
|
|
||||||
bool rp_probe(target *t)
|
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";
|
t->driver = "Raspberry RP2040";
|
||||||
target_add_ram(t, 0x20000000, 0x40000);
|
target_add_ram(t, 0x20000000, 0x40000);
|
||||||
return true;
|
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);
|
/* The RP Pico rescue DP provides no AP, so we need special handling
|
||||||
|
*
|
||||||
const struct command_s rp_rescue_cmd_list[] = {
|
* Attach to this DP will do the reset, but will fail to attach!
|
||||||
{"rescue_reset", (cmd_handler)rp_rescue_reset, "Hard reset to bootrom and halt"},
|
*/
|
||||||
{NULL, NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
void rp_rescue_probe(ADIv5_AP_t *ap)
|
void rp_rescue_probe(ADIv5_AP_t *ap)
|
||||||
{
|
{
|
||||||
target *t = target_new();
|
target *t = target_new();
|
||||||
@ -65,20 +79,9 @@ void rp_rescue_probe(ADIv5_AP_t *ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
adiv5_ap_ref(ap);
|
adiv5_ap_ref(ap);
|
||||||
|
t->attach = (void*)rp_rescue_do_reset;
|
||||||
t->priv = ap;
|
t->priv = ap;
|
||||||
t->priv_free = (void*)adiv5_ap_unref;
|
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;
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user