static int swd_queue_idcode_read(struct adiv5_dap *dap, uint8_t *ack, uint32_t *data) { int status = swd_queue_dp_read(dap, DP_IDCODE, data); if (status < 0) return status; *ack = status; /* ?? */ return ERROR_OK; }
static int swd_connect(struct adiv5_dap *dap) { const struct swd_driver *swd = adiv5_dap_swd_driver(dap); uint32_t dpidr; int status; /* FIXME validate transport config ... is the * configured DAP present (check IDCODE)? * Is *only* one DAP configured? * * MUST READ DPIDR */ /* Check if we should reset srst already when connecting, but not if reconnecting. */ if (!dap->do_reconnect) { enum reset_types jtag_reset_config = jtag_get_reset_config(); if (jtag_reset_config & RESET_CNCT_UNDER_SRST) { if (jtag_reset_config & RESET_SRST_NO_GATING) swd_add_reset(1); else LOG_WARNING("\'srst_nogate\' reset_config option is required"); } } /* Note, debugport_init() does setup too */ swd->switch_seq(JTAG_TO_SWD); /* Clear link state, including the SELECT cache. */ dap->do_reconnect = false; dap_invalidate_cache(dap); swd_queue_dp_read(dap, DP_DPIDR, &dpidr); /* force clear all sticky faults */ swd_clear_sticky_errors(dap); status = swd_run_inner(dap); if (status == ERROR_OK) { LOG_INFO("SWD DPIDR %#8.8" PRIx32, dpidr); dap->do_reconnect = false; status = dap_dp_init(dap); } else dap->do_reconnect = true; return status; }