diff --git a/doc/openocd.texi b/doc/openocd.texi index 5733aa27b..3134afdef 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -2671,6 +2671,26 @@ which are not currently documented here. @deffn {Interface Driver} {stlink} ST Micro ST-LINK adapter. + +@deffn {Config Command} {stlink_device_desc} description +Currently Not Supported. +@end deffn + +@deffn {Config Command} {stlink_serial} serial +Currently Not Supported. +@end deffn + +@deffn {Config Command} {stlink_layout} (@option{sg}|@option{usb}) +Specifies the stlink layout to use. +@end deffn + +@deffn {Config Command} {stlink_vid_pid} vid pid +The vendor ID and product ID of the STLINK device. +@end deffn + +@deffn {Config Command} {stlink_api} api_level +Manually sets the stlink api used, valid options are 1 or 2. +@end deffn @end deffn @deffn {Interface Driver} {ZY1000} diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c index 1de42efb9..b4944f56c 100644 --- a/src/jtag/drivers/stlink_usb.c +++ b/src/jtag/drivers/stlink_usb.c @@ -48,7 +48,7 @@ #define STLINK_CMD_SIZE_V1 (10) enum stlink_jtag_api_version { - STLINK_JTAG_API_V1 = 0, + STLINK_JTAG_API_V1 = 1, STLINK_JTAG_API_V2, }; @@ -1132,6 +1132,7 @@ static int stlink_usb_open(struct stlink_interface_param_s *param, void **fd) { int err; struct stlink_usb_handle_s *h; + enum stlink_jtag_api_version api; LOG_DEBUG("stlink_usb_open"); @@ -1213,8 +1214,17 @@ static int stlink_usb_open(struct stlink_interface_param_s *param, void **fd) return err; } + api = h->version.jtag_api_max; + + /* check that user has not requested certain api version + * and if they have check it is supported */ + if ((param->api != 0) && (param->api <= h->version.jtag_api_max)) { + api = param->api; + LOG_INFO("using stlink api v%d", api); + } + /* set the used jtag api, this will default to the newest supported version */ - h->jtag_api = h->version.jtag_api_max; + h->jtag_api = api; /* initialize the debug hardware */ err = stlink_usb_init_mode(h); diff --git a/src/jtag/stlink/stlink_interface.c b/src/jtag/stlink/stlink_interface.c index 389ab3fff..379e68d46 100644 --- a/src/jtag/stlink/stlink_interface.c +++ b/src/jtag/stlink/stlink_interface.c @@ -34,7 +34,7 @@ #include -static struct stlink_interface_s stlink_if = { {0, 0, 0, 0, 0}, 0, 0 }; +static struct stlink_interface_s stlink_if = { {0, 0, 0, 0, 0, 0}, 0, 0 }; int stlink_interface_open(enum stlink_transports tr) { @@ -200,6 +200,21 @@ COMMAND_HANDLER(stlink_interface_handle_vid_pid_command) return ERROR_OK; } +COMMAND_HANDLER(stlink_interface_handle_api_command) +{ + if (CMD_ARGC != 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + unsigned new_api; + COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], new_api); + if ((new_api == 0) || (new_api > 2)) + return ERROR_COMMAND_SYNTAX_ERROR; + + stlink_if.param.api = new_api; + + return ERROR_OK; +} + static const struct command_registration stlink_interface_command_handlers[] = { { .name = "stlink_device_desc", @@ -229,6 +244,13 @@ static const struct command_registration stlink_interface_command_handlers[] = { .help = "the vendor and product ID of the STLINK device", .usage = "(vid pid)* ", }, + { + .name = "stlink_api", + .handler = &stlink_interface_handle_api_command, + .mode = COMMAND_CONFIG, + .help = "set the desired stlink api level", + .usage = "api version 1 or 2", + }, COMMAND_REGISTRATION_DONE }; diff --git a/src/jtag/stlink/stlink_interface.h b/src/jtag/stlink/stlink_interface.h index 4b6949e42..ee2fefff1 100644 --- a/src/jtag/stlink/stlink_interface.h +++ b/src/jtag/stlink/stlink_interface.h @@ -38,6 +38,8 @@ struct stlink_interface_param_s { /** */ uint16_t pid; /** */ + unsigned api; + /** */ enum stlink_transports transport; };