hosted: Run target specific monitor commands with -M "command" .
Lists available commands: "blackmagic -M help" Quote multi argument monitor commands, e.g. STM32F1: blackmagic -M "option help"
This commit is contained in:
parent
165560edd8
commit
8e2f6937d5
|
@ -3,6 +3,8 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 Black Sphere Technologies Ltd.
|
* Copyright (C) 2011 Black Sphere Technologies Ltd.
|
||||||
* Written by Gareth McMullin <gareth@blacksphere.co.nz>
|
* Written by Gareth McMullin <gareth@blacksphere.co.nz>
|
||||||
|
* Copyright (C) 2021 Uwe Bonnes
|
||||||
|
* (bon@elektron.ikp.physik.tu-darmstadt.de)
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -27,6 +29,7 @@
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "gdb_packet.h"
|
#include "gdb_packet.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
|
#include "target_internal.h"
|
||||||
#include "morse.h"
|
#include "morse.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "serialno.h"
|
#include "serialno.h"
|
||||||
|
@ -37,13 +40,6 @@
|
||||||
|
|
||||||
typedef bool (*cmd_handler)(target *t, int argc, const char **argv);
|
typedef bool (*cmd_handler)(target *t, int argc, const char **argv);
|
||||||
|
|
||||||
struct command_s {
|
|
||||||
const char *cmd;
|
|
||||||
cmd_handler handler;
|
|
||||||
|
|
||||||
const char *help;
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool cmd_version(target *t, int argc, char **argv);
|
static bool cmd_version(target *t, int argc, char **argv);
|
||||||
static bool cmd_help(target *t, int argc, char **argv);
|
static bool cmd_help(target *t, int argc, char **argv);
|
||||||
|
|
||||||
|
@ -161,10 +157,11 @@ bool cmd_help(target *t, int argc, char **argv)
|
||||||
(void)argv;
|
(void)argv;
|
||||||
const struct command_s *c;
|
const struct command_s *c;
|
||||||
|
|
||||||
gdb_out("General commands:\n");
|
if (!t || t->tc->destroy_callback) {
|
||||||
for(c = cmd_list; c->cmd; c++)
|
gdb_out("General commands:\n");
|
||||||
gdb_outf("\t%s -- %s\n", c->cmd, c->help);
|
for(c = cmd_list; c->cmd; c++)
|
||||||
|
gdb_outf("\t%s -- %s\n", c->cmd, c->help);
|
||||||
|
}
|
||||||
if (!t)
|
if (!t)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,19 @@ blackmagic -V <file>.bin
|
||||||
```
|
```
|
||||||
### Show more options
|
### Show more options
|
||||||
```
|
```
|
||||||
blackmagic -h"
|
blackmagic -h
|
||||||
|
```
|
||||||
|
### Show available monitor commands
|
||||||
|
```
|
||||||
|
blackmagic -M help
|
||||||
|
```
|
||||||
|
### Show available monitor commands on second target
|
||||||
|
```
|
||||||
|
blackmagic -n 2 -M help
|
||||||
|
```
|
||||||
|
### Monitor commands with multiple arguments, e.g.Stm32F1:
|
||||||
|
```
|
||||||
|
blackmagic -M "option help"
|
||||||
```
|
```
|
||||||
## Used shared libraries:
|
## Used shared libraries:
|
||||||
### libusb
|
### libusb
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
#include "target_internal.h"
|
#include "target_internal.h"
|
||||||
#include "cortexm.h"
|
#include "cortexm.h"
|
||||||
|
#include "command.h"
|
||||||
|
|
||||||
#include "cl_utils.h"
|
#include "cl_utils.h"
|
||||||
#include "bmp_hosted.h"
|
#include "bmp_hosted.h"
|
||||||
|
@ -45,6 +46,18 @@
|
||||||
# include <sys/mman.h>
|
# include <sys/mman.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void cl_target_printf(struct target_controller *tc,
|
||||||
|
const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
(void)tc;
|
||||||
|
|
||||||
|
vprintf(fmt, ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct target_controller cl_controller = {
|
||||||
|
.printf = cl_target_printf,
|
||||||
|
};
|
||||||
|
|
||||||
struct mmap_data {
|
struct mmap_data {
|
||||||
void *data;
|
void *data;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
@ -152,6 +165,8 @@ static void cl_help(char **argv)
|
||||||
DEBUG_WARN("\t-p\t\t: Supplies power to the target (where applicable)\n");
|
DEBUG_WARN("\t-p\t\t: Supplies power to the target (where applicable)\n");
|
||||||
DEBUG_WARN("\t-R\t\t: Reset device\n");
|
DEBUG_WARN("\t-R\t\t: Reset device\n");
|
||||||
DEBUG_WARN("\t-H\t\t: Do not use high level commands (BMP-Remote)\n");
|
DEBUG_WARN("\t-H\t\t: Do not use high level commands (BMP-Remote)\n");
|
||||||
|
DEBUG_WARN("\t-M <string>\t: Run target specific monitor commands. Quote multi\n");
|
||||||
|
DEBUG_WARN("\t\t\t word strings. Run \"-M help\" for help.\n");
|
||||||
DEBUG_WARN("Flash operation modifiers options:\n");
|
DEBUG_WARN("Flash operation modifiers options:\n");
|
||||||
DEBUG_WARN("\tDefault action with given file is to write to flash\n");
|
DEBUG_WARN("\tDefault action with given file is to write to flash\n");
|
||||||
DEBUG_WARN("\t-a <addr>\t: Start flash operation at flash address <addr>\n"
|
DEBUG_WARN("\t-a <addr>\t: Start flash operation at flash address <addr>\n"
|
||||||
|
@ -168,7 +183,7 @@ void cl_init(BMP_CL_OPTIONS_t *opt, int argc, char **argv)
|
||||||
opt->opt_flash_size = 16 * 1024 *1024;
|
opt->opt_flash_size = 16 * 1024 *1024;
|
||||||
opt->opt_flash_start = 0xffffffff;
|
opt->opt_flash_start = 0xffffffff;
|
||||||
opt->opt_max_swj_frequency = 4000000;
|
opt->opt_max_swj_frequency = 4000000;
|
||||||
while((c = getopt(argc, argv, "eEhHv:d:f:s:I:c:Cln:tVtTa:S:jpP:rR")) != -1) {
|
while((c = getopt(argc, argv, "eEhHv:d:f:s:I:c:Cln:M:tVtTa:S:jpP:rR")) != -1) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'c':
|
case 'c':
|
||||||
if (optarg)
|
if (optarg)
|
||||||
|
@ -255,6 +270,11 @@ void cl_init(BMP_CL_OPTIONS_t *opt, int argc, char **argv)
|
||||||
if (optarg)
|
if (optarg)
|
||||||
opt->opt_target_dev = strtol(optarg, NULL, 0);
|
opt->opt_target_dev = strtol(optarg, NULL, 0);
|
||||||
break;
|
break;
|
||||||
|
case 'M':
|
||||||
|
opt->opt_mode = BMP_MODE_MONITOR;
|
||||||
|
if (optarg)
|
||||||
|
opt->opt_monitor = optarg;
|
||||||
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
if (optarg)
|
if (optarg)
|
||||||
opt->opt_position = atoi(optarg);
|
opt->opt_position = atoi(optarg);
|
||||||
|
@ -340,7 +360,8 @@ int cl_execute(BMP_CL_OPTIONS_t *opt)
|
||||||
opt->opt_target_dev, num_targets);
|
opt->opt_target_dev, num_targets);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
target *t = target_attach_n(opt->opt_target_dev, NULL);
|
target *t = target_attach_n(opt->opt_target_dev, &cl_controller);
|
||||||
|
|
||||||
if (!t) {
|
if (!t) {
|
||||||
DEBUG_WARN("Can not attach to target %d\n", opt->opt_target_dev);
|
DEBUG_WARN("Can not attach to target %d\n", opt->opt_target_dev);
|
||||||
goto target_detach;
|
goto target_detach;
|
||||||
|
@ -403,6 +424,8 @@ int cl_execute(BMP_CL_OPTIONS_t *opt)
|
||||||
default:
|
default:
|
||||||
DEBUG_WARN("No test for this core type yet\n");
|
DEBUG_WARN("No test for this core type yet\n");
|
||||||
}
|
}
|
||||||
|
} else if (opt->opt_mode == BMP_MODE_MONITOR) {
|
||||||
|
command_process(t, opt->opt_monitor);
|
||||||
}
|
}
|
||||||
if ((opt->opt_mode == BMP_MODE_TEST) ||
|
if ((opt->opt_mode == BMP_MODE_TEST) ||
|
||||||
(opt->opt_mode == BMP_MODE_SWJ_TEST))
|
(opt->opt_mode == BMP_MODE_SWJ_TEST))
|
||||||
|
@ -525,8 +548,11 @@ int cl_execute(BMP_CL_OPTIONS_t *opt)
|
||||||
uint32_t end_time = platform_time_ms();
|
uint32_t end_time = platform_time_ms();
|
||||||
if (read_file != -1)
|
if (read_file != -1)
|
||||||
close(read_file);
|
close(read_file);
|
||||||
DEBUG_WARN("Read/Verify succeeded for %d bytes, %8.3f kiB/s\n",
|
if ((opt->opt_mode == BMP_MODE_FLASH_VERIFY) ||
|
||||||
bytes_read, (((bytes_read * 1.0)/(end_time - start_time))));
|
(opt->opt_mode == BMP_MODE_FLASH_READ))
|
||||||
|
DEBUG_WARN("Read/Verify succeeded for %d bytes, %8.3f kiB/s\n",
|
||||||
|
bytes_read,
|
||||||
|
(((bytes_read * 1.0)/(end_time - start_time))));
|
||||||
}
|
}
|
||||||
free_map:
|
free_map:
|
||||||
if (map.size)
|
if (map.size)
|
||||||
|
|
|
@ -35,6 +35,7 @@ enum bmp_cl_mode {
|
||||||
BMP_MODE_FLASH_READ,
|
BMP_MODE_FLASH_READ,
|
||||||
BMP_MODE_FLASH_VERIFY,
|
BMP_MODE_FLASH_VERIFY,
|
||||||
BMP_MODE_SWJ_TEST,
|
BMP_MODE_SWJ_TEST,
|
||||||
|
BMP_MODE_MONITOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct BMP_CL_OPTIONS_s {
|
typedef struct BMP_CL_OPTIONS_s {
|
||||||
|
@ -51,6 +52,7 @@ typedef struct BMP_CL_OPTIONS_s {
|
||||||
char *opt_ident_string;
|
char *opt_ident_string;
|
||||||
int opt_position;
|
int opt_position;
|
||||||
char *opt_cable;
|
char *opt_cable;
|
||||||
|
char *opt_monitor;
|
||||||
int opt_debuglevel;
|
int opt_debuglevel;
|
||||||
int opt_target_dev;
|
int opt_target_dev;
|
||||||
uint32_t opt_flash_start;
|
uint32_t opt_flash_start;
|
||||||
|
|
|
@ -100,7 +100,7 @@ void target_list_free(void)
|
||||||
|
|
||||||
while(target_list) {
|
while(target_list) {
|
||||||
target *t = target_list->next;
|
target *t = target_list->next;
|
||||||
if (target_list->tc)
|
if (target_list->tc && target_list->tc->destroy_callback)
|
||||||
target_list->tc->destroy_callback(target_list->tc, target_list);
|
target_list->tc->destroy_callback(target_list->tc, target_list);
|
||||||
if (target_list->priv)
|
if (target_list->priv)
|
||||||
target_list->priv_free(target_list->priv);
|
target_list->priv_free(target_list->priv);
|
||||||
|
|
Loading…
Reference in New Issue