From 369bfd24bdbd4231abb70a5c4ae7fe7128dbd30c Mon Sep 17 00:00:00 2001 From: Cliff Date: Mon, 23 Jan 2023 01:08:31 -0700 Subject: [PATCH] Allow using Segger RTT as debug output (#3052) Firmware needs to be built with -DDEBUG=YES and -DDEBUG_SEGGER_RTT=YES to use this feature. --- .gitmodules | 3 ++ radio/src/CMakeLists.txt | 8 +++- radio/src/debug.cpp | 4 +- radio/src/serial.cpp | 40 +++++++++++++++++-- .../arm/stm32/bootloader/CMakeLists.txt | 13 ++++-- .../common/arm/stm32/bootloader/boot.cpp | 12 +++++- radio/src/thirdparty/Segger_RTT | 1 + 7 files changed, 69 insertions(+), 12 deletions(-) create mode 160000 radio/src/thirdparty/Segger_RTT diff --git a/.gitmodules b/.gitmodules index 3ec4ad6e0d5..542627057c9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -11,3 +11,6 @@ path = radio/src/thirdparty/FreeRTOS url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git shallow = true +[submodule "radio/src/thirdparty/Segger_RTT"] + path = radio/src/thirdparty/Segger_RTT + url = https://github.com/adfernandes/segger-rtt.git diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c08d92912af..69a5082ed7c 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -44,6 +44,7 @@ option(RAS "RAS (SWR) enabled" ON) option(TEMPLATES "Model templates menu" OFF) option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON) option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) +option(DEBUG_SEGGER_RTT "Debug output to Segger RTT" OFF) option(DEBUG_WINDOWS "Turn on windows traces" OFF) option(DEBUG_YAML "Turn on YAML traces" OFF) option(DEBUG_LABELS "Turn on Labels traces" OFF) @@ -365,6 +366,11 @@ if(TRACE_LUA_INTERNALS) add_definitions(-DTRACE_LUA_INTERNALS_ENABLED) endif() +if(DEBUG_SEGGER_RTT) + add_definitions(-DDEBUG_SEGGER_RTT) + set(SRC ${SRC} ${THIRDPARTY_DIR}/Segger_RTT/RTT/SEGGER_RTT.c) +endif() + if(DEBUG_WINDOWS) add_definitions(-DDEBUG_WINDOWS) endif() @@ -520,7 +526,7 @@ if(NATIVE_BUILD) target_compile_options(radiolib_native PUBLIC -DSIMU) add_dependencies(radiolib_native ${RADIO_DEPENDENCIES}) set_property(TARGET radiolib_native PROPERTY POSITION_INDEPENDENT_CODE ON) - + add_subdirectory(targets/simu) add_subdirectory(tests) endif() diff --git a/radio/src/debug.cpp b/radio/src/debug.cpp index 5b402a2507b..478c80e3b18 100644 --- a/radio/src/debug.cpp +++ b/radio/src/debug.cpp @@ -139,7 +139,7 @@ void dumpTraceBuffer() " notd", // INT_OTG_FS_RX_NOT_DEVICE, #endif // #if defined(DEBUG_USB_INTERRUPTS) }; -#elif defined(PCBTARANIS) +#elif defined(PCBTARANIS) const char * const interruptNames[INT_LAST] = { "Tick ", // INT_TICK, "5ms ", // INT_5MS, @@ -201,7 +201,7 @@ void DebugTimer::stop() else { last *= 10000ul; //adjust unit to 1us } - evalStats(); + evalStats(); } DebugTimer debugTimers[DEBUG_TIMERS_COUNT]; diff --git a/radio/src/serial.cpp b/radio/src/serial.cpp index 429489d23f7..e008daa99e0 100644 --- a/radio/src/serial.cpp +++ b/radio/src/serial.cpp @@ -45,6 +45,10 @@ #include "extmodule_serial_driver.h" #endif +#if defined(DEBUG_SEGGER_RTT) + #include "thirdparty/Segger_RTT/RTT/SEGGER_RTT.h" +#endif + #define PRINTF_BUFFER_SIZE 128 static void (*dbg_serial_putc)(void*, uint8_t) = nullptr; @@ -67,6 +71,33 @@ void dbgSerialSetSendCb(void* ctx, void (*cb)(void*, uint8_t)) dbg_serial_putc = cb; } +#if defined(DEBUG_SEGGER_RTT) + +extern "C" void dbgSerialPutc(char c) +{ + SEGGER_RTT_Write(0, (const void *)&c, 1); +} + +extern "C" void dbgSerialPrintf(const char * format, ...) +{ + va_list arglist; + char tmp[PRINTF_BUFFER_SIZE+1]; + + // no need to do anything if we don't have an output + if (!dbg_serial_putc) return; + + va_start(arglist, format); + vsnprintf(tmp, PRINTF_BUFFER_SIZE, format, arglist); + tmp[PRINTF_BUFFER_SIZE] = '\0'; + va_end(arglist); + + const char *t = tmp; + while (*t && dbg_serial_putc) { + SEGGER_RTT_Write(0, (const void *)t++, 1); + } +} +#else + extern "C" void dbgSerialPutc(char c) { auto _putc = dbg_serial_putc; @@ -81,7 +112,7 @@ extern "C" void dbgSerialPrintf(const char * format, ...) // no need to do anything if we don't have an output if (!dbg_serial_putc) return; - + va_start(arglist, format); vsnprintf(tmp, PRINTF_BUFFER_SIZE, format, arglist); tmp[PRINTF_BUFFER_SIZE] = '\0'; @@ -92,6 +123,7 @@ extern "C" void dbgSerialPrintf(const char * format, ...) dbg_serial_putc(dbg_serial_ctx, *t++); } } +#endif extern "C" void dbgSerialCrlf() { @@ -157,7 +189,7 @@ static void serialSetCallBacks(int mode, void* ctx, const etx_serial_port_t* por getByte = drv->getByte; setRxCb = drv->setReceiveCb; } - } + } // prevent compiler warnings (void)sendByte; @@ -228,7 +260,7 @@ static void serialSetCallBacks(int mode, void* ctx, const etx_serial_port_t* por extmoduleSetSerialPort(drv); break; #endif - + #endif } } @@ -392,7 +424,7 @@ void serialInit(uint8_t port_nr, int mode) void initSerialPorts() { memset(serialPortStates, 0, sizeof(serialPortStates)); - + for (uint8_t port_nr = 0; port_nr < MAX_AUX_SERIAL; port_nr++) { auto mode = getSerialPortMode(port_nr); serialInit(port_nr, mode); diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index d5487eb5618..74a6168d22a 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -54,6 +54,13 @@ if(BLUETOOTH) ) endif() +if(DEBUG_SEGGER_RTT) + set(BOOTLOADER_SRC + ${BOOTLOADER_SRC} + ../../../../../thirdparty/Segger_RTT/RTT/SEGGER_RTT.c + ) +endif() + if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14) set(BOOTLOADER_SRC @@ -73,7 +80,7 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14) foreach(LVGL_FILE ${LVGL_SRC_FILES_MINIMAL}) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../${LVGL_FILE}) endforeach() - + if(USB_CHARGER) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} @@ -88,11 +95,11 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S OR PCB STREQUAL NV14) ../../../../../targets/${TARGET_DIR}/extmodule_helper.cpp ) endif() - + if(DEBUG) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} - ../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c +# ../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c ../../../../../serial.cpp ../../../../../targets/common/arm/stm32/aux_serial_driver.cpp ../../../../../targets/common/arm/stm32/stm32_usart_driver.cpp diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index 0e744553c90..8ba0fba9c0a 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -27,6 +27,10 @@ #include "keys.h" #include "debug.h" +#if defined(DEBUG_SEGGER_RTT) + #include "thirdparty/Segger_RTT/RTT/SEGGER_RTT.h" +#endif + #if defined(PCBXLITE) #define BOOTLOADER_KEYS 0x0F #else @@ -83,7 +87,7 @@ void interrupt10ms() #if defined(DEBUG) g_tmr10ms++; #endif - + uint8_t index = 0; uint32_t in = readKeys(); @@ -228,6 +232,10 @@ void bootloaderInitApp() boardBootloaderInit(); #endif +#if defined(DEBUG_SEGGER_RTT) + SEGGER_RTT_ConfigUpBuffer(0, NULL, NULL, 0, SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#endif + pwrInit(); keysInit(); @@ -267,7 +275,7 @@ void bootloaderInitApp() #endif delaysInit(); // needed for lcdInit() - + #if defined(DEBUG) initSerialPorts(); #endif diff --git a/radio/src/thirdparty/Segger_RTT b/radio/src/thirdparty/Segger_RTT new file mode 160000 index 00000000000..fdac9caa261 --- /dev/null +++ b/radio/src/thirdparty/Segger_RTT @@ -0,0 +1 @@ +Subproject commit fdac9caa261a318eb549002f8d5e869cebeb1f37