*/
#include <getopt.h>
+#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#ifdef __MINGW32__
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
-#include <signal.h>
#endif
#include <stlink-common.h>
typedef struct _st_state_t {
// things from command line, bleh
int stlink_version;
- // "/dev/serial/by-id/usb-FTDI_TTL232R-3V3_FTE531X6-if00-port0" is only 58 chars
- char devicename[100];
int logging_level;
- int listen_port;
+ int listen_port;
int persistent;
int reset;
} st_state_t;
int serve(stlink_t *sl, st_state_t *st);
char* make_memory_map(stlink_t *sl);
-#ifndef __MINGW32__
static void cleanup(int signal __attribute__((unused))) {
if (connected_stlink) {
/* Switch back to mass storage mode before closing. */
exit(1);
}
-#endif
static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"verbose", optional_argument, NULL, 'v'},
- {"device", required_argument, NULL, 'd'},
{"stlink_version", required_argument, NULL, 's'},
{"stlinkv1", no_argument, NULL, '1'},
{"listen_port", required_argument, NULL, 'p'},
};
const char * help_str = "%s - usage:\n\n"
" -h, --help\t\tPrint this help\n"
- " -vXX, --verbose=XX\tspecify a specific verbosity level (0..99)\n"
- " -v, --verbose\tspecify generally verbose logging\n"
- " -d <device>, --device=/dev/stlink2_1\n"
- "\t\t\tWhere is your stlink device connected?\n"
+ " -vXX, --verbose=XX\tSpecify a specific verbosity level (0..99)\n"
+ " -v, --verbose\t\tSpecify generally verbose logging\n"
" -s X, --stlink_version=X\n"
"\t\t\tChoose what version of stlink to use, (defaults to 2)\n"
" -1, --stlinkv1\tForce stlink version 1\n"
"\t\t\tst-util will continue listening for connections after disconnect.\n"
" -n, --no-reset\n"
"\t\t\tDo not reset board on connection.\n"
+ "\n"
+ "The STLINKv2 device to use can be specified in the environment\n"
+ "variable STLINK_DEVICE on the format <USB_BUS>:<USB_ADDR>.\n"
+ "\n"
;
int option_index = 0;
int c;
int q;
- while ((c = getopt_long(argc, argv, "hv::d:s:1p:mn", long_options, &option_index)) != -1) {
+ while ((c = getopt_long(argc, argv, "hv::s:1p:mn", long_options, &option_index)) != -1) {
switch (c) {
case 0:
printf("XXXXX Shouldn't really normally come here, only if there's no corresponding option\n");
} else {
st->logging_level = DEFAULT_LOGGING_LEVEL;
}
- break;
- case 'd':
- if (strlen(optarg) > sizeof (st->devicename)) {
- fprintf(stderr, "device name too long: %zd\n", strlen(optarg));
- } else {
- strcpy(st->devicename, optarg);
- }
break;
case '1':
st->stlink_version = 1;
int main(int argc, char** argv) {
- uint32_t voltage;
+ int32_t voltage;
stlink_t *sl = NULL;
}
connected_stlink = sl;
-#ifndef __MINGW32__
signal(SIGINT, &cleanup);
signal(SIGTERM, &cleanup);
-#endif
if (state.reset) {
stlink_reset(sl);
}
#define CODE_BREAK_NUM 6
+#define CODE_LIT_NUM 2
#define CODE_BREAK_LOW 0x01
#define CODE_BREAK_HIGH 0x02
static void init_code_breakpoints(stlink_t *sl) {
memset(sl->q_buf, 0, 4);
stlink_write_debug32(sl, CM3_REG_FP_CTRL, 0x03 /*KEY | ENABLE4*/);
- printf("KARL - should read back as 0x03, not 60 02 00 00\n");
- stlink_read_debug32(sl, CM3_REG_FP_CTRL);
+ unsigned int val = stlink_read_debug32(sl, CM3_REG_FP_CTRL);
+ if (((val & 3) != 1) ||
+ ((((val >> 8) & 0x70) | ((val >> 4) & 0xf)) != CODE_BREAK_NUM) ||
+ (((val >> 8) & 0xf) != CODE_LIT_NUM)){
+ fprintf(stderr, "[FP_CTRL] = 0x%08x expecting 0x%08x\n", val,
+ ((CODE_BREAK_NUM & 0x70) << 8) | (CODE_LIT_NUM << 8) | ((CODE_BREAK_NUM & 0xf) << 4) | 1);
+ }
+
for(int i = 0; i < CODE_BREAK_NUM; i++) {
code_breaks[i].type = 0;