aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cores/arduino/USBCore.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp
index 3c6610c..62b90ed 100644
--- a/cores/arduino/USBCore.cpp
+++ b/cores/arduino/USBCore.cpp
@@ -425,13 +425,24 @@ static bool USB_SendStringDescriptor(const u8*string_P, u8 string_len, uint8_t f
}
// Does not timeout or cross fifo boundaries
-// Will only work for transfers <= 64 bytes
-// TODO
int USB_RecvControl(void* d, int len)
{
- WaitOUT();
- Recv((u8*)d,len);
- ClearOUT();
+ auto length = len;
+ while(length)
+ {
+ // Dont receive more than the USB Control EP has to offer
+ // Use fixed 64 because control EP always have 64 bytes even on 16u2.
+ auto recvLength = length;
+ if(recvLength > 64){
+ recvLength = 64;
+ }
+
+ // Write data to fit to the end (not the beginning) of the array
+ WaitOUT();
+ Recv((u8*)d + len - length, recvLength);
+ ClearOUT();
+ length -= recvLength;
+ }
return len;
}