Skip to content

Commit b2e6110

Browse files
jcbudacmaglie
authored andcommitted
Fix to USBDevice blocking-send
1 parent 9f3ae92 commit b2e6110

File tree

2 files changed

+51
-14
lines changed

2 files changed

+51
-14
lines changed

cores/arduino/USB/CDC.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,11 @@ size_t Serial_::write(const uint8_t *buffer, size_t size)
242242
// TODO - ZE - check behavior on different OSes and test what happens if an
243243
// open connection isn't broken cleanly (cable is yanked out, host dies
244244
// or locks up, or host virtual serial port hangs)
245-
// if (_usbLineInfo.lineState > 0) // Problem with Windows(R)
245+
if (_usbLineInfo.lineState > 0) // Problem with Windows(R)
246246
{
247247
uint32_t r = usb.send(CDC_ENDPOINT_IN, buffer, size);
248248

249-
if (r > 0) {
249+
if (r == 0) {
250250
return r;
251251
} else {
252252
setWriteError();

cores/arduino/USB/USBCore.cpp

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -579,27 +579,64 @@ uint8_t USBDeviceClass::armRecv(uint32_t ep, uint32_t len)
579579
// Blocking Send of data to an endpoint
580580
uint32_t USBDeviceClass::send(uint32_t ep, const void *data, uint32_t len)
581581
{
582+
uint32_t length = 0;
583+
582584
if (!_usbConfiguration)
583585
return -1;
586+
if (len > 16384)
587+
return -1;
584588

585-
//armSend(ep, data, len);
589+
if ((unsigned int)data > 0x20000000)
590+
{
591+
// Buffer in RAM
592+
usbd.epBank1SetAddress(ep, (void *)data);
593+
usbd.epBank1SetMultiPacketSize(ep, 0);
586594

587-
/* memcopy could be safer in multithreaded environment */
588-
memcpy(&udd_ep_in_cache_buffer[ep], data, len);
595+
usbd.epBank1SetByteCount(ep, len);
589596

590-
usbd.epBank1SetAddress(ep, &udd_ep_in_cache_buffer[ep]);
591-
usbd.epBank1SetByteCount(ep, len);
597+
// Clear the transfer complete flag
598+
usbd.epBank1AckTransferComplete(ep);
592599

593-
// Clear the transfer complete flag
594-
usbd.epBank1AckTransferComplete(ep);
600+
// RAM buffer is full, we can send data (IN)
601+
usbd.epBank1SetReady(ep);
595602

596-
// RAM buffer is full, we can send data (IN)
597-
usbd.epBank1SetReady(ep);
603+
// Wait for transfer to complete
604+
while (!usbd.epBank1IsTransferComplete(ep)) {
605+
; // need fire exit.
606+
}
607+
len = 0;
608+
}
609+
else
610+
{
611+
// Flash area
612+
while (len != 0)
613+
{
614+
if (len >= 64) {
615+
length = 64;
616+
} else {
617+
length = len;
618+
}
598619

599-
// Wait for transfer to complete
600-
while (!usbd.epBank1IsTransferComplete(ep)) {
601-
; // need fire exit.
620+
/* memcopy could be safer in multi threaded environment */
621+
memcpy(&udd_ep_in_cache_buffer[ep], data, length);
622+
623+
usbd.epBank1SetAddress(ep, &udd_ep_in_cache_buffer[ep]);
624+
usbd.epBank1SetByteCount(ep, length);
625+
626+
// Clear the transfer complete flag
627+
usbd.epBank1AckTransferComplete(ep);
628+
629+
// RAM buffer is full, we can send data (IN)
630+
usbd.epBank1SetReady(ep);
631+
632+
// Wait for transfer to complete
633+
while (!usbd.epBank1IsTransferComplete(ep)) {
634+
; // need fire exit.
635+
}
636+
len -= length;
637+
}
602638
}
639+
603640
return len;
604641
}
605642

0 commit comments

Comments
 (0)