return retval;
}
-/**
- * Utility to write AP registers.
- */
-static inline int adi_jtag_ap_write_check(struct adiv5_ap *ap,
- uint8_t reg_addr, uint8_t *outvalue)
+static void adi_jtag_finish_read(struct adiv5_dap *dap)
{
- return adi_jtag_dp_scan(ap->dap, JTAG_DP_APACC, reg_addr, DPAP_WRITE,
- outvalue, NULL, NULL, ap->memaccess_tck);
+ if (dap->last_read != NULL) {
+ adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
+ DP_RDBUFF, DPAP_READ, 0, dap->last_read, &dap->ack, 0);
+ dap->last_read = NULL;
+ }
}
static int adi_jtag_scan_inout_check_u32(struct adiv5_dap *dap,
if (ctrlstat & (SSTICKYORUN | SSTICKYERR)) {
LOG_DEBUG("jtag-dp: CTRL/STAT error, 0x%" PRIx32, ctrlstat);
/* Check power to debug regions */
- if ((ctrlstat & 0xf0000000) != 0xf0000000) {
+ if ((ctrlstat & (CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ | CSYSPWRUPACK)) !=
+ (CDBGPWRUPREQ | CDBGPWRUPACK | CSYSPWRUPREQ | CSYSPWRUPACK)) {
LOG_ERROR("Debug regions are unpowered, an unexpected reset might have happened");
return ERROR_JTAG_DEVICE_ERROR;
} else {
static int jtag_dp_q_read(struct adiv5_dap *dap, unsigned reg,
uint32_t *data)
{
- return adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
- reg, DPAP_READ, 0, data, 0);
+ int retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC, reg,
+ DPAP_READ, 0, dap->last_read, &dap->ack, 0);
+ dap->last_read = data;
+ return retval;
}
static int jtag_dp_q_write(struct adiv5_dap *dap, unsigned reg,
uint32_t data)
{
- return adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
- reg, DPAP_WRITE, data, NULL, 0);
+ int retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
+ reg, DPAP_WRITE, data, dap->last_read, &dap->ack, 0);
+ dap->last_read = NULL;
+ return retval;
}
/** Select the AP register bank matching bits 7:4 of reg. */
static int jtag_ap_q_bankselect(struct adiv5_ap *ap, unsigned reg)
{
struct adiv5_dap *dap = ap->dap;
- uint32_t select = ((uint32_t)ap->ap_num << 24) | (reg & 0x000000F0);
+ uint32_t sel = ((uint32_t)ap->ap_num << 24) | (reg & 0x000000F0);
- if (select == dap->select)
+ if (sel == dap->select)
return ERROR_OK;
- dap->select = select;
+ dap->select = sel;
- return jtag_dp_q_write(dap, DP_SELECT, select);
+ return jtag_dp_q_write(dap, DP_SELECT, sel);
}
static int jtag_ap_q_read(struct adiv5_ap *ap, unsigned reg,
uint32_t *data)
{
int retval = jtag_ap_q_bankselect(ap, reg);
-
if (retval != ERROR_OK)
return retval;
- return adi_jtag_scan_inout_check_u32(ap->dap, JTAG_DP_APACC, reg,
- DPAP_READ, 0, data, ap->memaccess_tck);
+ retval = adi_jtag_dp_scan_u32(ap->dap, JTAG_DP_APACC, reg,
+ DPAP_READ, 0, ap->dap->last_read, &ap->dap->ack,
+ ap->memaccess_tck);
+ ap->dap->last_read = data;
+
+ return retval;
}
static int jtag_ap_q_write(struct adiv5_ap *ap, unsigned reg,
uint32_t data)
{
- uint8_t out_value_buf[4];
-
int retval = jtag_ap_q_bankselect(ap, reg);
if (retval != ERROR_OK)
return retval;
- buf_set_u32(out_value_buf, 0, 32, data);
-
- return adi_jtag_ap_write_check(ap, reg, out_value_buf);
+ retval = adi_jtag_dp_scan_u32(ap->dap, JTAG_DP_APACC, reg,
+ DPAP_WRITE, data, ap->dap->last_read, &ap->dap->ack,
+ ap->memaccess_tck);
+ ap->dap->last_read = NULL;
+ return retval;
}
static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack)
static int jtag_dp_run(struct adiv5_dap *dap)
{
+ adi_jtag_finish_read(dap);
return jtagdp_transaction_endcheck(dap);
}