Include signal.h to define SIGINT
[fw/stlink] / gdbserver / gdb-server.c
index a6de1b20d2db8f68fc6f2891e2b5e1f338ce809e..a3ed335ad1d42a161bdf9dd9b9ec3b3d976822d7 100644 (file)
@@ -7,9 +7,11 @@
 */
 
 #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__
@@ -18,7 +20,6 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <signal.h>
 #endif
 
 #include <stlink-common.h>
@@ -45,10 +46,8 @@ static const char* current_memory_map = NULL;
 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;
@@ -57,7 +56,6 @@ typedef struct _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. */
@@ -68,7 +66,6 @@ static void cleanup(int signal __attribute__((unused))) {
 
     exit(1);
 }
-#endif
 
 
 
@@ -76,7 +73,6 @@ int parse_options(int argc, char** argv, st_state_t *st) {
     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'},
@@ -86,10 +82,8 @@ int parse_options(int argc, char** argv, st_state_t *st) {
     };
        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"
@@ -101,13 +95,17 @@ int parse_options(int argc, char** argv, st_state_t *st) {
     "\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");
@@ -127,13 +125,6 @@ int parse_options(int argc, char** argv, st_state_t *st) {
             } 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;
@@ -174,7 +165,7 @@ int parse_options(int argc, char** argv, st_state_t *st) {
 
 
 int main(int argc, char** argv) {
-       uint32_t voltage;
+       int32_t voltage;
 
        stlink_t *sl = NULL;
 
@@ -198,10 +189,8 @@ int main(int argc, char** argv) {
     }
 
     connected_stlink = sl;
-#ifndef __MINGW32__
     signal(SIGINT, &cleanup);
     signal(SIGTERM, &cleanup);
-#endif
 
     if (state.reset) {
                stlink_reset(sl);
@@ -484,6 +473,7 @@ static int delete_data_watchpoint(stlink_t *sl, stm32_addr_t addr)
 }
 
 #define CODE_BREAK_NUM 6
+#define CODE_LIT_NUM   2
 #define CODE_BREAK_LOW 0x01
 #define CODE_BREAK_HIGH        0x02
 
@@ -497,8 +487,14 @@ struct code_hw_breakpoint code_breaks[CODE_BREAK_NUM];
 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;