mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-02 13:24:12 +01:00
Added Long USB RecvControl call for >64 bytes
This commit is contained in:
parent
0b97e57b2c
commit
ced86a9c48
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user