mirror of
https://github.com/micropython/micropython.git
synced 2026-01-04 11:10:14 +01:00
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.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user