SWJ Frequency: Implement for cmsis-dap

This commit is contained in:
Uwe Bonnes 2020-11-20 13:10:54 +01:00
parent 1ca9f234f7
commit 13e8a262e4
6 changed files with 29 additions and 21 deletions

View File

@ -271,7 +271,6 @@ int dap_enter_debug_swd(ADIv5_DP_t *dp)
if (!(dap_caps & DAP_CAP_SWD)) if (!(dap_caps & DAP_CAP_SWD))
return -1; return -1;
mode = DAP_CAP_SWD; mode = DAP_CAP_SWD;
dap_swj_clock(2000000);
dap_transfer_configure(2, 128, 128); dap_transfer_configure(2, 128, 128);
dap_swd_configure(0); dap_swd_configure(0);
dap_connect(false); dap_connect(false);
@ -340,7 +339,6 @@ int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc)
mode = DAP_CAP_JTAG; mode = DAP_CAP_JTAG;
dap_disconnect(); dap_disconnect();
dap_connect(true); dap_connect(true);
dap_swj_clock(2000000);
jtag_proc->jtagtap_reset = cmsis_dap_jtagtap_reset; jtag_proc->jtagtap_reset = cmsis_dap_jtagtap_reset;
jtag_proc->jtagtap_next = cmsis_dap_jtagtap_next; jtag_proc->jtagtap_next = cmsis_dap_jtagtap_next;
jtag_proc->jtagtap_tms_seq = cmsis_dap_jtagtap_tms_seq; jtag_proc->jtagtap_tms_seq = cmsis_dap_jtagtap_tms_seq;

View File

@ -29,6 +29,7 @@ void dap_exit_function(void);
void dap_adiv5_dp_defaults(ADIv5_DP_t *dp); void dap_adiv5_dp_defaults(ADIv5_DP_t *dp);
int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc); int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc);
int dap_jtag_dp_init(ADIv5_DP_t *dp); int dap_jtag_dp_init(ADIv5_DP_t *dp);
uint32_t dap_swj_clock(uint32_t clock);
#else #else
int dap_init(bmp_info_t *info) int dap_init(bmp_info_t *info)
{ {
@ -36,19 +37,15 @@ int dap_init(bmp_info_t *info)
(void)info; (void)info;
return -1; return -1;
} }
int dap_enter_debug_swd(ADIv5_DP_t *dp) {(void)dp; return -1;} # pragma GCC diagnostic push
void dap_exit_function(void) {return;}; # pragma GCC diagnostic ignored "-Wunused-parameter"
void dap_adiv5_dp_defaults(ADIv5_DP_t *dp) {(void)dp; return; } int dap_enter_debug_swd(ADIv5_DP_t *dp) {return -1;}
int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc) uint32_t dap_swj_clock(uint32_t clock) {return 0;}
{ void dap_exit_function(void) {};
(void)jtag_proc; void dap_adiv5_dp_defaults(ADIv5_DP_t *dp) {};
return -1; int cmsis_dap_jtagtap_init(jtag_proc_t *jtag_proc) {return -1;}
} int dap_jtag_dp_init(ADIv5_DP_t *dp) {return -1;}
int dap_jtag_dp_init(ADIv5_DP_t *dp) # pragma GCC diagnostic pop
{
(void)dp;
return -1;
}
#endif #endif

View File

@ -203,18 +203,27 @@ void dap_disconnect(void)
dbg_dap_cmd(buf, sizeof(buf), 1); dbg_dap_cmd(buf, sizeof(buf), 1);
} }
//----------------------------------------------------------------------------- static uint32_t swj_clock;
void dap_swj_clock(uint32_t 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]; uint8_t buf[5];
buf[0] = ID_DAP_SWJ_CLOCK; buf[0] = ID_DAP_SWJ_CLOCK;
buf[1] = clock & 0xff; buf[1] = clock & 0xff;
buf[2] = (clock >> 8) & 0xff; buf[2] = (clock >> 8) & 0xff;
buf[3] = (clock >> 16) & 0xff; buf[3] = (clock >> 16) & 0xff;
buf[4] = (clock >> 24) & 0xff; buf[4] = (clock >> 24) & 0xff;
dbg_dap_cmd(buf, sizeof(buf), 5); dbg_dap_cmd(buf, sizeof(buf), 5);
if (buf[0])
DEBUG_WARN("dap_swj_clock failed\n");
else
swj_clock = clock;
return swj_clock;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -65,7 +65,6 @@ enum
void dap_led(int index, int state); void dap_led(int index, int state);
void dap_connect(bool jtag); void dap_connect(bool jtag);
void dap_disconnect(void); 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_transfer_configure(uint8_t idle, uint16_t count, uint16_t retry);
void dap_swd_configure(uint8_t cfg); void dap_swd_configure(uint8_t cfg);
int dap_info(int info, uint8_t *data, int size); int dap_info(int info, uint8_t *data, int size);

View File

@ -328,6 +328,9 @@ void platform_max_frequency_set(uint32_t freq)
case BMP_TYPE_BMP: case BMP_TYPE_BMP:
remote_max_frequency_set(freq); remote_max_frequency_set(freq);
break; break;
case BMP_TYPE_CMSIS_DAP:
dap_swj_clock(freq);
break;
default: default:
DEBUG_WARN("Setting max SWJ frequency not yet implemented\n"); DEBUG_WARN("Setting max SWJ frequency not yet implemented\n");
break; break;
@ -339,6 +342,9 @@ uint32_t platform_max_frequency_get(void)
switch (info.bmp_type) { switch (info.bmp_type) {
case BMP_TYPE_BMP: case BMP_TYPE_BMP:
return remote_max_frequency_get(); return remote_max_frequency_get();
case BMP_TYPE_CMSIS_DAP:
return dap_swj_clock(0);
break;
default: default:
DEBUG_WARN("Reading max SWJ frequency not yet implemented\n"); DEBUG_WARN("Reading max SWJ frequency not yet implemented\n");
break; break;

View File

@ -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"); DEBUG_WARN("Ignoring filename in reset/test mode\n");
opt->opt_flash_file = NULL; 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) static void display_target(int i, target *t, void *context)