#include <target/target.h>
-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)
{
/* set transport mode */
stlink_if.param.transport = tr;
- return stlink_if.layout->open(&stlink_if);
+ int result = stlink_if.layout->open(&stlink_if);
+ if (result != ERROR_OK)
+ return result;
+
+ return stlink_interface_init_reset();
}
int stlink_interface_init_target(struct target *t)
for (ii = 0; ii < limit; ii++) {
uint32_t expected = t->tap->expected_ids[ii];
- if (t->tap->idcode == expected) {
+ /* treat "-expected-id 0" as a "don't-warn" wildcard */
+ if (!expected || (t->tap->idcode == expected)) {
found = 1;
break;
}
}
if (found == 0) {
- LOG_ERROR
- ("stlink_interface_init_target: target not found: idcode: %x ",
- t->tap->idcode);
+ LOG_ERROR("stlink_interface_init_target: target not found: idcode: 0x%08x",
+ t->tap->idcode);
return ERROR_FAIL;
}
return ERROR_OK;
}
+int stlink_interface_init_reset(void)
+{
+ enum reset_types jtag_reset_config = jtag_get_reset_config();
+
+ if (jtag_reset_config & RESET_CNCT_UNDER_SRST) {
+ if (jtag_reset_config & RESET_SRST_NO_GATING) {
+ jtag_add_reset(0, 1);
+ stlink_if.layout->api->assert_srst(stlink_if.fd, 0);
+ } else
+ LOG_WARNING("\'srst_nogate\' reset_config option is required");
+ }
+
+ return ERROR_OK;
+}
+
COMMAND_HANDLER(stlink_interface_handle_device_desc_command)
{
LOG_DEBUG("stlink_interface_handle_device_desc_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",
.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
};