summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/renesas-ra/mphalport.c76
-rw-r--r--ports/renesas-ra/mphalport.h1
2 files changed, 8 insertions, 69 deletions
diff --git a/ports/renesas-ra/mphalport.c b/ports/renesas-ra/mphalport.c
index 7a5bcba2c..1c62c23dd 100644
--- a/ports/renesas-ra/mphalport.c
+++ b/ports/renesas-ra/mphalport.c
@@ -34,6 +34,7 @@
#include "py/ringbuf.h"
#include "extmod/misc.h"
#include "shared/runtime/interrupt_char.h"
+#include "shared/tinyusb/mp_usbd_cdc.h"
#include "tusb.h"
#include "uart.h"
@@ -64,62 +65,16 @@ NORETURN void mp_hal_raise(HAL_StatusTypeDef status) {
mp_raise_OSError(mp_hal_status_to_errno_table[status]);
}
-#if MICROPY_HW_USB_CDC
-
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;
- }
- }
-}
-
-#endif
-
uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
uintptr_t ret = 0;
#if MICROPY_HW_USB_CDC
- poll_cdc_interfaces();
+ ret |= mp_usbd_cdc_poll_interfaces(poll_flags);
#endif
- #if MICROPY_HW_ENABLE_UART_REPL || MICROPY_HW_USB_CDC
- if ((poll_flags & MP_STREAM_POLL_RD) && ringbuf_peek(&stdin_ringbuf) != -1) {
- ret |= MP_STREAM_POLL_RD;
- }
+ #if MICROPY_HW_ENABLE_UART_REPL
if (poll_flags & MP_STREAM_POLL_WR) {
- #if MICROPY_HW_ENABLE_UART_REPL
ret |= MP_STREAM_POLL_WR;
- #else
- if (tud_cdc_connected() && tud_cdc_write_available() > 0) {
- ret |= MP_STREAM_POLL_WR;
- }
- #endif
}
#endif
#if MICROPY_PY_OS_DUPTERM
@@ -132,7 +87,7 @@ uintptr_t mp_hal_stdio_poll(uintptr_t poll_flags) {
int mp_hal_stdin_rx_chr(void) {
for (;;) {
#if MICROPY_HW_USB_CDC
- poll_cdc_interfaces();
+ mp_usbd_cdc_poll_interfaces(0);
#endif
#if MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE
@@ -165,27 +120,10 @@ mp_uint_t mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
#endif
#if MICROPY_HW_USB_CDC
- 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;
- }
- int timeout = 0;
- // Wait with a max of USC_CDC_TIMEOUT ms
- while (n > tud_cdc_write_available() && timeout++ < MICROPY_HW_USB_CDC_TX_TIMEOUT) {
- MICROPY_EVENT_POLL_HOOK
- }
- if (timeout >= MICROPY_HW_USB_CDC_TX_TIMEOUT) {
- break;
- }
- uint32_t n2 = tud_cdc_write(str + i, n);
- tud_cdc_write_flush();
- i += n2;
- }
- ret = MIN(i, ret);
+ mp_uint_t cdc_res = mp_usbd_cdc_tx_strn(str, len);
+ if (cdc_res > 0) {
did_write = true;
+ ret = MIN(cdc_res, ret);
}
#endif
diff --git a/ports/renesas-ra/mphalport.h b/ports/renesas-ra/mphalport.h
index c5d27f2e4..14e6ee0c3 100644
--- a/ports/renesas-ra/mphalport.h
+++ b/ports/renesas-ra/mphalport.h
@@ -42,6 +42,7 @@
#define MICROPY_HW_USB_CDC_TX_TIMEOUT (500)
extern const unsigned char mp_hal_status_to_errno_table[4];
+extern int mp_interrupt_char;
extern ringbuf_t stdin_ringbuf;
static inline int mp_hal_status_to_neg_errno(HAL_StatusTypeDef status) {