adiv5: Attempt to handle JTAG DPv0 devices
This commit is contained in:
parent
b795cb7ef4
commit
79575cc8a9
|
@ -136,7 +136,7 @@ uint32_t jlink_swdp_scan(bmp_info_t *info)
|
||||||
|
|
||||||
jlink_adiv5_swdp_error(dp);
|
jlink_adiv5_swdp_error(dp);
|
||||||
|
|
||||||
adiv5_dp_init(dp);
|
adiv5_dp_init(dp, 0);
|
||||||
|
|
||||||
return target_list ? 1U : 0U;
|
return target_list ? 1U : 0U;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1099,7 +1099,7 @@ uint32_t stlink_swdp_scan(bmp_info_t *info)
|
||||||
|
|
||||||
stlink_dp_error(dp);
|
stlink_dp_error(dp);
|
||||||
|
|
||||||
adiv5_dp_init(dp);
|
adiv5_dp_init(dp, 0);
|
||||||
|
|
||||||
return target_list ? 1U : 0U;
|
return target_list ? 1U : 0U;
|
||||||
}
|
}
|
||||||
|
|
|
@ -681,7 +681,7 @@ static void rp_rescue_setup(ADIv5_DP_t *dp)
|
||||||
return;
|
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.
|
* Assume DP v1 or later.
|
||||||
|
@ -691,9 +691,10 @@ void adiv5_dp_init(ADIv5_DP_t *dp)
|
||||||
*
|
*
|
||||||
* for SWD-DP, we are guaranteed to be DP v1 or later.
|
* 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;
|
volatile struct exception e;
|
||||||
TRY_CATCH (e, EXCEPTION_ALL) {
|
TRY_CATCH (e, EXCEPTION_ALL) {
|
||||||
|
if (idcode != JTAG_IDCODE_ARM_DPv0)
|
||||||
dpidr = adiv5_dp_read(dp, ADIV5_DP_DPIDR);
|
dpidr = adiv5_dp_read(dp, ADIV5_DP_DPIDR);
|
||||||
}
|
}
|
||||||
if (e.type) {
|
if (e.type) {
|
||||||
|
@ -728,16 +729,13 @@ void adiv5_dp_init(ADIv5_DP_t *dp)
|
||||||
} else {
|
} else {
|
||||||
DEBUG_WARN("Invalid DPIDR %08" PRIx32 " assuming DP version 0\n", dpidr);
|
DEBUG_WARN("Invalid DPIDR %08" PRIx32 " assuming DP version 0\n", dpidr);
|
||||||
dp->version = 0;
|
dp->version = 0;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if (dp->version == 0) {
|
|
||||||
/* DP v0 */
|
|
||||||
DEBUG_WARN("DPv0 detected, no designer code available\n");
|
|
||||||
dp->designer_code = 0;
|
dp->designer_code = 0;
|
||||||
dp->partno = 0;
|
dp->partno = 0;
|
||||||
dp->mindp = 0;
|
dp->mindp = false;
|
||||||
}
|
}
|
||||||
|
} else if (dp->version == 0)
|
||||||
|
/* DP v0 */
|
||||||
|
DEBUG_WARN("DPv0 detected based on JTAG IDCode\n");
|
||||||
|
|
||||||
if (dp->version >= 2) {
|
if (dp->version >= 2) {
|
||||||
adiv5_dp_write(dp, ADIV5_DP_SELECT, 2); /* TARGETID is on bank 2 */
|
adiv5_dp_write(dp, ADIV5_DP_SELECT, 2); /* TARGETID is on bank 2 */
|
||||||
|
|
|
@ -162,6 +162,8 @@
|
||||||
#define JTAG_IDCODE_DESIGNER_OFFSET 1U
|
#define JTAG_IDCODE_DESIGNER_OFFSET 1U
|
||||||
#define JTAG_IDCODE_DESIGNER_MASK (0x7ffU << JTAG_IDCODE_DESIGNER_OFFSET)
|
#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 */
|
/* Constants to make RnW parameters more clear in code */
|
||||||
#define ADIV5_LOW_WRITE 0
|
#define ADIV5_LOW_WRITE 0
|
||||||
#define ADIV5_LOW_READ 1
|
#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);
|
void adiv5_dp_write(ADIv5_DP_t *dp, uint16_t addr, uint32_t value);
|
||||||
#endif
|
#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);
|
void platform_adiv5_dp_defaults(ADIv5_DP_t *dp);
|
||||||
ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel);
|
ADIv5_AP_t *adiv5_new_ap(ADIv5_DP_t *dp, uint8_t apsel);
|
||||||
void remote_jtag_dev(const jtag_dev_t *jtag_dev);
|
void remote_jtag_dev(const jtag_dev_t *jtag_dev);
|
||||||
|
|
|
@ -56,7 +56,7 @@ void adiv5_jtag_dp_handler(uint8_t jd_index)
|
||||||
dp->abort = adiv5_jtagdp_abort;
|
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)
|
uint32_t fw_adiv5_jtagdp_read(ADIv5_DP_t *dp, uint16_t addr)
|
||||||
|
|
|
@ -194,7 +194,7 @@ uint32_t adiv5_swdp_scan(uint32_t targetid)
|
||||||
memcpy(dp, initial_dp, sizeof(ADIv5_DP_t));
|
memcpy(dp, initial_dp, sizeof(ADIv5_DP_t));
|
||||||
dp->instance = i;
|
dp->instance = i;
|
||||||
|
|
||||||
adiv5_dp_init(dp);
|
adiv5_dp_init(dp, 0);
|
||||||
}
|
}
|
||||||
return target_list ? 1U : 0U;
|
return target_list ? 1U : 0U;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue