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) {
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;

1
ports/rp2/mphalport.h

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

Loading…
Cancel
Save