From ac8f277e5ad5c678c996c41d9bfd5ee72e525fee Mon Sep 17 00:00:00 2001 From: Peter Harper <77111776+peterharperuk@users.noreply.github.com> Date: Sun, 19 May 2024 00:59:47 +0100 Subject: [PATCH] Fix stdio_set_chars_available_callback for usb (#1649) When you get a callback to tell you a character is available, you should be able to call getchar_timeout_us, but it's not working for USB Fixes #1603 Co-authored-by: Andrew Gordon --- src/rp2_common/pico_stdio_usb/stdio_usb.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/rp2_common/pico_stdio_usb/stdio_usb.c b/src/rp2_common/pico_stdio_usb/stdio_usb.c index 0dc8d6d9..2895be72 100644 --- a/src/rp2_common/pico_stdio_usb/stdio_usb.c +++ b/src/rp2_common/pico_stdio_usb/stdio_usb.c @@ -57,7 +57,13 @@ static int64_t timer_task(__unused alarm_id_t id, __unused void *user_data) { static void low_priority_worker_irq(void) { if (mutex_try_enter(&stdio_usb_mutex, NULL)) { tud_task(); +#if PICO_STDIO_USB_SUPPORT_CHARS_AVAILABLE_CALLBACK + uint32_t chars_avail = tud_cdc_available(); +#endif mutex_exit(&stdio_usb_mutex); +#if PICO_STDIO_USB_SUPPORT_CHARS_AVAILABLE_CALLBACK + if (chars_avail && chars_available_callback) chars_available_callback(chars_available_param); +#endif } else { // if the mutex is already owned, then we are in non IRQ code in this file. // @@ -147,12 +153,6 @@ int stdio_usb_in_chars(char *buf, int length) { } #if PICO_STDIO_USB_SUPPORT_CHARS_AVAILABLE_CALLBACK -void tud_cdc_rx_cb(__unused uint8_t itf) { - if (chars_available_callback) { - usbd_defer_func(chars_available_callback, chars_available_param, false); - } -} - void stdio_usb_set_chars_available_callback(void (*fn)(void*), void *param) { chars_available_callback = fn; chars_available_param = param;