jlink_tap_execute();
}
- if (swd_mode)
- jlink_swd_switch_seq(NULL, JTAG_TO_SWD);
- else
- jlink_swd_switch_seq(NULL, SWD_TO_JTAG);
- jlink_swd_run_queue(NULL);
-
return ERROR_OK;
}
int ack = buf_get_u32(usb_in_buffer, pending_scan_results_buffer[i].first, 3);
if (ack != SWD_ACK_OK) {
- LOG_ERROR("SWD ack not OK: %d %s", ack,
+ LOG_DEBUG("SWD ack not OK: %d %s", ack,
ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK");
- queued_retval = ack;
+ queued_retval = ack == SWD_ACK_WAIT ? ERROR_WAIT : ERROR_FAIL;
goto skip;
} else if (pending_scan_results_buffer[i].length) {
uint32_t data = buf_get_u32(usb_in_buffer, 3 + pending_scan_results_buffer[i].first, 32);
static int swd_queue_dp_write(struct adiv5_dap *dap, unsigned reg,
uint32_t data);
+static int swd_queue_dp_read(struct adiv5_dap *dap, unsigned reg,
+ uint32_t *data);
static void swd_clear_sticky_errors(struct adiv5_dap *dap)
{
static int swd_run_inner(struct adiv5_dap *dap)
{
const struct swd_driver *swd = jtag_interface->swd;
+ int retval;
- int retval = swd->run(dap);
+ retval = swd->run(dap);
if (retval != ERROR_OK) {
/* fault response */
- swd_clear_sticky_errors(dap);
+ dap->do_reconnect = true;
}
return retval;
}
+static int swd_connect(struct adiv5_dap *dap)
+{
+ uint32_t idcode;
+ int status;
+
+ /* FIXME validate transport config ... is the
+ * configured DAP present (check IDCODE)?
+ * Is *only* one DAP configured?
+ *
+ * MUST READ IDCODE
+ */
+
+ /* Note, debugport_init() does setup too */
+ jtag_interface->swd->switch_seq(dap, JTAG_TO_SWD);
+
+ swd_queue_dp_read(dap, DP_IDCODE, &idcode);
+
+ /* force clear all sticky faults */
+ swd_clear_sticky_errors(dap);
+
+ status = swd_run_inner(dap);
+
+ if (status == ERROR_OK) {
+ LOG_INFO("SWD IDCODE %#8.8" PRIx32, idcode);
+ dap->do_reconnect = false;
+ }
+
+ return status;
+}
+
static inline int check_sync(struct adiv5_dap *dap)
{
return do_sync ? swd_run_inner(dap) : ERROR_OK;
return check_sync(dap);
}
-
static int swd_queue_dp_write(struct adiv5_dap *dap, unsigned reg,
uint32_t data)
{
const struct swd_driver *swd = jtag_interface->swd;
assert(swd);
+ if (dap->do_reconnect) {
+ int retval = swd_connect(dap);
+ if (retval != ERROR_OK)
+ return retval;
+ }
+
swd_queue_ap_bankselect(dap, reg);
swd->read_reg(dap, swd_cmd(true, true, reg), dap->last_read);
dap->last_read = data;
struct target *target = get_current_target(ctx);
struct arm *arm = target_to_arm(target);
struct adiv5_dap *dap = arm->dap;
- uint32_t idcode;
- int status;
-
/* Force the DAP's ops vector for SWD mode.
* messy - is there a better way? */
arm->dap->ops = &swd_dap_ops;
- /* FIXME validate transport config ... is the
- * configured DAP present (check IDCODE)?
- * Is *only* one DAP configured?
- *
- * MUST READ IDCODE
- */
-
- /* Note, debugport_init() does setup too */
-
- swd_queue_dp_read(dap, DP_IDCODE, &idcode);
-
- /* force clear all sticky faults */
- swd_clear_sticky_errors(dap);
-
- status = swd_run(dap);
-
- if (status == ERROR_OK)
- LOG_INFO("SWD IDCODE %#8.8" PRIx32, idcode);
-
- return status;
+ return swd_connect(dap);
}
static struct transport swd_transport = {