12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /*
- LUFA Library
- Copyright (C) Dean Camera, 2014.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
- */
-
- /*
- Copyright 2014 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, distribute, and sell this
- software and its documentation for any purpose is hereby granted
- without fee, provided that the above copyright notice appear in
- all copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the name of the author not be used in
- advertising or publicity pertaining to distribution of the
- software without specific, written prior permission.
-
- The author disclaims all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall the author be liable for any
- special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
- */
-
- #if defined(TEMPLATE_FUNC_NAME)
-
- uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
- uint16_t Length)
- {
- uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
- bool LastPacketFull = false;
-
- Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
-
- if (Length > USB_ControlRequest.wLength)
- Length = USB_ControlRequest.wLength;
- else if (!(Length))
- Endpoint_ClearIN();
-
- while (Length || LastPacketFull)
- {
- 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;
- else if (Endpoint_IsOUTReceived())
- break;
-
- if (Endpoint_IsINReady())
- {
- uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
-
- while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
- {
- TEMPLATE_TRANSFER_BYTE(DataStream);
- TEMPLATE_BUFFER_MOVE(DataStream, 1);
- Length--;
- BytesInEndpoint++;
- }
-
- LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
- Endpoint_ClearIN();
- }
- }
-
- while (!(Endpoint_IsOUTReceived()))
- {
- 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;
- }
-
- return ENDPOINT_RWCSTREAM_NoError;
- }
-
- #undef TEMPLATE_BUFFER_OFFSET
- #undef TEMPLATE_BUFFER_MOVE
- #undef TEMPLATE_FUNC_NAME
- #undef TEMPLATE_TRANSFER_BYTE
-
- #endif
|