adiv5: Attempt to handle JTAG DPv0 devices

This commit is contained in:
dragonmux 2022-08-18 12:44:57 +01:00 committed by Piotr Esden-Tempski
parent b795cb7ef4
commit 79575cc8a9
6 changed files with 16 additions and 16 deletions

View File

@ -136,7 +136,7 @@ uint32_t jlink_swdp_scan(bmp_info_t *info)
jlink_adiv5_swdp_error(dp);
adiv5_dp_init(dp);
adiv5_dp_init(dp, 0);
return target_list ? 1U : 0U;
}

View File

@ -1099,7 +1099,7 @@ uint32_t stlink_swdp_scan(bmp_info_t *info)
stlink_dp_error(dp);
adiv5_dp_init(dp);
adiv5_dp_init(dp, 0);
return target_list ? 1U : 0U;
}

View File

@ -681,7 +681,7 @@ static void rp_rescue_setup(ADIv5_DP_t *dp)
return;
}
void adiv5_dp_init(ADIv5_DP_t *dp)
void adiv5_dp_init(ADIv5_DP_t *dp, const uint32_t idcode)
{
/*
* Assume DP v1 or later.
@ -691,10 +691,11 @@ void adiv5_dp_init(ADIv5_DP_t *dp)
*
* for SWD-DP, we are guaranteed to be DP v1 or later.
*/
volatile uint32_t dpidr;
volatile uint32_t dpidr = 0;
volatile struct exception e;
TRY_CATCH (e, EXCEPTION_ALL) {
dpidr = adiv5_dp_read(dp, ADIV5_DP_DPIDR);
if (idcode != JTAG_IDCODE_ARM_DPv0)
dpidr = adiv5_dp_read(dp, ADIV5_DP_DPIDR);
}
if (e.type) {
DEBUG_WARN("DP not responding!...\n");
@ -728,16 +729,13 @@ void adiv5_dp_init(ADIv5_DP_t *dp)
} else {
DEBUG_WARN("Invalid DPIDR %08" PRIx32 " assuming DP version 0\n", dpidr);
dp->version = 0;
dp->designer_code = 0;
dp->partno = 0;
dp->mindp = false;
}
}
if (dp->version == 0) {
} else if (dp->version == 0)
/* DP v0 */
DEBUG_WARN("DPv0 detected, no designer code available\n");
dp->designer_code = 0;
dp->partno = 0;
dp->mindp = 0;
}
DEBUG_WARN("DPv0 detected based on JTAG IDCode\n");
if (dp->version >= 2) {
adiv5_dp_write(dp, ADIV5_DP_SELECT, 2); /* TARGETID is on bank 2 */

View File

@ -162,6 +162,8 @@
#define JTAG_IDCODE_DESIGNER_OFFSET 1U
#define JTAG_IDCODE_DESIGNER_MASK (0x7ffU << JTAG_IDCODE_DESIGNER_OFFSET)
#define JTAG_IDCODE_ARM_DPv0 0x4ba00477U
/* Constants to make RnW parameters more clear in code */
#define ADIV5_LOW_WRITE 0
#define ADIV5_LOW_READ 1
@ -358,7 +360,7 @@ void adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_
void adiv5_dp_write(ADIv5_DP_t *dp, uint16_t addr, uint32_t value);
#endif
void adiv5_dp_init(ADIv5_DP_t *dp);
void adiv5_dp_init(ADIv5_DP_t *dp, uint32_t idcode);
void platform_adiv5_dp_defaults(ADIv5_DP_t *dp);
ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel);
void remote_jtag_dev(const jtag_dev_t *jtag_dev);

View File

@ -56,7 +56,7 @@ void adiv5_jtag_dp_handler(uint8_t jd_index)
dp->abort = adiv5_jtagdp_abort;
}
adiv5_dp_init(dp);
adiv5_dp_init(dp, jtag_devs[jd_index].jd_idcode);
}
uint32_t fw_adiv5_jtagdp_read(ADIv5_DP_t *dp, uint16_t addr)

View File

@ -194,7 +194,7 @@ uint32_t adiv5_swdp_scan(uint32_t targetid)
memcpy(dp, initial_dp, sizeof(ADIv5_DP_t));
dp->instance = i;
adiv5_dp_init(dp);
adiv5_dp_init(dp, 0);
}
return target_list ? 1U : 0U;
}