aboutsummaryrefslogtreecommitdiff
path: root/cores
diff options
context:
space:
mode:
authorNicoHood <NicoHood@users.noreply.github.com>2015-12-19 01:49:54 +0100
committerNicoHood <NicoHood@users.noreply.github.com>2015-12-19 01:53:24 +0100
commit87b4f726a7a996056989ff6fd02280f94ac3cb90 (patch)
tree5b37c238f162ec03f7895fea9c2843181144688c /cores
parent513dbdd6901baba39d74ee28ded8b49d9a820069 (diff)
Added Long USB RecvControl call for >64 bytes
Diffstat (limited to 'cores')
-rw-r--r--cores/arduino/USBAPI.h1
-rw-r--r--cores/arduino/USBCore.cpp21
2 files changed, 21 insertions, 1 deletions
diff --git a/cores/arduino/USBAPI.h b/cores/arduino/USBAPI.h
index f22ab6a..358444e 100644
--- a/cores/arduino/USBAPI.h
+++ b/cores/arduino/USBAPI.h
@@ -193,6 +193,7 @@ bool CDC_Setup(USBSetup& setup);
int USB_SendControl(uint8_t flags, const void* d, int len);
int USB_RecvControl(void* d, int len);
+int USB_RecvControlLong(void* d, int len);
uint8_t USB_Available(uint8_t ep);
uint8_t USB_SendSpace(uint8_t ep);
diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp
index 3c6610c..4e7e8af 100644
--- a/cores/arduino/USBCore.cpp
+++ b/cores/arduino/USBCore.cpp
@@ -426,7 +426,7 @@ 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
+// Use USB_RecvControlLong for longer transfers
int USB_RecvControl(void* d, int len)
{
WaitOUT();
@@ -435,6 +435,25 @@ int USB_RecvControl(void* d, int len)
return len;
}
+// Does not timeout or cross fifo boundaries
+int USB_RecvControlLong(void* d, int len)
+{
+ auto bytesleft = len;
+ while(bytesleft > 0)
+ {
+ // 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 = bytesleft;
+ if(recvLength > 64){
+ recvLength = 64;
+ }
+
+ // Write data to fit to the beginning of the array
+ bytesleft -= USB_RecvControl((u8*)d + len - bytesleft, recvLength);
+ }
+ return len;
+}
+
static u8 SendInterfaces()
{
u8 interfaces = 0;