diff --git a/src/target/adiv5_swdp.c b/src/target/adiv5_swdp.c index 78d91eb6..2af37c00 100644 --- a/src/target/adiv5_swdp.c +++ b/src/target/adiv5_swdp.c @@ -195,9 +195,8 @@ uint32_t firmware_swdp_read(ADIv5_DP_t *dp, uint16_t addr) uint32_t firmware_swdp_error(ADIv5_DP_t *dp) { - uint32_t err, clr = 0; - - if ((dp->idcode & ADIV5_DP_VERSION_MASK) == ADIV5_DPv2) { + if ((dp->fault && (dp->idcode & ADIV5_DP_VERSION_MASK) == ADIV5_DPv2) && + dp->dp_low_write) { /* On protocoll error target gets deselected. * With DP Change, another target needs selection. * => Reselect with right target! */ @@ -206,6 +205,7 @@ uint32_t firmware_swdp_read(ADIv5_DP_t *dp, uint16_t addr) uint32_t dummy; dp->dp_low_read(dp, ADIV5_DP_IDCODE, &dummy); } + uint32_t err, clr = 0; err = adiv5_dp_read(dp, ADIV5_DP_CTRLSTAT) & (ADIV5_DP_CTRLSTAT_STICKYORUN | ADIV5_DP_CTRLSTAT_STICKYCMP | ADIV5_DP_CTRLSTAT_STICKYERR | ADIV5_DP_CTRLSTAT_WDATAERR); diff --git a/src/target/cortexm.c b/src/target/cortexm.c index d0877b7e..5ce3a3c6 100644 --- a/src/target/cortexm.c +++ b/src/target/cortexm.c @@ -478,6 +478,9 @@ bool cortexm_probe(ADIv5_AP_t *ap) bool cortexm_attach(target *t) { + ADIv5_AP_t *ap = cortexm_ap(t); + ap->dp->fault = 1; /* Force switch to this multi-drop device*/ + target_check_error(t); struct cortexm_priv *priv = t->priv; unsigned i; uint32_t r;