diff --git a/src/common/tusb_common.h b/src/common/tusb_common.h index 0d4082c031..09bf358aa7 100644 --- a/src/common/tusb_common.h +++ b/src/common/tusb_common.h @@ -69,6 +69,7 @@ #include #include #include +#include // Tinyusb Common Headers #include "tusb_option.h" diff --git a/src/common/tusb_debug.h b/src/common/tusb_debug.h index 2e9f1d9cdc..9879646e12 100644 --- a/src/common/tusb_debug.h +++ b/src/common/tusb_debug.h @@ -50,12 +50,14 @@ extern char const* const tu_str_xfer_result[]; #endif void tu_print_mem(void const *buf, uint32_t count, uint8_t indent); +int tu_printf_r(const char *format, ...); #ifdef CFG_TUSB_DEBUG_PRINTF + // External debug print function, must be ISR-safe extern int CFG_TUSB_DEBUG_PRINTF(const char *format, ...); #define tu_printf CFG_TUSB_DEBUG_PRINTF #else - #define tu_printf printf + #define tu_printf tu_printf_r #endif static inline void tu_print_buf(uint8_t const* buf, uint32_t bufsize) { diff --git a/src/tusb.c b/src/tusb.c index 0092267a19..88836045f2 100644 --- a/src/tusb.c +++ b/src/tusb.c @@ -452,6 +452,22 @@ void tu_print_mem(void const* buf, uint32_t count, uint8_t indent) { dump_str_line(buf8 - nback, nback); } +int tu_printf_r(const char *format, ...) +{ + // Simple re-entrancy lock, not safe for multi-core MCU + static volatile bool lock = false; + if (lock) { + return -1; + } + lock = true; + va_list args; + va_start(args, format); + int ret = vprintf(format, args); + va_end(args); + lock = false; + return ret; +} + #endif #endif // host or device enabled