From eee16cf08acb678450c60099fe1c9f905c3da533 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 17 Apr 2020 17:11:01 +0200 Subject: [PATCH 1/4] platforms/tm4c/jtagtap.c: Remove unreferenced and incomplete file. --- src/platforms/tm4c/jtagtap.c | 43 ------------------------------------ 1 file changed, 43 deletions(-) delete mode 100644 src/platforms/tm4c/jtagtap.c diff --git a/src/platforms/tm4c/jtagtap.c b/src/platforms/tm4c/jtagtap.c deleted file mode 100644 index 056a4fdb..00000000 --- a/src/platforms/tm4c/jtagtap.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "general.h" -#include "jtagtap.h" - -int -jtagtap_init(void) -{ - TMS_SET_MODE(); - - for(int i = 0; i <= 50; i++) jtagtap_next(1,0); - jtagtap_tms_seq(0xE73C, 16); - jtagtap_soft_reset(); - - return 0; -} - -void -jtagtap_reset(void) -{ -#ifdef TRST_PORT - volatile int i; - gpio_clear(TRST_PORT, TRST_PIN); - for(i = 0; i < 10000; i++) asm("nop"); - gpio_set(TRST_PORT, TRST_PIN); -#endif - jtagtap_soft_reset(); -} - -uint8_t -jtagtap_next(const uint8_t dTMS, const uint8_t dTDI) -{ - uint16_t ret; - - gpio_set_val(TMS_PORT, TMS_PIN, dTMS); - gpio_set_val(TDI_PORT, TDI_PIN, dTDI); - gpio_set(TCK_PORT, TCK_PIN); - ret = gpio_get(TDO_PORT, TDO_PIN); - gpio_clear(TCK_PORT, TCK_PIN); - - DEBUG("jtagtap_next(TMS = %d, TDI = %d) = %d\n", dTMS, dTDI, ret); - - return ret != 0; -} - From 783ec377d9c2a55e437d687ab786c889c6fe6ab6 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 24 Apr 2020 15:26:48 +0200 Subject: [PATCH 2/4] adiv5: Export extract. --- src/target/adiv5.c | 2 +- src/target/adiv5.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/target/adiv5.c b/src/target/adiv5.c index 778cd0c1..8c82a319 100644 --- a/src/target/adiv5.c +++ b/src/target/adiv5.c @@ -586,7 +586,7 @@ static void ap_mem_access_setup(ADIv5_AP_t *ap, uint32_t addr, enum align align) } /* Extract read data from data lane based on align and src address */ -static void * extract(void *dest, uint32_t src, uint32_t val, enum align align) +void * extract(void *dest, uint32_t src, uint32_t val, enum align align) { switch (align) { case ALIGN_BYTE: diff --git a/src/target/adiv5.h b/src/target/adiv5.h index c72a7a42..1ae53bd7 100644 --- a/src/target/adiv5.h +++ b/src/target/adiv5.h @@ -197,4 +197,5 @@ void adiv5_mem_write(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len) void adiv5_mem_write_sized(ADIv5_AP_t *ap, uint32_t dest, const void *src, size_t len, enum align align); uint64_t adiv5_ap_read_pidr(ADIv5_AP_t *ap, uint32_t addr); +void * extract(void *dest, uint32_t src, uint32_t val, enum align align); #endif From b0cf7d24bd4378044a5757fc276fa20969707196 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Sat, 25 Apr 2020 14:36:06 +0200 Subject: [PATCH 3/4] adiv5.c: Fix another leak. --- src/target/adiv5.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/target/adiv5.c b/src/target/adiv5.c index 8c82a319..5f0de60b 100644 --- a/src/target/adiv5.c +++ b/src/target/adiv5.c @@ -317,9 +317,11 @@ static bool adiv5_component_probe(ADIv5_AP_t *ap, uint32_t addr, int recursion, #endif for (int i = 0; i < 960; i++) { + adiv5_dp_error(ap->dp); uint32_t entry = adiv5_mem_read32(ap, addr + i*4); if (adiv5_dp_error(ap->dp)) { - DEBUG("%sFault reading ROM table entry\n", indent); + DEBUG("%sFault reading ROM table entry %d\n", indent, i); + break; } if (entry == 0) @@ -518,6 +520,7 @@ void adiv5_dp_init(ADIv5_DP_t *dp) if (ap->base == last_base) { DEBUG("AP %d: Duplicate base\n", i); adiv5_ap_cleanup(i); + free(ap); /* FIXME: Should we expect valid APs behind duplicate ones? */ return; } From 1e10b96b03da71b1a101c108ca9511c8a613666e Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Wed, 15 Apr 2020 18:59:13 +0200 Subject: [PATCH 4/4] Allow multiple scan routines. --- src/command.c | 10 +++++++- src/include/target.h | 7 ++++++ src/platforms/libftdi/platform.c | 11 +++++++++ src/platforms/pc-hosted/platform.c | 11 +++++++++ src/platforms/pc-stlinkv2/adiv5_jtagdp.c | 2 +- src/platforms/pc-stlinkv2/platform.c | 30 ++++++++++++++++++++++++ src/platforms/pc-stlinkv2/platform.h | 2 +- src/platforms/pc/cl_utils.c | 4 ++-- 8 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/command.c b/src/command.c index 12a5e4ad..4d0d1e50 100644 --- a/src/command.c +++ b/src/command.c @@ -186,7 +186,11 @@ static bool cmd_jtag_scan(target *t, int argc, char **argv) int devs = -1; volatile struct exception e; TRY_CATCH (e, EXCEPTION_ALL) { +#if PC_HOSTED == 1 + devs = platform_jtag_scan(argc > 1 ? irlens : NULL); +#else devs = jtag_scan(argc > 1 ? irlens : NULL); +#endif } switch (e.type) { case EXCEPTION_TIMEOUT: @@ -220,8 +224,12 @@ bool cmd_swdp_scan(target *t, int argc, char **argv) int devs = -1; volatile struct exception e; TRY_CATCH (e, EXCEPTION_ALL) { +#if PC_HOSTED == 1 + devs = platform_adiv5_swdp_scan(); +#else devs = adiv5_swdp_scan(); - } +#endif + } switch (e.type) { case EXCEPTION_TIMEOUT: gdb_outf("Timeout during scan. Is target stuck in WFI?\n"); diff --git a/src/include/target.h b/src/include/target.h index cc6131ef..b4b840c3 100644 --- a/src/include/target.h +++ b/src/include/target.h @@ -34,6 +34,13 @@ typedef struct target_s target; typedef uint32_t target_addr; struct target_controller; +#if defined(PC_HOSTED) +int platform_adiv5_swdp_scan(void); +int platform_jtag_scan(const uint8_t *lrlens); +#endif +int adiv5_swdp_scan(void); +int jtag_scan(const uint8_t *lrlens); + int adiv5_swdp_scan(void); int jtag_scan(const uint8_t *lrlens); diff --git a/src/platforms/libftdi/platform.c b/src/platforms/libftdi/platform.c index 8fad4ccd..88ed4f22 100644 --- a/src/platforms/libftdi/platform.c +++ b/src/platforms/libftdi/platform.c @@ -21,6 +21,7 @@ #include "gdb_if.h" #include "version.h" #include "platform.h" +#include "target.h" #include #include @@ -180,6 +181,16 @@ cable_desc_t cable_desc[] = { }, }; +int platform_adiv5_swdp_scan(void) +{ + return adiv5_swdp_scan(); +} + +int platform_jtag_scan(const uint8_t *lrlens) +{ + return jtag_scan(lrlens); +} + void platform_init(int argc, char **argv) { BMP_CL_OPTIONS_t cl_opts = {0}; diff --git a/src/platforms/pc-hosted/platform.c b/src/platforms/pc-hosted/platform.c index 361574d5..82f79960 100644 --- a/src/platforms/pc-hosted/platform.c +++ b/src/platforms/pc-hosted/platform.c @@ -23,6 +23,7 @@ #include "version.h" #include "platform.h" #include "remote.h" +#include "target.h" #include #include @@ -33,6 +34,16 @@ #include "cl_utils.h" static BMP_CL_OPTIONS_t cl_opts; /* Portable way to nullify the struct*/ +int platform_adiv5_swdp_scan(void) +{ + return adiv5_swdp_scan(); +} + +int platform_jtag_scan(const uint8_t *lrlens) +{ + return jtag_scan(lrlens); +} + void platform_init(int argc, char **argv) { cl_opts.opt_idstring = "Blackmagic Debug Probe Remote"; diff --git a/src/platforms/pc-stlinkv2/adiv5_jtagdp.c b/src/platforms/pc-stlinkv2/adiv5_jtagdp.c index 4c228fdb..30ff697e 100644 --- a/src/platforms/pc-stlinkv2/adiv5_jtagdp.c +++ b/src/platforms/pc-stlinkv2/adiv5_jtagdp.c @@ -31,7 +31,7 @@ struct jtag_dev_s jtag_devs[JTAG_MAX_DEVS+1]; int jtag_dev_count; -int jtag_scan(const uint8_t *irlens) +int jtag_scan_stlinkv2(const uint8_t *irlens) { uint32_t idcodes[JTAG_MAX_DEVS+1]; (void) *irlens; diff --git a/src/platforms/pc-stlinkv2/platform.c b/src/platforms/pc-stlinkv2/platform.c index e3f0a1f1..f594af17 100644 --- a/src/platforms/pc-stlinkv2/platform.c +++ b/src/platforms/pc-stlinkv2/platform.c @@ -20,6 +20,8 @@ #include "gdb_if.h" #include "version.h" #include "platform.h" +#include "target.h" +#include "target_internal.h" #include #include @@ -39,6 +41,34 @@ const char *platform_target_voltage(void) return stlink_target_voltage(); } +static int adiv5_swdp_scan_stlinkv2(void) +{ + target_list_free(); + ADIv5_DP_t *dp = (void*)calloc(1, sizeof(*dp)); + if (stlink_enter_debug_swd()) + return 0; + dp->idcode = stlink_read_coreid(); + dp->dp_read = stlink_dp_read; + dp->error = stlink_dp_error; + dp->low_access = stlink_dp_low_access; + dp->abort = stlink_dp_abort; + + stlink_dp_error(dp); + adiv5_dp_init(dp); + + return target_list?1:0; + return 0; +} +int platform_adiv5_swdp_scan(void) +{ + return adiv5_swdp_scan_stlinkv2(); +} + +int platform_jtag_scan(const uint8_t *lrlens) +{ + return jtag_scan_stlinkv2(lrlens); +} + void platform_init(int argc, char **argv) { stlink_init(argc, argv); diff --git a/src/platforms/pc-stlinkv2/platform.h b/src/platforms/pc-stlinkv2/platform.h index 7db112d4..c3f0bba3 100644 --- a/src/platforms/pc-stlinkv2/platform.h +++ b/src/platforms/pc-stlinkv2/platform.h @@ -44,5 +44,5 @@ void stlink_check_detach(int state); void platform_buffer_flush(void); int platform_buffer_write(const uint8_t *data, int size); int platform_buffer_read(uint8_t *data, int size); - +int jtag_scan_stlinkv2(const uint8_t *irlens); #endif diff --git a/src/platforms/pc/cl_utils.c b/src/platforms/pc/cl_utils.c index 45f6373d..d68dc78c 100644 --- a/src/platforms/pc/cl_utils.c +++ b/src/platforms/pc/cl_utils.c @@ -275,9 +275,9 @@ int cl_execute(BMP_CL_OPTIONS_t *opt) printf("Running in Test Mode\n"); printf("Target voltage: %s Volt\n", platform_target_voltage()); if (opt->opt_usejtag) { - num_targets = jtag_scan(NULL); + num_targets = platform_jtag_scan(NULL); } else { - num_targets = adiv5_swdp_scan(); + num_targets = platform_adiv5_swdp_scan(); } if (!num_targets) { DEBUG("No target found\n");