diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2011-05-26 11:27:21 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2011-05-26 11:27:21 +0000 |
commit | 1ea5dae8a824264580baea2479da7c58711ae879 (patch) | |
tree | 14dc584c7ce1da61cbf4d987d874e8c99d1fe3ad /LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c | |
parent | edc4db41f46f473fc0ba95fd03920d10aba1de4a (diff) | |
download | lufa-1ea5dae8a824264580baea2479da7c58711ae879.tar.gz lufa-1ea5dae8a824264580baea2479da7c58711ae879.tar.bz2 lufa-1ea5dae8a824264580baea2479da7c58711ae879.zip |
Copy out the EndpointStream and PipeStream functions to each architecture, so that each architecture can optimise the stream functions according to the available hardware (such as DMA, where available).
Diffstat (limited to 'LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c')
-rw-r--r-- | LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c new file mode 100644 index 000000000..e746b5124 --- /dev/null +++ b/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c @@ -0,0 +1,50 @@ +uint8_t TEMPLATE_FUNC_NAME (void* const Buffer, + uint16_t Length) +{ + uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + + if (!(Length)) + Endpoint_ClearOUT(); + + while (Length) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + else if (Endpoint_IsSETUPReceived()) + return ENDPOINT_RWCSTREAM_HostAborted; + + if (Endpoint_IsOUTReceived()) + { + while (Length && Endpoint_BytesInEndpoint()) + { + TEMPLATE_TRANSFER_BYTE(DataStream); + TEMPLATE_BUFFER_MOVE(DataStream, 1); + Length--; + } + + Endpoint_ClearOUT(); + } + } + + while (!(Endpoint_IsINReady())) + { + uint8_t USB_DeviceState_LCL = USB_DeviceState; + + if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) + return ENDPOINT_RWCSTREAM_DeviceDisconnected; + else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) + return ENDPOINT_RWCSTREAM_BusSuspended; + } + + return ENDPOINT_RWCSTREAM_NoError; +} + + +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_TRANSFER_BYTE |