Skip to content

Commit 1138d82

Browse files
Increase SerialUSB maximum transfer speed
Use chunks not bytes to transfer data to host, like in the serial_usb SDK.
1 parent 0eba6f0 commit 1138d82

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

cores/rp2040/SerialUSB.cpp

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -235,22 +235,40 @@ void SerialUSB::flush() {
235235
size_t SerialUSB::write(uint8_t c) {
236236
return write(&c, 1);
237237
}
238-
size_t SerialUSB::write(const uint8_t *p, size_t len) {
238+
size_t SerialUSB::write(const uint8_t *buf, size_t length) {
239+
static uint64_t last_avail_time;
239240
uint32_t owner;
240241
if (!mutex_try_enter(&usb_mutex, &owner)) {
241242
if (owner == get_core_num()) return 0; // would deadlock otherwise
242243
mutex_enter_blocking(&usb_mutex);
243244
}
244-
size_t remain = len;
245-
while (remain && tud_cdc_connected()) {
246-
size_t cnt = tud_cdc_write(p, remain);
247-
p += cnt;
248-
remain -= cnt;
249-
tud_task();
250-
tud_cdc_write_flush();
245+
int i = 0;
246+
if (tud_cdc_connected()) {
247+
for (int i = 0; i < length;) {
248+
int n = length - i;
249+
int avail = tud_cdc_write_available();
250+
if (n > avail) n = avail;
251+
if (n) {
252+
int n2 = tud_cdc_write(buf + i, n);
253+
tud_task();
254+
tud_cdc_write_flush();
255+
i += n2;
256+
last_avail_time = time_us_64();
257+
} else {
258+
tud_task();
259+
tud_cdc_write_flush();
260+
if (!tud_cdc_connected() ||
261+
(!tud_cdc_write_available() && time_us_64() > last_avail_time + 1000000 /* 1 second */)) {
262+
break;
263+
}
264+
}
265+
}
266+
} else {
267+
// reset our timeout
268+
last_avail_time = 0;
251269
}
252270
mutex_exit(&usb_mutex);
253-
return len - remain;
271+
return i;
254272
}
255273
SerialUSB::operator bool() {
256274
uint32_t owner;

0 commit comments

Comments
 (0)