Browse Source

rp2/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.

Fixes issue #9634.
pull/9816/head
robert-hh 2 years ago
committed by Damien George
parent
commit
8447fef9f9
  1. 7
      ports/rp2/mphalport.c
  2. 1
      ports/rp2/mphalport.h

7
ports/rp2/mphalport.c

@ -139,9 +139,14 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
if (n > CFG_TUD_CDC_EP_BUFSIZE) { if (n > CFG_TUD_CDC_EP_BUFSIZE) {
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 MICROPY_EVENT_POLL_HOOK
} }
if (timeout >= MICROPY_HW_USB_CDC_TX_TIMEOUT) {
break;
}
uint32_t n2 = tud_cdc_write(str + i, n); uint32_t n2 = tud_cdc_write(str + i, n);
tud_cdc_write_flush(); tud_cdc_write_flush();
i += n2; i += n2;

1
ports/rp2/mphalport.h

@ -33,6 +33,7 @@
#include "RP2040.h" // cmsis, for __WFI #include "RP2040.h" // cmsis, for __WFI
#define SYSTICK_MAX (0xffffff) #define SYSTICK_MAX (0xffffff)
#define MICROPY_HW_USB_CDC_TX_TIMEOUT (500)
extern int mp_interrupt_char; extern int mp_interrupt_char;
extern ringbuf_t stdin_ringbuf; extern ringbuf_t stdin_ringbuf;

Loading…
Cancel
Save