From fb9c70e91e1ac8d094f248369f4ba7362bbd15e0 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 24 Aug 2023 14:52:43 +0200 Subject: [PATCH] usb: c33: fix serial errors --- cores/arduino/usb/SerialUSB.cpp | 59 ++++++++++++++--------------- extras/tinyusb | 2 +- variants/PORTENTA_C33/tusb_config.h | 4 +- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/cores/arduino/usb/SerialUSB.cpp b/cores/arduino/usb/SerialUSB.cpp index cd73bedbd..1be01fbee 100644 --- a/cores/arduino/usb/SerialUSB.cpp +++ b/cores/arduino/usb/SerialUSB.cpp @@ -80,41 +80,40 @@ size_t _SerialUSB::write(uint8_t c) { return write(&c, 1); } -size_t _SerialUSB::write(const uint8_t *buf, size_t length) { - if (!_running) { +#include "device/usbd_pvt.h" + +size_t _SerialUSB::write(const uint8_t *buf, size_t size) { + if (!_running) { return 0; } - static uint64_t last_avail_time; - int written = 0; - if (connected()) { - for (size_t i = 0; i < length;) { - int n = length - i; - int avail = tud_cdc_write_available(); - if (n > avail) { - n = avail; - } - if (n) { - int n2 = tud_cdc_write(buf + i, n); - tud_task(); - tud_cdc_write_flush(); - i += n2; - written += n2; - last_avail_time = millis(); - } else { - tud_task(); - tud_cdc_write_flush(); - if (connected() || - (!tud_cdc_write_available() && millis() > last_avail_time + 1000 /* 1 second */)) { - break; - } - } + if (!connected()) { + return 0; + } + usbd_int_set(false); + size_t to_send = size, so_far = 0; + while(to_send){ + size_t space = tud_cdc_write_available(); + if(!space){ + usbd_int_set(true); + tud_cdc_write_flush(); + continue; + } + if(space > to_send){ + space = to_send; + } + size_t sent = tud_cdc_write( buf+so_far, space); + usbd_int_set(true); + if(sent){ + so_far += sent; + to_send -= sent; + tud_cdc_write_flush(); + } else { + size = so_far; + break; } - } else { - // reset our timeout - last_avail_time = 0; } - return written; + return size; } _SerialUSB::operator bool() { diff --git a/extras/tinyusb b/extras/tinyusb index edee46e79..7bf592305 160000 --- a/extras/tinyusb +++ b/extras/tinyusb @@ -1 +1 @@ -Subproject commit edee46e7941f56f5024bf60d56921cfe10d1f7a5 +Subproject commit 7bf5923052e5861f54c9cb0581e328f8be26a0a9 diff --git a/variants/PORTENTA_C33/tusb_config.h b/variants/PORTENTA_C33/tusb_config.h index 7e1782bd4..2324f39fe 100644 --- a/variants/PORTENTA_C33/tusb_config.h +++ b/variants/PORTENTA_C33/tusb_config.h @@ -109,8 +109,8 @@ // CDC FIFO size of TX and RX -#define CFG_TUD_CDC_RX_BUFSIZE ((TUD_OPT_HIGH_SPEED ? 512 : 64) * 8) -#define CFG_TUD_CDC_TX_BUFSIZE ((TUD_OPT_HIGH_SPEED ? 512 : 64) * 8) +#define CFG_TUD_CDC_RX_BUFSIZE (4096) +#define CFG_TUD_CDC_TX_BUFSIZE (64) // CDC Endpoint transfer buffer size, more is faster #define CFG_TUD_CDC_EP_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)