From 13e8a262e4b559e4697e9e470984d835b7ad5b3e Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 20 Nov 2020 13:10:54 +0100 Subject: [PATCH] SWJ Frequency: Implement for cmsis-dap --- src/platforms/hosted/cmsis_dap.c | 2 -- src/platforms/hosted/cmsis_dap.h | 23 ++++++++++------------- src/platforms/hosted/dap.c | 17 +++++++++++++---- src/platforms/hosted/dap.h | 1 - src/platforms/hosted/platform.c | 6 ++++++ src/platforms/pc/cl_utils.c | 1 - 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/platforms/hosted/cmsis_dap.c b/src/platforms/hosted/cmsis_dap.c index c1e9668..0689417 100644 --- a/src/platforms/hosted/cmsis_dap.c +++ b/src/platforms/hosted/cmsis_dap.c @@ -271,7 +271,6 @@ int dap_enter_debug_swd(ADIv5_DP_t *dp) if (!(dap_caps & DAP_CAP_SWD)) return -1; mode = DAP_CAP_SWD; - dap_swj_clock(2000000); dap_transfer_configure(2, 128, 128); dap_swd_configure(0); dap_connect(false); @@ -340,7 +339,6 @@ int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc) mode = DAP_CAP_JTAG; dap_disconnect(); dap_connect(true); - dap_swj_clock(2000000); jtag_proc->jtagtap_reset = cmsis_dap_jtagtap_reset; jtag_proc->jtagtap_next = cmsis_dap_jtagtap_next; jtag_proc->jtagtap_tms_seq = cmsis_dap_jtagtap_tms_seq; diff --git a/src/platforms/hosted/cmsis_dap.h b/src/platforms/hosted/cmsis_dap.h index 6668ac3..5451f8c 100644 --- a/src/platforms/hosted/cmsis_dap.h +++ b/src/platforms/hosted/cmsis_dap.h @@ -29,6 +29,7 @@ void dap_exit_function(void); void dap_adiv5_dp_defaults(ADIv5_DP_t *dp); int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc); int dap_jtag_dp_init(ADIv5_DP_t *dp); +uint32_t dap_swj_clock(uint32_t clock); #else int dap_init(bmp_info_t *info) { @@ -36,19 +37,15 @@ int dap_init(bmp_info_t *info) (void)info; return -1; } -int dap_enter_debug_swd(ADIv5_DP_t *dp) {(void)dp; return -1;} -void dap_exit_function(void) {return;}; -void dap_adiv5_dp_defaults(ADIv5_DP_t *dp) {(void)dp; return; } -int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc) -{ - (void)jtag_proc; - return -1; -} -int dap_jtag_dp_init(ADIv5_DP_t *dp) -{ - (void)dp; - return -1; -} +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-parameter" +int dap_enter_debug_swd(ADIv5_DP_t *dp) {return -1;} +uint32_t dap_swj_clock(uint32_t clock) {return 0;} +void dap_exit_function(void) {}; +void dap_adiv5_dp_defaults(ADIv5_DP_t *dp) {}; +int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc) {return -1;} +int dap_jtag_dp_init(ADIv5_DP_t *dp) {return -1;} +# pragma GCC diagnostic pop #endif diff --git a/src/platforms/hosted/dap.c b/src/platforms/hosted/dap.c index 0f0efee..6f9a23c 100644 --- a/src/platforms/hosted/dap.c +++ b/src/platforms/hosted/dap.c @@ -203,18 +203,27 @@ void dap_disconnect(void) dbg_dap_cmd(buf, sizeof(buf), 1); } -//----------------------------------------------------------------------------- -void dap_swj_clock(uint32_t clock) +static uint32_t swj_clock; +/* Set/Get JTAG/SWD clock frequency + * + * With clock == 0, return last set value. + */ +uint32_t dap_swj_clock(uint32_t clock) { + if (clock == 0) + return swj_clock; uint8_t buf[5]; - buf[0] = ID_DAP_SWJ_CLOCK; buf[1] = clock & 0xff; buf[2] = (clock >> 8) & 0xff; buf[3] = (clock >> 16) & 0xff; buf[4] = (clock >> 24) & 0xff; dbg_dap_cmd(buf, sizeof(buf), 5); - + if (buf[0]) + DEBUG_WARN("dap_swj_clock failed\n"); + else + swj_clock = clock; + return swj_clock; } //----------------------------------------------------------------------------- diff --git a/src/platforms/hosted/dap.h b/src/platforms/hosted/dap.h index 6a6fbb5..037e0f0 100644 --- a/src/platforms/hosted/dap.h +++ b/src/platforms/hosted/dap.h @@ -65,7 +65,6 @@ enum void dap_led(int index, int state); void dap_connect(bool jtag); void dap_disconnect(void); -void dap_swj_clock(uint32_t clock); void dap_transfer_configure(uint8_t idle, uint16_t count, uint16_t retry); void dap_swd_configure(uint8_t cfg); int dap_info(int info, uint8_t *data, int size); diff --git a/src/platforms/hosted/platform.c b/src/platforms/hosted/platform.c index 8ee1016..07aab72 100644 --- a/src/platforms/hosted/platform.c +++ b/src/platforms/hosted/platform.c @@ -328,6 +328,9 @@ void platform_max_frequency_set(uint32_t freq) case BMP_TYPE_BMP: remote_max_frequency_set(freq); break; + case BMP_TYPE_CMSIS_DAP: + dap_swj_clock(freq); + break; default: DEBUG_WARN("Setting max SWJ frequency not yet implemented\n"); break; @@ -339,6 +342,9 @@ uint32_t platform_max_frequency_get(void) switch (info.bmp_type) { case BMP_TYPE_BMP: return remote_max_frequency_get(); + case BMP_TYPE_CMSIS_DAP: + return dap_swj_clock(0); + break; default: DEBUG_WARN("Reading max SWJ frequency not yet implemented\n"); break; diff --git a/src/platforms/pc/cl_utils.c b/src/platforms/pc/cl_utils.c index 664d7eb..78ba5b5 100644 --- a/src/platforms/pc/cl_utils.c +++ b/src/platforms/pc/cl_utils.c @@ -290,7 +290,6 @@ void cl_init(BMP_CL_OPTIONS_t *opt, int argc, char **argv) DEBUG_WARN("Ignoring filename in reset/test mode\n"); opt->opt_flash_file = NULL; } - DEBUG_WARN("opt freq %" PRIu32 "\n", opt->opt_max_swj_frequency); } static void display_target(int i, target *t, void *context)