static void cortexa_reset(target *t) { /* This mess is Xilinx Zynq specific * See Zynq-7000 TRM, Xilinx doc UG585 */ #define ZYNQ_SLCR_UNLOCK 0xf8000008 #define ZYNQ_SLCR_UNLOCK_KEY 0xdf0d #define ZYNQ_SLCR_PSS_RST_CTRL 0xf8000200 target_mem_write32(t, ZYNQ_SLCR_UNLOCK, ZYNQ_SLCR_UNLOCK_KEY); target_mem_write32(t, ZYNQ_SLCR_PSS_RST_CTRL, 1); /* Try hard reset too */ platform_srst_set_val(true); platform_srst_set_val(false); /* Spin until Xilinx reconnects us */ platform_timeout timeout; platform_timeout_set(&timeout, 1000); volatile struct exception e; do { TRY_CATCH (e, EXCEPTION_ALL) { apb_read(t, DBGDIDR); } } while (!platform_timeout_is_expired(&timeout) && e.type == EXCEPTION_ERROR); if (e.type == EXCEPTION_ERROR) raise_exception(e.type, e.msg); platform_delay(100); cortexa_attach(t); }
bool cortexa_attach(target *t) { struct cortexa_priv *priv = t->priv; int tries; /* Clear any pending fault condition */ target_check_error(t); /* Enable halting debug mode */ uint32_t dbgdscr = apb_read(t, DBGDSCR); dbgdscr |= DBGDSCR_HDBGEN | DBGDSCR_ITREN; dbgdscr = (dbgdscr & ~DBGDSCR_EXTDCCMODE_MASK) | DBGDSCR_EXTDCCMODE_STALL; apb_write(t, DBGDSCR, dbgdscr); DEBUG("DBGDSCR = 0x%08"PRIx32"\n", dbgdscr); target_halt_request(t); tries = 10; while(!platform_srst_get_val() && !target_halt_poll(t, NULL) && --tries) platform_delay(200); if(!tries) return false; /* Clear any stale breakpoints */ for(unsigned i = 0; i < priv->hw_breakpoint_max; i++) { apb_write(t, DBGBCR(i), 0); } priv->hw_breakpoint_mask = 0; priv->bcr0 = 0; platform_srst_set_val(false); return true; }
static bool cmd_jtag_scan(target *t, int argc, char **argv) { (void)t; uint8_t irlens[argc]; gdb_outf("Target voltage: %s\n", platform_target_voltage()); if (argc > 1) { /* Accept a list of IR lengths on command line */ for (int i = 1; i < argc; i++) irlens[i-1] = atoi(argv[i]); irlens[argc-1] = 0; } if(connect_assert_srst) platform_srst_set_val(true); /* will be deasserted after attach */ int devs = -1; volatile struct exception e; TRY_CATCH (e, EXCEPTION_ALL) { devs = jtag_scan(argc > 1 ? irlens : NULL); }