diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index c2db331d2..fc89d2489 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -234,6 +234,7 @@ int jtag_cancel_queue(void); /* jtag commands */ int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); @@ -1409,6 +1410,8 @@ int jtag_register_commands(struct command_context_s *cmd_ctx) COMMAND_CONFIG, NULL); register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command, COMMAND_ANY, "set jtag speed (if supported) []"); + register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command, + COMMAND_ANY, "same as jtag_speed, except it takes khz as arguments"); register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command, COMMAND_CONFIG, "jtag_device "); register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command, @@ -1499,6 +1502,12 @@ int jtag_init(struct command_context_s *cmd_ctx) } +static int default_khz(int khz, int *jtag_speed) +{ + ERROR("Translation from khz to jtag_speed not implemented"); + return ERROR_FAIL; +} + int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int i; @@ -1524,6 +1533,11 @@ int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char exit(-1); jtag_interface = jtag_interfaces[i]; + + if (jtag_interface->khz == NULL) + { + jtag_interface->khz = default_khz; + } return ERROR_OK; } } @@ -1713,6 +1727,42 @@ int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } +int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + int cur_speed = 0; + int speed1, speed2; + if ((argc<1) || (argc>2)) + return ERROR_COMMAND_SYNTAX_ERROR; + + if (jtag == NULL) + { + ERROR("Interface not selected yet"); + return ERROR_COMMAND_SYNTAX_ERROR; + } + + if (argc >= 1) + speed1 = strtoul(args[0], NULL, 0); + if (argc == 2) + speed2 = strtoul(args[1], NULL, 0); + + if (jtag->khz(speed1, &speed1)!=ERROR_OK) + return ERROR_OK; + + if (jtag->khz(speed2, &speed2)!=ERROR_OK) + return ERROR_OK; + + if (argc >= 1) + cur_speed = jtag_speed = jtag_speed_post_reset = speed1; + + if (argc == 2) + cur_speed = jtag_speed_post_reset = speed2; + + jtag->speed(cur_speed); + + return ERROR_OK; +} + + int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { enum tap_state state; diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 0e9a9302e..16eb84dd0 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -195,6 +195,8 @@ typedef struct jtag_interface_s int (*register_commands)(struct command_context_s *cmd_ctx); int (*init)(void); int (*quit)(void); + /* returns JTAG speed for KHz. */ + int (*khz)(int khz, int *jtag_speed); } jtag_interface_t;