aboutsummaryrefslogtreecommitdiff
path: root/src/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/command.c')
-rw-r--r--src/command.c114
1 files changed, 85 insertions, 29 deletions
diff --git a/src/command.c b/src/command.c
index 46163fd..8e20960 100644
--- a/src/command.c
+++ b/src/command.c
@@ -22,18 +22,19 @@
* commands.
*/
-#include <stdlib.h>
-#include <string.h>
-
#include "general.h"
-
+#include "exception.h"
#include "command.h"
#include "gdb_packet.h"
-
#include "jtag_scan.h"
#include "target.h"
-
+#include "morse.h"
#include "adiv5.h"
+#include "version.h"
+
+#ifdef PLATFORM_HAS_TRACESWO
+# include "traceswo.h"
+#endif
static bool cmd_version(void);
static bool cmd_help(target *t);
@@ -42,6 +43,10 @@ static bool cmd_jtag_scan(target *t, int argc, char **argv);
static bool cmd_swdp_scan(void);
static bool cmd_targets(target *t);
static bool cmd_morse(void);
+static bool cmd_connect_srst(target *t, int argc, const char **argv);
+#ifdef PLATFORM_HAS_POWER_SWITCH
+static bool cmd_target_power(target *t, int argc, const char **argv);
+#endif
#ifdef PLATFORM_HAS_TRACESWO
static bool cmd_traceswo(void);
#endif
@@ -53,6 +58,10 @@ const struct command_s cmd_list[] = {
{"swdp_scan", (cmd_handler)cmd_swdp_scan, "Scan SW-DP for devices" },
{"targets", (cmd_handler)cmd_targets, "Display list of available targets" },
{"morse", (cmd_handler)cmd_morse, "Display morse error message" },
+ {"connect_srst", (cmd_handler)cmd_connect_srst, "Configure connect under SRST: (enable|disable)" },
+#ifdef PLATFORM_HAS_POWER_SWITCH
+ {"tpwr", (cmd_handler)cmd_target_power, "Supplies power to the target: (enable|disable)"},
+#endif
#ifdef PLATFORM_HAS_TRACESWO
{"traceswo", (cmd_handler)cmd_traceswo, "Start trace capture" },
#endif
@@ -68,19 +77,19 @@ int command_process(target *t, char *cmd)
const char **argv;
/* Initial estimate for argc */
- for(char *s = cmd; *s; s++)
+ for(char *s = cmd; *s; s++)
if((*s == ' ') || (*s == '\t')) argc++;
argv = alloca(sizeof(const char *) * argc);
/* Tokenize cmd to find argv */
- for(argc = 0, argv[argc] = strtok(cmd, " \t");
+ for(argc = 0, argv[argc] = strtok(cmd, " \t");
argv[argc]; argv[++argc] = strtok(NULL, " \t"));
/* Look for match and call handler */
for(c = cmd_list; c->cmd; c++) {
/* Accept a partial match as GDB does.
- * So 'mon ver' will match 'monitor version'
+ * So 'mon ver' will match 'monitor version'
*/
if(!strncmp(argv[0], c->cmd, strlen(argv[0])))
return !c->handler(t, argc, argv);
@@ -90,7 +99,7 @@ int command_process(target *t, char *cmd)
return -1;
for (tc = t->commands; tc; tc = tc->next)
- for(c = tc->cmds; c->cmd; c++)
+ for(c = tc->cmds; c->cmd; c++)
if(!strncmp(argv[0], c->cmd, strlen(argv[0])))
return !c->handler(t, argc, argv);
@@ -99,8 +108,8 @@ int command_process(target *t, char *cmd)
bool cmd_version(void)
{
- gdb_out("Black Magic Probe (Firmware 1.5" VERSION_SUFFIX ", build " BUILDDATE ")\n");
- gdb_out("Copyright (C) 2011 Black Sphere Technologies Ltd.\n");
+ gdb_out("Black Magic Probe (Firmware " FIRMWARE_VERSION ")\n");
+ gdb_out("Copyright (C) 2015 Black Sphere Technologies Ltd.\n");
gdb_out("License GPLv3+: GNU GPL version 3 or later "
"<http://gnu.org/licenses/gpl.html>\n\n");
@@ -113,7 +122,7 @@ bool cmd_help(target *t)
const struct command_s *c;
gdb_out("General commands:\n");
- for(c = cmd_list; c->cmd; c++)
+ for(c = cmd_list; c->cmd; c++)
gdb_outf("\t%s -- %s\n", c->cmd, c->help);
if (!t)
@@ -121,7 +130,7 @@ bool cmd_help(target *t)
for (tc = t->commands; tc; tc = tc->next) {
gdb_outf("%s specific commands:\n", tc->specific_name);
- for(c = tc->cmds; c->cmd; c++)
+ for(c = tc->cmds; c->cmd; c++)
gdb_outf("\t%s -- %s\n", c->cmd, c->help);
}
@@ -131,32 +140,43 @@ bool cmd_help(target *t)
static bool cmd_jtag_scan(target *t, int argc, char **argv)
{
(void)t;
- uint8_t *irlens = NULL;
+ uint8_t irlens[argc];
gdb_outf("Target voltage: %s\n", platform_target_voltage());
if (argc > 1) {
/* Accept a list of IR lengths on command line */
- irlens = alloca(argc);
for (int i = 1; i < argc; i++)
irlens[i-1] = atoi(argv[i]);
irlens[argc-1] = 0;
}
- int devs = jtag_scan(irlens);
+ int devs = -1;
+ volatile struct exception e;
+ TRY_CATCH (e, EXCEPTION_ALL) {
+ devs = jtag_scan(argc > 1 ? irlens : NULL);
+ }
+ switch (e.type) {
+ case EXCEPTION_TIMEOUT:
+ gdb_outf("Timeout during scan. Is target stuck in WFI?\n");
+ break;
+ case EXCEPTION_ERROR:
+ gdb_outf("Exception: %s\n", e.msg);
+ break;
+ }
if(devs < 0) {
gdb_out("JTAG device scan failed!\n");
return false;
- }
+ }
if(devs == 0) {
gdb_out("JTAG scan found no devices!\n");
return false;
- }
+ }
gdb_outf("Device IR Len IDCODE Description\n");
for(int i = 0; i < jtag_dev_count; i++)
- gdb_outf("%d\t%d\t0x%08lX %s\n", i,
- jtag_devs[i].ir_len, jtag_devs[i].idcode,
+ gdb_outf("%d\t%d\t0x%08lX %s\n", i,
+ jtag_devs[i].ir_len, jtag_devs[i].idcode,
jtag_devs[i].descr);
gdb_out("\n");
cmd_targets(NULL);
@@ -167,16 +187,28 @@ bool cmd_swdp_scan(void)
{
gdb_outf("Target voltage: %s\n", platform_target_voltage());
- if(adiv5_swdp_scan() < 0) {
+ int devs = -1;
+ volatile struct exception e;
+ TRY_CATCH (e, EXCEPTION_ALL) {
+ devs = adiv5_swdp_scan();
+ }
+ switch (e.type) {
+ case EXCEPTION_TIMEOUT:
+ gdb_outf("Timeout during scan. Is target stuck in WFI?\n");
+ break;
+ case EXCEPTION_ERROR:
+ gdb_outf("Exception: %s\n", e.msg);
+ break;
+ }
+
+ if(devs < 0) {
gdb_out("SW-DP scan failed!\n");
return false;
- }
-
- //gdb_outf("SW-DP detected IDCODE: 0x%08X\n", adiv5_dp_list->idcode);
+ }
cmd_targets(NULL);
return true;
-
+
}
bool cmd_targets(target *cur_target)
@@ -188,11 +220,11 @@ bool cmd_targets(target *cur_target)
gdb_out("No usable targets found.\n");
return false;
}
-
+
gdb_out("Available Targets:\n");
gdb_out("No. Att Driver\n");
for(t = target_list, i = 1; t; t = t->next, i++)
- gdb_outf("%2d %c %s\n", i, t==cur_target?'*':' ',
+ gdb_outf("%2d %c %s\n", i, t==cur_target?'*':' ',
t->driver);
return true;
@@ -200,11 +232,35 @@ bool cmd_targets(target *cur_target)
bool cmd_morse(void)
{
- if(morse_msg)
+ if(morse_msg)
gdb_outf("%s\n", morse_msg);
return true;
}
+static bool cmd_connect_srst(target *t, int argc, const char **argv)
+{
+ (void)t;
+ if (argc == 1)
+ gdb_outf("Assert SRST during connect: %s\n",
+ connect_assert_srst ? "enabled" : "disabled");
+ else
+ connect_assert_srst = !strcmp(argv[1], "enable");
+ return true;
+}
+
+#ifdef PLATFORM_HAS_POWER_SWITCH
+static bool cmd_target_power(target *t, int argc, const char **argv)
+{
+ (void)t;
+ if (argc == 1)
+ gdb_outf("Target Power: %s\n",
+ platform_target_get_power() ? "enabled" : "disabled");
+ else
+ platform_target_set_power(!strncmp(argv[1], "enable", strlen(argv[1])));
+ return true;
+}
+#endif
+
#ifdef PLATFORM_HAS_TRACESWO
static bool cmd_traceswo(void)
{