From ca63ead2d8b242296d1fc2f6965e25dfdddeec15 Mon Sep 17 00:00:00 2001 From: robert-hh Date: Sun, 16 Oct 2022 12:08:52 +0200 Subject: [PATCH] samd/mphalport: Add a timeout to mp_hal_stdout_tx_strn(). If USB CDC is connected and the board sends data, but the host does not receive the data, the device locks up. This is fixed in this commit by having a timeout of 500ms, after which time the transmission is skipped. --- ports/samd/mphalport.c | 7 ++++++- ports/samd/mphalport.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ports/samd/mphalport.c b/ports/samd/mphalport.c index b60bada480..44d1470fc5 100644 --- a/ports/samd/mphalport.c +++ b/ports/samd/mphalport.c @@ -194,9 +194,14 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) { if (n > CFG_TUD_CDC_EP_BUFSIZE) { n = CFG_TUD_CDC_EP_BUFSIZE; } - while (n > tud_cdc_write_available()) { + 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; diff --git a/ports/samd/mphalport.h b/ports/samd/mphalport.h index 2cbb3333f6..4799c575c9 100644 --- a/ports/samd/mphalport.h +++ b/ports/samd/mphalport.h @@ -35,6 +35,8 @@ #include "hpl_time_measure.h" #include "sam.h" +#define MICROPY_HW_USB_CDC_TX_TIMEOUT (500) + extern int mp_interrupt_char; extern volatile uint32_t systick_ms; uint64_t mp_hal_ticks_us_64(void);