Adding framework for st-trace.

pull/1072/head
John Hall 2020-11-25 10:51:20 -08:00
rodzic 8560f931d4
commit 27d3144fce
3 zmienionych plików z 149 dodań i 0 usunięć

1
.gitignore vendored
Wyświetl plik

@ -4,3 +4,4 @@ build-mingw
obj-*
*.user*
.cmake/
*.swp

Wyświetl plik

@ -231,6 +231,7 @@ install(TARGETS ${STLINK_LIB_STATIC} ARCHIVE DESTINATION ${STLINK_LIBRARY_PATH})
set(ST-FLASH_SOURCES src/st-flash/flash.c src/st-flash/flash_opts.c)
set(ST-INFO_SOURCES src/st-info/info.c)
set(ST-UTIL_SOURCES src/st-util/gdb-remote.c src/st-util/gdb-server.c src/st-util/semihosting.c)
set(ST-TRACE_SOURCES src/st-trace/trace.c)
if (MSVC)
# Add getopt to sources
@ -241,20 +242,24 @@ endif ()
add_executable(st-flash ${ST-FLASH_SOURCES})
add_executable(st-info ${ST-INFO_SOURCES})
add_executable(st-util ${ST-UTIL_SOURCES})
add_executable(st-trace ${ST-TRACE_SOURCES})
if (WIN32 OR APPLE)
target_link_libraries(st-flash ${STLINK_LIB_STATIC} ${SSP_LIB})
target_link_libraries(st-info ${STLINK_LIB_STATIC} ${SSP_LIB})
target_link_libraries(st-util ${STLINK_LIB_STATIC} ${SSP_LIB})
target_link_libraries(st-trace ${STLINK_LIB_STATIC} ${SSP_LIB})
else ()
target_link_libraries(st-flash ${STLINK_LIB_SHARED} ${SSP_LIB})
target_link_libraries(st-info ${STLINK_LIB_SHARED} ${SSP_LIB})
target_link_libraries(st-util ${STLINK_LIB_SHARED} ${SSP_LIB})
target_link_libraries(st-trace ${STLINK_LIB_SHARED} ${SSP_LIB})
endif ()
install(TARGETS st-flash DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS st-info DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS st-util DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS st-trace DESTINATION ${CMAKE_INSTALL_BINDIR})
###

Wyświetl plik

@ -0,0 +1,143 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <stdbool.h>
#include <getopt.h>
#include <stlink.h>
#include <logging.h>
#define DEFAULT_LOGGING_LEVEL 50
#define DEBUG_LOGGING_LEVEL 100
#define APP_RESULT_SUCCESS 0
#define APP_RESULT_INVALID_PARAMS 1
struct _st_settings_t
{
bool show_help;
bool show_version;
int logging_level;
int core_frequency_mhz;
bool reset_board;
char* serial_number;
bool wait_sync;
};
typedef struct _st_settings_t st_settings_t;
static void usage(void) {
puts("st-trace - usage:");
puts(" -h, --help Print this help");
puts(" -V, --version Print this version");
puts(" -vXX, --verbose=XX Specify a specific verbosity level (0..99)");
puts(" -v, --verbose Specify a generally verbose logging");
puts(" -cXX, --clock=XX Specify the core frequency in MHz");
puts(" -n, --no-reset Do not reset board on connection");
puts(" -sXX, --serial=XX Use a specific serial number");
puts(" -a, --no-sync Do not wait for a sync packet");
}
bool parse_options(int argc, char** argv, st_settings_t *settings) {
static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{"verbose", optional_argument, NULL, 'v'},
{"clock", required_argument, NULL, 'c'},
{"no-reset", no_argument, NULL, 'n'},
{"serial", required_argument, NULL, 's'},
{"no-sync", no_argument, NULL, 'a'},
{0, 0, 0, 0},
};
int option_index = 0;
int c;
settings->show_help = false;
settings->show_version = false;
settings->logging_level = DEFAULT_LOGGING_LEVEL;
settings->core_frequency_mhz = 0;
settings->reset_board = true;
settings->serial_number = NULL;
settings->wait_sync = true;
while ((c = getopt_long(argc, argv, "hVv::c:ns:a", long_options, &option_index)) != -1) {
switch (c) {
case 'h':
settings->show_help = true;
break;
case 'V':
settings->show_version = true;
break;
case 'v':
if (optarg) {
settings->logging_level = atoi(optarg);
} else {
settings->logging_level = DEBUG_LOGGING_LEVEL;
}
break;
case 'c':
settings->core_frequency_mhz = atoi(optarg);
break;
case 'n':
settings->reset_board = false;
break;
case 's':
settings->serial_number = optarg;
break;
case 'a':
settings->wait_sync = false;
break;
case '?':
return false;
break;
default:
printf("ERROR: Unknown command line option: '%c' (0x%02x)\n", c, c);
return false;
}
}
if (optind < argc) {
while (optind < argc) {
printf("ERROR: Unknown command line argument: '%s'\n", argv[optind++]);
}
return false;
}
return true;
}
int main(int argc, char** argv)
{
st_settings_t settings;
if (!parse_options(argc, argv, &settings)) {
usage();
return APP_RESULT_INVALID_PARAMS;
}
/* if (settings.logging_level >= UDEBUG) */
printf("show_help = %s\n", settings.show_help ? "true" : "false");
printf("show_version = %s\n", settings.show_version ? "true" : "false");
printf("logging_level = %d\n", settings.logging_level);
printf("core_frequency = %d MHz\n", settings.core_frequency_mhz);
printf("reset_board = %s\n", settings.reset_board ? "true" : "false");
printf("serial_number = %s\n", settings.serial_number ? settings.serial_number : "any");
printf("wait_sync = %s\n", settings.wait_sync ? "true" : "false");
if (settings.show_help) {
usage();
return APP_RESULT_SUCCESS;
}
if (settings.show_version) {
printf("v%s\n", STLINK_VERSION);
return APP_RESULT_SUCCESS;
}
return APP_RESULT_SUCCESS;
}