From c85c172c6313fbc646b1ad96189a0f03121a2370 Mon Sep 17 00:00:00 2001 From: Dmitry Bravikov Date: Sun, 6 Nov 2011 23:26:12 +0600 Subject: [PATCH] Parsing the arguments of command line --- Makefile | 2 +- gdbserver/Makefile | 2 +- gdbserver/gdb-server.c | 170 ++++++++++++++++++++++++----------------- 3 files changed, 102 insertions(+), 72 deletions(-) diff --git a/Makefile b/Makefile index 943302e..d66afb8 100644 --- a/Makefile +++ b/Makefile @@ -66,6 +66,6 @@ flash: $(MAKE) -C flash CONFIG_USE_LIBSG="$(CONFIG_USE_LIBSG)" gdbserver: - $(MAKE) -C gdbserver + $(MAKE) -C gdbserver CONFIG_USE_LIBSG="$(CONFIG_USE_LIBSG)" .PHONY: clean all flash gdbserver diff --git a/gdbserver/Makefile b/gdbserver/Makefile index a10a0d8..85b0ac1 100644 --- a/gdbserver/Makefile +++ b/gdbserver/Makefile @@ -9,6 +9,7 @@ OBJS = gdb-remote.o gdb-server.o CFLAGS+=-g -Wall -Werror -std=gnu99 -I../src CFLAGS+=-DCONFIG_USE_LIBUSB=1 +CFLAGS+=-DCONFIG_USE_LIBSG=$(CONFIG_USE_LIBSG) LDFLAGS=-L.. -lstlink -lusb-1.0 ifeq ($(CONFIG_USE_LIBSG),) @@ -16,7 +17,6 @@ CONFIG_USE_LIBSG=1 endif ifneq ($(CONFIG_USE_LIBSG),0) -CFLAGS+=-DCONFIG_USE_LIBSG=1 LDFLAGS+=-lsgutils2 endif diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index 67f0be0..1254232 100644 --- a/gdbserver/gdb-server.c +++ b/gdbserver/gdb-server.c @@ -83,74 +83,106 @@ char* make_memory_map(const struct chip_params *params, uint32_t flash_size); int main(int argc, char** argv) { stlink_t *sl = NULL; - - const char * HelpStr = "Usage:\n" - "\t st-util port [/dev/sgX]\n" - "\t st-util [port]\n" - "\t st-util --help\n"; - - switch(argc) { - - case 3 : { - //sl = stlink_quirk_open(argv[2], 0); - // FIXME - hardcoded to usb.... - sl = stlink_open_usb(10); - if(sl == NULL) return 1; - break; - } - - case 2 : { - if (strcmp(argv[1], "--help") == 0) { - fprintf(stdout, HelpStr, NULL); - return 1; - } - } - -#if CONFIG_USE_LIBSG - case 1 : { // Search ST-LINK (from /dev/sg0 to /dev/sg99) - const int DevNumMax = 99; - int ExistDevCount = 0; - - for(int DevNum = 0; DevNum <= DevNumMax; DevNum++) - { - if(DevNum < 10) { - char DevName[] = "/dev/sgX"; - const int X_index = 7; - DevName[X_index] = DevNum + '0'; - if ( !access(DevName, F_OK) ) { - sl = stlink_quirk_open(DevName, 0); - ExistDevCount++; - } - } - else if(DevNum < 100) { - char DevName[] = "/dev/sgXY"; - const int X_index = 7; - const int Y_index = 8; - DevName[X_index] = DevNum/10 + '0'; - DevName[Y_index] = DevNum%10 + '0'; - if ( !access(DevName, F_OK) ) { - sl = stlink_quirk_open(DevName, 0); - ExistDevCount++; - } - } - if(sl != NULL) break; - } - - if(sl == NULL) { - fprintf(stdout, "\nNumber of /dev/sgX devices found: %i \n", - ExistDevCount); - fprintf(stderr, "ST-LINK not found\n"); - return 1; - } - break; - } -#endif - - default: { - fprintf(stderr, HelpStr, NULL); - return 1; - } - } + int port = 0; + + const char * HelpStr = "\nUsage:\n" + "\tst-util [Arguments]\n" + "\tArguments (no more than 2):\n" + "\t\t: Port. Default: 4242.\n" + "\t\t{usb|sgauto|/dev/sgX}: Transport, " + "where X = {0, 1, 2, ...}. Default: USB.\n" + "\tExamples:\n" + "\t\tst-util 1234\n" + "\t\tst-util sgauto\n" + "\t\tst-util 1234 usb\n" + "\t\tst-util /dev/sgX 1234\n" + "\t\tst-util 1234 /dev/sgX\n"; + + + // Parsing the arguments of command line ... + + if (argc == 1 || argc > 3) { + fprintf(stderr, HelpStr, NULL); + return 1; + } + + for(int a = 1; a < argc; a++) { + + // Port + int p = atoi(argv[a]); + if (p < 0 || p > 0xFFFF) { + fprintf(stderr, "Invalid port\n"); + fprintf(stderr, HelpStr, NULL); + return 1; + } + if (p > 0 && port == 0) {port = p; continue;} + + // if (p == 0) ... + + // usb + if (!strcmp(argv[a], "usb")) { + if (sl != NULL) return 1; + sl = stlink_open_usb(10); + if(sl == NULL) return 1; + continue; + } + + // /dev/sgX + if (!strncmp(argv[a], "/dev/sgX", 7)) { + if(!CONFIG_USE_LIBSG) { + fprintf(stderr, "libsg not use\n"); + return 1; + } + if (sl != NULL) return 1; + sl = stlink_quirk_open(argv[a], 0); + if(sl == NULL) return 1; + continue; + } + + // sg_auto + if (!strcmp(argv[a], "sgauto")) { + if(!CONFIG_USE_LIBSG) { + fprintf(stderr, "libsg not use\n"); + return 1; + } + + // Search ST-LINK (from /dev/sg0 to /dev/sg99) + for(int DevNum = 0; DevNum <= 99; DevNum++) + { + if(sl != NULL) return 1; + if(DevNum < 10) { + char DevName[] = "/dev/sgX"; + DevName[7] = DevNum + '0'; + if ( !access(DevName, F_OK) ) + sl = stlink_quirk_open(DevName, 0); + } + else { + char DevName[] = "/dev/sgXY"; + DevName[7] = DevNum/10 + '0'; + DevName[8] = DevNum%10 + '0'; + if ( !access(DevName, F_OK) ) + sl = stlink_quirk_open(DevName, 0); + } + + } + + if(sl == NULL) return 1; + continue; + } + + // Invalid argumets + fprintf(stderr, "Invalid argumets\n"); + fprintf(stderr, HelpStr, NULL); + return 1; + } + + // Default transport: USB + if (sl == NULL) sl = stlink_open_usb(10); + // Default port: 4242 + if (port == 0) port = 4242; + + + if (sl == NULL) return 1; if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) { stlink_exit_dfu_mode(sl); @@ -200,8 +232,6 @@ int main(int argc, char** argv) { // memory map is in 1k blocks. current_memory_map = make_memory_map(params, flash_size * 0x400); - int port = 4242; - while(serve(sl, port) == 0); /* Switch back to mass storage mode before closing. */ -- 2.39.5