Example #1
0
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;
}
Example #2
0
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;
}