diff options
author | Andrew Leech <andrew@alelec.net> | 2024-05-11 08:50:13 +1000 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2024-05-31 19:47:25 +1000 |
commit | 2475a52f5cb8dfdf62a5ca5fe0eb9eeb14fc61b9 (patch) | |
tree | 1319a0b69f8adc971548b4bb329b467b5e45af50 | |
parent | 1eaa562fdf2a7472991bbfe2d2bc0e8d0b11bb28 (diff) |
mimxrt/mphalport: Refactor to use shared TinyUSB CDC functions.
Signed-off-by: Andrew Leech <andrew@alelec.net>
-rw-r--r-- | ports/mimxrt/Makefile | 2 | ||||
-rw-r--r-- | ports/mimxrt/mpconfigport.h | 1 | ||||
-rw-r--r-- | ports/mimxrt/mphalport.c | 72 | ||||
-rw-r--r-- | ports/mimxrt/mphalport.h | 1 |
4 files changed, 10 insertions, 66 deletions
diff --git a/ports/mimxrt/Makefile b/ports/mimxrt/Makefile index 96abb11bf..75cf9caec 100644 --- a/ports/mimxrt/Makefile +++ b/ports/mimxrt/Makefile @@ -232,6 +232,8 @@ SHARED_SRC_C += \ shared/runtime/stdout_helpers.c \ shared/runtime/sys_stdio_mphal.c \ shared/timeutils/timeutils.c \ + shared/tinyusb/mp_usbd.c \ + shared/tinyusb/mp_usbd_cdc.c \ # Set flash driver name, base address and internal flash flag, based on the flash type. ifeq ($(MICROPY_HW_FLASH_TYPE),$(filter $(MICROPY_HW_FLASH_TYPE),qspi_nor_flash)) diff --git a/ports/mimxrt/mpconfigport.h b/ports/mimxrt/mpconfigport.h index a4c6d6e20..ac918ba4d 100644 --- a/ports/mimxrt/mpconfigport.h +++ b/ports/mimxrt/mpconfigport.h @@ -148,6 +148,7 @@ uint32_t trng_random_u32(void); #endif #define MICROPY_HW_ENABLE_USBDEV (1) +#define MICROPY_HW_USB_CDC (1) // Hooks to add builtins diff --git a/ports/mimxrt/mphalport.c b/ports/mimxrt/mphalport.c index 6e982b8c8..be5abd95b 100644 --- a/ports/mimxrt/mphalport.c +++ b/ports/mimxrt/mphalport.c @@ -30,6 +30,7 @@ #include "py/mphal.h" #include "shared/timeutils/timeutils.h" #include "shared/runtime/interrupt_char.h" +#include "shared/tinyusb/mp_usbd_cdc.h" #include "extmod/misc.h" #include "ticks.h" #include "tusb.h" @@ -44,51 +45,9 @@ static uint8_t stdin_ringbuf_array[MICROPY_HW_STDIN_BUFFER_LEN]; ringbuf_t stdin_ringbuf = {stdin_ringbuf_array, sizeof(stdin_ringbuf_array), 0, 0}; -uint8_t cdc_itf_pending; // keep track of cdc interfaces which need attention to poll - -void poll_cdc_interfaces(void) { - // any CDC interfaces left to poll? - if (cdc_itf_pending && ringbuf_free(&stdin_ringbuf)) { - for (uint8_t itf = 0; itf < 8; ++itf) { - if (cdc_itf_pending & (1 << itf)) { - tud_cdc_rx_cb(itf); - if (!cdc_itf_pending) { - break; - } - } - } - } -} - - -void tud_cdc_rx_cb(uint8_t itf) { - // consume pending USB data immediately to free usb buffer and keep the endpoint from stalling. - // in case the ringbuffer is full, mark the CDC interface that need attention later on for polling - cdc_itf_pending &= ~(1 << itf); - for (uint32_t bytes_avail = tud_cdc_n_available(itf); bytes_avail > 0; --bytes_avail) { - if (ringbuf_free(&stdin_ringbuf)) { - int data_char = tud_cdc_read_char(); - if (data_char == mp_interrupt_char) { - mp_sched_keyboard_interrupt(); - } else { - ringbuf_put(&stdin_ringbuf, data_char); - } - } else { - cdc_itf_pending |= (1 << itf); - return; - } - } -} - uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) { uintptr_t ret = 0; - poll_cdc_interfaces(); - if ((poll_flags & MP_STREAM_POLL_RD) && ringbuf_peek(&stdin_ringbuf) != -1) { - ret |= MP_STREAM_POLL_RD; - } - if ((poll_flags & MP_STREAM_POLL_WR) && tud_cdc_connected() && tud_cdc_write_available() > 0) { - ret |= MP_STREAM_POLL_WR; - } + ret |= mp_usbd_cdc_poll_interfaces(poll_flags); #if MICROPY_PY_OS_DUPTERM ret |= mp_os_dupterm_poll(poll_flags); #endif @@ -97,7 +56,7 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) { int mp_hal_stdin_rx_chr(void) { for (;;) { - poll_cdc_interfaces(); + mp_usbd_cdc_poll_interfaces(0); int c = ringbuf_get(&stdin_ringbuf); if (c != -1) { return c; @@ -115,29 +74,10 @@ int mp_hal_stdin_rx_chr(void) { mp_uint_t mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) { mp_uint_t ret = len; bool did_write = false; - if (tud_cdc_connected()) { - size_t i = 0; - while (i < len) { - uint32_t n = len - i; - if (n > CFG_TUD_CDC_EP_BUFSIZE) { - n = CFG_TUD_CDC_EP_BUFSIZE; - } - uint64_t timeout = ticks_us64() + (uint64_t)(MICROPY_HW_USB_CDC_TX_TIMEOUT * 1000); - // Wait with a max of USC_CDC_TIMEOUT ms - while (n > tud_cdc_write_available() && ticks_us64() < timeout) { - MICROPY_EVENT_POLL_HOOK - } - if (ticks_us64() >= timeout) { - ret = i; - break; - } - - uint32_t n2 = tud_cdc_write(str + i, n); - tud_cdc_write_flush(); - i += n2; - } + mp_uint_t cdc_res = mp_usbd_cdc_tx_strn(str, len); + if (cdc_res > 0) { did_write = true; - ret = MIN(i, ret); + ret = MIN(cdc_res, ret); } #if MICROPY_PY_OS_DUPTERM int dupterm_res = mp_os_dupterm_tx_strn(str, len); diff --git a/ports/mimxrt/mphalport.h b/ports/mimxrt/mphalport.h index 7f5a228fa..c69ebf581 100644 --- a/ports/mimxrt/mphalport.h +++ b/ports/mimxrt/mphalport.h @@ -72,6 +72,7 @@ #define MP_HAL_PIN_TRIGGER_RISE kGPIO_IntRisingEdge #define MP_HAL_PIN_TRIGGER_RISE_FALL kGPIO_IntRisingOrFallingEdge +extern int mp_interrupt_char; extern ringbuf_t stdin_ringbuf; // Define an alias for systick_ms, because the shared softtimer.c uses |