diff --git a/src/st-info/info.c b/src/st-info/info.c index 1bc48a0..12bab28 100644 --- a/src/st-info/info.c +++ b/src/st-info/info.c @@ -5,16 +5,21 @@ #include +const char * knownFreqs ="5k 15k 25k 50k 100k 125k 240k 480k 950k 1200k 1.2M 1800k 1.8M 4000k 4M"; +unsigned int myFrequencyInkHz = 100u; // Default clock speed. + static void usage(void) { puts("st-info --version"); puts("st-info --probe"); puts("st-info --serial"); puts("st-info --hla-serial"); - puts("st-info --flash [--connect-under-reset]"); - puts("st-info --pagesize [--connect-under-reset]"); - puts("st-info --sram [--connect-under-reset]"); - puts("st-info --chipid [--connect-under-reset]"); - puts("st-info --descr [--connect-under-reset]"); + puts("st-info --flash [--freq nn] [--connect-under-reset]"); + puts("st-info --pagesize [--freq nn] [--connect-under-reset]"); + puts("st-info --sram [--freq nn] [--connect-under-reset]"); + puts("st-info --chipid [--freq nn] [--connect-under-reset]"); + puts("st-info --descr [--freq nn] [--connect-under-reset]"); + fprintf(stdout, "Valid clock frequency selections: %s\n", knownFreqs); + } /* Print normal or OpenOCD hla_serial with newline */ @@ -80,15 +85,24 @@ static stlink_t *stlink_open_first(bool under_reset) { if (sl == NULL) { if (under_reset) { - sl = stlink_open_usb(0, 2, NULL, 0); + sl = stlink_open_usb(0, 2, NULL, myFrequencyInkHz); } else { - sl = stlink_open_usb(0, 1, NULL, 0); + sl = stlink_open_usb(0, 1, NULL, myFrequencyInkHz); } } return(sl); } +static bool starts_with(const char * str, const char * prefix) { + size_t n = strlen(prefix); + + if (strlen(str) < n) { + return(false); + } + return (0 == strncmp(str, prefix, n)); +} + static int print_data(int ac, char **av) { stlink_t* sl = NULL; bool under_reset = false; @@ -102,19 +116,89 @@ static int print_data(int ac, char **av) { return(0); } - if (ac == 3) { - if (strcmp(av[2], "--connect-under-reset") == 0) { + int extra = 2; + bool searchForOpts = false; + if (ac >= 3) searchForOpts = true; + for (;searchForOpts;) { + bool unknownOpt = true; + if (strcmp(av[extra], "--connect-under-reset") == 0) { under_reset = true; - } else { - usage(); - return(-1); + unknownOpt = false; + } + else if (strcmp(av[extra], "--freq") == 0 || starts_with(av[extra], "--freq=")) { + const char* freq; + + if (strcmp(av[extra], "--freq") == 0) { +// ac--; +// av++; + extra++; + + if (extra > ac) { // No more arguments on the command line. + fprintf(stderr, "No valid frequency number given as argument!\n"); + return(-1); + } + freq = av[extra]; + } else { + freq = av[extra] + strlen("--freq="); // Advance pointer throug char array. +// printf("String %s\n", freq); + } + // Check for digits followed by a valid postfix. + if (strcmp(freq, "5k") == 0) { + myFrequencyInkHz = 5u; + unknownOpt = false; + } else if (strcmp(freq, "15k") == 0) { + myFrequencyInkHz = 15u; + unknownOpt = false; + } else if (strcmp(freq, "25k") == 0) { + myFrequencyInkHz = 25u; + unknownOpt = false; + } else if (strcmp(freq, "50k") == 0) { + myFrequencyInkHz = 50u; + unknownOpt = false; + } else if (strcmp(freq, "100k") == 0) { + myFrequencyInkHz = 100u; + unknownOpt = false; + } else if (strcmp(freq, "125k") == 0) { + myFrequencyInkHz = 125u; + unknownOpt = false; + } else if (strcmp(freq, "240k") == 0) { + myFrequencyInkHz = 240u; + unknownOpt = false; + } else if (strcmp(freq, "480k") == 0) { + myFrequencyInkHz = 480u; + unknownOpt = false; + } else if (strcmp(freq, "950k") == 0) { + myFrequencyInkHz = 950u; + unknownOpt = false; + } else if ((strcmp(freq, "1200k") == 0) || (strcmp(freq, "1.2M") == 0)) { + myFrequencyInkHz = 1200u; + unknownOpt = false; + } else if ((strcmp(freq, "1800k") == 0 ) || (strcmp(freq, "1.8M") == 0 )) { + myFrequencyInkHz = 1800u; + unknownOpt = false; + } else if ((strcmp(freq, "4000k") == 0) || (strcmp(freq, "4M") == 0 )) { + myFrequencyInkHz = 4000u; + unknownOpt = false; + } else { + fprintf(stderr, "No valid frequency found!\nValid frequencies: %s\n", knownFreqs); + return(-1); + } } + if ( unknownOpt ) { + fprintf(stderr, "Unknown option! %s\nValid options:\n", av[extra]); + usage(); + return(-1); + } + extra++; + if (extra >= ac) searchForOpts = false; } - + fprintf(stdout, "Using clock %u kHz.\n", myFrequencyInkHz); sl = stlink_open_first(under_reset); - if (sl == NULL) { return(-1); } - + if (sl == NULL) { + fprintf(stderr, "Could not open programmer interface!"); + return(-1); + } sl->verbose = 0; if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) { stlink_exit_dfu_mode(sl); }