summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ports/esp32/usb.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/ports/esp32/usb.c b/ports/esp32/usb.c
index 21047fa2b..95c827729 100644
--- a/ports/esp32/usb.c
+++ b/ports/esp32/usb.c
@@ -93,15 +93,28 @@ void usb_tx_strn(const char *str, size_t len) {
}
while (len) {
+ // Get amount of CDC output buffer space available, making sure
+ // there is at least one byte available.
+ size_t avail = tud_cdc_n_write_available(CDC_ITF);
+ if (avail == 0) {
+ if (tinyusb_cdcacm_write_flush(CDC_ITF, pdMS_TO_TICKS(1000)) != ESP_OK) {
+ return;
+ }
+ avail = tud_cdc_n_write_available(CDC_ITF);
+ }
+
+ // Write as much data as possible.
size_t l = len;
- if (l > CONFIG_USB_CDC_TX_BUFSIZE) {
- l = CONFIG_USB_CDC_TX_BUFSIZE;
+ if (l > avail) {
+ l = avail;
}
- tinyusb_cdcacm_write_queue(CDC_ITF, (uint8_t *)str, l);
- tinyusb_cdcacm_write_flush(CDC_ITF, pdMS_TO_TICKS(1000));
+ tud_cdc_n_write(CDC_ITF, (uint8_t *)str, l);
str += l;
len -= l;
}
+
+ // Queue a flush to write out the data in the CDC buffer (if any).
+ tud_cdc_n_write_flush(CDC_ITF);
}
#endif // CONFIG_USB_ENABLED