Initial restructuring of the core USB driver module to support multiple architectures...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 19 Feb 2011 22:59:27 +0000 (22:59 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 19 Feb 2011 22:59:27 +0000 (22:59 +0000)
109 files changed:
LUFA.pnproj
LUFA/Drivers/USB/Class/Audio.h
LUFA/Drivers/USB/Class/CDC.h
LUFA/Drivers/USB/Class/Common/Audio.h
LUFA/Drivers/USB/Class/Common/CDC.h
LUFA/Drivers/USB/Class/Common/HID.h
LUFA/Drivers/USB/Class/Common/HIDParser.h
LUFA/Drivers/USB/Class/Common/MIDI.h
LUFA/Drivers/USB/Class/Common/MassStorage.h
LUFA/Drivers/USB/Class/Common/Printer.h
LUFA/Drivers/USB/Class/Common/RNDIS.h
LUFA/Drivers/USB/Class/Common/StillImage.h
LUFA/Drivers/USB/Class/Device/Audio.c
LUFA/Drivers/USB/Class/Device/CDC.c
LUFA/Drivers/USB/Class/Device/HID.c
LUFA/Drivers/USB/Class/Device/MIDI.c
LUFA/Drivers/USB/Class/Device/MassStorage.c
LUFA/Drivers/USB/Class/Device/RNDIS.c
LUFA/Drivers/USB/Class/HID.h
LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/Class/Host/HID.c
LUFA/Drivers/USB/Class/Host/MIDI.c
LUFA/Drivers/USB/Class/Host/MassStorage.c
LUFA/Drivers/USB/Class/Host/Printer.c
LUFA/Drivers/USB/Class/Host/RNDIS.c
LUFA/Drivers/USB/Class/Host/StillImage.c
LUFA/Drivers/USB/Class/MIDI.h
LUFA/Drivers/USB/Class/MassStorage.h
LUFA/Drivers/USB/Class/Printer.h
LUFA/Drivers/USB/Class/RNDIS.h
LUFA/Drivers/USB/Class/StillImage.h
LUFA/Drivers/USB/Core/AVR8/Device.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Device.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Endpoint.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Endpoint.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Host.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Host.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/OTG.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Pipe.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Pipe.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/USBController.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/USBController.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/USBInterrupt.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/USBInterrupt.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/ConfigDescriptor.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/ConfigDescriptor.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/Device.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/DeviceStandardReq.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/DeviceStandardReq.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/Endpoint.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/EndpointStream.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/EndpointStream.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/Events.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/Events.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/Host.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/HostStandardReq.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/HostStandardReq.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/OTG.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/Pipe.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/PipeStream.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/PipeStream.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/StdDescriptors.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/StdRequestType.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_R.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_W.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/Template/Template_Endpoint_RW.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/USBController.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/USBInterrupt.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/USBMode.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/USBTask.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/USBTask.h [new file with mode: 0644]
LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c [deleted file]
LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h [deleted file]
LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c [deleted file]
LUFA/Drivers/USB/HighLevel/DeviceStandardReq.h [deleted file]
LUFA/Drivers/USB/HighLevel/EndpointStream.c [deleted file]
LUFA/Drivers/USB/HighLevel/EndpointStream.h [deleted file]
LUFA/Drivers/USB/HighLevel/Events.c [deleted file]
LUFA/Drivers/USB/HighLevel/Events.h [deleted file]
LUFA/Drivers/USB/HighLevel/HostStandardReq.c [deleted file]
LUFA/Drivers/USB/HighLevel/HostStandardReq.h [deleted file]
LUFA/Drivers/USB/HighLevel/PipeStream.c [deleted file]
LUFA/Drivers/USB/HighLevel/PipeStream.h [deleted file]
LUFA/Drivers/USB/HighLevel/StdDescriptors.h [deleted file]
LUFA/Drivers/USB/HighLevel/StdRequestType.h [deleted file]
LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_Control_R.c [deleted file]
LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_Control_W.c [deleted file]
LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c [deleted file]
LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c [deleted file]
LUFA/Drivers/USB/HighLevel/USBMode.h [deleted file]
LUFA/Drivers/USB/HighLevel/USBTask.c [deleted file]
LUFA/Drivers/USB/HighLevel/USBTask.h [deleted file]
LUFA/Drivers/USB/LowLevel/Device.c [deleted file]
LUFA/Drivers/USB/LowLevel/Device.h [deleted file]
LUFA/Drivers/USB/LowLevel/Endpoint.c [deleted file]
LUFA/Drivers/USB/LowLevel/Endpoint.h [deleted file]
LUFA/Drivers/USB/LowLevel/Host.c [deleted file]
LUFA/Drivers/USB/LowLevel/Host.h [deleted file]
LUFA/Drivers/USB/LowLevel/OTG.h [deleted file]
LUFA/Drivers/USB/LowLevel/Pipe.c [deleted file]
LUFA/Drivers/USB/LowLevel/Pipe.h [deleted file]
LUFA/Drivers/USB/LowLevel/USBController.c [deleted file]
LUFA/Drivers/USB/LowLevel/USBController.h [deleted file]
LUFA/Drivers/USB/LowLevel/USBInterrupt.c [deleted file]
LUFA/Drivers/USB/LowLevel/USBInterrupt.h [deleted file]
LUFA/Drivers/USB/USB.h
LUFA/ManPages/DirectorySummaries.txt
LUFA/makefile

index dde8b95..070f8f7 100644 (file)
@@ -1 +1 @@
-<Project name="LUFA"><Folder name="Demos"><Folder name="Device"><Folder name="ClassDriver"><Folder name="AudioInput"><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.c"></File><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.h"></File><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.txt"></File><File path="Demos\Device\ClassDriver\AudioInput\Descriptors.c"></File><File path="Demos\Device\ClassDriver\AudioInput\Descriptors.h"></File><File path="Demos\Device\ClassDriver\AudioInput\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\AudioInput\makefile"></File><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.aps"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\ClassDriver\AudioOutput\Descriptors.c"></File><File path="Demos\Device\ClassDriver\AudioOutput\Descriptors.h"></File><File path="Demos\Device\ClassDriver\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\AudioOutput\makefile"></File><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.aps"></File></Folder><Folder name="DualVirtualSerial"><File path="Demos\Device\ClassDriver\DualVirtualSerial\Descriptors.c"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\Descriptors.h"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.c"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.h"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.txt"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\LUFA DualVirtualSerial.inf"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\makefile"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.aps"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\ClassDriver\GenericHID\Descriptors.c"></File><File path="Demos\Device\ClassDriver\GenericHID\Descriptors.h"></File><File path="Demos\Device\ClassDriver\GenericHID\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.c"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.h"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.txt"></File><File path="Demos\Device\ClassDriver\GenericHID\makefile"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.aps"></File></Folder><Folder name="Joystick"><File path="Demos\Device\ClassDriver\Joystick\Descriptors.c"></File><File path="Demos\Device\ClassDriver\Joystick\Descriptors.h"></File><File path="Demos\Device\ClassDriver\Joystick\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.c"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.h"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.txt"></File><File path="Demos\Device\ClassDriver\Joystick\makefile"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.aps"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\ClassDriver\Keyboard\Descriptors.c"></File><File path="Demos\Device\ClassDriver\Keyboard\Descriptors.h"></File><File path="Demos\Device\ClassDriver\Keyboard\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.c"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.h"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.txt"></File><File path="Demos\Device\ClassDriver\Keyboard\makefile"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.aps"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\ClassDriver\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\makefile"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.aps"></File></Folder><Folder name="KeyboardMouseMultiReport"><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\Descriptors.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\Descriptors.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.txt"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\makefile"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.aps"></File></Folder><Folder name="MassStorage"><Folder name="Lib"><File path="Demos\Device\ClassDriver\MassStorage\Lib\DataflashManager.c"></File><File path="Demos\Device\ClassDriver\MassStorage\Lib\DataflashManager.h"></File><File path="Demos\Device\ClassDriver\MassStorage\Lib\SCSI.c"></File><File path="Demos\Device\ClassDriver\MassStorage\Lib\SCSI.h"></File></Folder><File path="Demos\Device\ClassDriver\MassStorage\Descriptors.c"></File><File path="Demos\Device\ClassDriver\MassStorage\Descriptors.h"></File><File path="Demos\Device\ClassDriver\MassStorage\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\MassStorage\makefile"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.c"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.h"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.txt"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.aps"></File></Folder><Folder name="MassStorageKeyboard"><Folder name="Lib"><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\DataflashManager.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\DataflashManager.h"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\SCSI.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\SCSI.h"></File></Folder><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Descriptors.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Descriptors.h"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\makefile"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.h"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.txt"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.aps"></File></Folder><Folder name="MIDI"><File path="Demos\Device\ClassDriver\MIDI\Descriptors.c"></File><File path="Demos\Device\ClassDriver\MIDI\Descriptors.h"></File><File path="Demos\Device\ClassDriver\MIDI\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\MIDI\makefile"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.c"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.h"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.txt"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.aps"></File></Folder><Folder name="Mouse"><File path="Demos\Device\ClassDriver\Mouse\Descriptors.c"></File><File path="Demos\Device\ClassDriver\Mouse\Descriptors.h"></File><File path="Demos\Device\ClassDriver\Mouse\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\Mouse\makefile"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.c"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.h"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.txt"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.aps"></File></Folder><Folder name="RNDISEthernet"><Folder name="Lib"><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Webserver.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ARP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ARP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\DHCP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\DHCP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Ethernet.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Ethernet.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\EthernetProtocols.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ICMP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ICMP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\IP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\IP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ProtocolDecoders.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ProtocolDecoders.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\TCP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\TCP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\UDP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\UDP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Webserver.c"></File></Folder><File path="Demos\Device\ClassDriver\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\makefile"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.aps"></File></Folder><Folder name="VirtualSerial"><File path="Demos\Device\ClassDriver\VirtualSerial\Descriptors.c"></File><File path="Demos\Device\ClassDriver\VirtualSerial\Descriptors.h"></File><File path="Demos\Device\ClassDriver\VirtualSerial\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\VirtualSerial\LUFA VirtualSerial.inf"></File><File path="Demos\Device\ClassDriver\VirtualSerial\makefile"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.c"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.h"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.txt"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.aps"></File></Folder><Folder name="VirtualSerialMouse"><File path="Demos\Device\ClassDriver\VirtualSerialMouse\Descriptors.c"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\Descriptors.h"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\LUFA VirtualSerialMouse.inf"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\makefile"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.c"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.h"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.txt"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.aps"></File></Folder><File path="Demos\Device\ClassDriver\makefile"></File></Folder><Folder name="LowLevel"><Folder name="AudioInput"><File path="Demos\Device\LowLevel\AudioInput\AudioInput.c"></File><File path="Demos\Device\LowLevel\AudioInput\AudioInput.h"></File><File path="Demos\Device\LowLevel\AudioInput\AudioInput.txt"></File><File path="Demos\Device\LowLevel\AudioInput\Descriptors.c"></File><File path="Demos\Device\LowLevel\AudioInput\Descriptors.h"></File><File path="Demos\Device\LowLevel\AudioInput\Doxygen.conf"></File><File path="Demos\Device\LowLevel\AudioInput\makefile"></File><File path="Demos\Device\LowLevel\AudioInput\AudioInput.aps"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\LowLevel\AudioOutput\Descriptors.c"></File><File path="Demos\Device\LowLevel\AudioOutput\Descriptors.h"></File><File path="Demos\Device\LowLevel\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\LowLevel\AudioOutput\makefile"></File><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.aps"></File></Folder><Folder name="DualVirtualSerial"><File path="Demos\Device\LowLevel\DualVirtualSerial\Descriptors.c"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\Descriptors.h"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\Doxygen.conf"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.c"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.h"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.txt"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\LUFA DualVirtualSerial.inf"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\makefile"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.aps"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\LowLevel\GenericHID\Descriptors.c"></File><File path="Demos\Device\LowLevel\GenericHID\Descriptors.h"></File><File path="Demos\Device\LowLevel\GenericHID\Doxygen.conf"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.c"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.h"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.txt"></File><File path="Demos\Device\LowLevel\GenericHID\makefile"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.aps"></File></Folder><Folder name="Joystick"><File path="Demos\Device\LowLevel\Joystick\Descriptors.c"></File><File path="Demos\Device\LowLevel\Joystick\Descriptors.h"></File><File path="Demos\Device\LowLevel\Joystick\Doxygen.conf"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.c"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.h"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.txt"></File><File path="Demos\Device\LowLevel\Joystick\makefile"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.aps"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\LowLevel\Keyboard\Descriptors.c"></File><File path="Demos\Device\LowLevel\Keyboard\Descriptors.h"></File><File path="Demos\Device\LowLevel\Keyboard\Doxygen.conf"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.c"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.h"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.txt"></File><File path="Demos\Device\LowLevel\Keyboard\makefile"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.aps"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\LowLevel\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\LowLevel\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\LowLevel\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\LowLevel\KeyboardMouse\makefile"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.aps"></File></Folder><Folder name="MassStorage"><Folder name="Lib"><File path="Demos\Device\LowLevel\MassStorage\Lib\DataflashManager.c"></File><File path="Demos\Device\LowLevel\MassStorage\Lib\DataflashManager.h"></File><File path="Demos\Device\LowLevel\MassStorage\Lib\SCSI.c"></File><File path="Demos\Device\LowLevel\MassStorage\Lib\SCSI.h"></File></Folder><File path="Demos\Device\LowLevel\MassStorage\Descriptors.c"></File><File path="Demos\Device\LowLevel\MassStorage\Descriptors.h"></File><File path="Demos\Device\LowLevel\MassStorage\Doxygen.conf"></File><File path="Demos\Device\LowLevel\MassStorage\makefile"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.c"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.h"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.txt"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.aps"></File></Folder><Folder name="MIDI"><File path="Demos\Device\LowLevel\MIDI\Descriptors.c"></File><File path="Demos\Device\LowLevel\MIDI\Descriptors.h"></File><File path="Demos\Device\LowLevel\MIDI\Doxygen.conf"></File><File path="Demos\Device\LowLevel\MIDI\makefile"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.c"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.h"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.txt"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.aps"></File></Folder><Folder name="Mouse"><File path="Demos\Device\LowLevel\Mouse\Descriptors.c"></File><File path="Demos\Device\LowLevel\Mouse\Descriptors.h"></File><File path="Demos\Device\LowLevel\Mouse\Doxygen.conf"></File><File path="Demos\Device\LowLevel\Mouse\makefile"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.c"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.h"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.txt"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.aps"></File></Folder><Folder name="RNDISEthernet"><Folder name="Lib"><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Webserver.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ARP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ARP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\DHCP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\DHCP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Ethernet.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Ethernet.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\EthernetProtocols.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ICMP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ICMP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\IP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\IP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ProtocolDecoders.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ProtocolDecoders.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\RNDIS.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\RNDIS.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\TCP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\TCP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\UDP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\UDP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Webserver.c"></File></Folder><File path="Demos\Device\LowLevel\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\LowLevel\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\LowLevel\RNDISEthernet\makefile"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.aps"></File></Folder><Folder name="VirtualSerial"><File path="Demos\Device\LowLevel\VirtualSerial\Descriptors.c"></File><File path="Demos\Device\LowLevel\VirtualSerial\Descriptors.h"></File><File path="Demos\Device\LowLevel\VirtualSerial\Doxygen.conf"></File><File path="Demos\Device\LowLevel\VirtualSerial\LUFA VirtualSerial.inf"></File><File path="Demos\Device\LowLevel\VirtualSerial\makefile"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.c"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.h"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.txt"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.aps"></File></Folder><File path="Demos\Device\LowLevel\makefile"></File></Folder><Folder name="Incomplete"><Folder name="SideShow"><Folder name="Lib"><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowApplications.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowApplications.h"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommands.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommands.h"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommon.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommon.h"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowContent.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowContent.h"></File></Folder><File path="Demos\Device\Incomplete\Sideshow\Descriptors.c"></File><File path="Demos\Device\Incomplete\Sideshow\Descriptors.h"></File><File path="Demos\Device\Incomplete\Sideshow\makefile"></File><File path="Demos\Device\Incomplete\Sideshow\Sideshow.c"></File><File path="Demos\Device\Incomplete\Sideshow\Sideshow.h"></File></Folder><Folder name="TestAndMeasurement"><File path="Demos\Device\Incomplete\TestAndMeasurement\Descriptors.c"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\Descriptors.h"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\TestAndMeasurement.c"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\TestAndMeasurement.h"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\makefile"></File></Folder></Folder><File path="Demos\Device\makefile"></File></Folder><Folder name="Host"><Folder name="ClassDriver"><Folder name="JoystickHostWithParser"><File path="Demos\Host\ClassDriver\JoystickHostWithParser\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.c"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.h"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.txt"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\makefile"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.aps"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\ClassDriver\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\ClassDriver\KeyboardHost\makefile"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.aps"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\makefile"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.aps"></File></Folder><Folder name="MassStorageHost"><File path="Demos\Host\ClassDriver\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MassStorageHost\makefile"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.aps"></File></Folder><Folder name="MIDIHost"><File path="Demos\Host\ClassDriver\MIDIHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MIDIHost\makefile"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.c"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.h"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.txt"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.aps"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\ClassDriver\MouseHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MouseHost\makefile"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.c"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.h"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.txt"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.aps"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\ClassDriver\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\makefile"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.txt"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.aps"></File></Folder><Folder name="PrinterHost"><File path="Demos\Host\ClassDriver\PrinterHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\PrinterHost\makefile"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.c"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.h"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.txt"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.aps"></File></Folder><Folder name="RNDISEthernetHost"><File path="Demos\Host\ClassDriver\RNDISEthernetHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\makefile"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.c"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.h"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.txt"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.aps"></File></Folder><Folder name="StillImageHost"><File path="Demos\Host\ClassDriver\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\StillImageHost\makefile"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.txt"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.aps"></File></Folder><Folder name="VirtualSerialHost"><File path="Demos\Host\ClassDriver\VirtualSerialHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\makefile"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.c"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.h"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.txt"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.aps"></File></Folder><File path="Demos\Host\ClassDriver\makefile"></File></Folder><Folder name="LowLevel"><Folder name="GenericHIDHost"><File path="Demos\Host\LowLevel\GenericHIDHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\GenericHIDHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\GenericHIDHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.c"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.h"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.txt"></File><File path="Demos\Host\LowLevel\GenericHIDHost\makefile"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.aps"></File></Folder><Folder name="JoystickHostWithParser"><File path="Demos\Host\LowLevel\JoystickHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\Doxygen.conf"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\HIDReport.c"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\HIDReport.h"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.c"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.h"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.txt"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\makefile"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.aps"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\LowLevel\KeyboardHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\KeyboardHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\LowLevel\KeyboardHost\makefile"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.aps"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\LowLevel\KeyboardHostWithParser\makefile"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\HIDReport.c"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\HIDReport.h"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.aps"></File></Folder><Folder name="MassStorageHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\MassStorageHost\Lib\MassStoreCommands.c"></File><File path="Demos\Host\LowLevel\MassStorageHost\Lib\MassStoreCommands.h"></File></Folder><File path="Demos\Host\LowLevel\MassStorageHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MassStorageHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MassStorageHost\makefile"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.aps"></File></Folder><Folder name="MIDIHost"><File path="Demos\Host\LowLevel\MIDIHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MIDIHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MIDIHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MIDIHost\makefile"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.c"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.h"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.txt"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.aps"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\LowLevel\MouseHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MouseHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MouseHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MouseHost\makefile"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.c"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.h"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.txt"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.aps"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.txt"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\HIDReport.c"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\HIDReport.h"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\makefile"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.aps"></File></Folder><Folder name="PrinterHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\PrinterHost\Lib\PrinterCommands.c"></File><File path="Demos\Host\LowLevel\PrinterHost\Lib\PrinterCommands.h"></File></Folder><File path="Demos\Host\LowLevel\PrinterHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\PrinterHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\PrinterHost\makefile"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.c"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.h"></File><File path="Demos\Host\LowLevel\PrinterHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.txt"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.aps"></File></Folder><Folder name="RNDISEthernetHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\RNDISEthernetHost\Lib\RNDISCommands.c"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\Lib\RNDISCommands.h"></File></Folder><File path="Demos\Host\LowLevel\RNDISEthernetHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\makefile"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISEthernetHost.c"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISEthernetHost.h"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISHost.txt"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISEthernetHost.aps"></File></Folder><Folder name="StillImageHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\StillImageHost\Lib\StillImageCommands.c"></File><File path="Demos\Host\LowLevel\StillImageHost\Lib\StillImageCommands.h"></File><File path="Demos\Host\LowLevel\StillImageHost\Lib\PIMACodes.h"></File></Folder><File path="Demos\Host\LowLevel\StillImageHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\StillImageHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\StillImageHost\makefile"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.txt"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.aps"></File></Folder><Folder name="VirtualSerialHost"><File path="Demos\Host\LowLevel\VirtualSerialHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\makefile"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.c"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.h"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.txt"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.aps"></File></Folder><File path="Demos\Host\LowLevel\makefile"></File></Folder><Folder name="Incomplete"><Folder name="BluetoothHost"><Folder name="Lib"><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothACLPackets.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothACLPackets.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothClassCodes.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothHCICommands.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothHCICommands.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothStack.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothStack.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDPServices.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDPServices.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMM.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMM.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDP.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDP.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMMControl.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMMControl.h"></File></Folder><File path="Demos\Host\Incomplete\BluetoothHost\makefile"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothHost.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothHost.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\ConfigDescriptor.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\ConfigDescriptor.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\DeviceDescriptor.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\DeviceDescriptor.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Doxygen.conf"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothEvents.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothEvents.h"></File></Folder></Folder><File path="Demos\Host\makefile"></File></Folder><Folder name="DualRole"><Folder name="ClassDriver"><Folder name="MouseHostDevice"><File path="Demos\DualRole\ClassDriver\MouseHostDevice\Doxygen.conf"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\makefile"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\Descriptors.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\Descriptors.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\DeviceFunctions.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\HostFunctions.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\HostFunctions.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\DeviceFunctions.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.txt"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.aps"></File></Folder><File path="Demos\DualRole\ClassDriver\makefile"></File></Folder><File path="Demos\DualRole\makefile"></File></Folder><File path="Demos\makefile"></File></Folder><Folder name="LUFA"><Folder name="Common"><File path="LUFA\Common\Common.h"></File><File path="LUFA\Common\BoardTypes.h"></File><File path="LUFA\Common\Attributes.h"></File><File path="LUFA\Common\Architectures.h"></File></Folder><Folder name="Drivers"><Folder name="USB"><Folder name="LowLevel"><File path="LUFA\Drivers\USB\LowLevel\Pipe.c"></File><File path="LUFA\Drivers\USB\LowLevel\Pipe.h"></File><File path="LUFA\Drivers\USB\LowLevel\Device.h"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.c"></File><File path="LUFA\Drivers\USB\LowLevel\Endpoint.h"></File><File path="LUFA\Drivers\USB\LowLevel\Host.c"></File><File path="LUFA\Drivers\USB\LowLevel\Host.h"></File><File path="LUFA\Drivers\USB\LowLevel\OTG.h"></File><File path="LUFA\Drivers\USB\LowLevel\USBInterrupt.c"></File><File path="LUFA\Drivers\USB\LowLevel\USBInterrupt.h"></File><File path="LUFA\Drivers\USB\LowLevel\Device.c"></File><File path="LUFA\Drivers\USB\LowLevel\USBController.c"></File><File path="LUFA\Drivers\USB\LowLevel\USBController.h"></File></Folder><Folder name="HighLevel"><Folder name="Template"><File path="LUFA\Drivers\USB\HighLevel\Template\Template_Pipe_RW.c"></File><File path="LUFA\Drivers\USB\HighLevel\Template\Template_Endpoint_RW.c"></File><File path="LUFA\Drivers\USB\HighLevel\Template\Template_Endpoint_Control_W.c"></File><File path="LUFA\Drivers\USB\HighLevel\Template\Template_Endpoint_Control_R.c"></File></Folder><File path="LUFA\Drivers\USB\HighLevel\USBTask.h"></File><File path="LUFA\Drivers\USB\HighLevel\Events.c"></File><File path="LUFA\Drivers\USB\HighLevel\Events.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBTask.c"></File><File path="LUFA\Drivers\USB\HighLevel\StdDescriptors.h"></File><File path="LUFA\Drivers\USB\HighLevel\StdRequestType.h"></File><File path="LUFA\Drivers\USB\HighLevel\USBMode.h"></File><File path="LUFA\Drivers\USB\HighLevel\ConfigDescriptor.c"></File><File path="LUFA\Drivers\USB\HighLevel\ConfigDescriptor.h"></File><File path="LUFA\Drivers\USB\HighLevel\DeviceStandardReq.c"></File><File path="LUFA\Drivers\USB\HighLevel\DeviceStandardReq.h"></File><File path="LUFA\Drivers\USB\HighLevel\HostStandardReq.c"></File><File path="LUFA\Drivers\USB\HighLevel\HostStandardReq.h"></File><File path="LUFA\Drivers\USB\HighLevel\EndpointStream.h"></File><File path="LUFA\Drivers\USB\HighLevel\EndpointStream.c"></File><File path="LUFA\Drivers\USB\HighLevel\PipeStream.h"></File><File path="LUFA\Drivers\USB\HighLevel\PipeStream.c"></File></Folder><Folder name="Class"><Folder name="Device"><File path="LUFA\Drivers\USB\Class\Device\HID.c"></File><File path="LUFA\Drivers\USB\Class\Device\HID.h"></File><File path="LUFA\Drivers\USB\Class\Device\CDC.c"></File><File path="LUFA\Drivers\USB\Class\Device\CDC.h"></File><File path="LUFA\Drivers\USB\Class\Device\RNDIS.c"></File><File path="LUFA\Drivers\USB\Class\Device\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\Device\MassStorage.c"></File><File path="LUFA\Drivers\USB\Class\Device\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\Device\Audio.c"></File><File path="LUFA\Drivers\USB\Class\Device\Audio.h"></File><File path="LUFA\Drivers\USB\Class\Device\MIDI.c"></File><File path="LUFA\Drivers\USB\Class\Device\MIDI.h"></File></Folder><Folder name="Host"><File path="LUFA\Drivers\USB\Class\Host\CDC.c"></File><File path="LUFA\Drivers\USB\Class\Host\CDC.h"></File><File path="LUFA\Drivers\USB\Class\Host\HID.c"></File><File path="LUFA\Drivers\USB\Class\Host\HID.h"></File><File path="LUFA\Drivers\USB\Class\Host\MassStorage.c"></File><File path="LUFA\Drivers\USB\Class\Host\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\Host\StillImage.c"></File><File path="LUFA\Drivers\USB\Class\Host\StillImage.h"></File><File path="LUFA\Drivers\USB\Class\Host\MIDI.c"></File><File path="LUFA\Drivers\USB\Class\Host\MIDI.h"></File><File path="LUFA\Drivers\USB\Class\Host\Printer.c"></File><File path="LUFA\Drivers\USB\Class\Host\Printer.h"></File><File path="LUFA\Drivers\USB\Class\Host\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\Host\RNDIS.c"></File></Folder><Folder name="Common"><File path="LUFA\Drivers\USB\Class\Common\Audio.h"></File><File path="LUFA\Drivers\USB\Class\Common\CDC.h"></File><File path="LUFA\Drivers\USB\Class\Common\HID.h"></File><File path="LUFA\Drivers\USB\Class\Common\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\Common\MIDI.h"></File><File path="LUFA\Drivers\USB\Class\Common\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\Common\StillImage.h"></File><File path="LUFA\Drivers\USB\Class\Common\Printer.h"></File><File path="LUFA\Drivers\USB\Class\Common\HIDParser.c"></File><File path="LUFA\Drivers\USB\Class\Common\HIDParser.h"></File><File path="LUFA\Drivers\USB\Class\Common\HIDReportData.h"></File></Folder><File path="LUFA\Drivers\USB\Class\Audio.h"></File><File path="LUFA\Drivers\USB\Class\CDC.h"></File><File path="LUFA\Drivers\USB\Class\HID.h"></File><File path="LUFA\Drivers\USB\Class\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\MIDI.h"></File><File path="LUFA\Drivers\USB\Class\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\StillImage.h"></File><File path="LUFA\Drivers\USB\Class\Printer.h"></File></Folder><File path="LUFA\Drivers\USB\USB.h"></File></Folder><Folder name="Misc"><File path="LUFA\Drivers\Misc\TerminalCodes.h"></File><File path="LUFA\Drivers\Misc\RingBuffer.h"></File><File path="LUFA\Drivers\Misc\AT45DB321C.h"></File><File path="LUFA\Drivers\Misc\AT45DB642D.h"></File></Folder><Folder name="Board"><Folder name="ADAFRUITU4"><File path="LUFA\Drivers\Board\ADAFRUITU4\LEDs.h"></File></Folder><Folder name="ATAVRUSBRF01"><File path="LUFA\Drivers\Board\ATAVRUSBRF01\LEDs.h"></File><File path="LUFA\Drivers\Board\ATAVRUSBRF01\Buttons.h"></File></Folder><Folder name="BENITO"><File path="LUFA\Drivers\Board\BENITO\LEDs.h"></File><File path="LUFA\Drivers\Board\BENITO\Buttons.h"></File></Folder><Folder name="BUMBLEB"><File path="LUFA\Drivers\Board\BUMBLEB\Buttons.h"></File><File path="LUFA\Drivers\Board\BUMBLEB\Joystick.h"></File><File path="LUFA\Drivers\Board\BUMBLEB\LEDs.h"></File></Folder><Folder name="BUI"><File path="LUFA\Drivers\Board\BUI\LEDs.h"></File></Folder><Folder name="BLACKCAT"><File path="LUFA\Drivers\Board\BLACKCAT\LEDs.h"></File></Folder><Folder name="CULV3"><File path="LUFA\Drivers\Board\CULV3\Buttons.h"></File><File path="LUFA\Drivers\Board\CULV3\LEDs.h"></File></Folder><Folder name="EVK527"><File path="LUFA\Drivers\Board\EVK527\Buttons.h"></File><File path="LUFA\Drivers\Board\EVK527\LEDs.h"></File><File path="LUFA\Drivers\Board\EVK527\Joystick.h"></File><File path="LUFA\Drivers\Board\EVK527\Dataflash.h"></File></Folder><Folder name="JMDBU2"><File path="LUFA\Drivers\Board\JMDBU2\Buttons.h"></File><File path="LUFA\Drivers\Board\JMDBU2\LEDs.h"></File></Folder><Folder name="MAXIMUS"><File path="LUFA\Drivers\Board\MAXIMUS\LEDs.h"></File></Folder><Folder name="MICROSIN162"><File path="LUFA\Drivers\Board\MICROSIN162\LEDs.h"></File><File path="LUFA\Drivers\Board\MICROSIN162\Buttons.h"></File></Folder><Folder name="MINIMUS"><File path="LUFA\Drivers\Board\MINIMUS\Buttons.h"></File><File path="LUFA\Drivers\Board\MINIMUS\LEDs.h"></File></Folder><Folder name="OLIMEX162"><File path="LUFA\Drivers\Board\OLIMEX162\LEDs.h"></File><File path="LUFA\Drivers\Board\OLIMEX162\Buttons.h"></File></Folder><Folder name="RZUSBSTICK"><File path="LUFA\Drivers\Board\RZUSBSTICK\LEDs.h"></File></Folder><Folder name="SPARKFUN8U2"><File path="LUFA\Drivers\Board\SPARKFUN8U2\LEDs.h"></File></Folder><Folder name="STK525"><File path="LUFA\Drivers\Board\STK525\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK525\Joystick.h"></File><File path="LUFA\Drivers\Board\STK525\LEDs.h"></File><File path="LUFA\Drivers\Board\STK525\Buttons.h"></File></Folder><Folder name="STK526"><File path="LUFA\Drivers\Board\STK526\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK526\Joystick.h"></File><File path="LUFA\Drivers\Board\STK526\LEDs.h"></File><File path="LUFA\Drivers\Board\STK526\Buttons.h"></File></Folder><Folder name="TEENSY"><File path="LUFA\Drivers\Board\TEENSY\LEDs.h"></File></Folder><Folder name="UDIP"><File path="LUFA\Drivers\Board\UDIP\LEDs.h"></File><File path="LUFA\Drivers\Board\UDIP\Buttons.h"></File></Folder><Folder name="UNO"><File path="LUFA\Drivers\Board\UNO\LEDs.h"></File></Folder><Folder name="USBFOO"><File path="LUFA\Drivers\Board\USBFOO\Buttons.h"></File><File path="LUFA\Drivers\Board\USBFOO\LEDS.h"></File></Folder><Folder name="USBKEY"><File path="LUFA\Drivers\Board\USBKEY\Dataflash.h"></File><File path="LUFA\Drivers\Board\USBKEY\Joystick.h"></File><File path="LUFA\Drivers\Board\USBKEY\LEDs.h"></File><File path="LUFA\Drivers\Board\USBKEY\Buttons.h"></File></Folder><Folder name="USBTINYMKII"><File path="LUFA\Drivers\Board\USBTINYMKII\LEDs.h"></File><File path="LUFA\Drivers\Board\USBTINYMKII\Buttons.h"></File></Folder><Folder name="XPLAIN"><File path="LUFA\Drivers\Board\XPLAIN\LEDs.h"></File><File path="LUFA\Drivers\Board\XPLAIN\Dataflash.h"></File></Folder><File path="LUFA\Drivers\Board\Temperature.h"></File><File path="LUFA\Drivers\Board\Dataflash.h"></File><File path="LUFA\Drivers\Board\Joystick.h"></File><File path="LUFA\Drivers\Board\Temperature.c"></File><File path="LUFA\Drivers\Board\LEDs.h"></File><File path="LUFA\Drivers\Board\Buttons.h"></File></Folder><Folder name="Peripheral"><Folder name="AVR8"><File path="LUFA\Drivers\Peripheral\AVR8\ADC.h"></File><File path="LUFA\Drivers\Peripheral\AVR8\Serial.c"></File><File path="LUFA\Drivers\Peripheral\AVR8\Serial.h"></File><File path="LUFA\Drivers\Peripheral\AVR8\SPI.h"></File><File path="LUFA\Drivers\Peripheral\AVR8\TWI.c"></File><File path="LUFA\Drivers\Peripheral\AVR8\TWI.h"></File></Folder><File path="LUFA\Drivers\Peripheral\ADC.h"></File><File path="LUFA\Drivers\Peripheral\TWI.h"></File><File path="LUFA\Drivers\Peripheral\Serial.h"></File><File path="LUFA\Drivers\Peripheral\SPI.h"></File></Folder></Folder><Folder name="ManPages"><File path="LUFA\ManPages\AboutLUFA.txt"></File><File path="LUFA\ManPages\BuildingLinkableLibraries.txt"></File><File path="LUFA\ManPages\ChangeLog.txt"></File><File path="LUFA\ManPages\CompileTimeTokens.txt"></File><File path="LUFA\ManPages\DevelopingWithLUFA.txt"></File><File path="LUFA\ManPages\DeviceSupport.txt"></File><File path="LUFA\ManPages\DirectorySummaries.txt"></File><File path="LUFA\ManPages\Donating.txt"></File><File path="LUFA\ManPages\FutureChanges.txt"></File><File path="LUFA\ManPages\GettingStarted.txt"></File><File path="LUFA\ManPages\Groups.txt"></File><File path="LUFA\ManPages\LibraryResources.txt"></File><File path="LUFA\ManPages\LUFAPoweredProjects.txt"></File><File path="LUFA\ManPages\MainPage.txt"></File><File path="LUFA\ManPages\MigrationInformation.txt"></File><File path="LUFA\ManPages\VIDAndPIDValues.txt"></File><File path="LUFA\ManPages\WritingBoardDrivers.txt"></File><File path="LUFA\ManPages\ConfiguringApps.txt"></File><File path="LUFA\ManPages\CompilingApps.txt"></File><File path="LUFA\ManPages\ProgrammingApps.txt"></File><File path="LUFA\ManPages\LibraryApps.txt"></File><File path="LUFA\ManPages\WhyUseLUFA.txt"></File><File path="LUFA\ManPages\LUFAvsAtmelStack.txt"></File><File path="LUFA\ManPages\AlternativeStacks.txt"></File><File path="LUFA\ManPages\SoftwareBootloaderJump.txt"></File><File path="LUFA\ManPages\LicenseInfo.txt"></File></Folder><Folder name="Scheduler"><File path="LUFA\Scheduler\Scheduler.c"></File><File path="LUFA\Scheduler\Scheduler.h"></File></Folder><Folder name="CodeTemplates"><Folder name="DriverStubs"><File path="LUFA\CodeTemplates\DriverStubs\Buttons.h"></File><File path="LUFA\CodeTemplates\DriverStubs\Dataflash.h"></File><File path="LUFA\CodeTemplates\DriverStubs\Joystick.h"></File><File path="LUFA\CodeTemplates\DriverStubs\LEDs.h"></File></Folder><File path="LUFA\CodeTemplates\makefile_template"></File></Folder><File path="LUFA\makefile"></File><File path="LUFA\Version.h"></File><File path="LUFA\Doxygen.conf"></File><File path="LUFA\License.txt"></File></Folder><Folder name="Bootloaders"><Folder name="CDC"><File path="Bootloaders\CDC\BootloaderCDC.c"></File><File path="Bootloaders\CDC\BootloaderCDC.h"></File><File path="Bootloaders\CDC\Descriptors.c"></File><File path="Bootloaders\CDC\Descriptors.h"></File><File path="Bootloaders\CDC\makefile"></File><File path="Bootloaders\CDC\LUFA CDC Bootloader.inf"></File><File path="Bootloaders\CDC\Doxygen.conf"></File><File path="Bootloaders\CDC\BootloaderCDC.txt"></File><File path="Bootloaders\CDC\BootloaderCDC.aps"></File></Folder><Folder name="DFU"><File path="Bootloaders\DFU\BootloaderDFU.c"></File><File path="Bootloaders\DFU\BootloaderDFU.h"></File><File path="Bootloaders\DFU\Descriptors.c"></File><File path="Bootloaders\DFU\Descriptors.h"></File><File path="Bootloaders\DFU\makefile"></File><File path="Bootloaders\DFU\BootloaderDFU.txt"></File><File path="Bootloaders\DFU\Doxygen.conf"></File><File path="Bootloaders\DFU\BootloaderDFU.aps"></File></Folder><Folder name="HID"><Folder name="HostLoaderApp"><File path="Bootloaders\HID\HostLoaderApp\gpl3.txt"></File><File path="Bootloaders\HID\HostLoaderApp\Makefile"></File><File path="Bootloaders\HID\HostLoaderApp\Makefile.bsd"></File><File path="Bootloaders\HID\HostLoaderApp\hid_bootloader_cli.c"></File></Folder><File path="Bootloaders\HID\Descriptors.c"></File><File path="Bootloaders\HID\Descriptors.h"></File><File path="Bootloaders\HID\makefile"></File><File path="Bootloaders\HID\BootloaderHID.txt"></File><File path="Bootloaders\HID\BootloaderHID.c"></File><File path="Bootloaders\HID\BootloaderHID.h"></File><File path="Bootloaders\HID\Doxygen.conf"></File><File path="Bootloaders\HID\BootloaderHID.aps"></File></Folder><File path="Bootloaders\makefile"></File></Folder><Folder name="Projects"><Folder name="AVRISP-MKII"><Folder name="Lib"><Folder name="ISP"><File path="Projects\AVRISP-MKII\Lib\ISP\ISPProtocol.c"></File><File path="Projects\AVRISP-MKII\Lib\ISP\ISPProtocol.h"></File><File path="Projects\AVRISP-MKII\Lib\ISP\ISPTarget.c"></File><File path="Projects\AVRISP-MKII\Lib\ISP\ISPTarget.h"></File></Folder><Folder name="XPROG"><File path="Projects\AVRISP-MKII\Lib\XPROG\TINYNVM.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\TINYNVM.h"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XMEGANVM.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XMEGANVM.h"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGProtocol.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGProtocol.h"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGTarget.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGTarget.h"></File></Folder><File path="Projects\AVRISP-MKII\Lib\V2Protocol.c"></File><File path="Projects\AVRISP-MKII\Lib\V2Protocol.h"></File><File path="Projects\AVRISP-MKII\Lib\V2ProtocolConstants.h"></File><File path="Projects\AVRISP-MKII\Lib\V2ProtocolParams.c"></File><File path="Projects\AVRISP-MKII\Lib\V2ProtocolParams.h"></File></Folder><File path="Projects\AVRISP-MKII\Descriptors.c"></File><File path="Projects\AVRISP-MKII\Descriptors.h"></File><File path="Projects\AVRISP-MKII\Doxygen.conf"></File><File path="Projects\AVRISP-MKII\makefile"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.c"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.h"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.txt"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.aps"></File></Folder><Folder name="Benito"><File path="Projects\Benito\Benito.c"></File><File path="Projects\Benito\Benito.h"></File><File path="Projects\Benito\Descriptors.c"></File><File path="Projects\Benito\Descriptors.h"></File><File path="Projects\Benito\Doxygen.conf"></File><File path="Projects\Benito\makefile"></File><File path="Projects\Benito\Benito.txt"></File><File path="Projects\Benito\Benito Programmer.inf"></File><File path="Projects\Benito\Benito.aps"></File></Folder><Folder name="LEDNotifier"><Folder name="CPUUsageApp"><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.cs"></File><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.csproj"></File><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.Designer.cs"></File><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.resx"></File><File path="Projects\LEDNotifier\CPUUsageApp\Program.cs"></File></Folder><Folder name="HotmailNotifierApp"><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.cs"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.csproj"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.Designer.cs"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.resx"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\Program.cs"></File></Folder><Folder name="LEDMixerApp"><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.cs"></File><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.csproj"></File><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.Designer.cs"></File><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.resx"></File><File path="Projects\LEDNotifier\LEDMixerApp\Program.cs"></File></Folder><File path="Projects\LEDNotifier\Descriptors.c"></File><File path="Projects\LEDNotifier\Descriptors.h"></File><File path="Projects\LEDNotifier\Doxygen.conf"></File><File path="Projects\LEDNotifier\LEDNotifier.c"></File><File path="Projects\LEDNotifier\LEDNotifier.h"></File><File path="Projects\LEDNotifier\LEDNotifier.txt"></File><File path="Projects\LEDNotifier\LUFA LED Notifier.inf"></File><File path="Projects\LEDNotifier\makefile"></File><File path="Projects\LEDNotifier\LEDNotifier.aps"></File></Folder><Folder name="MagStripe"><Folder name="Lib"><File path="Projects\Magstripe\Lib\CircularBitBuffer.c"></File><File path="Projects\Magstripe\Lib\CircularBitBuffer.h"></File><File path="Projects\Magstripe\Lib\MagstripeHW.h"></File></Folder><File path="Projects\Magstripe\Descriptors.c"></File><File path="Projects\Magstripe\Descriptors.h"></File><File path="Projects\Magstripe\Magstripe.c"></File><File path="Projects\Magstripe\Magstripe.h"></File><File path="Projects\Magstripe\makefile"></File><File path="Projects\Magstripe\Magstripe.txt"></File><File path="Projects\Magstripe\Doxygen.conf"></File><File path="Projects\Magstripe\Magstripe.aps"></File></Folder><Folder name="MIDIToneGenerator"><File path="Projects\MIDIToneGenerator\Descriptors.c"></File><File path="Projects\MIDIToneGenerator\Descriptors.h"></File><File path="Projects\MIDIToneGenerator\makefile"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.c"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.h"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.txt"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.aps"></File></Folder><Folder name="MissileLauncher"><File path="Projects\MissileLauncher\ConfigDescriptor.c"></File><File path="Projects\MissileLauncher\ConfigDescriptor.h"></File><File path="Projects\MissileLauncher\Doxygen.conf"></File><File path="Projects\MissileLauncher\makefile"></File><File path="Projects\MissileLauncher\MissileLauncher.c"></File><File path="Projects\MissileLauncher\MissileLauncher.h"></File><File path="Projects\MissileLauncher\MissileLauncher.txt"></File><File path="Projects\MissileLauncher\MissileLauncher.aps"></File></Folder><Folder name="RelayBoard"><File path="Projects\RelayBoard\Descriptors.c"></File><File path="Projects\RelayBoard\Descriptors.h"></File><File path="Projects\RelayBoard\Doxygen.conf"></File><File path="Projects\RelayBoard\makefile"></File><File path="Projects\RelayBoard\RelayBoard.c"></File><File path="Projects\RelayBoard\RelayBoard.h"></File><File path="Projects\RelayBoard\RelayBoard.txt"></File><File path="Projects\RelayBoard\RelayBoard.aps"></File></Folder><Folder name="TempDataLogger"><Folder name="Lib"><Folder name="FATFs"><File path="Projects\TempDataLogger\Lib\FATFs\diskio.c"></File><File path="Projects\TempDataLogger\Lib\FATFs\diskio.h"></File><File path="Projects\TempDataLogger\Lib\FATFs\ff.c"></File><File path="Projects\TempDataLogger\Lib\FATFs\ff.h"></File><File path="Projects\TempDataLogger\Lib\FATFs\ffconf.h"></File><File path="Projects\TempDataLogger\Lib\FATFs\integer.h"></File></Folder><File path="Projects\TempDataLogger\Lib\DataflashManager.c"></File><File path="Projects\TempDataLogger\Lib\DataflashManager.h"></File><File path="Projects\TempDataLogger\Lib\DS1307.c"></File><File path="Projects\TempDataLogger\Lib\DS1307.h"></File><File path="Projects\TempDataLogger\Lib\SCSI.c"></File><File path="Projects\TempDataLogger\Lib\SCSI.h"></File></Folder><Folder name="TempLogHostApp"><File path="Projects\TempDataLogger\TempLogHostApp\DataLoggerSettings.cs"></File><File path="Projects\TempDataLogger\TempLogHostApp\DataLoggerSettings.Designer.cs"></File><File path="Projects\TempDataLogger\TempLogHostApp\DataLoggerSettings.resx"></File><File path="Projects\TempDataLogger\TempLogHostApp\Program.cs"></File><File path="Projects\TempDataLogger\TempLogHostApp\TempLoggerHostApp.csproj"></File></Folder><File path="Projects\TempDataLogger\Descriptors.c"></File><File path="Projects\TempDataLogger\Descriptors.h"></File><File path="Projects\TempDataLogger\Doxygen.conf"></File><File path="Projects\TempDataLogger\makefile"></File><File path="Projects\TempDataLogger\TempDataLogger.c"></File><File path="Projects\TempDataLogger\TempDataLogger.h"></File><File path="Projects\TempDataLogger\TemperatureDataLogger.txt"></File><File path="Projects\TempDataLogger\TempDataLogger.aps"></File></Folder><Folder name="USBtoSerial"><File path="Projects\USBtoSerial\Descriptors.h"></File><File path="Projects\USBtoSerial\Doxygen.conf"></File><File path="Projects\USBtoSerial\LUFA USBtoSerial.inf"></File><File path="Projects\USBtoSerial\makefile"></File><File path="Projects\USBtoSerial\USBtoSerial.c"></File><File path="Projects\USBtoSerial\USBtoSerial.h"></File><File path="Projects\USBtoSerial\USBtoSerial.txt"></File><File path="Projects\USBtoSerial\USBtoSerial.aps"></File><File path="Projects\USBtoSerial\Descriptors.c"></File></Folder><Folder name="Webserver"><Folder name="Lib"><Folder name="uip"><File path="Projects\Webserver\Lib\uip\clock.c"></File><File path="Projects\Webserver\Lib\uip\clock.h"></File><File path="Projects\Webserver\Lib\uip\timer.c"></File><File path="Projects\Webserver\Lib\uip\timer.h"></File><File path="Projects\Webserver\Lib\uip\uip.c"></File><File path="Projects\Webserver\Lib\uip\uip.h"></File><File path="Projects\Webserver\Lib\uip\uip_arp.c"></File><File path="Projects\Webserver\Lib\uip\uip_arp.h"></File><File path="Projects\Webserver\Lib\uip\uipopt.h"></File><File path="Projects\Webserver\Lib\uip\uip-split.c"></File><File path="Projects\Webserver\Lib\uip\uip-split.h"></File></Folder><Folder name="FATFs"><File path="Projects\Webserver\Lib\FATFs\diskio.c"></File><File path="Projects\Webserver\Lib\FATFs\diskio.h"></File><File path="Projects\Webserver\Lib\FATFs\ff.c"></File><File path="Projects\Webserver\Lib\FATFs\ff.h"></File><File path="Projects\Webserver\Lib\FATFs\ffconf.h"></File><File path="Projects\Webserver\Lib\FATFs\integer.h"></File></Folder><File path="Projects\Webserver\Lib\DataflashManager.c"></File><File path="Projects\Webserver\Lib\DataflashManager.h"></File><File path="Projects\Webserver\Lib\uIPManagement.c"></File><File path="Projects\Webserver\Lib\uIPManagement.h"></File><File path="Projects\Webserver\Lib\HTTPServerApp.c"></File><File path="Projects\Webserver\Lib\HTTPServerApp.h"></File><File path="Projects\Webserver\Lib\SCSI.c"></File><File path="Projects\Webserver\Lib\SCSI.h"></File><File path="Projects\Webserver\Lib\DHCPClientApp.c"></File><File path="Projects\Webserver\Lib\DHCPClientApp.h"></File><File path="Projects\Webserver\Lib\TELNETServerApp.c"></File><File path="Projects\Webserver\Lib\TELNETServerApp.h"></File></Folder><File path="Projects\Webserver\makefile"></File><File path="Projects\Webserver\Webserver.c"></File><File path="Projects\Webserver\Webserver.h"></File><File path="Projects\Webserver\Doxygen.conf"></File><File path="Projects\Webserver\Webserver.txt"></File><File path="Projects\Webserver\Descriptors.c"></File><File path="Projects\Webserver\Descriptors.h"></File><File path="Projects\Webserver\USBHostMode.c"></File><File path="Projects\Webserver\USBHostMode.h"></File><File path="Projects\Webserver\USBDeviceMode.c"></File><File path="Projects\Webserver\USBDeviceMode.h"></File><File path="Projects\Webserver\Webserver.aps"></File></Folder><Folder name="XPLAINBridge"><Folder name="Lib"><File path="Projects\XPLAINBridge\Lib\SoftUART.c"></File><File path="Projects\XPLAINBridge\Lib\SoftUART.h"></File></Folder><File path="Projects\XPLAINBridge\XPLAINBridge.txt"></File><File path="Projects\XPLAINBridge\XPLAINBridge.h"></File><File path="Projects\XPLAINBridge\XPLAINBridge.c"></File><File path="Projects\XPLAINBridge\XPLAINBridge.aps"></File><File path="Projects\XPLAINBridge\USARTDescriptors.h"></File><File path="Projects\XPLAINBridge\USARTDescriptors.c"></File><File path="Projects\XPLAINBridge\makefile"></File><File path="Projects\XPLAINBridge\LUFA XPLAIN Bridge.inf"></File><File path="Projects\XPLAINBridge\Doxygen.conf"></File><File path="Projects\XPLAINBridge\AVRISPDescriptors.h"></File><File path="Projects\XPLAINBridge\AVRISPDescriptors.c"></File></Folder><Folder name="Incomplete"><Folder name="StandaloneProgrammer"><Folder name="Lib"><Folder name="PetiteFATFs"><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\diskio.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\diskio.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\integer.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\pff.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\pff.h"></File></Folder><File path="Projects\Incomplete\StandaloneProgrammer\Lib\DataflashManager.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\DataflashManager.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\SCSI.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\SCSI.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\ProgrammerConfig.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\ProgrammerConfig.h"></File></Folder><File path="Projects\Incomplete\StandaloneProgrammer\Descriptors.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Descriptors.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\makefile"></File><File path="Projects\Incomplete\StandaloneProgrammer\StandaloneProgrammer.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\StandaloneProgrammer.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskDevice.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskDevice.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskHost.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskHost.h"></File></Folder></Folder><File path="Projects\makefile"></File></Folder><File path="makefile"></File><File path="README.txt"></File></Project>
\ No newline at end of file
+<Project name="LUFA"><Folder name="Demos"><Folder name="Device"><Folder name="ClassDriver"><Folder name="AudioInput"><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.c"></File><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.h"></File><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.txt"></File><File path="Demos\Device\ClassDriver\AudioInput\Descriptors.c"></File><File path="Demos\Device\ClassDriver\AudioInput\Descriptors.h"></File><File path="Demos\Device\ClassDriver\AudioInput\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\AudioInput\makefile"></File><File path="Demos\Device\ClassDriver\AudioInput\AudioInput.aps"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\ClassDriver\AudioOutput\Descriptors.c"></File><File path="Demos\Device\ClassDriver\AudioOutput\Descriptors.h"></File><File path="Demos\Device\ClassDriver\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\AudioOutput\makefile"></File><File path="Demos\Device\ClassDriver\AudioOutput\AudioOutput.aps"></File></Folder><Folder name="DualVirtualSerial"><File path="Demos\Device\ClassDriver\DualVirtualSerial\Descriptors.c"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\Descriptors.h"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.c"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.h"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.txt"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\LUFA DualVirtualSerial.inf"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\makefile"></File><File path="Demos\Device\ClassDriver\DualVirtualSerial\DualVirtualSerial.aps"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\ClassDriver\GenericHID\Descriptors.c"></File><File path="Demos\Device\ClassDriver\GenericHID\Descriptors.h"></File><File path="Demos\Device\ClassDriver\GenericHID\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.c"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.h"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.txt"></File><File path="Demos\Device\ClassDriver\GenericHID\makefile"></File><File path="Demos\Device\ClassDriver\GenericHID\GenericHID.aps"></File></Folder><Folder name="Joystick"><File path="Demos\Device\ClassDriver\Joystick\Descriptors.c"></File><File path="Demos\Device\ClassDriver\Joystick\Descriptors.h"></File><File path="Demos\Device\ClassDriver\Joystick\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.c"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.h"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.txt"></File><File path="Demos\Device\ClassDriver\Joystick\makefile"></File><File path="Demos\Device\ClassDriver\Joystick\Joystick.aps"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\ClassDriver\Keyboard\Descriptors.c"></File><File path="Demos\Device\ClassDriver\Keyboard\Descriptors.h"></File><File path="Demos\Device\ClassDriver\Keyboard\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.c"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.h"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.txt"></File><File path="Demos\Device\ClassDriver\Keyboard\makefile"></File><File path="Demos\Device\ClassDriver\Keyboard\Keyboard.aps"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\ClassDriver\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\makefile"></File><File path="Demos\Device\ClassDriver\KeyboardMouse\KeyboardMouse.aps"></File></Folder><Folder name="KeyboardMouseMultiReport"><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\Descriptors.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\Descriptors.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.c"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.h"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.txt"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\makefile"></File><File path="Demos\Device\ClassDriver\KeyboardMouseMultiReport\KeyboardMouseMultiReport.aps"></File></Folder><Folder name="MassStorage"><Folder name="Lib"><File path="Demos\Device\ClassDriver\MassStorage\Lib\DataflashManager.c"></File><File path="Demos\Device\ClassDriver\MassStorage\Lib\DataflashManager.h"></File><File path="Demos\Device\ClassDriver\MassStorage\Lib\SCSI.c"></File><File path="Demos\Device\ClassDriver\MassStorage\Lib\SCSI.h"></File></Folder><File path="Demos\Device\ClassDriver\MassStorage\Descriptors.c"></File><File path="Demos\Device\ClassDriver\MassStorage\Descriptors.h"></File><File path="Demos\Device\ClassDriver\MassStorage\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\MassStorage\makefile"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.c"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.h"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.txt"></File><File path="Demos\Device\ClassDriver\MassStorage\MassStorage.aps"></File></Folder><Folder name="MassStorageKeyboard"><Folder name="Lib"><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\DataflashManager.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\DataflashManager.h"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\SCSI.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Lib\SCSI.h"></File></Folder><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Descriptors.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Descriptors.h"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\makefile"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.c"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.h"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.txt"></File><File path="Demos\Device\ClassDriver\MassStorageKeyboard\MassStorageKeyboard.aps"></File></Folder><Folder name="MIDI"><File path="Demos\Device\ClassDriver\MIDI\Descriptors.c"></File><File path="Demos\Device\ClassDriver\MIDI\Descriptors.h"></File><File path="Demos\Device\ClassDriver\MIDI\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\MIDI\makefile"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.c"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.h"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.txt"></File><File path="Demos\Device\ClassDriver\MIDI\MIDI.aps"></File></Folder><Folder name="Mouse"><File path="Demos\Device\ClassDriver\Mouse\Descriptors.c"></File><File path="Demos\Device\ClassDriver\Mouse\Descriptors.h"></File><File path="Demos\Device\ClassDriver\Mouse\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\Mouse\makefile"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.c"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.h"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.txt"></File><File path="Demos\Device\ClassDriver\Mouse\Mouse.aps"></File></Folder><Folder name="RNDISEthernet"><Folder name="Lib"><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Webserver.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ARP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ARP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\DHCP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\DHCP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Ethernet.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Ethernet.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\EthernetProtocols.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ICMP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ICMP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\IP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\IP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ProtocolDecoders.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\ProtocolDecoders.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\TCP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\TCP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\UDP.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\UDP.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Lib\Webserver.c"></File></Folder><File path="Demos\Device\ClassDriver\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\makefile"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\ClassDriver\RNDISEthernet\RNDISEthernet.aps"></File></Folder><Folder name="VirtualSerial"><File path="Demos\Device\ClassDriver\VirtualSerial\Descriptors.c"></File><File path="Demos\Device\ClassDriver\VirtualSerial\Descriptors.h"></File><File path="Demos\Device\ClassDriver\VirtualSerial\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\VirtualSerial\LUFA VirtualSerial.inf"></File><File path="Demos\Device\ClassDriver\VirtualSerial\makefile"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.c"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.h"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.txt"></File><File path="Demos\Device\ClassDriver\VirtualSerial\VirtualSerial.aps"></File></Folder><Folder name="VirtualSerialMouse"><File path="Demos\Device\ClassDriver\VirtualSerialMouse\Descriptors.c"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\Descriptors.h"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\Doxygen.conf"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\LUFA VirtualSerialMouse.inf"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\makefile"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.c"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.h"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.txt"></File><File path="Demos\Device\ClassDriver\VirtualSerialMouse\VirtualSerialMouse.aps"></File></Folder><File path="Demos\Device\ClassDriver\makefile"></File></Folder><Folder name="LowLevel"><Folder name="AudioInput"><File path="Demos\Device\LowLevel\AudioInput\AudioInput.c"></File><File path="Demos\Device\LowLevel\AudioInput\AudioInput.h"></File><File path="Demos\Device\LowLevel\AudioInput\AudioInput.txt"></File><File path="Demos\Device\LowLevel\AudioInput\Descriptors.c"></File><File path="Demos\Device\LowLevel\AudioInput\Descriptors.h"></File><File path="Demos\Device\LowLevel\AudioInput\Doxygen.conf"></File><File path="Demos\Device\LowLevel\AudioInput\makefile"></File><File path="Demos\Device\LowLevel\AudioInput\AudioInput.aps"></File></Folder><Folder name="AudioOutput"><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.c"></File><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.h"></File><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.txt"></File><File path="Demos\Device\LowLevel\AudioOutput\Descriptors.c"></File><File path="Demos\Device\LowLevel\AudioOutput\Descriptors.h"></File><File path="Demos\Device\LowLevel\AudioOutput\Doxygen.conf"></File><File path="Demos\Device\LowLevel\AudioOutput\makefile"></File><File path="Demos\Device\LowLevel\AudioOutput\AudioOutput.aps"></File></Folder><Folder name="DualVirtualSerial"><File path="Demos\Device\LowLevel\DualVirtualSerial\Descriptors.c"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\Descriptors.h"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\Doxygen.conf"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.c"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.h"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.txt"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\LUFA DualVirtualSerial.inf"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\makefile"></File><File path="Demos\Device\LowLevel\DualVirtualSerial\DualVirtualSerial.aps"></File></Folder><Folder name="GenericHID"><File path="Demos\Device\LowLevel\GenericHID\Descriptors.c"></File><File path="Demos\Device\LowLevel\GenericHID\Descriptors.h"></File><File path="Demos\Device\LowLevel\GenericHID\Doxygen.conf"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.c"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.h"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.txt"></File><File path="Demos\Device\LowLevel\GenericHID\makefile"></File><File path="Demos\Device\LowLevel\GenericHID\GenericHID.aps"></File></Folder><Folder name="Joystick"><File path="Demos\Device\LowLevel\Joystick\Descriptors.c"></File><File path="Demos\Device\LowLevel\Joystick\Descriptors.h"></File><File path="Demos\Device\LowLevel\Joystick\Doxygen.conf"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.c"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.h"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.txt"></File><File path="Demos\Device\LowLevel\Joystick\makefile"></File><File path="Demos\Device\LowLevel\Joystick\Joystick.aps"></File></Folder><Folder name="Keyboard"><File path="Demos\Device\LowLevel\Keyboard\Descriptors.c"></File><File path="Demos\Device\LowLevel\Keyboard\Descriptors.h"></File><File path="Demos\Device\LowLevel\Keyboard\Doxygen.conf"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.c"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.h"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.txt"></File><File path="Demos\Device\LowLevel\Keyboard\makefile"></File><File path="Demos\Device\LowLevel\Keyboard\Keyboard.aps"></File></Folder><Folder name="KeyboardMouse"><File path="Demos\Device\LowLevel\KeyboardMouse\Descriptors.c"></File><File path="Demos\Device\LowLevel\KeyboardMouse\Descriptors.h"></File><File path="Demos\Device\LowLevel\KeyboardMouse\Doxygen.conf"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.c"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.h"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.txt"></File><File path="Demos\Device\LowLevel\KeyboardMouse\makefile"></File><File path="Demos\Device\LowLevel\KeyboardMouse\KeyboardMouse.aps"></File></Folder><Folder name="MassStorage"><Folder name="Lib"><File path="Demos\Device\LowLevel\MassStorage\Lib\DataflashManager.c"></File><File path="Demos\Device\LowLevel\MassStorage\Lib\DataflashManager.h"></File><File path="Demos\Device\LowLevel\MassStorage\Lib\SCSI.c"></File><File path="Demos\Device\LowLevel\MassStorage\Lib\SCSI.h"></File></Folder><File path="Demos\Device\LowLevel\MassStorage\Descriptors.c"></File><File path="Demos\Device\LowLevel\MassStorage\Descriptors.h"></File><File path="Demos\Device\LowLevel\MassStorage\Doxygen.conf"></File><File path="Demos\Device\LowLevel\MassStorage\makefile"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.c"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.h"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.txt"></File><File path="Demos\Device\LowLevel\MassStorage\MassStorage.aps"></File></Folder><Folder name="MIDI"><File path="Demos\Device\LowLevel\MIDI\Descriptors.c"></File><File path="Demos\Device\LowLevel\MIDI\Descriptors.h"></File><File path="Demos\Device\LowLevel\MIDI\Doxygen.conf"></File><File path="Demos\Device\LowLevel\MIDI\makefile"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.c"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.h"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.txt"></File><File path="Demos\Device\LowLevel\MIDI\MIDI.aps"></File></Folder><Folder name="Mouse"><File path="Demos\Device\LowLevel\Mouse\Descriptors.c"></File><File path="Demos\Device\LowLevel\Mouse\Descriptors.h"></File><File path="Demos\Device\LowLevel\Mouse\Doxygen.conf"></File><File path="Demos\Device\LowLevel\Mouse\makefile"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.c"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.h"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.txt"></File><File path="Demos\Device\LowLevel\Mouse\Mouse.aps"></File></Folder><Folder name="RNDISEthernet"><Folder name="Lib"><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Webserver.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ARP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ARP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\DHCP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\DHCP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Ethernet.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Ethernet.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\EthernetProtocols.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ICMP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ICMP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\IP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\IP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ProtocolDecoders.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\ProtocolDecoders.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\RNDIS.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\RNDIS.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\TCP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\TCP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\UDP.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\UDP.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Lib\Webserver.c"></File></Folder><File path="Demos\Device\LowLevel\RNDISEthernet\Descriptors.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Descriptors.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\Doxygen.conf"></File><File path="Demos\Device\LowLevel\RNDISEthernet\LUFA RNDIS.inf"></File><File path="Demos\Device\LowLevel\RNDISEthernet\makefile"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.c"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.h"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.txt"></File><File path="Demos\Device\LowLevel\RNDISEthernet\RNDISEthernet.aps"></File></Folder><Folder name="VirtualSerial"><File path="Demos\Device\LowLevel\VirtualSerial\Descriptors.c"></File><File path="Demos\Device\LowLevel\VirtualSerial\Descriptors.h"></File><File path="Demos\Device\LowLevel\VirtualSerial\Doxygen.conf"></File><File path="Demos\Device\LowLevel\VirtualSerial\LUFA VirtualSerial.inf"></File><File path="Demos\Device\LowLevel\VirtualSerial\makefile"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.c"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.h"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.txt"></File><File path="Demos\Device\LowLevel\VirtualSerial\VirtualSerial.aps"></File></Folder><File path="Demos\Device\LowLevel\makefile"></File></Folder><Folder name="Incomplete"><Folder name="SideShow"><Folder name="Lib"><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowApplications.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowApplications.h"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommands.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommands.h"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommon.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowCommon.h"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowContent.c"></File><File path="Demos\Device\Incomplete\Sideshow\Lib\SideshowContent.h"></File></Folder><File path="Demos\Device\Incomplete\Sideshow\Descriptors.c"></File><File path="Demos\Device\Incomplete\Sideshow\Descriptors.h"></File><File path="Demos\Device\Incomplete\Sideshow\makefile"></File><File path="Demos\Device\Incomplete\Sideshow\Sideshow.c"></File><File path="Demos\Device\Incomplete\Sideshow\Sideshow.h"></File></Folder><Folder name="TestAndMeasurement"><File path="Demos\Device\Incomplete\TestAndMeasurement\Descriptors.c"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\Descriptors.h"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\TestAndMeasurement.c"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\TestAndMeasurement.h"></File><File path="Demos\Device\Incomplete\TestAndMeasurement\makefile"></File></Folder></Folder><File path="Demos\Device\makefile"></File></Folder><Folder name="Host"><Folder name="ClassDriver"><Folder name="JoystickHostWithParser"><File path="Demos\Host\ClassDriver\JoystickHostWithParser\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.c"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.h"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.txt"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\makefile"></File><File path="Demos\Host\ClassDriver\JoystickHostWithParser\JoystickHostWithParser.aps"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\ClassDriver\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\ClassDriver\KeyboardHost\makefile"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\ClassDriver\KeyboardHost\KeyboardHost.aps"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\makefile"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\ClassDriver\KeyboardHostWithParser\KeyboardHostWithParser.aps"></File></Folder><Folder name="MassStorageHost"><File path="Demos\Host\ClassDriver\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MassStorageHost\makefile"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\ClassDriver\MassStorageHost\MassStorageHost.aps"></File></Folder><Folder name="MIDIHost"><File path="Demos\Host\ClassDriver\MIDIHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MIDIHost\makefile"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.c"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.h"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.txt"></File><File path="Demos\Host\ClassDriver\MIDIHost\MIDIHost.aps"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\ClassDriver\MouseHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MouseHost\makefile"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.c"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.h"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.txt"></File><File path="Demos\Host\ClassDriver\MouseHost\MouseHost.aps"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\ClassDriver\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\makefile"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.txt"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\ClassDriver\MouseHostWithParser\MouseHostWithParser.aps"></File></Folder><Folder name="PrinterHost"><File path="Demos\Host\ClassDriver\PrinterHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\PrinterHost\makefile"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.c"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.h"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.txt"></File><File path="Demos\Host\ClassDriver\PrinterHost\PrinterHost.aps"></File></Folder><Folder name="RNDISEthernetHost"><File path="Demos\Host\ClassDriver\RNDISEthernetHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\makefile"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.c"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.h"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.txt"></File><File path="Demos\Host\ClassDriver\RNDISEthernetHost\RNDISEthernetHost.aps"></File></Folder><Folder name="StillImageHost"><File path="Demos\Host\ClassDriver\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\StillImageHost\makefile"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.txt"></File><File path="Demos\Host\ClassDriver\StillImageHost\StillImageHost.aps"></File></Folder><Folder name="VirtualSerialHost"><File path="Demos\Host\ClassDriver\VirtualSerialHost\Doxygen.conf"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\makefile"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.c"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.h"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.txt"></File><File path="Demos\Host\ClassDriver\VirtualSerialHost\VirtualSerialHost.aps"></File></Folder><File path="Demos\Host\ClassDriver\makefile"></File></Folder><Folder name="LowLevel"><Folder name="GenericHIDHost"><File path="Demos\Host\LowLevel\GenericHIDHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\GenericHIDHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\GenericHIDHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.c"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.h"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.txt"></File><File path="Demos\Host\LowLevel\GenericHIDHost\makefile"></File><File path="Demos\Host\LowLevel\GenericHIDHost\GenericHIDHost.aps"></File></Folder><Folder name="JoystickHostWithParser"><File path="Demos\Host\LowLevel\JoystickHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\Doxygen.conf"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\HIDReport.c"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\HIDReport.h"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.c"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.h"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.txt"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\makefile"></File><File path="Demos\Host\LowLevel\JoystickHostWithParser\JoystickHostWithParser.aps"></File></Folder><Folder name="KeyboardHost"><File path="Demos\Host\LowLevel\KeyboardHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\KeyboardHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\KeyboardHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.c"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.h"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.txt"></File><File path="Demos\Host\LowLevel\KeyboardHost\makefile"></File><File path="Demos\Host\LowLevel\KeyboardHost\KeyboardHost.aps"></File></Folder><Folder name="KeyboardHostWithParser"><File path="Demos\Host\LowLevel\KeyboardHostWithParser\makefile"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\Doxygen.conf"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\HIDReport.c"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\HIDReport.h"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.c"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.h"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.txt"></File><File path="Demos\Host\LowLevel\KeyboardHostWithParser\KeyboardHostWithParser.aps"></File></Folder><Folder name="MassStorageHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\MassStorageHost\Lib\MassStoreCommands.c"></File><File path="Demos\Host\LowLevel\MassStorageHost\Lib\MassStoreCommands.h"></File></Folder><File path="Demos\Host\LowLevel\MassStorageHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MassStorageHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MassStorageHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MassStorageHost\makefile"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.c"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.h"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.txt"></File><File path="Demos\Host\LowLevel\MassStorageHost\MassStorageHost.aps"></File></Folder><Folder name="MIDIHost"><File path="Demos\Host\LowLevel\MIDIHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MIDIHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MIDIHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MIDIHost\makefile"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.c"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.h"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.txt"></File><File path="Demos\Host\LowLevel\MIDIHost\MIDIHost.aps"></File></Folder><Folder name="MouseHost"><File path="Demos\Host\LowLevel\MouseHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MouseHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MouseHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MouseHost\makefile"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.c"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.h"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.txt"></File><File path="Demos\Host\LowLevel\MouseHost\MouseHost.aps"></File></Folder><Folder name="MouseHostWithParser"><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.txt"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\Doxygen.conf"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\HIDReport.c"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\HIDReport.h"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\makefile"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.c"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.h"></File><File path="Demos\Host\LowLevel\MouseHostWithParser\MouseHostWithParser.aps"></File></Folder><Folder name="PrinterHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\PrinterHost\Lib\PrinterCommands.c"></File><File path="Demos\Host\LowLevel\PrinterHost\Lib\PrinterCommands.h"></File></Folder><File path="Demos\Host\LowLevel\PrinterHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\PrinterHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\PrinterHost\makefile"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.c"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.h"></File><File path="Demos\Host\LowLevel\PrinterHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.txt"></File><File path="Demos\Host\LowLevel\PrinterHost\PrinterHost.aps"></File></Folder><Folder name="RNDISEthernetHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\RNDISEthernetHost\Lib\RNDISCommands.c"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\Lib\RNDISCommands.h"></File></Folder><File path="Demos\Host\LowLevel\RNDISEthernetHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\makefile"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISEthernetHost.c"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISEthernetHost.h"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISHost.txt"></File><File path="Demos\Host\LowLevel\RNDISEthernetHost\RNDISEthernetHost.aps"></File></Folder><Folder name="StillImageHost"><Folder name="Lib"><File path="Demos\Host\LowLevel\StillImageHost\Lib\StillImageCommands.c"></File><File path="Demos\Host\LowLevel\StillImageHost\Lib\StillImageCommands.h"></File><File path="Demos\Host\LowLevel\StillImageHost\Lib\PIMACodes.h"></File></Folder><File path="Demos\Host\LowLevel\StillImageHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\StillImageHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\StillImageHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\StillImageHost\makefile"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.c"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.h"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.txt"></File><File path="Demos\Host\LowLevel\StillImageHost\StillImageHost.aps"></File></Folder><Folder name="VirtualSerialHost"><File path="Demos\Host\LowLevel\VirtualSerialHost\ConfigDescriptor.c"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\ConfigDescriptor.h"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\Doxygen.conf"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\makefile"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.c"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.h"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.txt"></File><File path="Demos\Host\LowLevel\VirtualSerialHost\VirtualSerialHost.aps"></File></Folder><File path="Demos\Host\LowLevel\makefile"></File></Folder><Folder name="Incomplete"><Folder name="BluetoothHost"><Folder name="Lib"><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothACLPackets.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothACLPackets.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothClassCodes.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothHCICommands.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothHCICommands.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothStack.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\BluetoothStack.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDPServices.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDPServices.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMM.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMM.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDP.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\SDP.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMMControl.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\Lib\RFCOMMControl.h"></File></Folder><File path="Demos\Host\Incomplete\BluetoothHost\makefile"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothHost.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothHost.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\ConfigDescriptor.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\ConfigDescriptor.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\DeviceDescriptor.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\DeviceDescriptor.h"></File><File path="Demos\Host\Incomplete\BluetoothHost\Doxygen.conf"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothEvents.c"></File><File path="Demos\Host\Incomplete\BluetoothHost\BluetoothEvents.h"></File></Folder></Folder><File path="Demos\Host\makefile"></File></Folder><Folder name="DualRole"><Folder name="ClassDriver"><Folder name="MouseHostDevice"><File path="Demos\DualRole\ClassDriver\MouseHostDevice\Doxygen.conf"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\makefile"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\Descriptors.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\Descriptors.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\DeviceFunctions.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\HostFunctions.c"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\HostFunctions.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\DeviceFunctions.h"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.txt"></File><File path="Demos\DualRole\ClassDriver\MouseHostDevice\MouseHostDevice.aps"></File></Folder><File path="Demos\DualRole\ClassDriver\makefile"></File></Folder><File path="Demos\DualRole\makefile"></File></Folder><File path="Demos\makefile"></File></Folder><Folder name="LUFA"><Folder name="Common"><File path="LUFA\Common\Common.h"></File><File path="LUFA\Common\BoardTypes.h"></File><File path="LUFA\Common\Attributes.h"></File><File path="LUFA\Common\Architectures.h"></File></Folder><Folder name="Drivers"><Folder name="USB"><Folder name="Core"><Folder name="AVR8"><File path="LUFA\Drivers\USB\Core\AVR8\Device.c"></File><File path="LUFA\Drivers\USB\Core\AVR8\Device.h"></File><File path="LUFA\Drivers\USB\Core\AVR8\Endpoint.c"></File><File path="LUFA\Drivers\USB\Core\AVR8\Endpoint.h"></File><File path="LUFA\Drivers\USB\Core\AVR8\Host.c"></File><File path="LUFA\Drivers\USB\Core\AVR8\Host.h"></File><File path="LUFA\Drivers\USB\Core\AVR8\OTG.h"></File><File path="LUFA\Drivers\USB\Core\AVR8\Pipe.c"></File><File path="LUFA\Drivers\USB\Core\AVR8\Pipe.h"></File><File path="LUFA\Drivers\USB\Core\AVR8\USBController.c"></File><File path="LUFA\Drivers\USB\Core\AVR8\USBController.h"></File><File path="LUFA\Drivers\USB\Core\AVR8\USBInterrupt.c"></File><File path="LUFA\Drivers\USB\Core\AVR8\USBInterrupt.h"></File></Folder><Folder name="Template"><File path="LUFA\Drivers\USB\Core\Template\Template_Endpoint_Control_R.c"></File><File path="LUFA\Drivers\USB\Core\Template\Template_Endpoint_Control_W.c"></File><File path="LUFA\Drivers\USB\Core\Template\Template_Endpoint_RW.c"></File><File path="LUFA\Drivers\USB\Core\Template\Template_Pipe_RW.c"></File></Folder><File path="LUFA\Drivers\USB\Core\ConfigDescriptor.c"></File><File path="LUFA\Drivers\USB\Core\ConfigDescriptor.h"></File><File path="LUFA\Drivers\USB\Core\DeviceStandardReq.c"></File><File path="LUFA\Drivers\USB\Core\DeviceStandardReq.h"></File><File path="LUFA\Drivers\USB\Core\EndpointStream.c"></File><File path="LUFA\Drivers\USB\Core\EndpointStream.h"></File><File path="LUFA\Drivers\USB\Core\Events.c"></File><File path="LUFA\Drivers\USB\Core\Events.h"></File><File path="LUFA\Drivers\USB\Core\HostStandardReq.c"></File><File path="LUFA\Drivers\USB\Core\HostStandardReq.h"></File><File path="LUFA\Drivers\USB\Core\PipeStream.c"></File><File path="LUFA\Drivers\USB\Core\PipeStream.h"></File><File path="LUFA\Drivers\USB\Core\StdDescriptors.h"></File><File path="LUFA\Drivers\USB\Core\StdRequestType.h"></File><File path="LUFA\Drivers\USB\Core\USBMode.h"></File><File path="LUFA\Drivers\USB\Core\USBTask.c"></File><File path="LUFA\Drivers\USB\Core\USBTask.h"></File><File path="LUFA\Drivers\USB\Core\Device.h"></File><File path="LUFA\Drivers\USB\Core\Endpoint.h"></File><File path="LUFA\Drivers\USB\Core\Host.h"></File><File path="LUFA\Drivers\USB\Core\OTG.h"></File><File path="LUFA\Drivers\USB\Core\Pipe.h"></File><File path="LUFA\Drivers\USB\Core\USBController.h"></File><File path="LUFA\Drivers\USB\Core\USBInterrupt.h"></File></Folder><Folder name="Class"><Folder name="Device"><File path="LUFA\Drivers\USB\Class\Device\HID.c"></File><File path="LUFA\Drivers\USB\Class\Device\HID.h"></File><File path="LUFA\Drivers\USB\Class\Device\CDC.c"></File><File path="LUFA\Drivers\USB\Class\Device\CDC.h"></File><File path="LUFA\Drivers\USB\Class\Device\RNDIS.c"></File><File path="LUFA\Drivers\USB\Class\Device\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\Device\MassStorage.c"></File><File path="LUFA\Drivers\USB\Class\Device\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\Device\Audio.c"></File><File path="LUFA\Drivers\USB\Class\Device\Audio.h"></File><File path="LUFA\Drivers\USB\Class\Device\MIDI.c"></File><File path="LUFA\Drivers\USB\Class\Device\MIDI.h"></File></Folder><Folder name="Host"><File path="LUFA\Drivers\USB\Class\Host\CDC.c"></File><File path="LUFA\Drivers\USB\Class\Host\CDC.h"></File><File path="LUFA\Drivers\USB\Class\Host\HID.c"></File><File path="LUFA\Drivers\USB\Class\Host\HID.h"></File><File path="LUFA\Drivers\USB\Class\Host\MassStorage.c"></File><File path="LUFA\Drivers\USB\Class\Host\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\Host\StillImage.c"></File><File path="LUFA\Drivers\USB\Class\Host\StillImage.h"></File><File path="LUFA\Drivers\USB\Class\Host\MIDI.c"></File><File path="LUFA\Drivers\USB\Class\Host\MIDI.h"></File><File path="LUFA\Drivers\USB\Class\Host\Printer.c"></File><File path="LUFA\Drivers\USB\Class\Host\Printer.h"></File><File path="LUFA\Drivers\USB\Class\Host\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\Host\RNDIS.c"></File></Folder><Folder name="Common"><File path="LUFA\Drivers\USB\Class\Common\Audio.h"></File><File path="LUFA\Drivers\USB\Class\Common\CDC.h"></File><File path="LUFA\Drivers\USB\Class\Common\HID.h"></File><File path="LUFA\Drivers\USB\Class\Common\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\Common\MIDI.h"></File><File path="LUFA\Drivers\USB\Class\Common\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\Common\StillImage.h"></File><File path="LUFA\Drivers\USB\Class\Common\Printer.h"></File><File path="LUFA\Drivers\USB\Class\Common\HIDParser.c"></File><File path="LUFA\Drivers\USB\Class\Common\HIDParser.h"></File><File path="LUFA\Drivers\USB\Class\Common\HIDReportData.h"></File></Folder><File path="LUFA\Drivers\USB\Class\Audio.h"></File><File path="LUFA\Drivers\USB\Class\CDC.h"></File><File path="LUFA\Drivers\USB\Class\HID.h"></File><File path="LUFA\Drivers\USB\Class\MassStorage.h"></File><File path="LUFA\Drivers\USB\Class\MIDI.h"></File><File path="LUFA\Drivers\USB\Class\RNDIS.h"></File><File path="LUFA\Drivers\USB\Class\StillImage.h"></File><File path="LUFA\Drivers\USB\Class\Printer.h"></File></Folder><File path="LUFA\Drivers\USB\USB.h"></File></Folder><Folder name="Misc"><File path="LUFA\Drivers\Misc\TerminalCodes.h"></File><File path="LUFA\Drivers\Misc\RingBuffer.h"></File><File path="LUFA\Drivers\Misc\AT45DB321C.h"></File><File path="LUFA\Drivers\Misc\AT45DB642D.h"></File></Folder><Folder name="Board"><Folder name="ADAFRUITU4"><File path="LUFA\Drivers\Board\ADAFRUITU4\LEDs.h"></File></Folder><Folder name="ATAVRUSBRF01"><File path="LUFA\Drivers\Board\ATAVRUSBRF01\LEDs.h"></File><File path="LUFA\Drivers\Board\ATAVRUSBRF01\Buttons.h"></File></Folder><Folder name="BENITO"><File path="LUFA\Drivers\Board\BENITO\LEDs.h"></File><File path="LUFA\Drivers\Board\BENITO\Buttons.h"></File></Folder><Folder name="BUMBLEB"><File path="LUFA\Drivers\Board\BUMBLEB\Buttons.h"></File><File path="LUFA\Drivers\Board\BUMBLEB\Joystick.h"></File><File path="LUFA\Drivers\Board\BUMBLEB\LEDs.h"></File></Folder><Folder name="BUI"><File path="LUFA\Drivers\Board\BUI\LEDs.h"></File></Folder><Folder name="BLACKCAT"><File path="LUFA\Drivers\Board\BLACKCAT\LEDs.h"></File></Folder><Folder name="CULV3"><File path="LUFA\Drivers\Board\CULV3\Buttons.h"></File><File path="LUFA\Drivers\Board\CULV3\LEDs.h"></File></Folder><Folder name="EVK527"><File path="LUFA\Drivers\Board\EVK527\Buttons.h"></File><File path="LUFA\Drivers\Board\EVK527\LEDs.h"></File><File path="LUFA\Drivers\Board\EVK527\Joystick.h"></File><File path="LUFA\Drivers\Board\EVK527\Dataflash.h"></File></Folder><Folder name="JMDBU2"><File path="LUFA\Drivers\Board\JMDBU2\Buttons.h"></File><File path="LUFA\Drivers\Board\JMDBU2\LEDs.h"></File></Folder><Folder name="MAXIMUS"><File path="LUFA\Drivers\Board\MAXIMUS\LEDs.h"></File></Folder><Folder name="MICROSIN162"><File path="LUFA\Drivers\Board\MICROSIN162\LEDs.h"></File><File path="LUFA\Drivers\Board\MICROSIN162\Buttons.h"></File></Folder><Folder name="MINIMUS"><File path="LUFA\Drivers\Board\MINIMUS\Buttons.h"></File><File path="LUFA\Drivers\Board\MINIMUS\LEDs.h"></File></Folder><Folder name="OLIMEX162"><File path="LUFA\Drivers\Board\OLIMEX162\LEDs.h"></File><File path="LUFA\Drivers\Board\OLIMEX162\Buttons.h"></File></Folder><Folder name="RZUSBSTICK"><File path="LUFA\Drivers\Board\RZUSBSTICK\LEDs.h"></File></Folder><Folder name="SPARKFUN8U2"><File path="LUFA\Drivers\Board\SPARKFUN8U2\LEDs.h"></File></Folder><Folder name="STK525"><File path="LUFA\Drivers\Board\STK525\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK525\Joystick.h"></File><File path="LUFA\Drivers\Board\STK525\LEDs.h"></File><File path="LUFA\Drivers\Board\STK525\Buttons.h"></File></Folder><Folder name="STK526"><File path="LUFA\Drivers\Board\STK526\Dataflash.h"></File><File path="LUFA\Drivers\Board\STK526\Joystick.h"></File><File path="LUFA\Drivers\Board\STK526\LEDs.h"></File><File path="LUFA\Drivers\Board\STK526\Buttons.h"></File></Folder><Folder name="TEENSY"><File path="LUFA\Drivers\Board\TEENSY\LEDs.h"></File></Folder><Folder name="UDIP"><File path="LUFA\Drivers\Board\UDIP\LEDs.h"></File><File path="LUFA\Drivers\Board\UDIP\Buttons.h"></File></Folder><Folder name="UNO"><File path="LUFA\Drivers\Board\UNO\LEDs.h"></File></Folder><Folder name="USBFOO"><File path="LUFA\Drivers\Board\USBFOO\Buttons.h"></File><File path="LUFA\Drivers\Board\USBFOO\LEDS.h"></File></Folder><Folder name="USBKEY"><File path="LUFA\Drivers\Board\USBKEY\Dataflash.h"></File><File path="LUFA\Drivers\Board\USBKEY\Joystick.h"></File><File path="LUFA\Drivers\Board\USBKEY\LEDs.h"></File><File path="LUFA\Drivers\Board\USBKEY\Buttons.h"></File></Folder><Folder name="USBTINYMKII"><File path="LUFA\Drivers\Board\USBTINYMKII\LEDs.h"></File><File path="LUFA\Drivers\Board\USBTINYMKII\Buttons.h"></File></Folder><Folder name="XPLAIN"><File path="LUFA\Drivers\Board\XPLAIN\LEDs.h"></File><File path="LUFA\Drivers\Board\XPLAIN\Dataflash.h"></File></Folder><File path="LUFA\Drivers\Board\Temperature.h"></File><File path="LUFA\Drivers\Board\Dataflash.h"></File><File path="LUFA\Drivers\Board\Joystick.h"></File><File path="LUFA\Drivers\Board\Temperature.c"></File><File path="LUFA\Drivers\Board\LEDs.h"></File><File path="LUFA\Drivers\Board\Buttons.h"></File></Folder><Folder name="Peripheral"><Folder name="AVR8"><File path="LUFA\Drivers\Peripheral\AVR8\ADC.h"></File><File path="LUFA\Drivers\Peripheral\AVR8\Serial.c"></File><File path="LUFA\Drivers\Peripheral\AVR8\Serial.h"></File><File path="LUFA\Drivers\Peripheral\AVR8\SPI.h"></File><File path="LUFA\Drivers\Peripheral\AVR8\TWI.c"></File><File path="LUFA\Drivers\Peripheral\AVR8\TWI.h"></File></Folder><File path="LUFA\Drivers\Peripheral\ADC.h"></File><File path="LUFA\Drivers\Peripheral\TWI.h"></File><File path="LUFA\Drivers\Peripheral\Serial.h"></File><File path="LUFA\Drivers\Peripheral\SPI.h"></File></Folder></Folder><Folder name="ManPages"><File path="LUFA\ManPages\AboutLUFA.txt"></File><File path="LUFA\ManPages\BuildingLinkableLibraries.txt"></File><File path="LUFA\ManPages\ChangeLog.txt"></File><File path="LUFA\ManPages\CompileTimeTokens.txt"></File><File path="LUFA\ManPages\DevelopingWithLUFA.txt"></File><File path="LUFA\ManPages\DeviceSupport.txt"></File><File path="LUFA\ManPages\DirectorySummaries.txt"></File><File path="LUFA\ManPages\Donating.txt"></File><File path="LUFA\ManPages\FutureChanges.txt"></File><File path="LUFA\ManPages\GettingStarted.txt"></File><File path="LUFA\ManPages\Groups.txt"></File><File path="LUFA\ManPages\LibraryResources.txt"></File><File path="LUFA\ManPages\LUFAPoweredProjects.txt"></File><File path="LUFA\ManPages\MainPage.txt"></File><File path="LUFA\ManPages\MigrationInformation.txt"></File><File path="LUFA\ManPages\VIDAndPIDValues.txt"></File><File path="LUFA\ManPages\WritingBoardDrivers.txt"></File><File path="LUFA\ManPages\ConfiguringApps.txt"></File><File path="LUFA\ManPages\CompilingApps.txt"></File><File path="LUFA\ManPages\ProgrammingApps.txt"></File><File path="LUFA\ManPages\LibraryApps.txt"></File><File path="LUFA\ManPages\WhyUseLUFA.txt"></File><File path="LUFA\ManPages\LUFAvsAtmelStack.txt"></File><File path="LUFA\ManPages\AlternativeStacks.txt"></File><File path="LUFA\ManPages\SoftwareBootloaderJump.txt"></File><File path="LUFA\ManPages\LicenseInfo.txt"></File></Folder><Folder name="Scheduler"><File path="LUFA\Scheduler\Scheduler.c"></File><File path="LUFA\Scheduler\Scheduler.h"></File></Folder><Folder name="CodeTemplates"><Folder name="DriverStubs"><File path="LUFA\CodeTemplates\DriverStubs\Buttons.h"></File><File path="LUFA\CodeTemplates\DriverStubs\Dataflash.h"></File><File path="LUFA\CodeTemplates\DriverStubs\Joystick.h"></File><File path="LUFA\CodeTemplates\DriverStubs\LEDs.h"></File></Folder><File path="LUFA\CodeTemplates\makefile_template"></File></Folder><File path="LUFA\makefile"></File><File path="LUFA\Version.h"></File><File path="LUFA\Doxygen.conf"></File><File path="LUFA\License.txt"></File></Folder><Folder name="Bootloaders"><Folder name="CDC"><File path="Bootloaders\CDC\BootloaderCDC.c"></File><File path="Bootloaders\CDC\BootloaderCDC.h"></File><File path="Bootloaders\CDC\Descriptors.c"></File><File path="Bootloaders\CDC\Descriptors.h"></File><File path="Bootloaders\CDC\makefile"></File><File path="Bootloaders\CDC\LUFA CDC Bootloader.inf"></File><File path="Bootloaders\CDC\Doxygen.conf"></File><File path="Bootloaders\CDC\BootloaderCDC.txt"></File><File path="Bootloaders\CDC\BootloaderCDC.aps"></File></Folder><Folder name="DFU"><File path="Bootloaders\DFU\BootloaderDFU.c"></File><File path="Bootloaders\DFU\BootloaderDFU.h"></File><File path="Bootloaders\DFU\Descriptors.c"></File><File path="Bootloaders\DFU\Descriptors.h"></File><File path="Bootloaders\DFU\makefile"></File><File path="Bootloaders\DFU\BootloaderDFU.txt"></File><File path="Bootloaders\DFU\Doxygen.conf"></File><File path="Bootloaders\DFU\BootloaderDFU.aps"></File></Folder><Folder name="HID"><Folder name="HostLoaderApp"><File path="Bootloaders\HID\HostLoaderApp\gpl3.txt"></File><File path="Bootloaders\HID\HostLoaderApp\Makefile"></File><File path="Bootloaders\HID\HostLoaderApp\Makefile.bsd"></File><File path="Bootloaders\HID\HostLoaderApp\hid_bootloader_cli.c"></File></Folder><File path="Bootloaders\HID\Descriptors.c"></File><File path="Bootloaders\HID\Descriptors.h"></File><File path="Bootloaders\HID\makefile"></File><File path="Bootloaders\HID\BootloaderHID.txt"></File><File path="Bootloaders\HID\BootloaderHID.c"></File><File path="Bootloaders\HID\BootloaderHID.h"></File><File path="Bootloaders\HID\Doxygen.conf"></File><File path="Bootloaders\HID\BootloaderHID.aps"></File></Folder><File path="Bootloaders\makefile"></File></Folder><Folder name="Projects"><Folder name="AVRISP-MKII"><Folder name="Lib"><Folder name="ISP"><File path="Projects\AVRISP-MKII\Lib\ISP\ISPProtocol.c"></File><File path="Projects\AVRISP-MKII\Lib\ISP\ISPProtocol.h"></File><File path="Projects\AVRISP-MKII\Lib\ISP\ISPTarget.c"></File><File path="Projects\AVRISP-MKII\Lib\ISP\ISPTarget.h"></File></Folder><Folder name="XPROG"><File path="Projects\AVRISP-MKII\Lib\XPROG\TINYNVM.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\TINYNVM.h"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XMEGANVM.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XMEGANVM.h"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGProtocol.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGProtocol.h"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGTarget.c"></File><File path="Projects\AVRISP-MKII\Lib\XPROG\XPROGTarget.h"></File></Folder><File path="Projects\AVRISP-MKII\Lib\V2Protocol.c"></File><File path="Projects\AVRISP-MKII\Lib\V2Protocol.h"></File><File path="Projects\AVRISP-MKII\Lib\V2ProtocolConstants.h"></File><File path="Projects\AVRISP-MKII\Lib\V2ProtocolParams.c"></File><File path="Projects\AVRISP-MKII\Lib\V2ProtocolParams.h"></File></Folder><File path="Projects\AVRISP-MKII\Descriptors.c"></File><File path="Projects\AVRISP-MKII\Descriptors.h"></File><File path="Projects\AVRISP-MKII\Doxygen.conf"></File><File path="Projects\AVRISP-MKII\makefile"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.c"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.h"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.txt"></File><File path="Projects\AVRISP-MKII\AVRISP-MKII.aps"></File></Folder><Folder name="Benito"><File path="Projects\Benito\Benito.c"></File><File path="Projects\Benito\Benito.h"></File><File path="Projects\Benito\Descriptors.c"></File><File path="Projects\Benito\Descriptors.h"></File><File path="Projects\Benito\Doxygen.conf"></File><File path="Projects\Benito\makefile"></File><File path="Projects\Benito\Benito.txt"></File><File path="Projects\Benito\Benito Programmer.inf"></File><File path="Projects\Benito\Benito.aps"></File></Folder><Folder name="LEDNotifier"><Folder name="CPUUsageApp"><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.cs"></File><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.csproj"></File><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.Designer.cs"></File><File path="Projects\LEDNotifier\CPUUsageApp\CPUMonitor.resx"></File><File path="Projects\LEDNotifier\CPUUsageApp\Program.cs"></File></Folder><Folder name="HotmailNotifierApp"><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.cs"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.csproj"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.Designer.cs"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\MailNotifier.resx"></File><File path="Projects\LEDNotifier\HotmailNotifierApp\Program.cs"></File></Folder><Folder name="LEDMixerApp"><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.cs"></File><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.csproj"></File><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.Designer.cs"></File><File path="Projects\LEDNotifier\LEDMixerApp\LEDMixer.resx"></File><File path="Projects\LEDNotifier\LEDMixerApp\Program.cs"></File></Folder><File path="Projects\LEDNotifier\Descriptors.c"></File><File path="Projects\LEDNotifier\Descriptors.h"></File><File path="Projects\LEDNotifier\Doxygen.conf"></File><File path="Projects\LEDNotifier\LEDNotifier.c"></File><File path="Projects\LEDNotifier\LEDNotifier.h"></File><File path="Projects\LEDNotifier\LEDNotifier.txt"></File><File path="Projects\LEDNotifier\LUFA LED Notifier.inf"></File><File path="Projects\LEDNotifier\makefile"></File><File path="Projects\LEDNotifier\LEDNotifier.aps"></File></Folder><Folder name="MagStripe"><Folder name="Lib"><File path="Projects\Magstripe\Lib\CircularBitBuffer.c"></File><File path="Projects\Magstripe\Lib\CircularBitBuffer.h"></File><File path="Projects\Magstripe\Lib\MagstripeHW.h"></File></Folder><File path="Projects\Magstripe\Descriptors.c"></File><File path="Projects\Magstripe\Descriptors.h"></File><File path="Projects\Magstripe\Magstripe.c"></File><File path="Projects\Magstripe\Magstripe.h"></File><File path="Projects\Magstripe\makefile"></File><File path="Projects\Magstripe\Magstripe.txt"></File><File path="Projects\Magstripe\Doxygen.conf"></File><File path="Projects\Magstripe\Magstripe.aps"></File></Folder><Folder name="MIDIToneGenerator"><File path="Projects\MIDIToneGenerator\Descriptors.c"></File><File path="Projects\MIDIToneGenerator\Descriptors.h"></File><File path="Projects\MIDIToneGenerator\makefile"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.c"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.h"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.txt"></File><File path="Projects\MIDIToneGenerator\MIDIToneGenerator.aps"></File></Folder><Folder name="MissileLauncher"><File path="Projects\MissileLauncher\ConfigDescriptor.c"></File><File path="Projects\MissileLauncher\ConfigDescriptor.h"></File><File path="Projects\MissileLauncher\Doxygen.conf"></File><File path="Projects\MissileLauncher\makefile"></File><File path="Projects\MissileLauncher\MissileLauncher.c"></File><File path="Projects\MissileLauncher\MissileLauncher.h"></File><File path="Projects\MissileLauncher\MissileLauncher.txt"></File><File path="Projects\MissileLauncher\MissileLauncher.aps"></File></Folder><Folder name="RelayBoard"><File path="Projects\RelayBoard\Descriptors.c"></File><File path="Projects\RelayBoard\Descriptors.h"></File><File path="Projects\RelayBoard\Doxygen.conf"></File><File path="Projects\RelayBoard\makefile"></File><File path="Projects\RelayBoard\RelayBoard.c"></File><File path="Projects\RelayBoard\RelayBoard.h"></File><File path="Projects\RelayBoard\RelayBoard.txt"></File><File path="Projects\RelayBoard\RelayBoard.aps"></File></Folder><Folder name="TempDataLogger"><Folder name="Lib"><Folder name="FATFs"><File path="Projects\TempDataLogger\Lib\FATFs\diskio.c"></File><File path="Projects\TempDataLogger\Lib\FATFs\diskio.h"></File><File path="Projects\TempDataLogger\Lib\FATFs\ff.c"></File><File path="Projects\TempDataLogger\Lib\FATFs\ff.h"></File><File path="Projects\TempDataLogger\Lib\FATFs\ffconf.h"></File><File path="Projects\TempDataLogger\Lib\FATFs\integer.h"></File></Folder><File path="Projects\TempDataLogger\Lib\DataflashManager.c"></File><File path="Projects\TempDataLogger\Lib\DataflashManager.h"></File><File path="Projects\TempDataLogger\Lib\DS1307.c"></File><File path="Projects\TempDataLogger\Lib\DS1307.h"></File><File path="Projects\TempDataLogger\Lib\SCSI.c"></File><File path="Projects\TempDataLogger\Lib\SCSI.h"></File></Folder><Folder name="TempLogHostApp"><File path="Projects\TempDataLogger\TempLogHostApp\DataLoggerSettings.cs"></File><File path="Projects\TempDataLogger\TempLogHostApp\DataLoggerSettings.Designer.cs"></File><File path="Projects\TempDataLogger\TempLogHostApp\DataLoggerSettings.resx"></File><File path="Projects\TempDataLogger\TempLogHostApp\Program.cs"></File><File path="Projects\TempDataLogger\TempLogHostApp\TempLoggerHostApp.csproj"></File></Folder><File path="Projects\TempDataLogger\Descriptors.c"></File><File path="Projects\TempDataLogger\Descriptors.h"></File><File path="Projects\TempDataLogger\Doxygen.conf"></File><File path="Projects\TempDataLogger\makefile"></File><File path="Projects\TempDataLogger\TempDataLogger.c"></File><File path="Projects\TempDataLogger\TempDataLogger.h"></File><File path="Projects\TempDataLogger\TemperatureDataLogger.txt"></File><File path="Projects\TempDataLogger\TempDataLogger.aps"></File></Folder><Folder name="USBtoSerial"><File path="Projects\USBtoSerial\Descriptors.h"></File><File path="Projects\USBtoSerial\Doxygen.conf"></File><File path="Projects\USBtoSerial\LUFA USBtoSerial.inf"></File><File path="Projects\USBtoSerial\makefile"></File><File path="Projects\USBtoSerial\USBtoSerial.c"></File><File path="Projects\USBtoSerial\USBtoSerial.h"></File><File path="Projects\USBtoSerial\USBtoSerial.txt"></File><File path="Projects\USBtoSerial\USBtoSerial.aps"></File><File path="Projects\USBtoSerial\Descriptors.c"></File></Folder><Folder name="Webserver"><Folder name="Lib"><Folder name="uip"><File path="Projects\Webserver\Lib\uip\clock.c"></File><File path="Projects\Webserver\Lib\uip\clock.h"></File><File path="Projects\Webserver\Lib\uip\timer.c"></File><File path="Projects\Webserver\Lib\uip\timer.h"></File><File path="Projects\Webserver\Lib\uip\uip.c"></File><File path="Projects\Webserver\Lib\uip\uip.h"></File><File path="Projects\Webserver\Lib\uip\uip_arp.c"></File><File path="Projects\Webserver\Lib\uip\uip_arp.h"></File><File path="Projects\Webserver\Lib\uip\uipopt.h"></File><File path="Projects\Webserver\Lib\uip\uip-split.c"></File><File path="Projects\Webserver\Lib\uip\uip-split.h"></File></Folder><Folder name="FATFs"><File path="Projects\Webserver\Lib\FATFs\diskio.c"></File><File path="Projects\Webserver\Lib\FATFs\diskio.h"></File><File path="Projects\Webserver\Lib\FATFs\ff.c"></File><File path="Projects\Webserver\Lib\FATFs\ff.h"></File><File path="Projects\Webserver\Lib\FATFs\ffconf.h"></File><File path="Projects\Webserver\Lib\FATFs\integer.h"></File></Folder><File path="Projects\Webserver\Lib\DataflashManager.c"></File><File path="Projects\Webserver\Lib\DataflashManager.h"></File><File path="Projects\Webserver\Lib\uIPManagement.c"></File><File path="Projects\Webserver\Lib\uIPManagement.h"></File><File path="Projects\Webserver\Lib\HTTPServerApp.c"></File><File path="Projects\Webserver\Lib\HTTPServerApp.h"></File><File path="Projects\Webserver\Lib\SCSI.c"></File><File path="Projects\Webserver\Lib\SCSI.h"></File><File path="Projects\Webserver\Lib\DHCPClientApp.c"></File><File path="Projects\Webserver\Lib\DHCPClientApp.h"></File><File path="Projects\Webserver\Lib\TELNETServerApp.c"></File><File path="Projects\Webserver\Lib\TELNETServerApp.h"></File></Folder><File path="Projects\Webserver\makefile"></File><File path="Projects\Webserver\Webserver.c"></File><File path="Projects\Webserver\Webserver.h"></File><File path="Projects\Webserver\Doxygen.conf"></File><File path="Projects\Webserver\Webserver.txt"></File><File path="Projects\Webserver\Descriptors.c"></File><File path="Projects\Webserver\Descriptors.h"></File><File path="Projects\Webserver\USBHostMode.c"></File><File path="Projects\Webserver\USBHostMode.h"></File><File path="Projects\Webserver\USBDeviceMode.c"></File><File path="Projects\Webserver\USBDeviceMode.h"></File><File path="Projects\Webserver\Webserver.aps"></File></Folder><Folder name="XPLAINBridge"><Folder name="Lib"><File path="Projects\XPLAINBridge\Lib\SoftUART.c"></File><File path="Projects\XPLAINBridge\Lib\SoftUART.h"></File></Folder><File path="Projects\XPLAINBridge\XPLAINBridge.txt"></File><File path="Projects\XPLAINBridge\XPLAINBridge.h"></File><File path="Projects\XPLAINBridge\XPLAINBridge.c"></File><File path="Projects\XPLAINBridge\XPLAINBridge.aps"></File><File path="Projects\XPLAINBridge\USARTDescriptors.h"></File><File path="Projects\XPLAINBridge\USARTDescriptors.c"></File><File path="Projects\XPLAINBridge\makefile"></File><File path="Projects\XPLAINBridge\LUFA XPLAIN Bridge.inf"></File><File path="Projects\XPLAINBridge\Doxygen.conf"></File><File path="Projects\XPLAINBridge\AVRISPDescriptors.h"></File><File path="Projects\XPLAINBridge\AVRISPDescriptors.c"></File></Folder><Folder name="Incomplete"><Folder name="StandaloneProgrammer"><Folder name="Lib"><Folder name="PetiteFATFs"><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\diskio.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\diskio.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\integer.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\pff.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\PetiteFATFs\pff.h"></File></Folder><File path="Projects\Incomplete\StandaloneProgrammer\Lib\DataflashManager.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\DataflashManager.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\SCSI.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\SCSI.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\ProgrammerConfig.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Lib\ProgrammerConfig.h"></File></Folder><File path="Projects\Incomplete\StandaloneProgrammer\Descriptors.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\Descriptors.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\makefile"></File><File path="Projects\Incomplete\StandaloneProgrammer\StandaloneProgrammer.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\StandaloneProgrammer.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskDevice.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskDevice.h"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskHost.c"></File><File path="Projects\Incomplete\StandaloneProgrammer\DiskHost.h"></File></Folder></Folder><File path="Projects\makefile"></File></Folder><File path="makefile"></File><File path="README.txt"></File></Project>
\ No newline at end of file
index 9a13eb1..e2f88d1 100644 (file)
@@ -63,7 +63,7 @@
                #define __INCLUDE_FROM_AUDIO_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_DEVICE)
                        #include "Device/Audio.h"
index a5dc373..935291c 100644 (file)
@@ -64,7 +64,7 @@
                #define __INCLUDE_FROM_CDC_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_DEVICE)
                        #include "Device/CDC.h"
index 8ddb52d..be899bb 100644 (file)
@@ -51,7 +51,7 @@
 #define _AUDIO_CLASS_COMMON_H_
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
 
                #include <string.h>
 
index c63c0b5..5a4c2c2 100644 (file)
@@ -51,7 +51,7 @@
 #define _CDC_CLASS_COMMON_H_
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
 
                #include <string.h>
 
index fd35905..7b0c34d 100644 (file)
@@ -51,7 +51,7 @@
 #define _HID_CLASS_COMMON_H_
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
                #include "HIDParser.h"
 
                #include <string.h>
index cd32093..98544a0 100644 (file)
 #define __HIDPARSER_H__
 
        /* Includes: */
-               #include <string.h>
-               #include <stdbool.h>
+               #include "../../../../Common/Common.h"
 
                #include "HIDReportData.h"
                #include "../Common/HID.h"
 
-               #include "../../../../Common/Common.h"
-
+               #include <string.h>
+               
        /* Enable C linkage for C++ Compilers: */
                #if defined(__cplusplus)
                        extern "C" {
index 8d56f1e..c72ca5a 100644 (file)
@@ -54,7 +54,7 @@
                #define __INCLUDE_FROM_AUDIO_DRIVER
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
                #include "Audio.h"
 
                #include <string.h>
index f4274ca..1acd682 100644 (file)
@@ -51,7 +51,7 @@
 #define _MS_CLASS_COMMON_H_
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
 
                #include <string.h>
 
index 23bc6a4..092cd8f 100644 (file)
@@ -51,7 +51,7 @@
 #define _PRINTER_CLASS_COMMON_H_
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
 
                #include <string.h>
 
index 6b67b97..cb806ec 100644 (file)
@@ -54,7 +54,7 @@
                #define __INCLUDE_FROM_CDC_DRIVER
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
                #include "CDC.h"
 
                #include <string.h>
index 06299bf..7ef04d8 100644 (file)
@@ -51,7 +51,7 @@
 #define _SI_CLASS_COMMON_H_
 
        /* Includes: */
-               #include "../../HighLevel/StdDescriptors.h"
+               #include "../../Core/StdDescriptors.h"
 
                #include <string.h>
 
index 3a0993a..986e73f 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_AUDIO_DRIVER
index 838bd71..a196f53 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_CDC_DRIVER
index 4126738..505b66e 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_HID_DRIVER
index ecedea7..5e4bd9c 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_MIDI_DRIVER
index 4d7cff6..289d4c0 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_MS_DRIVER
index 490ad51..3ade4af 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_DEVICE)
 
 #define  __INCLUDE_FROM_RNDIS_DRIVER
index 4eafa75..f72d47b 100644 (file)
@@ -65,7 +65,7 @@
                #define __INCLUDE_FROM_HID_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_DEVICE)
                        #include "Device/HID.h"
index 73e634b..d99e42e 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_CDC_DRIVER
index 459d53c..4460484 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_HID_DRIVER
index 2b19bcc..d376a30 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_MIDI_DRIVER
index e632827..537ce51 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_MS_DRIVER
index a086a53..bd960e2 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_PRINTER_DRIVER
index 23bd79b..2349757 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_RNDIS_DRIVER
index 3bfd36c..1fbe000 100644 (file)
@@ -29,7 +29,8 @@
 */
 
 #define  __INCLUDE_FROM_USB_DRIVER
-#include "../../HighLevel/USBMode.h"
+#include "../../Core/USBMode.h"
+
 #if defined(USB_CAN_BE_HOST)
 
 #define  __INCLUDE_FROM_SI_DRIVER
index 431df22..3f7970b 100644 (file)
@@ -67,7 +67,7 @@
                #define __INCLUDE_FROM_MIDI_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_DEVICE)
                        #include "Device/MIDI.h"
index 8267c16..49af9dd 100644 (file)
@@ -64,7 +64,7 @@
                #define __INCLUDE_FROM_MS_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_DEVICE)
                        #include "Device/MassStorage.h"
index e624128..067ce75 100644 (file)
@@ -65,7 +65,7 @@
                #define __INCLUDE_FROM_PRINTER_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_HOST)
                        #include "Host/Printer.h"
index 5725bea..37a5840 100644 (file)
@@ -64,7 +64,7 @@
                #define __INCLUDE_FROM_RNDIS_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_DEVICE)
                        #include "Device/RNDIS.h"
index dadb98d..a421b15 100644 (file)
@@ -63,7 +63,7 @@
                #define __INCLUDE_FROM_SI_DRIVER
 
        /* Includes: */
-               #include "../HighLevel/USBMode.h"
+               #include "../Core/USBMode.h"
 
                #if defined(USB_CAN_BE_HOST)
                        #include "Host/StillImage.h"
diff --git a/LUFA/Drivers/USB/Core/AVR8/Device.c b/LUFA/Drivers/USB/Core/AVR8/Device.c
new file mode 100644 (file)
index 0000000..c1b37f4
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "Device.h"
+
+void USB_Device_SendRemoteWakeup(void)
+{
+       if (!(USB_Options & USB_OPT_MANUAL_PLL))
+       {
+               USB_PLL_On();
+               while (!(USB_PLL_IsReady()));
+       }
+
+       USB_CLK_Unfreeze();
+
+       UDCON |= (1 << RMWKUP);
+       while (!(UDCON & (1 << RMWKUP)));
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Device.h b/LUFA/Drivers/USB/Core/AVR8/Device.h
new file mode 100644 (file)
index 0000000..30088f1
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB device mode definitions (AVR8)
+ *
+ *  This file contains structures, function prototypes and macros related to USB device mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Device
+ *  \defgroup Group_Device_AVR8 Device Management (AVR8)
+ *
+ *  USB Device mode related macros and enums. This module contains macros and enums which are used when
+ *  the USB controller is initialized in device mode.
+ *
+ *  @{
+ */
+
+#ifndef __USBDEVICE_AVR8_H__
+#define __USBDEVICE_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+               #include "../StdDescriptors.h"
+               #include "../USBInterrupt.h"
+               #include "../Endpoint.h"
+               
+               #include <avr/boot.h>
+
+       /* Preprocessor Checks: */
+               #if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
+                       #error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+               #endif
+
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** \name USB Device Mode Option Masks */
+                       //@{
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
+                               /** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+                                *  USB interface should be initialized in low speed (1.5Mb/s) mode.
+                                *
+                                *  \note Low Speed mode is not available on all USB AVR models.
+                                *        \n
+                                *
+                                *  \note Restrictions apply on the number, size and type of endpoints which can be used
+                                *        when running in low speed mode - refer to the USB 2.0 specification.
+                                */
+                               #define USB_DEVICE_OPT_LOWSPEED            (1 << 0)
+                       #endif
+
+                       /** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+                        *  USB interface should be initialized in full speed (12Mb/s) mode.
+                        */
+                       #define USB_DEVICE_OPT_FULLSPEED               (0 << 0)
+                       //@}
+                       
+                       #if (!defined(NO_INTERNAL_SERIAL) && \
+                            (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__) || \
+                             defined(__AVR_ATmega32U6__) || defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__) ||  \
+                             defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__)  || defined(__AVR_ATmega8U2__)))
+                               /** String descriptor index for the device's unique serial number string descriptor within the device.
+                                *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
+                                *  number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain
+                                *  a unique serial number internally, and setting the device descriptors serial number string index to this value
+                                *  will cause it to use the internal serial number.
+                                *
+                                *  On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseudo-serial
+                                *  number for the device.
+                                */
+                               #define USE_INTERNAL_SERIAL           0xDC
+                       #else
+                               #define USE_INTERNAL_SERIAL           NO_DESCRIPTOR
+                       #endif                  
+                       
+               /* Function Prototypes: */
+                       /** Sends a Remote Wakeup request to the host. This signals to the host that the device should
+                        *  be taken out of suspended mode, and communications should resume.
+                        *
+                        *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
+                        *  host computer when the host has suspended all USB devices to enter a low power state.
+                        *
+                        *  \note This macro should only be used if the device has indicated to the host that it
+                        *        supports the Remote Wakeup feature in the device descriptors, and should only be
+                        *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
+                        *        the \ref USB_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP compile
+                        *        time option is used, this macro is unavailable.
+                        *        \n\n
+                        *
+                        *  \note The USB clock must be running for this function to operate. If the stack is initialized with
+                        *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running
+                        *        before attempting to call this function.
+                        *
+                        *  \see \ref Group_Descriptors for more information on the RMWAKEUP feature and device descriptors.
+                        */
+                       void USB_Device_SendRemoteWakeup(void);
+
+               /* Type Defines: */
+                       enum USB_Device_States_t
+                       {
+                               DEVICE_STATE_Unattached                   = 0, /**< Internally implemented by the library. This state indicates
+                                                                               *   that the device is not currently connected to a host.
+                                                                               */
+                               DEVICE_STATE_Powered                      = 1, /**< Internally implemented by the library. This state indicates
+                                                                               *   that the device is connected to a host, but enumeration has not
+                                                                               *   yet begun.
+                                                                               */
+                               DEVICE_STATE_Default                      = 2, /**< Internally implemented by the library. This state indicates
+                                                                               *   that the device's USB bus has been reset by the host and it is
+                                                                               *   now waiting for the host to begin the enumeration process.
+                                                                               */
+                               DEVICE_STATE_Addressed                    = 3, /**< Internally implemented by the library. This state indicates
+                                                                               *   that the device has been addressed by the USB Host, but is not
+                                                                               *   yet configured.
+                                                                               */
+                               DEVICE_STATE_Configured                   = 4, /**< May be implemented by the user project. This state indicates
+                                                                               *   that the device has been enumerated by the host and is ready
+                                                                               *   for USB communications to begin.
+                                                                               */
+                               DEVICE_STATE_Suspended                    = 5, /**< May be implemented by the user project. This state indicates
+                                                                               *   that the USB bus has been suspended by the host, and the device
+                                                                               *   should power down to a minimal power level until the bus is
+                                                                               *   resumed.
+                                                                               */
+                       };
+
+               /* Inline Functions: */
+                       /** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
+                        *  the frame number is incremented by one.
+                        */
+                       static inline uint16_t USB_Device_GetFrameNumber(void)
+                       {
+                               return UDFNUM;
+                       }
+
+                       #if !defined(NO_SOF_EVENTS)
+                               /** Enables the device mode Start Of Frame events. When enabled, this causes the
+                                *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+                                *  at the start of each USB frame when enumerated in device mode.
+                                *
+                                *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+                                */
+                               static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+                               static inline void USB_Device_EnableSOFEvents(void)
+                               {
+                                       USB_INT_Enable(USB_INT_SOFI);
+                               }
+
+                               /** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
+                                *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
+                                *
+                                *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+                                */
+                               static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+                               static inline void USB_Device_DisableSOFEvents(void)
+                               {
+                                       USB_INT_Disable(USB_INT_SOFI);
+                               }
+                       #endif
+
+               /* Function Prototypes: */
+                       /** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,
+                        *  index and language ID. This function MUST be overridden in the user application (added with full, identical
+                        *  prototype and name so that the library can call it to retrieve descriptor data.
+                        *
+                        *  \param[in] wValue               The type of the descriptor to retrieve in the upper byte, and the index in the
+                        *                                  lower byte (when more than one descriptor of the given type exists, such as the
+                        *                                  case of string descriptors). The type may be one of the standard types defined
+                        *                                  in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
+                        *  \param[in] wIndex               The language ID of the string to return if the \c wValue type indicates
+                        *                                  \ref DTYPE_String, otherwise zero for standard descriptors, or as defined in a
+                        *                                  class-specific standards.
+                        *  \param[out] DescriptorAddress   Pointer to the descriptor in memory. This should be set by the routine to
+                        *                                  the address of the descriptor.
+                        *  \param[out] MemoryAddressSpace  A value from the \ref USB_DescriptorMemorySpaces_t enum to indicate the memory
+                        *                                  space in which the descriptor is stored. This parameter does not exist when one
+                        *                                  of the \c USE_*_DESCRIPTORS compile time options is used.
+                        *
+                        *  \note By default, the library expects all descriptors to be located in flash memory via the \c PROGMEM attribute.
+                        *        If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to
+                        *        allow the descriptors to be changed dynamically at runtime) either the \c USE_RAM_DESCRIPTORS or the
+                        *        \c USE_EEPROM_DESCRIPTORS tokens may be defined in the project makefile and passed to the compiler by the -D
+                        *        switch.
+                        *
+                        *  \return Size in bytes of the descriptor if it exists, zero or \ref NO_DESCRIPTOR otherwise.
+                        */
+                       uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+                                                           const uint8_t wIndex,
+                                                           const void** const DescriptorAddress
+                       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
+                                                           , uint8_t* MemoryAddressSpace
+                       #endif
+                                                           ) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Inline Functions: */
+                       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+                       static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Device_SetLowSpeed(void)
+                       {
+                               UDCON |=  (1 << LSM);
+                       }
+
+                       static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Device_SetFullSpeed(void)
+                       {
+                               UDCON &= ~(1 << LSM);
+                       }
+                       #endif
+
+                       static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
+                       {
+                               UDADDR  = ((UDADDR & (1 << ADDEN)) | (Address & 0x7F));
+                               UDADDR |= (1 << ADDEN);
+                       }
+
+                       static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE;
+                       static inline bool USB_Device_IsAddressSet(void)
+                       {
+                               return (UDADDR & (1 << ADDEN));
+                       }
+               
+                       static inline uint8_t USB_Device_GetSerialString(wchar_t* UnicodeString, const uint8_t MaxLen)
+                       {
+                               uint8_t SerialCharNum = 0;
+
+                               ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+                               {
+                                       uint8_t SigReadAddress = 0x0E;
+
+                                       for (SerialCharNum = 0; SerialCharNum < MIN(MaxLen, 20); SerialCharNum++)
+                                       {
+                                               if (SerialCharNum == MaxLen)
+                                                 break;
+
+                                               uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
+
+                                               if (SerialCharNum & 0x01)
+                                               {
+                                                       SerialByte >>= 4;
+                                                       SigReadAddress++;
+                                               }
+
+                                               SerialByte &= 0x0F;
+
+                                               UnicodeString[SerialCharNum] = (SerialByte >= 10) ?
+                                                                              (('A' - 10) + SerialByte) : ('0' + SerialByte);
+                                       }
+                               }
+                               
+                               return SerialCharNum;
+                       }
+               
+       #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Endpoint.c b/LUFA/Drivers/USB/Core/AVR8/Endpoint.c
new file mode 100644 (file)
index 0000000..c4e32c0
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "Endpoint.h"
+
+#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+uint8_t USB_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+                                    const uint8_t UECFG0XData,
+                                    const uint8_t UECFG1XData)
+{
+#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
+       Endpoint_SelectEndpoint(Number);
+       Endpoint_EnableEndpoint();
+
+       UECFG1X = 0;
+       UECFG0X = UECFG0XData;
+       UECFG1X = UECFG1XData;
+
+       return Endpoint_IsConfigured();
+#else  
+       for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+       {
+               uint8_t UECFG0XTemp;
+               uint8_t UECFG1XTemp;
+               uint8_t UEIENXTemp;
+
+               Endpoint_SelectEndpoint(EPNum);
+               
+               if (EPNum == Number)
+               {
+                       UECFG0XTemp = UECFG0XData;
+                       UECFG1XTemp = UECFG1XData;
+                       UEIENXTemp  = 0;
+               }
+               else
+               {
+                       UECFG0XTemp = UECFG0X;
+                       UECFG1XTemp = UECFG1X;
+                       UEIENXTemp  = UEIENX;
+               }
+
+               if (!(UECFG1XTemp & (1 << ALLOC)))
+                 continue;
+
+               Endpoint_DisableEndpoint();
+               UECFG1X &= (1 << ALLOC);
+
+               Endpoint_EnableEndpoint();
+               UECFG0X = UECFG0XTemp;
+               UECFG1X = UECFG1XTemp;
+               UEIENX  = UEIENXTemp;
+                       
+               if (!(Endpoint_IsConfigured()))
+                 return false;                 
+       }
+       
+       Endpoint_SelectEndpoint(Number);
+       return true;
+#endif
+}
+
+void Endpoint_ClearEndpoints(void)
+{
+       UEINT = 0;
+
+       for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+       {
+               Endpoint_SelectEndpoint(EPNum);
+               UEIENX  = 0;
+               UEINTX  = 0;
+               UECFG1X = 0;
+               Endpoint_DisableEndpoint();
+       }
+}
+
+void Endpoint_ClearStatusStage(void)
+{
+       if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
+       {
+               while (!(Endpoint_IsOUTReceived()))
+               {
+                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+                         return;
+               }
+
+               Endpoint_ClearOUT();
+       }
+       else
+       {
+               while (!(Endpoint_IsINReady()))
+               {
+                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+                         return;
+               }
+
+               Endpoint_ClearIN();
+       }
+}
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_WaitUntilReady(void)
+{
+       #if (USB_STREAM_TIMEOUT_MS < 0xFF)
+       uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+       #else
+       uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+       #endif
+
+       uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
+
+       for (;;)
+       {
+               if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+               {
+                       if (Endpoint_IsINReady())
+                         return ENDPOINT_READYWAIT_NoError;
+               }
+               else
+               {
+                       if (Endpoint_IsOUTReceived())
+                         return ENDPOINT_READYWAIT_NoError;
+               }
+               
+               uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+                 return ENDPOINT_READYWAIT_DeviceDisconnected;
+               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+                 return ENDPOINT_READYWAIT_BusSuspended;
+               else if (Endpoint_IsStalled())
+                 return ENDPOINT_READYWAIT_EndpointStalled;
+
+               uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
+
+               if (CurrentFrameNumber != PreviousFrameNumber)
+               {
+                       PreviousFrameNumber = CurrentFrameNumber;
+
+                       if (!(TimeoutMSRem--))
+                         return ENDPOINT_READYWAIT_Timeout;
+               }
+       }
+}
+#endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Endpoint.h b/LUFA/Drivers/USB/Core/AVR8/Endpoint.h
new file mode 100644 (file)
index 0000000..1feadd3
--- /dev/null
@@ -0,0 +1,897 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB device endpoint management definitions.
+ *
+ *  This file contains structures, function prototypes and macros related to the management of the device's
+ *  data endpoints when the library is initialized in USB device mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointRW
+ *  \defgroup Group_EndpointRW_AVR8 Endpoint Data Reading and Writing (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPrimitiveRW
+ *  \defgroup Group_EndpointPrimitiveRW_AVR8 Read/Write of Primitive Data Types (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPacketManagement
+ *  \defgroup Group_EndpointPacketManagement_AVR8 Endpoint Packet Management (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ *  \defgroup Group_EndpointManagement_AVR8 Endpoint Management (AVR8)
+ *
+ *  Functions, macros and enums related to endpoint management when in USB Device mode. This
+ *  module contains the endpoint management macros, as well as endpoint interrupt and data
+ *  send/receive functions for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_AVR8_H__
+#define __ENDPOINT_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+               #include "../USBTask.h"
+               #include "../USBInterrupt.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Macros: */
+                       #define _ENDPOINT_GET_MAXSIZE(EPIndex)         _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## EPIndex)
+                       #define _ENDPOINT_GET_MAXSIZE2(EPDetails)      _ENDPOINT_GET_MAXSIZE3(EPDetails)
+                       #define _ENDPOINT_GET_MAXSIZE3(MaxSize, Banks) (MaxSize)
+
+                       #define _ENDPOINT_GET_BANKS(EPIndex)           _ENDPOINT_GET_BANKS2(ENDPOINT_DETAILS_EP ## EPIndex)
+                       #define _ENDPOINT_GET_BANKS2(EPDetails)        _ENDPOINT_GET_BANKS3(EPDetails)
+                       #define _ENDPOINT_GET_BANKS3(MaxSize, Banks)   (Banks)
+
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+                               #define ENDPOINT_DETAILS_MAXEP             7
+
+                               #define ENDPOINT_DETAILS_EP0               64,  2
+                               #define ENDPOINT_DETAILS_EP1               256, 2
+                               #define ENDPOINT_DETAILS_EP2               64,  2
+                               #define ENDPOINT_DETAILS_EP3               64,  2
+                               #define ENDPOINT_DETAILS_EP4               64,  2
+                               #define ENDPOINT_DETAILS_EP5               64,  2
+                               #define ENDPOINT_DETAILS_EP6               64,  2
+                       #else
+                               #define ENDPOINT_DETAILS_MAXEP             5
+
+                               #define ENDPOINT_DETAILS_EP0               64,  2
+                               #define ENDPOINT_DETAILS_EP1               64,  1
+                               #define ENDPOINT_DETAILS_EP2               64,  1
+                               #define ENDPOINT_DETAILS_EP3               64,  2
+                               #define ENDPOINT_DETAILS_EP4               64,  2
+                       #endif
+
+               /* Inline Functions: */
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+                                                                                              ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+                       {
+                               uint8_t  MaskVal    = 0;
+                               uint16_t CheckBytes = 8;
+
+                               while (CheckBytes < Bytes)
+                               {
+                                       MaskVal++;
+                                       CheckBytes <<= 1;
+                               }
+
+                               return (MaskVal << EPSIZE0);
+                       }
+
+               /* Function Prototypes: */
+                       void Endpoint_ClearEndpoints(void);
+                       bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+                                                           const uint8_t UECFG0XData,
+                                                           const uint8_t UECFG1XData);
+
+       #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** \name Endpoint Direction Masks */
+                       //@{
+                       /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
+                        *  should be initialized in the OUT direction - i.e. data flows from host to device.
+                        */
+                       #define ENDPOINT_DIR_OUT                        (0 << EPDIR)
+
+                       /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
+                        *  should be initialized in the IN direction - i.e. data flows from device to host.
+                        */
+                       #define ENDPOINT_DIR_IN                         (1 << EPDIR)
+                       //@}
+                       
+                       /** \name Endpoint Bank Mode Masks */
+                       //@{
+                       /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+                        *  that the endpoint should have one single bank, which requires less USB FIFO memory but results
+                        *  in slower transfers as only one USB device (the AVR or the host) can access the endpoint's
+                        *  bank at the one time.
+                        */
+                       #define ENDPOINT_BANK_SINGLE                    (0 << EPBK0)
+
+                       /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+                        *  that the endpoint should have two banks, which requires more USB FIFO memory but results
+                        *  in faster transfers as one USB device (the AVR or the host) can access one bank while the other
+                        *  accesses the second bank.
+                        */
+                       #define ENDPOINT_BANK_DOUBLE                    (1 << EPBK0)
+                       //@}
+                       
+                       /** Endpoint address for the default control endpoint, which always resides in address 0. This is
+                        *  defined for convenience to give more readable code when used with the endpoint macros.
+                        */
+                       #define ENDPOINT_CONTROLEP                      0
+
+                       #if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+                               /** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
+                                *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined.
+                                */
+                               #define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8
+                       #endif
+
+                       /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
+                        *  numerical address in the device.
+                        */
+                       #define ENDPOINT_EPNUM_MASK                     0x07
+
+                       /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
+                        *  direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
+                        */
+                       #define ENDPOINT_EPDIR_MASK                     0x80
+
+                       /** Endpoint bank size mask, for masking against endpoint addresses to retrieve the endpoint's
+                        *  bank size in the device.
+                        */
+                       #define ENDPOINT_EPSIZE_MASK                    0x7F
+
+                       /** Retrives the maximum bank size in bytes of a given endpoint.
+                        *
+                        *  \note This macro will only work correctly on endpoint indexes that are compile-time constants
+                        *        defined by the preprocessor.
+                        *
+                        *  \param[in] EPIndex  Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
+                        */
+                       #define ENDPOINT_MAX_SIZE(EPIndex)              _ENDPOINT_GET_MAXSIZE(EPIndex)
+
+                       /** Retrieves the total number of banks supported by the given endpoint.
+                        *
+                        *  \note This macro will only work correctly on endpoint indexes that are compile-time constants
+                        *        defined by the preprocessor.
+                        *
+                        *  \param[in] EPIndex  Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
+                        */
+                       #define ENDPOINT_BANKS_SUPPORTED(EPIndex)       _ENDPOINT_GET_BANKS(EPIndex)
+
+                       #if !defined(CONTROL_ONLY_DEVICE) || defined(__DOXYGEN__)
+                               /** Total number of endpoints (including the default control endpoint at address 0) which may
+                                *  be used in the device. Different USB AVR models support different amounts of endpoints,
+                                *  this value reflects the maximum number of endpoints for the currently selected AVR model.
+                                */
+                               #define ENDPOINT_TOTAL_ENDPOINTS            ENDPOINT_DETAILS_MAXEP
+                       #else
+                               #define ENDPOINT_TOTAL_ENDPOINTS            1
+                       #endif
+
+               /* Enums: */
+                       /** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
+                        *
+                        *  \ingroup Group_EndpointRW_AVR8
+                        */
+                       enum Endpoint_WaitUntilReady_ErrorCodes_t
+                       {
+                               ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
+                               ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream
+                                                                                *   transfer by the host or device.
+                                                                                */
+                               ENDPOINT_READYWAIT_DeviceDisconnected      = 2, /**< Device was disconnected from the host while
+                                                                                *   waiting for the endpoint to become ready.
+                                                                                */
+                               ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and
+                                                                                *   no USB endpoint traffic can occur until the bus
+                                                                                *   has resumed.
+                                                                                */
+                               ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet
+                                                                                *   within the software timeout period set by the
+                                                                                *   \ref USB_STREAM_TIMEOUT_MS macro.
+                                                                                */
+                       };
+
+               /* Inline Functions: */
+                       /** Configures the specified endpoint number with the given endpoint type, direction, bank size
+                        *  and banking mode. Once configured, the endpoint may be read from or written to, depending
+                        *  on its direction.
+                        *
+                        *  \param[in] Number     Endpoint number to configure. This must be more than 0 and less than
+                        *                        \ref ENDPOINT_TOTAL_ENDPOINTS.
+                        *
+                        *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types
+                        *                        are available on Low Speed USB devices - refer to the USB 2.0 specification.
+                        *
+                        *  \param[in] Direction  Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
+                        *                        All endpoints (except Control type) are unidirectional - data may only be read
+                        *                        from or written to the endpoint bank based on its direction, not both.
+                        *
+                        *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted
+                        *                        to the USB host, or after they have been received from the USB host (depending on
+                        *                        the endpoint's data direction). The bank size must indicate the maximum packet size
+                        *                        that the endpoint can handle.
+                        *
+                        *  \param[in] Banks      Number of banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask.
+                        *                        More banks uses more USB DPRAM, but offers better performance. Isochronous type
+                        *                        endpoints <b>must</b> have at least two banks.
+                        *
+                        *  \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
+                        *        ascending order, or bank corruption will occur.
+                        *        \n\n
+                        *
+                        *  \note Certain models of USB AVR's endpoints may have different maximum packet sizes based on the endpoint's
+                        *        index - refer to the chosen USB AVR's datasheet to determine the maximum bank size for each endpoint.
+                        *        \n\n
+                        *
+                        *  \note The default control endpoint should not be manually configured by the user application, as
+                        *        it is automatically configured by the library internally.
+                        *        \n\n
+                        *
+                        *  \note This routine will automatically select the specified endpoint upon success. Upon failure, the endpoint
+                        *        which failed to reconfigure correctly will be selected.
+                        *
+                        *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+                        */
+                       static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+                                                                     const uint8_t Type,
+                                                                     const uint8_t Direction,
+                                                                     const uint16_t Size,
+                                                                     const uint8_t Banks) ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+                                                                     const uint8_t Type,
+                                                                     const uint8_t Direction,
+                                                                     const uint16_t Size,
+                                                                     const uint8_t Banks)
+                       {
+                               return Endpoint_ConfigureEndpoint_Prv(Number, (((Type) << EPTYPE0) | (Direction)),
+                                                                     ((1 << ALLOC) | Banks | Endpoint_BytesToEPSizeMask(Size)));
+                       }
+
+                       /** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+                        *
+                        *  \note The return width of this function may differ, depending on the maximum endpoint bank size
+                        *        of the selected AVR model.
+                        *
+                        *  \ingroup Group_EndpointRW_AVR8
+                        *
+                        *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer.
+                        */
+                       static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint16_t Endpoint_BytesInEndpoint(void)
+                       {
+                               #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+                                       return UEBCX;
+                               #elif defined(USB_SERIES_4_AVR)
+                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
+                               #elif defined(USB_SERIES_2_AVR)
+                                       return UEBCLX;
+                               #endif
+                       }
+
+                       /** Get the endpoint address of the currently selected endpoint. This is typically used to save
+                        *  the currently selected endpoint number so that it can be restored after another endpoint has
+                        *  been manipulated.
+                        *
+                        *  \return Index of the currently selected endpoint.
+                        */
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       return (UENUM & ENDPOINT_EPNUM_MASK);
+                               #else
+                                       return ENDPOINT_CONTROLEP;
+                               #endif
+                       }
+
+                       /** Selects the given endpoint number. If the address from the device descriptors is used, the
+                        *  value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint
+                        *  number (and discarding the endpoint direction bit).
+                        *
+                        *  Any endpoint operations which do not require the endpoint number to be indicated will operate on
+                        *  the currently selected endpoint.
+                        *
+                        *  \param[in] EndpointNumber Endpoint number to select.
+                        */
+                       static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UENUM = EndpointNumber;
+                               #endif
+                       }
+
+                       /** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
+                        *  data In and Out pointers to the bank's contents.
+                        *
+                        *  \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
+                        */
+                       static inline void Endpoint_ResetFIFO(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ResetFIFO(const uint8_t EndpointNumber)
+                       {
+                               UERST = (1 << EndpointNumber);
+                               UERST = 0;
+                       }
+
+                       /** Enables the currently selected endpoint so that data can be sent and received through it to
+                        *  and from a host.
+                        *
+                        *  \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
+                        */
+                       static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_EnableEndpoint(void)
+                       {
+                               UECONX |= (1 << EPEN);
+                       }
+
+                       /** Disables the currently selected endpoint so that data cannot be sent and received through it
+                        *  to and from a host.
+                        */
+                       static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_DisableEndpoint(void)
+                       {
+                               UECONX &= ~(1 << EPEN);
+                       }
+
+                       /** Determines if the currently selected endpoint is enabled, but not necessarily configured.
+                        *
+                        * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsEnabled(void)
+                       {
+                               return ((UECONX & (1 << EPEN)) ? true : false);
+                       }
+
+                       /** Aborts all pending IN transactions on the currently selected endpoint, once the bank
+                        *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
+                        *  will terminate all queued transactions, resetting the endpoint banks ready for a new
+                        *  packet.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_AbortPendingIN(void)
+                       {
+                               while (UESTA0X & (0x03 << NBUSYBK0))
+                               {
+                                       UEINTX |= (1 << RXOUTI);
+                                       while (UEINTX & (1 << RXOUTI));
+                               }
+                       }
+                       
+                       /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
+                        *  transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
+                        *  \ref Endpoint_ClearOUT() command.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \return Total number of busy banks in the selected endpoint.
+                        */
+                       static inline uint8_t Endpoint_GetBusyBanks(void)
+                       {
+                               return (UESTA0X & (0x03 << NBUSYBK0));
+                       }
+
+                       /** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
+                        *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
+                        *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
+                        *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
+                        *  direction and the endpoint bank is full.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending
+                        *          on its direction.
+                        */
+                       static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsReadWriteAllowed(void)
+                       {
+                               return ((UEINTX & (1 << RWAL)) ? true : false);
+                       }
+
+                       /** Determines if the currently selected endpoint is configured.
+                        *
+                        *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsConfigured(void)
+                       {
+                               return ((UESTA0X & (1 << CFGOK)) ? true : false);
+                       }
+
+                       /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
+                        *  interrupt duration has elapsed. Which endpoints have interrupted can be determined by
+                        *  masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
+                        *
+                        *  \return Mask whose bits indicate which endpoints have interrupted.
+                        */
+                       static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetEndpointInterrupts(void)
+                       {
+                               return UEINT;
+                       }
+
+                       /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
+                        *  endpoints).
+                        *
+                        *  \param[in] EndpointNumber  Index of the endpoint whose interrupt flag should be tested.
+                        *
+                        *  \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
+                        */
+                       static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber)
+                       {
+                               return ((UEINT & (1 << EndpointNumber)) ? true : false);
+                       }
+
+                       /** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsINReady(void)
+                       {
+                               return ((UEINTX & (1 << TXINI)) ? true : false);
+                       }
+
+                       /** Determines if the selected OUT endpoint has received new packet from the host.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsOUTReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
+                       }
+
+                       /** Determines if the current CONTROL type endpoint has received a SETUP packet.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsSETUPReceived(void)
+                       {
+                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
+                       }
+
+                       /** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
+                        *  endpoint for the next packet.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \note This is not applicable for non CONTROL type endpoints.
+                        */
+                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearSETUP(void)
+                       {
+                               UEINTX &= ~(1 << RXSTPI);
+                       }
+
+                       /** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the
+                        *  next packet and switching to the alternative endpoint bank if double banked.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearIN(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+                               #else
+                                       UEINTX &= ~(1 << TXINI);
+                               #endif
+                       }
+
+                       /** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint
+                        *  for the next packet and switching to the alternative endpoint bank if double banked.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearOUT(void)
+                       {
+                               #if !defined(CONTROL_ONLY_DEVICE)
+                                       UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
+                               #else
+                                       UEINTX &= ~(1 << RXOUTI);
+                               #endif
+                       }
+
+                       /** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
+                        *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
+                        *  way for devices to indicate invalid commands to the host so that the current transfer can be
+                        *  aborted and the host can begin its own recovery sequence.
+                        *
+                        *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro
+                        *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
+                        *  endpoint.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_StallTransaction(void)
+                       {
+                               UECONX |= (1 << STALLRQ);
+                       }
+
+                       /** Clears the STALL condition on the currently selected endpoint.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        */
+                       static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ClearStall(void)
+                       {
+                               UECONX |= (1 << STALLRQC);
+                       }
+
+                       /** Determines if the currently selected endpoint is stalled, false otherwise.
+                        *
+                        *  \ingroup Group_EndpointPacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
+                        */
+                       static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Endpoint_IsStalled(void)
+                       {
+                               return ((UECONX & (1 << STALLRQ)) ? true : false);
+                       }
+
+                       /** Resets the data toggle of the currently selected endpoint. */
+                       static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_ResetDataToggle(void)
+                       {
+                               UECONX |= (1 << RSTDT);
+                       }
+
+                       /** Determines the currently selected endpoint's direction.
+                        *
+                        *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+                        */
+                       static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_GetEndpointDirection(void)
+                       {
+                               return (UECFG0X & ENDPOINT_DIR_IN);
+                       }
+
+                       /** Sets the direction of the currently selected endpoint.
+                        *
+                        *  \param[in] DirectionMask  New endpoint direction, as a \c ENDPOINT_DIR_* mask.
+                        */
+                       static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask)
+                       {
+                               UECFG0X = ((UECFG0X & ~ENDPOINT_DIR_IN) | DirectionMask);
+                       }
+
+                       /** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \return Next byte in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint8_t Endpoint_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Endpoint_Read_Byte(void)
+                       {
+                               return UEDATX;
+                       }
+
+                       /** Writes one byte from the currently selected endpoint's bank, for IN direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \param[in] Byte  Next byte to write into the the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_Byte(const uint8_t Byte)
+                       {
+                               UEDATX = Byte;
+                       }
+
+                       /** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        */
+                       static inline void Endpoint_Discard_Byte(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Discard_Byte(void)
+                       {
+                               uint8_t Dummy;
+
+                               Dummy = UEDATX;
+                       }
+
+                       /** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \return Next word in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint16_t Endpoint_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint16_t Endpoint_Read_Word_LE(void)
+                       {
+                               union
+                               {
+                                       uint16_t Word;
+                                       uint8_t  Bytes[2];
+                               } Data;
+
+                               Data.Bytes[0] = UEDATX;
+                               Data.Bytes[1] = UEDATX;
+
+                               return Data.Word;
+                       }
+
+                       /** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \return Next word in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint16_t Endpoint_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint16_t Endpoint_Read_Word_BE(void)
+                       {
+                               union
+                               {
+                                       uint16_t Word;
+                                       uint8_t  Bytes[2];
+                               } Data;
+
+                               Data.Bytes[1] = UEDATX;
+                               Data.Bytes[0] = UEDATX;
+
+                               return Data.Word;
+                       }
+
+                       /** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \param[in] Word  Next word to write to the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_Word_LE(const uint16_t Word)
+                       {
+                               UEDATX = (Word & 0xFF);
+                               UEDATX = (Word >> 8);
+                       }
+
+                       /** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \param[in] Word  Next word to write to the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_Word_BE(const uint16_t Word)
+                       {
+                               UEDATX = (Word >> 8);
+                               UEDATX = (Word & 0xFF);
+                       }
+
+                       /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        */
+                       static inline void Endpoint_Discard_Word(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Discard_Word(void)
+                       {
+                               uint8_t Dummy;
+
+                               Dummy = UEDATX;
+                               Dummy = UEDATX;
+                       }
+
+                       /** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \return Next double word in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint32_t Endpoint_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint32_t Endpoint_Read_DWord_LE(void)
+                       {
+                               union
+                               {
+                                       uint32_t DWord;
+                                       uint8_t  Bytes[4];
+                               } Data;
+
+                               Data.Bytes[0] = UEDATX;
+                               Data.Bytes[1] = UEDATX;
+                               Data.Bytes[2] = UEDATX;
+                               Data.Bytes[3] = UEDATX;
+
+                               return Data.DWord;
+                       }
+
+                       /** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \return Next double word in the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline uint32_t Endpoint_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint32_t Endpoint_Read_DWord_BE(void)
+                       {
+                               union
+                               {
+                                       uint32_t DWord;
+                                       uint8_t  Bytes[4];
+                               } Data;
+
+                               Data.Bytes[3] = UEDATX;
+                               Data.Bytes[2] = UEDATX;
+                               Data.Bytes[1] = UEDATX;
+                               Data.Bytes[0] = UEDATX;
+
+                               return Data.DWord;
+                       }
+
+                       /** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \param[in] DWord  Next double word to write to the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_DWord_LE(const uint32_t DWord)
+                       {
+                               UEDATX = (DWord &  0xFF);
+                               UEDATX = (DWord >> 8);
+                               UEDATX = (DWord >> 16);
+                               UEDATX = (DWord >> 24);
+                       }
+
+                       /** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
+                        *  direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        *
+                        *  \param[in] DWord  Next double word to write to the currently selected endpoint's FIFO buffer.
+                        */
+                       static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Write_DWord_BE(const uint32_t DWord)
+                       {
+                               UEDATX = (DWord >> 24);
+                               UEDATX = (DWord >> 16);
+                               UEDATX = (DWord >> 8);
+                               UEDATX = (DWord &  0xFF);
+                       }
+
+                       /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+                        *
+                        *  \ingroup Group_EndpointPrimitiveRW_AVR8
+                        */
+                       static inline void Endpoint_Discard_DWord(void) ATTR_ALWAYS_INLINE;
+                       static inline void Endpoint_Discard_DWord(void)
+                       {
+                               uint8_t Dummy;
+
+                               Dummy = UEDATX;
+                               Dummy = UEDATX;
+                               Dummy = UEDATX;
+                               Dummy = UEDATX;
+                       }
+
+               /* External Variables: */
+                       /** Global indicating the maximum packet size of the default control endpoint located at address
+                        *  0 in the device. This value is set to the value indicated in the device descriptor in the user
+                        *  project once the USB interface is initialized into device mode.
+                        *
+                        *  If space is an issue, it is possible to fix this to a static value by defining the control
+                        *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile
+                        *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically
+                        *  read from the descriptors at runtime and instead fixed to the given value. When used, it is
+                        *  important that the descriptor control endpoint size value matches the size given as the
+                        *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token
+                        *  be used in the device descriptors to ensure this.
+                        *
+                        *  \note This variable should be treated as read-only in the user application, and never manually
+                        *        changed in value.
+                        */
+                       #if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+                               extern uint8_t USB_ControlEndpointSize;
+                       #else
+                               #define USB_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE
+                       #endif
+
+               /* Function Prototypes: */
+                       /** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
+                        *  with respect to the data direction. This is a convenience function which can be used to
+                        *  simplify user control request handling.
+                        */
+                       void Endpoint_ClearStatusStage(void);
+
+                       /** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
+                        *  to be read or written to it.
+                        *
+                        *  \note This routine should not be called on CONTROL type endpoints.
+                        *
+                        *  \ingroup Group_EndpointRW_AVR8
+                        *
+                        *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+                        */
+                       uint8_t Endpoint_WaitUntilReady(void);
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Host.c b/LUFA/Drivers/USB/Core/AVR8/Host.c
new file mode 100644 (file)
index 0000000..214d193
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_HOST_C
+#include "Host.h"
+
+void USB_Host_ProcessNextHostState(void)
+{
+       uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
+       uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
+
+       static uint16_t WaitMSRemaining;
+       static uint8_t  PostWaitState;
+
+       switch (USB_HostState)
+       {
+               case HOST_STATE_WaitForDevice:
+                       if (WaitMSRemaining)
+                       {
+                               if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+                               {
+                                       USB_HostState = PostWaitState;
+                                       ErrorCode     = HOST_ENUMERROR_WaitStage;
+                                       break;
+                               }
+
+                               if (!(--WaitMSRemaining))
+                                 USB_HostState = PostWaitState;
+                       }
+
+                       break;
+               case HOST_STATE_Powered:
+                       WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
+
+                       USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
+                       break;
+               case HOST_STATE_Powered_WaitForDeviceSettle:
+                       if (WaitMSRemaining--)
+                       {
+                               _delay_ms(1);
+                               break;
+                       }
+                       else
+                       {
+                               USB_Host_VBUS_Manual_Off();
+
+                               USB_OTGPAD_On();
+                               USB_Host_VBUS_Auto_Enable();
+                               USB_Host_VBUS_Auto_On();
+
+                               USB_HostState = HOST_STATE_Powered_WaitForConnect;
+                       }
+
+                       break;
+               case HOST_STATE_Powered_WaitForConnect:
+                       if (USB_INT_HasOccurred(USB_INT_DCONNI))
+                       {
+                               USB_INT_Clear(USB_INT_DCONNI);
+                               USB_INT_Clear(USB_INT_DDISCI);
+
+                               USB_INT_Clear(USB_INT_VBERRI);
+                               USB_INT_Enable(USB_INT_VBERRI);
+
+                               USB_Host_ResumeBus();
+                               Pipe_ClearPipes();
+
+                               HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
+                       }
+
+                       break;
+               case HOST_STATE_Powered_DoReset:
+                       USB_Host_ResetDevice();
+
+                       HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
+                       break;
+               case HOST_STATE_Powered_ConfigPipe:
+                       Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
+                                                          PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
+                                                          PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);
+
+                       if (!(Pipe_IsConfigured()))
+                       {
+                               ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+                               SubErrorCode = 0;
+                               break;
+                       }
+
+                       USB_HostState = HOST_STATE_Default;
+                       break;
+               case HOST_STATE_Default:
+                       USB_ControlRequest = (USB_Request_Header_t)
+                               {
+                                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+                                       .bRequest      = REQ_GetDescriptor,
+                                       .wValue        = (DTYPE_Device << 8),
+                                       .wIndex        = 0,
+                                       .wLength       = 8,
+                               };
+
+                       uint8_t DataBuffer[8];
+
+                       if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
+                       {
+                               ErrorCode = HOST_ENUMERROR_ControlError;
+                               break;
+                       }
+
+                       USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
+
+                       USB_Host_ResetDevice();
+
+                       HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
+                       break;
+               case HOST_STATE_Default_PostReset:
+                       Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
+                                          PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
+                                          USB_ControlPipeSize, PIPE_BANK_SINGLE);
+
+                       if (!(Pipe_IsConfigured()))
+                       {
+                               ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+                               SubErrorCode = 0;
+                               break;
+                       }
+
+                       USB_ControlRequest = (USB_Request_Header_t)
+                               {
+                                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+                                       .bRequest      = REQ_SetAddress,
+                                       .wValue        = USB_HOST_DEVICEADDRESS,
+                                       .wIndex        = 0,
+                                       .wLength       = 0,
+                               };
+
+                       if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+                       {
+                               ErrorCode = HOST_ENUMERROR_ControlError;
+                               break;
+                       }
+
+                       HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
+                       break;
+               case HOST_STATE_Default_PostAddressSet:
+                       USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
+
+                       EVENT_USB_Host_DeviceEnumerationComplete();
+                       USB_HostState = HOST_STATE_Addressed;
+                       break;
+       }
+
+       if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
+       {
+               EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
+
+               USB_Host_VBUS_Auto_Off();
+
+               EVENT_USB_Host_DeviceUnattached();
+
+               USB_ResetInterface();
+       }
+}
+
+uint8_t USB_Host_WaitMS(uint8_t MS)
+{
+       bool    BusSuspended = USB_Host_IsBusSuspended();
+       uint8_t ErrorCode    = HOST_WAITERROR_Successful;
+       bool    HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+       USB_INT_Disable(USB_INT_HSOFI);
+       USB_INT_Clear(USB_INT_HSOFI);
+
+       USB_Host_ResumeBus();
+
+       while (MS)
+       {
+               if (USB_INT_HasOccurred(USB_INT_HSOFI))
+               {
+                       USB_INT_Clear(USB_INT_HSOFI);
+                       MS--;
+               }
+
+               if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
+               {
+                       ErrorCode = HOST_WAITERROR_DeviceDisconnect;
+
+                       break;
+               }
+
+               if (Pipe_IsError() == true)
+               {
+                       Pipe_ClearError();
+                       ErrorCode = HOST_WAITERROR_PipeError;
+
+                       break;
+               }
+
+               if (Pipe_IsStalled() == true)
+               {
+                       Pipe_ClearStall();
+                       ErrorCode = HOST_WAITERROR_SetupStalled;
+
+                       break;
+               }
+       }
+
+       if (BusSuspended)
+         USB_Host_SuspendBus();
+
+       if (HSOFIEnabled)
+         USB_INT_Enable(USB_INT_HSOFI);
+
+       return ErrorCode;
+}
+
+static void USB_Host_ResetDevice(void)
+{
+       bool BusSuspended = USB_Host_IsBusSuspended();
+
+       USB_INT_Disable(USB_INT_DDISCI);
+
+       USB_Host_ResetBus();
+       while (!(USB_Host_IsBusResetComplete()));
+       USB_Host_ResumeBus();
+
+       bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+       USB_INT_Disable(USB_INT_HSOFI);
+       USB_INT_Clear(USB_INT_HSOFI);
+
+       for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
+       {
+               /* Workaround for powerless-pull-up devices. After a USB bus reset,
+                  all disconnection interrupts are suppressed while a USB frame is
+                  looked for - if it is found within 10ms, the device is still
+                  present.                                                        */
+
+               if (USB_INT_HasOccurred(USB_INT_HSOFI))
+               {
+                       USB_INT_Clear(USB_INT_HSOFI);
+                       USB_INT_Clear(USB_INT_DDISCI);
+                       break;
+               }
+
+               _delay_ms(1);
+       }
+
+       if (HSOFIEnabled)
+         USB_INT_Enable(USB_INT_HSOFI);
+
+       if (BusSuspended)
+         USB_Host_SuspendBus();
+
+       USB_INT_Enable(USB_INT_DDISCI);
+}
+
+uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber)
+{
+       USB_ControlRequest = (USB_Request_Header_t)
+               {
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+                       .bRequest      = REQ_SetConfiguration,
+                       .wValue        = ConfigNumber,
+                       .wIndex        = 0,
+                       .wLength       = 0,
+               };
+
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+       return USB_Host_SendControlRequest(NULL);
+}
+
+uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr)
+{
+       USB_ControlRequest = (USB_Request_Header_t)
+               {
+                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+                       .bRequest      = REQ_GetDescriptor,
+                       .wValue        = (DTYPE_Device << 8),
+                       .wIndex        = 0,
+                       .wLength       = sizeof(USB_Descriptor_Device_t),
+               };
+
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+       return USB_Host_SendControlRequest(DeviceDescriptorPtr);
+}
+
+uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index,
+                                           void* const Buffer,
+                                           const uint8_t BufferLength)
+{
+       USB_ControlRequest = (USB_Request_Header_t)
+               {
+                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+                       .bRequest      = REQ_GetDescriptor,
+                       .wValue        = (DTYPE_String << 8) | Index,
+                       .wIndex        = 0,
+                       .wLength       = BufferLength,
+               };
+
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+       return USB_Host_SendControlRequest(Buffer);
+}
+
+uint8_t USB_Host_ClearPipeStall(const uint8_t EndpointNum)
+{
+       USB_ControlRequest = (USB_Request_Header_t)
+               {
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),
+                       .bRequest      = REQ_ClearFeature,
+                       .wValue        = FEATURE_SEL_EndpointHalt,
+                       .wIndex        = EndpointNum,
+                       .wLength       = 0,
+               };
+
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+       return USB_Host_SendControlRequest(NULL);
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Host.h b/LUFA/Drivers/USB/Core/AVR8/Host.h
new file mode 100644 (file)
index 0000000..def17ee
--- /dev/null
@@ -0,0 +1,523 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB host mode definitions  (AVR8)
+ *
+ *  This file contains structures, function prototypes and macros related to USB host mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Host
+ *  \defgroup Group_Host_AVR8 Host Management (AVR8)
+ *
+ *  USB Host mode related macros and enums. This module contains macros and enums which are used when
+ *  the USB controller is initialized in host mode.
+ *
+ *  @{
+ */
+
+#ifndef __USBHOST_AVR8_H__
+#define __USBHOST_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+               #include "../StdDescriptors.h"
+               #include "../Pipe.h"
+               #include "../USBInterrupt.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** Indicates the fixed USB device address which any attached device is enumerated to when in
+                        *  host mode. As only one USB device may be attached to the AVR in host mode at any one time
+                        *  and that the address used is not important (other than the fact that it is non-zero), a
+                        *  fixed value is specified by the library.
+                        */
+                       #define USB_HOST_DEVICEADDRESS                 1
+
+                       #if !defined(USB_HOST_TIMEOUT_MS) || defined(__DOXYGEN__)
+                               /** Constant for the maximum software timeout period of sent USB control transactions to an attached
+                                *  device. If a device fails to respond to a sent control request within this period, the
+                                *  library will return a timeout error code.
+                                *
+                                *  This value may be overridden in the user project makefile as the value of the
+                                *  \ref USB_HOST_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+                                */
+                               #define USB_HOST_TIMEOUT_MS                1000
+                       #endif
+
+                       #if !defined(HOST_DEVICE_SETTLE_DELAY_MS) || defined(__DOXYGEN__)
+                               /** Constant for the delay in milliseconds after a device is connected before the library
+                                *  will start the enumeration process. Some devices require a delay of up to 5 seconds
+                                *  after connection before the enumeration process can start or incorrect operation will
+                                *  occur.
+                                *
+                                *  The default delay value may be overridden in the user project makefile by defining the
+                                *  \c HOST_DEVICE_SETTLE_DELAY_MS token to the required delay in milliseconds, and passed to the
+                                *  compiler using the -D switch.
+                                */
+                               #define HOST_DEVICE_SETTLE_DELAY_MS        1000
+                       #endif
+
+               /* Enums: */
+                       /** Enum for the various states of the USB Host state machine. Only some states are
+                        *  implemented in the LUFA library - other states are left to the user to implement.
+                        *
+                        *  For information on each possible USB host state, refer to the USB 2.0 specification.
+                        *  Several of the USB host states are broken up further into multiple smaller sub-states,
+                        *  so that they can be internally implemented inside the library in an efficient manner.
+                        *
+                        *  \see \ref USB_HostState, which stores the current host state machine state.
+                        */
+                       enum USB_Host_States_t
+                       {
+                               HOST_STATE_WaitForDeviceRemoval         = 0,  /**< Internally implemented by the library. This state can be
+                                                                              *   used by the library to wait until the attached device is
+                                                                              *   removed by the user - useful for when an error occurs or
+                                                                              *   further communication with the device is not needed. This
+                                                                              *   allows for other code to run while the state machine is
+                                                                              *   effectively disabled.
+                                                                              */
+                               HOST_STATE_WaitForDevice                = 1,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that the stack is waiting for an interval to elapse before
+                                                                              *   continuing with the next step of the device enumeration
+                                                                              *   process.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Unattached                   = 2,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that the host state machine is waiting for a device to be
+                                                                              *   attached so that it can start the enumeration process.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Powered                      = 3,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that a device has been attached, and the library's internals
+                                                                              *   are being configured to begin the enumeration process.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Powered_WaitForDeviceSettle  = 4,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that the stack is waiting for the initial settling period to
+                                                                              *   elapse before beginning the enumeration process.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Powered_WaitForConnect       = 5,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that the stack is waiting for a connection event from the USB
+                                                                              *   controller to indicate a valid USB device has been attached to
+                                                                              *   the bus and is ready to be enumerated.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Powered_DoReset              = 6,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that a valid USB device has been attached, and that it is
+                                                                              *   will now be reset to ensure it is ready for enumeration.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Powered_ConfigPipe           = 7,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that the attached device is currently powered and reset, and
+                                                                              *   that the control pipe is now being configured by the stack.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Default                      = 8,  /**< Internally implemented by the library. This state indicates
+                                                                              *   that the stack is currently retrieving the control endpoint's
+                                                                              *   size from the device, so that the control pipe can be altered
+                                                                              *   to match.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Default_PostReset            = 9,  /**< Internally implemented by the library. This state indicates that
+                                                                              *   the control pipe is being reconfigured to match the retrieved
+                                                                              *   control endpoint size from the device, and the device's USB bus
+                                                                              *   address is being set.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Default_PostAddressSet       = 10, /**< Internally implemented by the library. This state indicates that
+                                                                              *   the device's address has now been set, and the stack is has now
+                                                                              *   completed the device enumeration process. This state causes the
+                                                                              *   stack to change the current USB device address to that set for
+                                                                              *   the connected device, before progressing to the user-implemented
+                                                                              *   \ref HOST_STATE_Addressed state for further communications.
+                                                                              *
+                                                                              *   \note Do not manually change to this state in the user code.
+                                                                              */
+                               HOST_STATE_Addressed                    = 11, /**< May be implemented by the user project. This state should
+                                                                              *   set the device configuration before progressing to the
+                                                                              *   \ref HOST_STATE_Configured state. Other processing (such as the
+                                                                              *   retrieval and processing of the device descriptor) should also
+                                                                              *   be placed in this state.
+                                                                              */
+                               HOST_STATE_Configured                   = 12, /**< May be implemented by the user project. This state should implement the
+                                                                              *   actual work performed on the attached device and changed to the
+                                                                              *   \ref HOST_STATE_Suspended or \ref HOST_STATE_WaitForDeviceRemoval states as needed.
+                                                                              */
+                               HOST_STATE_Suspended                    = 15, /**< May be implemented by the user project. This state should be maintained
+                                                                              *   while the bus is suspended, and changed to either the \ref HOST_STATE_Configured
+                                                                              *   (after resuming the bus with the USB_Host_ResumeBus() macro) or the
+                                                                              *   \ref HOST_STATE_WaitForDeviceRemoval states as needed.
+                                                                              */
+                       };
+
+                       /** Enum for the error codes for the \ref EVENT_USB_Host_HostError() event.
+                        *
+                        *  \see \ref Group_Events for more information on this event.
+                        */
+                       enum USB_Host_ErrorCodes_t
+                       {
+                               HOST_ERROR_VBusVoltageDip       = 0, /**< VBUS voltage dipped to an unacceptable level. This
+                                                                     *   error may be the result of an attached device drawing
+                                                                     *   too much current from the VBUS line, or due to the
+                                                                     *   AVR's power source being unable to supply sufficient
+                                                                     *   current.
+                                                                     */
+                       };
+
+                       /** Enum for the error codes for the \ref EVENT_USB_Host_DeviceEnumerationFailed() event.
+                        *
+                        *  \see \ref Group_Events for more information on this event.
+                        */
+                       enum USB_Host_EnumerationErrorCodes_t
+                       {
+                               HOST_ENUMERROR_NoError          = 0, /**< No error occurred. Used internally, this is not a valid
+                                                                     *   ErrorCode parameter value for the \ref EVENT_USB_Host_DeviceEnumerationFailed()
+                                                                     *   event.
+                                                                     */
+                               HOST_ENUMERROR_WaitStage        = 1, /**< One of the delays between enumeration steps failed
+                                                                     *   to complete successfully, due to a timeout or other
+                                                                     *   error.
+                                                                     */
+                               HOST_ENUMERROR_NoDeviceDetected = 2, /**< No device was detected, despite the USB data lines
+                                                                     *   indicating the attachment of a device.
+                                                                     */
+                               HOST_ENUMERROR_ControlError     = 3, /**< One of the enumeration control requests failed to
+                                                                     *   complete successfully.
+                                                                     */
+                               HOST_ENUMERROR_PipeConfigError  = 4, /**< The default control pipe (address 0) failed to
+                                                                     *   configure correctly.
+                                                                     */
+                       };
+
+               /* Inline Functions: */
+                       /** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
+                        *  the frame number is incremented by one.
+                        */
+                       static inline uint16_t USB_Host_GetFrameNumber(void)
+                       {
+                               return UHFNUM;
+                       }
+
+                       #if !defined(NO_SOF_EVENTS)
+                               /** Enables the host mode Start Of Frame events. When enabled, this causes the
+                                *  \ref EVENT_USB_Host_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+                                *  at the start of each USB frame when a device is enumerated while in host mode.
+                                *
+                                *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+                                */
+                               static inline void USB_Host_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+                               static inline void USB_Host_EnableSOFEvents(void)
+                               {
+                                       USB_INT_Enable(USB_INT_HSOFI);
+                               }
+
+                               /** Disables the host mode Start Of Frame events. When disabled, this stops the firing of the
+                                *  \ref EVENT_USB_Host_StartOfFrame() event when enumerated in host mode.
+                                *
+                                *  \note Not available when the NO_SOF_EVENTS compile time token is defined.
+                                */
+                               static inline void USB_Host_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+                               static inline void USB_Host_DisableSOFEvents(void)
+                               {
+                                       USB_INT_Disable(USB_INT_HSOFI);
+                               }
+                       #endif
+
+                       /** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
+                        *  USB bus resets leave the default control pipe configured (if already configured).
+                        *
+                        *  If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
+                        *  woken up automatically and the bus resumed after the reset has been correctly issued.
+                        */
+                       static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_ResetBus(void)
+                       {
+                               UHCON |=  (1 << RESET);
+                       }
+
+                       /** Determines if a previously issued bus reset (via the \ref USB_Host_ResetBus() macro) has
+                        *  completed.
+                        *
+                        *  \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
+                        */
+                       static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_Host_IsBusResetComplete(void)
+                       {
+                               return ((UHCON & (1 << RESET)) ? false : true);
+                       }
+
+                       /** Resumes USB communications with an attached and enumerated device, by resuming the transmission
+                        *  of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
+                        *  host and attached device may occur.
+                        */
+                       static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_ResumeBus(void)
+                       {
+                               UHCON |=  (1 << SOFEN);
+                       }
+
+                       /** Suspends the USB bus, preventing any communications from occurring between the host and attached
+                        *  device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
+                        *  messages to the device.
+                        */
+                       static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_SuspendBus(void)
+                       {
+                               UHCON &= ~(1 << SOFEN);
+                       }
+
+                       /** Determines if the USB bus has been suspended via the use of the \ref USB_Host_SuspendBus() macro,
+                        *  false otherwise. While suspended, no USB communications can occur until the bus is resumed,
+                        *  except for the Remote Wakeup event from the device if supported.
+                        *
+                        *  \return Boolean \c true if the bus is currently suspended, \c false otherwise.
+                        */
+                       static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_Host_IsBusSuspended(void)
+                       {
+                               return ((UHCON & (1 << SOFEN)) ? false : true);
+                       }
+
+                       /** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
+                        *  false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
+                        *
+                        *  \return Boolean \c true if the attached device is enumerated in Full Speed mode, \c false otherwise.
+                        */
+                       static inline bool USB_Host_IsDeviceFullSpeed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_Host_IsDeviceFullSpeed(void)
+                       {
+                               return ((USBSTA & (1 << SPEED)) ? true : false);
+                       }
+
+                       /** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
+                        *  that the host resume the USB bus and wake up the device, false otherwise.
+                        *
+                        *  \return Boolean \c true if the attached device has sent a Remote Wakeup request, \c false otherwise.
+                        */
+                       static inline bool USB_Host_IsRemoteWakeupSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_Host_IsRemoteWakeupSent(void)
+                       {
+                               return ((UHINT & (1 << RXRSMI)) ? true : false);
+                       }
+
+                       /** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
+                       static inline void USB_Host_ClearRemoteWakeupSent(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_ClearRemoteWakeupSent(void)
+                       {
+                               UHINT &= ~(1 << RXRSMI);
+                       }
+
+                       /** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
+                        *  a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
+                        *  be resumed.
+                        */
+                       static inline void USB_Host_ResumeFromWakeupRequest(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_ResumeFromWakeupRequest(void)
+                       {
+                               UHCON |=  (1 << RESUME);
+                       }
+
+                       /** Determines if a resume from Remote Wakeup request is currently being sent to an attached
+                        *  device.
+                        *
+                        *  \return Boolean \c true if no resume request is currently being sent, \c false otherwise.
+                        */
+                       static inline bool USB_Host_IsResumeFromWakeupRequestSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_Host_IsResumeFromWakeupRequestSent(void)
+                       {
+                               return ((UHCON & (1 << RESUME)) ? false : true);
+                       }
+
+               /* Function Prototypes: */
+                       /** Convenience function. This routine sends a SET CONFIGURATION standard request to the attached
+                        *  device, with the given configuration index. This can be used to easily set the device
+                        *  configuration without creating and sending the request manually.
+                        *
+                        *  \note After this routine returns, the control pipe will be selected.
+                        *
+                        *  \param[in] ConfigNumber  Configuration index to send to the device.
+                        *
+                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+                        */
+                       uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber);
+
+                       /** Convenience function. This routine sends a GET DESCRIPTOR standard request to the attached
+                        *  device, requesting the device descriptor. This can be used to easily retrieve information
+                        *  about the device such as its VID, PID and power requirements.
+                        *
+                        *  \note After this routine returns, the control pipe will be selected.
+                        *
+                        *  \param[out] DeviceDescriptorPtr  Pointer to the destination device descriptor structure where
+                        *                                   the read data is to be stored.
+                        *
+                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+                        */
+                       uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr);
+
+                       /** Convenience function. This routine sends a GET DESCRIPTOR standard request to the attached
+                        *  device, requesting the string descriptor of the specified index. This can be used to easily
+                        *  retrieve string descriptors from the device by index, after the index is obtained from the
+                        *  Device or Configuration descriptors.
+                        *
+                        *  \note After this routine returns, the control pipe will be selected.
+                        *
+                        *  \param[in]  Index        Index of the string index to retrieve.
+                        *  \param[out] Buffer       Pointer to the destination buffer where the retrieved string descriptor is
+                        *                           to be stored.
+                        *  \param[in] BufferLength  Maximum size of the string descriptor which can be stored into the buffer.
+                        *
+                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+                        */
+                       uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index,
+                                                                  void* const Buffer,
+                                                                  const uint8_t BufferLength);
+
+                       /** Clears a stall condition on the given pipe, via a CLEAR FEATURE standard request to the attached device.
+                        *
+                        *  \note After this routine returns, the control pipe will be selected.
+                        *
+                        *  \param[in] EndpointIndex  Index of the endpoint to clear, including the endpoint's direction.
+                        *
+                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+                        */
+                       uint8_t USB_Host_ClearPipeStall(const uint8_t EndpointIndex);
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Macros: */
+                       static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_HostMode_On(void)
+                       {
+                               USBCON |=  (1 << HOST);
+                       }
+
+                       static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_HostMode_Off(void)
+                       {
+                               USBCON &= ~(1 << HOST);
+                       }
+
+                       static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_VBUS_Auto_Enable(void)
+                       {
+                               OTGCON &= ~(1 << VBUSHWC);
+                               UHWCON |=  (1 << UVCONE);
+                       }
+
+                       static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_VBUS_Manual_Enable(void)
+                       {
+                               OTGCON |=  (1 << VBUSHWC);
+                               UHWCON &= ~(1 << UVCONE);
+
+                               DDRE   |=  (1 << 7);
+                       }
+
+                       static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_VBUS_Auto_On(void)
+                       {
+                               OTGCON |=  (1 << VBUSREQ);
+                       }
+
+                       static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_VBUS_Manual_On(void)
+                       {
+                               PORTE  |=  (1 << 7);
+                       }
+
+                       static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_VBUS_Auto_Off(void)
+                       {
+                               OTGCON |=  (1 << VBUSRQC);
+                       }
+
+                       static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_VBUS_Manual_Off(void)
+                       {
+                               PORTE  &= ~(1 << 7);
+                       }
+
+                       static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
+                       {
+                               UHADDR  =  (Address & 0x7F);
+                       }
+
+               /* Enums: */
+                       enum USB_Host_WaitMSErrorCodes_t
+                       {
+                               HOST_WAITERROR_Successful       = 0,
+                               HOST_WAITERROR_DeviceDisconnect = 1,
+                               HOST_WAITERROR_PipeError        = 2,
+                               HOST_WAITERROR_SetupStalled     = 3,
+                       };
+
+               /* Function Prototypes: */
+                       void    USB_Host_ProcessNextHostState(void);
+                       uint8_t USB_Host_WaitMS(uint8_t MS);
+
+                       #if defined(__INCLUDE_FROM_HOST_C)
+                               static void USB_Host_ResetDevice(void);
+                       #endif
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/OTG.h b/LUFA/Drivers/USB/Core/AVR8/OTG.h
new file mode 100644 (file)
index 0000000..cc0cc3d
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB OTG mode definitions (AVR8)
+ *
+ *  This file contains structures, function prototypes and macros related to USB OTG mode, where two USB devices
+ *  may be linked directly together and exchange host/device roles as needed.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_OTG
+ *  \defgroup Group_OTG_AVR8 USB On The Go (OTG) Management (AVR8)
+ *
+ *  This module contains macros for embedded USB hosts with dual role On The Go capabilities, for managing role
+ *  exchange. OTG is a way for two USB dual role devices to talk to one another directly without fixed device/host
+ *  roles.
+ *
+ *  @{
+ */
+
+#ifndef __USBOTG_AVR8_H__
+#define __USBOTG_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** Mask for the VBUS pulsing method of SRP, supported by some OTG devices.
+                        *
+                        *  \see \ref USB_OTG_Device_InitiateSRP().
+                        */
+                       #define USB_OTG_SRP_VBUS                   (1 << SRPSEL)
+
+                       /** Mask for the Data + pulsing method of SRP, supported by some OTG devices.
+                        *
+                        *  \see \ref USB_OTG_Device_InitiateSRP().
+                        */
+                       #define USB_OTG_STP_DATA                   0
+
+               /* Inline Functions: */
+                       /** Initiate a Host Negotiation Protocol request. This indicates to the other connected device
+                        *  that the device wishes to change device/host roles.
+                        */
+                       static inline void USB_OTG_Device_RequestHNP(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTG_Device_RequestHNP(void)
+                       {
+                               OTGCON |=  (1 << HNPREQ);
+                       }
+
+                       /** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other
+                        *  connected device.
+                        */
+                       static inline void USB_OTG_Device_CancelHNPRequest(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTG_Device_CancelHNPRequest(void)
+                       {
+                               OTGCON &= ~(1 << HNPREQ);
+                       }
+
+                       /** Determines if the device is currently sending a HNP to an attached host.
+                        *
+                        *  \return Boolean \c true if currently sending a HNP to the other connected device, \c false otherwise
+                        */
+                       static inline bool USB_OTG_Device_IsSendingHNP(void) ATTR_ALWAYS_INLINE;
+                       static inline bool USB_OTG_Device_IsSendingHNP(void)
+                       {
+                               return ((OTGCON & (1 << HNPREQ)) ? true : false);
+                       }
+
+                       /** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB
+                        *  interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in
+                        *  host mode indicates that VBUS should be applied and a session started.
+                        *
+                        *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by
+                        *  pulsing the Data + line via the internal pull-up resistor.
+                        *
+                        *  \param[in] SRPTypeMask  Mask indicating the type of SRP to use, either \ref USB_OTG_SRP_VBUS or
+                        *                          \ref USB_OTG_STP_DATA.
+                        */
+                       static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask)
+                       {
+                               OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (SRPTypeMask | (1 << SRPREQ)));
+                       }
+
+                       /** Accepts a HNP from a connected device, indicating that both devices should exchange
+                        *  device/host roles.
+                        */
+                       static inline void USB_OTG_Host_AcceptHNP(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTG_Host_AcceptHNP(void)
+                       {
+                               OTGCON |=  (1 << HNPREQ);
+                       }
+
+                       /** Rejects a HNP from a connected device, indicating that both devices should remain in their
+                        *  current device/host roles.
+                        */
+                       static inline void USB_OTG_Host_RejectHNP(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTG_Host_RejectHNP(void)
+                       {
+                               OTGCON &= ~(1 << HNPREQ);
+                       }
+
+                       /** Indicates if the connected device is not currently sending a HNP request.
+                        *
+                        *  \return Boolean \c true if a HNP is currently being issued by the connected device, \c false otherwise.
+                        */
+                       static inline bool USB_OTG_Host_IsHNPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_OTG_Host_IsHNPReceived(void)
+                       {
+                               return ((OTGCON & (1 << HNPREQ)) ? true : false);
+                       }
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Pipe.c b/LUFA/Drivers/USB/Core/AVR8/Pipe.c
new file mode 100644 (file)
index 0000000..1175132
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#include "Pipe.h"
+
+uint8_t USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+bool Pipe_ConfigurePipe(const uint8_t Number,
+                        const uint8_t Type,
+                        const uint8_t Token,
+                        const uint8_t EndpointNumber,
+                        const uint16_t Size,
+                        const uint8_t Banks)
+{
+#if defined(ORDERED_EP_CONFIG)
+       Pipe_SelectPipe(Number);
+       Pipe_EnablePipe();
+
+       UPCFG1X = 0;
+
+       UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
+       UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
+
+       Pipe_SetInfiniteINRequests();
+
+       return Pipe_IsConfigured();
+#else  
+       for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
+       {
+               uint8_t UPCFG0XTemp;
+               uint8_t UPCFG1XTemp;
+               uint8_t UPCFG2XTemp;
+               uint8_t UPCONXTemp;
+               uint8_t UPINRQXTemp;
+               uint8_t UPIENXTemp;
+
+               Pipe_SelectPipe(PNum);
+               
+               if (PNum == Number)
+               {
+                       UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
+                       UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
+                       UPCFG2XTemp = 0;
+                       UPCONXTemp  = ((1 << PEN) | (1 << INMODE));
+                       UPINRQXTemp = 0;
+                       UPIENXTemp  = 0;
+               }
+               else
+               {
+                       UPCFG0XTemp = UPCFG0X;
+                       UPCFG1XTemp = UPCFG1X;
+                       UPCFG2XTemp = UPCFG2X;
+                       UPCONXTemp  = UPCONX;
+                       UPINRQXTemp = UPINRQX;
+                       UPIENXTemp  = UPIENX;
+               }
+
+               if (!(UPCFG1XTemp & (1 << ALLOC)))
+                 continue;
+                 
+               Pipe_DisablePipe();
+               UPCFG1X &= (1 << ALLOC);
+
+               Pipe_EnablePipe();
+               UPCFG0X = UPCFG0XTemp;
+               UPCFG1X = UPCFG1XTemp;
+               UPCFG2X = UPCFG2XTemp;
+               UPCONX  = UPCONXTemp;
+               UPINRQX = UPINRQXTemp;
+               UPIENX  = UPIENXTemp;
+
+               if (!(Pipe_IsConfigured()))
+                 return false;         
+       }
+               
+       Pipe_SelectPipe(Number);        
+       return true;
+#endif
+}
+
+void Pipe_ClearPipes(void)
+{
+       UPINT = 0;
+
+       for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+       {
+               Pipe_SelectPipe(PNum);
+               UPIENX  = 0;
+               UPINTX  = 0;
+               UPCFG1X = 0;
+               Pipe_DisablePipe();
+       }
+}
+
+bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
+{
+       uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();
+
+       for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+       {
+               Pipe_SelectPipe(PNum);
+
+               if (!(Pipe_IsConfigured()))
+                 continue;
+
+               uint8_t PipeToken        = Pipe_GetPipeToken();
+               bool    PipeTokenCorrect = true;
+
+               if (PipeToken != PIPE_TOKEN_SETUP)
+                 PipeTokenCorrect = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT));
+
+               if (PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)))
+                 return true;
+       }
+
+       Pipe_SelectPipe(PrevPipeNumber);
+       return false;
+}
+
+uint8_t Pipe_WaitUntilReady(void)
+{
+       #if (USB_STREAM_TIMEOUT_MS < 0xFF)
+       uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+       #else
+       uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+       #endif
+
+       uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
+
+       for (;;)
+       {
+               if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
+               {
+                       if (Pipe_IsINReceived())
+                         return PIPE_READYWAIT_NoError;
+               }
+               else
+               {
+                       if (Pipe_IsOUTReady())
+                         return PIPE_READYWAIT_NoError;
+               }
+
+               if (Pipe_IsStalled())
+                 return PIPE_READYWAIT_PipeStalled;
+               else if (USB_HostState == HOST_STATE_Unattached)
+                 return PIPE_READYWAIT_DeviceDisconnected;
+
+               uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
+               if (CurrentFrameNumber != PreviousFrameNumber)
+               {
+                       PreviousFrameNumber = CurrentFrameNumber;
+
+                       if (!(TimeoutMSRem--))
+                         return PIPE_READYWAIT_Timeout;
+               }
+       }
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/Pipe.h b/LUFA/Drivers/USB/Core/AVR8/Pipe.h
new file mode 100644 (file)
index 0000000..3f62ec5
--- /dev/null
@@ -0,0 +1,940 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB host pipe management definitions.
+ *
+ *  This file contains structures, function prototypes and macros related to the management of the device's
+ *  data pipes when the library is initialized in USB host mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeRW
+ *  \defgroup Group_PipeRW_AVR8 Pipe Data Reading and Writing (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+
+/** \ingroup Group_PipePrimitiveRW
+ *  \defgroup Group_PipePrimitiveRW_AVR8 Read/Write of Primitive Data Types (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to pipes.
+ */
+
+/** \ingroup Group_PipePacketManagement
+ *  \defgroup Group_PipePacketManagement_AVR8 Pipe Packet Management (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+
+/** \ingroup Group_PipeControlReq
+ *  \defgroup Group_PipeControlReq_AVR8 Pipe Control Request Management (AVR8)
+ *
+ *  Module for host mode request processing. This module allows for the transmission of standard, class and
+ *  vendor control requests to the default control endpoint of an attached device while in host mode.
+ *
+ *  \see Chapter 9 of the USB 2.0 specification.
+ */
+
+/** \ingroup Group_PipeManagement
+ *  \defgroup Group_PipeManagement_AVR8 Pipe Management (AVR8)
+ *
+ *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This
+ *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
+ *  for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_AVR8_H__
+#define __PIPE_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+               #include "../USBTask.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** \name Pipe Error Flag Masks */
+                       //@{
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */
+                       #define PIPE_ERRORFLAG_OVERFLOW         (1 << 6)
+
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that an underflow error occurred in the pipe on the received data. */
+                       #define PIPE_ERRORFLAG_UNDERFLOW        (1 << 5)
+
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */
+                       #define PIPE_ERRORFLAG_CRC16            (1 << 4)
+
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */
+                       #define PIPE_ERRORFLAG_TIMEOUT          (1 << 3)
+
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */
+                       #define PIPE_ERRORFLAG_PID              (1 << 2)
+
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */
+                       #define PIPE_ERRORFLAG_DATAPID          (1 << 1)
+
+                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */
+                       #define PIPE_ERRORFLAG_DATATGL          (1 << 0)
+                       //@}
+
+                       /** \name Pipe Token Masks */
+                       //@{
+                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes),
+                        *  which will trigger a control request on the attached device when data is written to the pipe.
+                        */
+                       #define PIPE_TOKEN_SETUP                (0 << PTOKEN0)
+
+                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),
+                        *  indicating that the pipe data will flow from device to host.
+                        */
+                       #define PIPE_TOKEN_IN                   (1 << PTOKEN0)
+
+                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a OUT token (for non-CONTROL type pipes),
+                        *  indicating that the pipe data will flow from host to device.
+                        */
+                       #define PIPE_TOKEN_OUT                  (2 << PTOKEN0)
+                       //@}
+                       
+                       /** \name Pipe Bank Mode Masks */
+                       //@{
+                       /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
+                        *  should have one single bank, which requires less USB FIFO memory but results in slower transfers as
+                        *  only one USB device (the AVR or the attached device) can access the pipe's bank at the one time.
+                        */
+                       #define PIPE_BANK_SINGLE                (0 << EPBK0)
+
+                       /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
+                        *  should have two banks, which requires more USB FIFO memory but results in faster transfers as one
+                        *  USB device (the AVR or the attached device) can access one bank while the other accesses the second
+                        *  bank.
+                        */
+                       #define PIPE_BANK_DOUBLE                (1 << EPBK0)
+                       //@}
+                       
+                       /** Pipe address for the default control pipe, which always resides in address 0. This is
+                        *  defined for convenience to give more readable code when used with the pipe macros.
+                        */
+                       #define PIPE_CONTROLPIPE                0
+
+                       /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value
+                        *  in the device descriptor of the attached device.
+                        */
+                       #define PIPE_CONTROLPIPE_DEFAULT_SIZE   64
+
+                       /** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address
+                        *  in the device.
+                        */
+                       #define PIPE_PIPENUM_MASK               0x07
+
+                       /** Total number of pipes (including the default control pipe at address 0) which may be used in
+                        *  the device. Different USB AVR models support different amounts of pipes, this value reflects
+                        *  the maximum number of pipes for the currently selected AVR model.
+                        */
+                       #define PIPE_TOTAL_PIPES                7
+
+                       /** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR
+                        *  model supports the largest bank size possible on the device; different pipe numbers support
+                        *  different maximum bank sizes. This value reflects the largest possible bank of any pipe on the
+                        *  currently selected USB AVR model.
+                        */
+                       #define PIPE_MAX_SIZE                   256
+
+                       /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
+                        *  numerical address in the attached device.
+                        */
+                       #define PIPE_EPNUM_MASK                 0x0F
+
+                       /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
+                        *  direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
+                        */
+                       #define PIPE_EPDIR_MASK                 0x80
+
+               /* Enums: */
+                       /** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function.
+                        *
+                        *  \ingroup Group_PipeRW_AVR8
+                        */
+                       enum Pipe_WaitUntilReady_ErrorCodes_t
+                       {
+                               PIPE_READYWAIT_NoError                 = 0, /**< Pipe ready for next packet, no error. */
+                               PIPE_READYWAIT_PipeStalled             = 1,     /**< The device stalled the pipe while waiting. */
+                               PIPE_READYWAIT_DeviceDisconnected      = 2,     /**< Device was disconnected from the host while waiting. */
+                               PIPE_READYWAIT_Timeout                 = 3, /**< The device failed to accept or send the next packet
+                                                                            *   within the software timeout period set by the
+                                                                            *   \ref USB_STREAM_TIMEOUT_MS macro.
+                                                                            */
+                       };
+
+               /* Inline Functions: */
+                       /** Indicates the number of bytes currently stored in the current pipes's selected bank.
+                        *
+                        *  \note The return width of this function may differ, depending on the maximum pipe bank size
+                        *        of the selected AVR model.
+                        *
+                        *  \ingroup Group_PipeRW_AVR8
+                        *
+                        *  \return Total number of bytes in the currently selected pipe's FIFO buffer.
+                        */
+                       static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint16_t Pipe_BytesInPipe(void)
+                       {
+                               return UPBCX;
+                       }
+
+                       /** Returns the pipe address of the currently selected pipe. This is typically used to save the
+                        *  currently selected pipe number so that it can be restored after another pipe has been manipulated.
+                        *
+                        *  \return Index of the currently selected pipe.
+                        */
+                       static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_GetCurrentPipe(void)
+                       {
+                               return (UPNUM & PIPE_PIPENUM_MASK);
+                       }
+
+                       /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
+                        *  indicated will operate on the currently selected pipe.
+                        *
+                        *  \param[in] PipeNumber  Index of the pipe to select.
+                        */
+                       static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
+                       {
+                               UPNUM = PipeNumber;
+                       }
+
+                       /** Resets the desired pipe, including the pipe banks and flags.
+                        *
+                        *  \param[in] PipeNumber  Index of the pipe to reset.
+                        */
+                       static inline void Pipe_ResetPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ResetPipe(const uint8_t PipeNumber)
+                       {
+                               UPRST = (1 << PipeNumber);
+                               UPRST = 0;
+                       }
+
+                       /** Enables the currently selected pipe so that data can be sent and received through it to and from
+                        *  an attached device.
+                        *
+                        *  \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
+                        */
+                       static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_EnablePipe(void)
+                       {
+                               UPCONX |= (1 << PEN);
+                       }
+
+                       /** Disables the currently selected pipe so that data cannot be sent and received through it to and
+                        *  from an attached device.
+                        */
+                       static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_DisablePipe(void)
+                       {
+                               UPCONX &= ~(1 << PEN);
+                       }
+
+                       /** Determines if the currently selected pipe is enabled, but not necessarily configured.
+                        *
+                        * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsEnabled(void)
+                       {
+                               return ((UPCONX & (1 << PEN)) ? true : false);
+                       }
+
+                       /** Gets the current pipe token, indicating the pipe's data direction and type.
+                        *
+                        *  \return The current pipe token, as a \c PIPE_TOKEN_* mask.
+                        */
+                       static inline uint8_t Pipe_GetPipeToken(void) ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_GetPipeToken(void)
+                       {
+                               return (UPCFG0X & (0x03 << PTOKEN0));
+                       }
+
+                       /** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_*
+                        *  masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
+                        *  control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
+                        *  which have two endpoints of opposite direction sharing the same endpoint address within the device.
+                        *
+                        *  \param[in] Token  New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
+                        */
+                       static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_SetPipeToken(const uint8_t Token)
+                       {
+                               UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
+                       }
+
+                       /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
+                       static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_SetInfiniteINRequests(void)
+                       {
+                               UPCONX |= (1 << INMODE);
+                       }
+
+                       /** Configures the currently selected pipe to only allow the specified number of IN requests to be
+                        *  accepted by the pipe before it is automatically frozen.
+                        *
+                        *  \param[in] TotalINRequests  Total number of IN requests that the pipe may receive before freezing.
+                        */
+                       static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
+                       {
+                               UPCONX &= ~(1 << INMODE);
+                               UPINRQX = TotalINRequests;
+                       }
+
+                       /** Determines if the currently selected pipe is configured.
+                        *
+                        *  \return Boolean \c true if the selected pipe is configured, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsConfigured(void)
+                       {
+                               return ((UPSTAX & (1 << CFGOK)) ? true : false);
+                       }
+
+                       /** Retrieves the endpoint number of the endpoint within the attached device that the currently selected
+                        *  pipe is bound to.
+                        *
+                        *  \return Endpoint number the currently selected pipe is bound to.
+                        */
+                       static inline uint8_t Pipe_BoundEndpointNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_BoundEndpointNumber(void)
+                       {
+                               return ((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK);
+                       }
+
+                       /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
+                        *
+                        *  \param[in] Milliseconds  Number of milliseconds between each pipe poll.
+                        */
+                       static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
+                       {
+                               UPCFG2X = Milliseconds;
+                       }
+
+                       /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
+                        *  be serviced.
+                        *
+                        *  \return Mask whose bits indicate which pipes have interrupted.
+                        */
+                       static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_GetPipeInterrupts(void)
+                       {
+                               return UPINT;
+                       }
+
+                       /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type
+                        *  pipes).
+                        *
+                        *  \param[in] PipeNumber  Index of the pipe whose interrupt flag should be tested.
+                        *
+                        *  \return Boolean \c true if the specified pipe has interrupted, \c false otherwise.
+                        */
+                       static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber)
+                       {
+                               return ((UPINT & (1 << PipeNumber)) ? true : false);
+                       }
+
+                       /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
+                       static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Unfreeze(void)
+                       {
+                               UPCONX &= ~(1 << PFREEZE);
+                       }
+
+                       /** Freezes the selected pipe, preventing it from communicating with an attached device. */
+                       static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Freeze(void)
+                       {
+                               UPCONX |= (1 << PFREEZE);
+                       }
+
+                       /** Determines if the currently selected pipe is frozen, and not able to accept data.
+                        *
+                        *  \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsFrozen(void)
+                       {
+                               return ((UPCONX & (1 << PFREEZE)) ? true : false);
+                       }
+
+                       /** Clears the master pipe error flag. */
+                       static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearError(void)
+                       {
+                               UPINTX &= ~(1 << PERRI);
+                       }
+
+                       /** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
+                        *  some sort of hardware error has occurred on the pipe.
+                        *
+                        *  \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
+                        *
+                        *  \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsError(void)
+                       {
+                               return ((UPINTX & (1 << PERRI)) ? true : false);
+                       }
+
+                       /** Clears all the currently selected pipe's hardware error flags, but does not clear the master error
+                        *  flag for the pipe.
+                        */
+                       static inline void Pipe_ClearErrorFlags(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearErrorFlags(void)
+                       {
+                               UPERRX = 0;
+                       }
+
+                       /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
+                        *  value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred.
+                        *
+                        *  \return  Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe.
+                        */
+                       static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_GetErrorFlags(void)
+                       {
+                               return ((UPERRX & (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT |
+                                                  PIPE_ERRORFLAG_PID   | PIPE_ERRORFLAG_DATAPID |
+                                                  PIPE_ERRORFLAG_DATATGL)) |
+                                       (UPSTAX & (PIPE_ERRORFLAG_OVERFLOW | PIPE_ERRORFLAG_UNDERFLOW)));
+                       }
+                       
+                       /** Retrieves the number of busy banks in the currently selected pipe, which have been queued for
+                        *  transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the
+                        *  \ref Pipe_ClearIN() command.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Total number of busy banks in the selected pipe.
+                        */
+                       static inline uint8_t Pipe_GetBusyBanks(void)
+                       {
+                               return (UPSTAX & (0x03 << NBUSYBK0));
+                       }
+
+                       /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
+                        *  bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
+                        *  direction). This function will return false if an error has occurred in the pipe, or if the pipe
+                        *  is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
+                        *  direction and the pipe bank is full.
+                        *
+                        *  \note This function is not valid on CONTROL type pipes.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the currently selected pipe may be read from or written to, depending
+                        *          on its direction.
+                        */
+                       static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsReadWriteAllowed(void)
+                       {
+                               return ((UPINTX & (1 << RWAL)) ? true : false);
+                       }
+
+                       /** Determines if a packet has been received on the currently selected IN pipe from the attached device.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsINReceived(void)
+                       {
+                               return ((UPINTX & (1 << RXINI)) ? true : false);
+                       }
+
+                       /** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsOUTReady(void)
+                       {
+                               return ((UPINTX & (1 << TXOUTI)) ? true : false);
+                       }
+
+                       /** Determines if no SETUP request is currently being sent to the attached device on the selected
+                        *  CONTROL type pipe.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsSETUPSent(void)
+                       {
+                               return ((UPINTX & (1 << TXSTPI)) ? true : false);
+                       }
+
+                       /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        */
+                       static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearSETUP(void)
+                       {
+                               UPINTX &= ~((1 << TXSTPI) | (1 << FIFOCON));
+                       }
+
+                       /** Acknowledges the reception of a setup IN request from the attached device on the currently selected
+                        *  pipe, freeing the bank ready for the next packet.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        */
+                       static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearIN(void)
+                       {
+                               UPINTX &= ~((1 << RXINI) | (1 << FIFOCON));
+                       }
+
+                       /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
+                        *  the bank ready for the next packet.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        */
+                       static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearOUT(void)
+                       {
+                               UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON));
+                       }
+
+                       /** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
+                        *  the currently selected pipe. This occurs when the host sends a packet to the device, but the device
+                        *  is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
+                        *  received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet
+                        *  can be re-sent.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsNAKReceived(void)
+                       {
+                               return ((UPINTX & (1 << NAKEDI)) ? true : false);
+                       }
+
+                       /** Clears the NAK condition on the currently selected pipe.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \see \ref Pipe_IsNAKReceived() for more details.
+                        */
+                       static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearNAKReceived(void)
+                       {
+                               UPINTX &= ~(1 << NAKEDI);
+                       }
+
+                       /** Determines if the currently selected pipe has had the STALL condition set by the attached device.
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        *
+                        *  \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
+                        */
+                       static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool Pipe_IsStalled(void)
+                       {
+                               return ((UPINTX & (1 << RXSTALLI)) ? true : false);
+                       }
+
+                       /** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
+                        *  STALL condition itself (this must be done via a ClearFeature control request to the device).
+                        *
+                        *  \ingroup Group_PipePacketManagement_AVR8
+                        */
+                       static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_ClearStall(void)
+                       {
+                               UPINTX &= ~(1 << RXSTALLI);
+                       }
+
+                       /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \return Next byte in the currently selected pipe's FIFO buffer.
+                        */
+                       static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_Read_Byte(void)
+                       {
+                               return UPDATX;
+                       }
+
+                       /** Writes one byte from the currently selected pipe's bank, for IN direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \param[in] Byte  Next byte to write into the the currently selected pipe's FIFO buffer.
+                        */
+                       static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Write_Byte(const uint8_t Byte)
+                       {
+                               UPDATX = Byte;
+                       }
+
+                       /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        */
+                       static inline void Pipe_Discard_Byte(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Discard_Byte(void)
+                       {
+                               uint8_t Dummy;
+
+                               Dummy = UPDATX;
+                       }
+
+                       /** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \return Next word in the currently selected pipe's FIFO buffer.
+                        */
+                       static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint16_t Pipe_Read_Word_LE(void)
+                       {
+                               union
+                               {
+                                       uint16_t Word;
+                                       uint8_t  Bytes[2];
+                               } Data;
+
+                               Data.Bytes[0] = UPDATX;
+                               Data.Bytes[1] = UPDATX;
+
+                               return Data.Word;
+                       }
+
+                       /** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \return Next word in the currently selected pipe's FIFO buffer.
+                        */
+                       static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint16_t Pipe_Read_Word_BE(void)
+                       {
+                               union
+                               {
+                                       uint16_t Word;
+                                       uint8_t  Bytes[2];
+                               } Data;
+
+                               Data.Bytes[1] = UPDATX;
+                               Data.Bytes[0] = UPDATX;
+
+                               return Data.Word;
+                       }
+
+                       /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \param[in] Word  Next word to write to the currently selected pipe's FIFO buffer.
+                        */
+                       static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Write_Word_LE(const uint16_t Word)
+                       {
+                               UPDATX = (Word & 0xFF);
+                               UPDATX = (Word >> 8);
+                       }
+
+                       /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \param[in] Word  Next word to write to the currently selected pipe's FIFO buffer.
+                        */
+                       static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Write_Word_BE(const uint16_t Word)
+                       {
+                               UPDATX = (Word >> 8);
+                               UPDATX = (Word & 0xFF);
+                       }
+
+                       /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        */
+                       static inline void Pipe_Discard_Word(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Discard_Word(void)
+                       {
+                               uint8_t Dummy;
+
+                               Dummy = UPDATX;
+                               Dummy = UPDATX;
+                       }
+
+                       /** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \return Next double word in the currently selected pipe's FIFO buffer.
+                        */
+                       static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint32_t Pipe_Read_DWord_LE(void)
+                       {
+                               union
+                               {
+                                       uint32_t DWord;
+                                       uint8_t  Bytes[4];
+                               } Data;
+
+                               Data.Bytes[0] = UPDATX;
+                               Data.Bytes[1] = UPDATX;
+                               Data.Bytes[2] = UPDATX;
+                               Data.Bytes[3] = UPDATX;
+
+                               return Data.DWord;
+                       }
+
+                       /** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \return Next double word in the currently selected pipe's FIFO buffer.
+                        */
+                       static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint32_t Pipe_Read_DWord_BE(void)
+                       {
+                               union
+                               {
+                                       uint32_t DWord;
+                                       uint8_t  Bytes[4];
+                               } Data;
+
+                               Data.Bytes[3] = UPDATX;
+                               Data.Bytes[2] = UPDATX;
+                               Data.Bytes[1] = UPDATX;
+                               Data.Bytes[0] = UPDATX;
+
+                               return Data.DWord;
+                       }
+
+                       /** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \param[in] DWord  Next double word to write to the currently selected pipe's FIFO buffer.
+                        */
+                       static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
+                       {
+                               UPDATX = (DWord &  0xFF);
+                               UPDATX = (DWord >> 8);
+                               UPDATX = (DWord >> 16);
+                               UPDATX = (DWord >> 24);
+                       }
+
+                       /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
+                        *  direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        *
+                        *  \param[in] DWord  Next double word to write to the currently selected pipe's FIFO buffer.
+                        */
+                       static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
+                       {
+                               UPDATX = (DWord >> 24);
+                               UPDATX = (DWord >> 16);
+                               UPDATX = (DWord >> 8);
+                               UPDATX = (DWord &  0xFF);
+                       }
+
+                       /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
+                        *
+                        *  \ingroup Group_PipePrimitiveRW_AVR8
+                        */
+                       static inline void Pipe_Discard_DWord(void) ATTR_ALWAYS_INLINE;
+                       static inline void Pipe_Discard_DWord(void)
+                       {
+                               uint8_t Dummy;
+
+                               Dummy = UPDATX;
+                               Dummy = UPDATX;
+                               Dummy = UPDATX;
+                               Dummy = UPDATX;
+                       }
+
+               /* External Variables: */
+                       /** Global indicating the maximum packet size of the default control pipe located at address
+                        *  0 in the device. This value is set to the value indicated in the attached device's device
+                    *  descriptor once the USB interface is initialized into host mode and a device is attached
+                        *  to the USB bus.
+                        *
+                        *  \note This variable should be treated as read-only in the user application, and never manually
+                        *        changed in value.
+                        */
+                       extern uint8_t USB_ControlPipeSize;
+
+               /* Function Prototypes: */
+                       /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the
+                        *  attached device, bank size and banking mode.
+                        *
+                        *  A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze()
+                        *  before being used. Pipes should be kept frozen unless waiting for data from a device while in IN mode, or
+                        *  sending data to the device in OUT mode. IN type pipes are also automatically configured to accept infinite
+                        *  numbers of IN requests without automatic freezing - this can be overridden by a call to
+                        *  \ref Pipe_SetFiniteINRequests().
+                        *
+                        *  \param[in] Number          Pipe number to configure. This must be more than 0 and less than \ref PIPE_TOTAL_PIPES.
+                        *
+                        *  \param[in] Type            Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low
+                        *                             Speed USB devices - refer to the USB 2.0 specification.
+                        *
+                        *  \param[in] Token           Pipe data token, either \ref PIPE_TOKEN_SETUP, \ref PIPE_TOKEN_OUT or \ref PIPE_TOKEN_IN.
+                        *                             All pipes (except Control type) are unidirectional - data may only be read from or
+                        *                             written to the pipe bank based on its direction, not both.
+                        *
+                        *  \param[in] EndpointNumber  Endpoint index within the attached device that the pipe should interface to.
+                        *
+                        *  \param[in] Size            Size of the pipe's bank, where packets are stored before they are transmitted to
+                        *                             the USB device, or after they have been received from the USB device (depending on
+                        *                             the pipe's data direction). The bank size must indicate the maximum packet size that
+                        *                             the pipe can handle.
+                        *
+                        *  \param[in] Banks           Number of banks to use for the pipe being configured, a \c PIPE_BANK_* mask. More banks
+                        *                             uses more USB DPRAM, but offers better performance. Isochronous type pipes <b>must</b>
+                        *                             have at least two banks.
+                        *
+                        *  \note When the \c ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
+                        *        or bank corruption will occur.
+                        *        \n\n
+                        *
+                        *  \note Certain models of USB AVR's pipes may have different maximum packet sizes based on the pipe's
+                        *        index - refer to the chosen USB AVR's datasheet to determine the maximum bank size for each pipe.
+                        *        \n\n
+                        *
+                        *  \note The default control pipe should not be manually configured by the user application, as it is
+                        *        automatically configured by the library internally.
+                        *        \n\n
+                        *
+                        *  \note This routine will automatically select the specified pipe upon success. Upon failure, the pipe which
+                        *        failed to reconfigure correctly will be selected.
+                        *
+                        *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+                        */
+                       bool Pipe_ConfigurePipe(const uint8_t Number,
+                                               const uint8_t Type,
+                                               const uint8_t Token,
+                                               const uint8_t EndpointNumber,
+                                               const uint16_t Size,
+                                               const uint8_t Banks);
+
+                       /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read
+                        *  or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).
+                        *
+                        *  \ingroup Group_PipeRW_AVR8
+                        *
+                        *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+                        */
+                       uint8_t Pipe_WaitUntilReady(void);
+
+                       /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
+                        *  endpoint is found, it is automatically selected.
+                        *
+                        *  \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check.
+                        *
+                        *  \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found,
+                        *          \c false otherwise.
+                        */
+                       bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Macros: */
+                       #if !defined(ENDPOINT_CONTROLEP)
+                               #define ENDPOINT_CONTROLEP          0
+                       #endif
+
+               /* Inline Functions: */
+                       static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
+                       static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
+                       {
+                               uint8_t  MaskVal    = 0;
+                               uint16_t CheckBytes = 8;
+
+                               while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
+                               {
+                                       MaskVal++;
+                                       CheckBytes <<= 1;
+                               }
+
+                               return (MaskVal << EPSIZE0);
+                       }
+
+               /* Function Prototypes: */
+                       void Pipe_ClearPipes(void);
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/USBController.c b/LUFA/Drivers/USB/Core/AVR8/USBController.c
new file mode 100644 (file)
index 0000000..f41b5cc
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#define  __INCLUDE_FROM_USB_CONTROLLER_C
+#include "USBController.h"
+
+#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
+volatile uint8_t USB_CurrentMode = USB_MODE_None;
+#endif
+
+#if !defined(USE_STATIC_OPTIONS)
+volatile uint8_t USB_Options;
+#endif
+
+void USB_Init(
+               #if defined(USB_CAN_BE_BOTH)
+               const uint8_t Mode
+               #endif
+
+               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
+               ,
+               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+               void
+               #endif
+
+               #if !defined(USE_STATIC_OPTIONS)
+               const uint8_t Options
+               #endif
+               )
+{
+       #if !defined(USE_STATIC_OPTIONS)
+       USB_Options = Options;
+       #endif
+
+       if (!(USB_Options & USB_OPT_REG_DISABLED))
+         USB_REG_On();
+       else
+         USB_REG_Off();
+
+       #if defined(USB_CAN_BE_BOTH)
+       if (Mode == USB_MODE_UID)
+       {
+               UHWCON |= (1 << UIDE);
+               USB_INT_Enable(USB_INT_IDTI);
+               USB_CurrentMode = USB_GetUSBModeFromUID();
+       }
+       else
+       {
+               USB_CurrentMode = Mode;
+       }
+       #endif
+
+       USB_IsInitialized = true;
+
+       USB_ResetInterface();
+}
+
+void USB_Disable(void)
+{
+       USB_INT_DisableAllInterrupts();
+       USB_INT_ClearAllInterrupts();
+
+       USB_Detach();
+       USB_Controller_Disable();
+
+       if (!(USB_Options & USB_OPT_MANUAL_PLL))
+         USB_PLL_Off();
+
+       USB_REG_Off();
+
+       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+       USB_OTGPAD_Off();
+       #endif
+
+       #if defined(USB_CAN_BE_BOTH)
+       USB_CurrentMode = USB_MODE_None;
+       #endif
+
+       USB_IsInitialized = false;
+}
+
+void USB_ResetInterface(void)
+{
+       #if defined(USB_CAN_BE_BOTH)
+       bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0);
+       #endif
+
+       USB_INT_DisableAllInterrupts();
+       USB_INT_ClearAllInterrupts();
+
+       USB_Controller_Reset();
+
+       if (!(USB_Options & USB_OPT_MANUAL_PLL))
+       {
+               #if defined(USB_SERIES_4_AVR)
+               PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1));
+               #endif
+
+               USB_PLL_On();
+               while (!(USB_PLL_IsReady()));
+       }
+
+       #if defined(USB_CAN_BE_BOTH)
+       if (UIDModeSelectEnabled)
+       {
+               UHWCON |= (1 << UIDE);
+               USB_INT_Enable(USB_INT_IDTI);
+       }
+       #endif
+
+       USB_CLK_Unfreeze();
+
+       if (USB_CurrentMode == USB_MODE_Device)
+       {
+               #if defined(USB_CAN_BE_DEVICE)
+               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+               UHWCON |=  (1 << UIMOD);
+               #endif
+
+               USB_Init_Device();
+               #endif
+       }
+       else if (USB_CurrentMode == USB_MODE_Host)
+       {
+               #if defined(USB_CAN_BE_HOST)
+               UHWCON &= ~(1 << UIMOD);
+
+               USB_Init_Host();
+               #endif
+       }
+
+       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+       USB_OTGPAD_On();
+       #endif
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_Init_Device(void)
+{
+       USB_DeviceState          = DEVICE_STATE_Unattached;
+       USB_ConfigurationNumber  = 0;
+
+       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+       USB_RemoteWakeupEnabled  = false;
+       #endif
+
+       #if !defined(NO_DEVICE_SELF_POWER)
+       USB_CurrentlySelfPowered = false;
+       #endif
+
+       #if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+       USB_Descriptor_Device_t* DeviceDescriptorPtr;
+
+       if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
+       {
+               #if defined(USE_RAM_DESCRIPTORS)
+               USB_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+               #elif defined(USE_EEPROM_DESCRIPTORS)
+               USB_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+               #else
+               USB_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+               #endif
+       }
+       #endif
+
+       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+       if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+         USB_Device_SetLowSpeed();
+       else
+         USB_Device_SetFullSpeed();
+
+       USB_INT_Enable(USB_INT_VBUS);
+       #endif
+
+       Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+                                                          ENDPOINT_DIR_OUT, USB_ControlEndpointSize,
+                                                          ENDPOINT_BANK_SINGLE);
+
+       USB_INT_Clear(USB_INT_SUSPI);
+       USB_INT_Enable(USB_INT_SUSPI);
+       USB_INT_Enable(USB_INT_EORSTI);
+
+       USB_Attach();
+}
+#endif
+
+#if defined(USB_CAN_BE_HOST)
+static void USB_Init_Host(void)
+{
+       USB_HostState       = HOST_STATE_Unattached;
+       USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+       USB_Host_HostMode_On();
+
+       USB_Host_VBUS_Auto_Off();
+       USB_Host_VBUS_Manual_Enable();
+       USB_Host_VBUS_Manual_On();
+
+       USB_INT_Enable(USB_INT_SRPI);
+       USB_INT_Enable(USB_INT_BCERRI);
+
+       USB_Attach();
+}
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/USBController.h b/LUFA/Drivers/USB/Core/AVR8/USBController.h
new file mode 100644 (file)
index 0000000..292b393
--- /dev/null
@@ -0,0 +1,466 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB low level USB controller definitions (AVR8)
+ *
+ *  This file contains structures, function prototypes and macros related to the low level configuration of the
+ *  USB controller, to start, stop and reset the USB library core.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USBManagement
+ *  \defgroup Group_USBManagement_AVR8 USB Interface Management (AVR8)
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ *  @{
+ */
+
+#ifndef __USBCONTROLLER_AVR8_H__
+#define __USBCONTROLLER_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+               #include "../USBMode.h"
+               #include "../Events.h"
+               #include "../USBTask.h"
+               #include "../USBInterrupt.h"
+
+               #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+                       #include "../Host.h"
+                       #include "../OTG.h"
+                       #include "../Pipe.h"
+                       #include "../HostStandardReq.h"
+                       #include "../PipeStream.h"
+               #endif
+
+               #if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+                       #include "../Device.h"
+                       #include "../Endpoint.h"
+                       #include "../DeviceStandardReq.h"
+                       #include "../EndpointStream.h"
+               #endif
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks and Defines: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+               #if !defined(F_CLOCK)
+                       #error F_CLOCK is not defined. You must define F_CLOCK to the frequency of the unprescaled input clock in your project makefile.
+               #endif
+
+               #if (F_CLOCK == 8000000)
+                       #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
+                            defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \
+                            defined(__AVR_ATmega32U2__))
+                               #define USB_PLL_PSC                0
+                       #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
+                               #define USB_PLL_PSC                0
+                       #elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U6__))
+                               #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))
+                       #elif (defined(__AVR_AT90USB647__)  || defined(__AVR_AT90USB1287__))
+                               #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))
+                       #endif
+               #elif (F_CLOCK == 16000000)
+                       #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
+                            defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \
+                            defined(__AVR_ATmega32U2__))
+                               #define USB_PLL_PSC                (1 << PLLP0)
+                       #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
+                               #define USB_PLL_PSC                (1 << PINDIV)
+                       #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))
+                               #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1))
+                       #elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))
+                               #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP0))
+                       #endif
+               #endif
+
+               #if !defined(USB_PLL_PSC)
+                       #error No PLL prescale value available for chosen F_CLOCK value and AVR model.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** \name USB Controller Option Masks */
+                       //@{
+                       /** Regulator disable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad
+                        *  regulator should be enabled to regulate the data pin voltages to within the USB standard.
+                        *
+                        *  \note See USB AVR data sheet for more information on the internal pad regulator.
+                        */
+                       #define USB_OPT_REG_DISABLED               (1 << 1)
+
+                       /** Regulator enable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad
+                        *  regulator should be disabled and the AVR's VCC level used for the data pads.
+                        *
+                        *  \note See USB AVR data sheet for more information on the internal pad regulator.
+                        */
+                       #define USB_OPT_REG_ENABLED                (0 << 1)
+
+                       /** Manual PLL control option mask for \ref USB_Init(). This indicates to the library that the user application
+                        *  will take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock
+                        *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations.
+                        */
+                       #define USB_OPT_MANUAL_PLL                 (1 << 2)
+
+                       /** Automatic PLL control option mask for \ref USB_Init(). This indicates to the library that the library should
+                        *  take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock
+                        *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations.
+                        */
+                       #define USB_OPT_AUTO_PLL                   (0 << 2)
+                       //@}
+                       
+                       /** \name Endpoint/Pipe Type Masks */
+                       //@{
+                       /** Mask for a CONTROL type endpoint or pipe.
+                        *
+                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+                        */
+                       #define EP_TYPE_CONTROL                    0x00
+
+                       /** Mask for an ISOCHRONOUS type endpoint or pipe.
+                        *
+                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+                        */
+                       #define EP_TYPE_ISOCHRONOUS                0x01
+
+                       /** Mask for a BULK type endpoint or pipe.
+                        *
+                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+                        */
+                       #define EP_TYPE_BULK                       0x02
+
+                       /** Mask for an INTERRUPT type endpoint or pipe.
+                        *
+                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+                        */
+                       #define EP_TYPE_INTERRUPT                  0x03
+                       //@}
+
+                       #if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__)
+                               /** Constant for the maximum software timeout period of the USB data stream transfer functions
+                                *  (both control and standard) when in either device or host mode. If the next packet of a stream
+                                *  is not received or acknowledged within this time period, the stream function will fail.
+                                *
+                                *  This value may be overridden in the user project makefile as the value of the
+                                *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+                                */
+                               #define USB_STREAM_TIMEOUT_MS       100
+                       #endif
+
+               /* Inline Functions: */
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
+                               /** Determines if the VBUS line is currently high (i.e. the USB host is supplying power).
+                                *
+                                *  \note This function is not available on some AVR models which do not support hardware VBUS monitoring.
+                                *
+                                *  \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise.
+                                */
+                               static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                               static inline bool USB_VBUS_GetStatus(void)
+                               {
+                                       return ((USBSTA & (1 << VBUS)) ? true : false);
+                               }
+                       #endif
+
+                       /** Detaches the device from the USB bus. This has the effect of removing the device from any
+                        *  attached host, ceasing USB communications. If no host is present, this prevents any host from
+                        *  enumerating the device once attached until \ref USB_Attach() is called.
+                        */
+                       static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Detach(void)
+                       {
+                               UDCON  |=  (1 << DETACH);
+                       }
+
+                       /** Attaches the device to the USB bus. This announces the device's presence to any attached
+                        *  USB host, starting the enumeration process. If no host is present, attaching the device
+                        *  will allow for enumeration once a host is connected to the device.
+                        *
+                        *  This is inexplicably also required for proper operation while in host mode, to enable the
+                        *  attachment of a device to the host. This is despite the bit being located in the device-mode
+                        *  register and despite the datasheet making no mention of its requirement in host mode.
+                        */
+                       static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Attach(void)
+                       {
+                               UDCON  &= ~(1 << DETACH);
+                       }
+
+               /* Function Prototypes: */
+                       /** Main function to initialize and start the USB interface. Once active, the USB interface will
+                        *  allow for device connection to a host when in device mode, or for device enumeration while in
+                        *  host mode.
+                        *
+                        *  As the USB library relies on interrupts for the device and host mode enumeration processes,
+                        *  the user must enable global interrupts before or shortly after this function is called. In
+                        *  device mode, interrupts must be enabled within 500ms of this function being called to ensure
+                        *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be
+                        *  enabled at the application's leisure however enumeration will not begin of an attached device
+                        *  until after this has occurred.
+                        *
+                        *  Calling this function when the USB interface is already initialized will cause a complete USB
+                        *  interface reset and re-enumeration.
+                        *
+                        *  \param[in] Mode     This is a mask indicating what mode the USB interface is to be initialized to, a value
+                        *                      from the \ref USB_Modes_t enum.
+                        *
+                        *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
+                        *                      interface to control the USB interface's behaviour. This should be comprised of
+                        *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the
+                        *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
+                        *                      mode speed.
+                        *
+                        *  \note To reduce the FLASH requirements of the library if only device or host mode is required,
+                        *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY
+                        *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler
+                        *        via the -D switch. If the mode is statically set, this parameter does not exist in the
+                        *        function prototype.
+                        *        \n\n
+                        *
+                        *  \note To reduce the FLASH requirements of the library if only fixed settings are are required,
+                        *        the options may be set statically in the same manner as the mode (see the Mode parameter of
+                        *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token,
+                        *        defined to the appropriate options masks. When the options are statically set, this
+                        *        parameter does not exist in the function prototype.
+                        *        \n\n
+                        *
+                        *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB
+                        *        AVR models which only implement the USB device mode in hardware.
+                        *
+                        *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks.
+                        */
+                       void USB_Init(
+                                      #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+                                      const uint8_t Mode
+                                      #endif
+
+                                      #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__)
+                                      ,
+                                      #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+                                      void
+                                      #endif
+
+                                      #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+                                      const uint8_t Options
+                                      #endif
+                                      );
+
+                       /** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO
+                        *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface
+                        *  is restarted with the \ref USB_Init() function.
+                        */
+                       void USB_Disable(void);
+
+                       /** Resets the interface, when already initialized. This will re-enumerate the device if already connected
+                        *  to a host, or re-enumerate an already attached device when in host mode.
+                        */
+                       void USB_ResetInterface(void);
+
+               /* Global Variables: */
+                       #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
+                               /** Indicates the mode that the USB interface is currently initialized to, a value from the
+                                *  \ref USB_Modes_t enum.
+                                *
+                                *  \note This variable should be treated as read-only in the user application, and never manually
+                                *        changed in value.
+                                *        \n\n
+                                *
+                                *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the
+                                *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller
+                                *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time
+                                *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to
+                                *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the
+                                *        USB interface is not initialized.
+                                */
+                               extern volatile uint8_t USB_CurrentMode;
+                       #elif defined(USB_HOST_ONLY)
+                               #define USB_CurrentMode USB_MODE_Host
+                       #elif defined(USB_DEVICE_ONLY)
+                               #define USB_CurrentMode USB_MODE_Device
+                       #endif
+
+                       #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+                               /** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init()
+                                *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module.
+                                *
+                                *  \note This variable should be treated as read-only in the user application, and never manually
+                                *        changed in value.
+                                */
+                               extern volatile uint8_t USB_Options;
+                       #elif defined(USE_STATIC_OPTIONS)
+                               #define USB_Options USE_STATIC_OPTIONS
+                       #endif
+
+               /* Enums: */
+                       /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
+                        *  user application via \ref USB_CurrentMode.
+                        */
+                       enum USB_Modes_t
+                       {
+                               USB_MODE_None   = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
+                               USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
+                               USB_MODE_Host   = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */
+                               USB_MODE_UID    = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the
+                                                     *   USB connector.
+                                                     */
+                       };
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Function Prototypes: */
+                       #if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
+                               #if defined(USB_CAN_BE_DEVICE)
+                               static void USB_Init_Device(void);
+                               #endif
+
+                               #if defined(USB_CAN_BE_HOST)
+                               static void USB_Init_Host(void);
+                               #endif
+                       #endif
+
+               /* Inline Functions: */
+                       static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_PLL_On(void)
+                       {
+                               PLLCSR  = USB_PLL_PSC;
+                               PLLCSR |= (1 << PLLE);
+                       }
+
+                       static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_PLL_Off(void)
+                       {
+                               PLLCSR  = 0;
+                       }
+
+                       static inline bool USB_PLL_IsReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline bool USB_PLL_IsReady(void)
+                       {
+                               return ((PLLCSR  &   (1 << PLOCK)) ? true : false);
+                       }
+
+                       static inline void USB_REG_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_REG_On(void)
+                       {
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+                               UHWCON  |=  (1 << UVREGE);
+                       #else
+                               REGCR   &= ~(1 << REGDIS);
+                       #endif
+                       }
+
+                       static inline void USB_REG_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_REG_Off(void)
+                       {
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+                               UHWCON  &= ~(1 << UVREGE);
+                       #else
+                               REGCR   |=  (1 << REGDIS);
+                       #endif
+                       }
+
+                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+                       static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTGPAD_On(void)
+                       {
+                               USBCON  |=  (1 << OTGPADE);
+                       }
+
+                       static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_OTGPAD_Off(void)
+                       {
+                               USBCON  &= ~(1 << OTGPADE);
+                       }
+                       #endif
+
+                       static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_CLK_Freeze(void)
+                       {
+                               USBCON  |=  (1 << FRZCLK);
+                       }
+
+                       static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_CLK_Unfreeze(void)
+                       {
+                               USBCON  &= ~(1 << FRZCLK);
+                       }
+
+                       static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Controller_Enable(void)
+                       {
+                               USBCON  |=  (1 << USBE);
+                       }
+
+                       static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Controller_Disable(void)
+                       {
+                               USBCON  &= ~(1 << USBE);
+                       }
+
+                       static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
+                       static inline void USB_Controller_Reset(void)
+                       {
+                               const uint8_t Temp = USBCON;
+
+                               USBCON = (Temp & ~(1 << USBE));
+                               USBCON = (Temp |  (1 << USBE));
+                       }
+
+                       #if defined(USB_CAN_BE_BOTH)
+                       static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+                       static inline uint8_t USB_GetUSBModeFromUID(void)
+                       {
+                               if (USBSTA & (1 << ID))
+                                 return USB_MODE_Device;
+                               else
+                                 return USB_MODE_Host;
+                       }
+                       #endif
+
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/USBInterrupt.c b/LUFA/Drivers/USB/Core/AVR8/USBInterrupt.c
new file mode 100644 (file)
index 0000000..34234fe
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBInterrupt.h"
+
+void USB_INT_DisableAllInterrupts(void)
+{
+       #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+       USBCON &= ~((1 << VBUSTE) | (1 << IDTE));
+       #elif defined(USB_SERIES_4_AVR)
+       USBCON &= ~(1 << VBUSTE);
+       #endif
+
+       #if defined(USB_CAN_BE_BOTH)
+       OTGIEN  = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_HOST)
+       UHIEN   = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_DEVICE)
+       UDIEN   = 0;
+       #endif
+}
+
+void USB_INT_ClearAllInterrupts(void)
+{
+       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+       USBINT = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_BOTH)
+       OTGINT = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_HOST)
+       UHINT  = 0;
+       #endif
+
+       #if defined(USB_CAN_BE_DEVICE)
+       UDINT  = 0;
+       #endif
+}
+
+ISR(USB_GEN_vect, ISR_BLOCK)
+{
+       #if defined(USB_CAN_BE_DEVICE)
+       #if !defined(NO_SOF_EVENTS)
+       if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
+       {
+               USB_INT_Clear(USB_INT_SOFI);
+
+               EVENT_USB_Device_StartOfFrame();
+       }
+       #endif
+
+       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+       if (USB_INT_HasOccurred(USB_INT_VBUS) && USB_INT_IsEnabled(USB_INT_VBUS))
+       {
+               USB_INT_Clear(USB_INT_VBUS);
+
+               if (USB_VBUS_GetStatus())
+               {
+                       USB_DeviceState = DEVICE_STATE_Powered;
+                       EVENT_USB_Device_Connect();
+               }
+               else
+               {
+                       USB_DeviceState = DEVICE_STATE_Unattached;
+                       EVENT_USB_Device_Disconnect();
+               }
+       }
+       #endif
+
+       if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
+       {
+               USB_INT_Clear(USB_INT_SUSPI);
+
+               USB_INT_Disable(USB_INT_SUSPI);
+               USB_INT_Enable(USB_INT_WAKEUPI);
+
+               USB_CLK_Freeze();
+
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+                 USB_PLL_Off();
+
+               #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
+               USB_DeviceState = DEVICE_STATE_Unattached;
+               EVENT_USB_Device_Disconnect();
+               #else
+               USB_DeviceState = DEVICE_STATE_Suspended;
+               EVENT_USB_Device_Suspend();
+               #endif
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
+       {
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+               {
+                       USB_PLL_On();
+                       while (!(USB_PLL_IsReady()));
+               }
+
+               USB_CLK_Unfreeze();
+
+               USB_INT_Clear(USB_INT_WAKEUPI);
+
+               USB_INT_Disable(USB_INT_WAKEUPI);
+               USB_INT_Enable(USB_INT_SUSPI);
+
+               if (USB_ConfigurationNumber)
+                 USB_DeviceState = DEVICE_STATE_Configured;
+               else
+                 USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
+
+               #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
+               EVENT_USB_Device_Connect();
+               #else
+               EVENT_USB_Device_WakeUp();
+               #endif
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
+       {
+               USB_INT_Clear(USB_INT_EORSTI);
+
+               USB_DeviceState         = DEVICE_STATE_Default;
+               USB_ConfigurationNumber = 0;
+
+               USB_INT_Clear(USB_INT_SUSPI);
+               USB_INT_Disable(USB_INT_SUSPI);
+               USB_INT_Enable(USB_INT_WAKEUPI);
+
+               Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+                                          ENDPOINT_DIR_OUT, USB_ControlEndpointSize,
+                                          ENDPOINT_BANK_SINGLE);
+
+               #if defined(INTERRUPT_CONTROL_ENDPOINT)
+               USB_INT_Enable(USB_INT_RXSTPI);
+               #endif
+
+               EVENT_USB_Device_Reset();
+       }
+       #endif
+
+       #if defined(USB_CAN_BE_HOST)
+       #if !defined(NO_SOF_EVENTS)
+       if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
+       {
+               USB_INT_Clear(USB_INT_HSOFI);
+
+               EVENT_USB_Host_StartOfFrame();
+       }
+       #endif
+
+       if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
+       {
+               USB_INT_Clear(USB_INT_DDISCI);
+               USB_INT_Clear(USB_INT_DCONNI);
+               USB_INT_Disable(USB_INT_DDISCI);
+
+               EVENT_USB_Host_DeviceUnattached();
+
+               USB_ResetInterface();
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
+       {
+               USB_INT_Clear(USB_INT_VBERRI);
+
+               USB_Host_VBUS_Manual_Off();
+               USB_Host_VBUS_Auto_Off();
+
+               EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
+               EVENT_USB_Host_DeviceUnattached();
+
+               USB_HostState = HOST_STATE_Unattached;
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI))
+       {
+               USB_INT_Clear(USB_INT_SRPI);
+               USB_INT_Disable(USB_INT_SRPI);
+
+               EVENT_USB_Host_DeviceAttached();
+
+               USB_INT_Enable(USB_INT_DDISCI);
+
+               USB_HostState = HOST_STATE_Powered;
+       }
+
+       if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
+       {
+               USB_INT_Clear(USB_INT_BCERRI);
+
+               EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
+               EVENT_USB_Host_DeviceUnattached();
+
+               USB_ResetInterface();
+       }
+       #endif
+
+       #if defined(USB_CAN_BE_BOTH)
+       if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))
+       {
+               USB_INT_Clear(USB_INT_IDTI);
+
+               if (USB_DeviceState != DEVICE_STATE_Unattached)
+                 EVENT_USB_Device_Disconnect();
+
+               if (USB_HostState != HOST_STATE_Unattached)
+                 EVENT_USB_Host_DeviceUnattached();
+
+               USB_CurrentMode = USB_GetUSBModeFromUID();
+               USB_ResetInterface();
+
+               EVENT_USB_UIDChange();
+       }
+       #endif
+}
+
+#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)
+ISR(USB_COM_vect, ISR_BLOCK)
+{
+       uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
+
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+       USB_INT_Disable(USB_INT_RXSTPI);
+
+       NONATOMIC_BLOCK(NONATOMIC_FORCEOFF)
+       {
+               USB_Device_ProcessControlRequest();
+       }
+
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+       USB_INT_Enable(USB_INT_RXSTPI);
+       Endpoint_SelectEndpoint(PrevSelectedEndpoint);
+}
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/USBInterrupt.h b/LUFA/Drivers/USB/Core/AVR8/USBInterrupt.h
new file mode 100644 (file)
index 0000000..3cb0b66
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB controller interrupt service routine management (AVR8)
+ *
+ *  This file contains definitions required for the correct handling of low level USB service routine interrupts
+ *  from the USB controller.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBINTERRUPT_AVR8_H__
+#define __USBINTERRUPT_AVR8_H__
+
+       /* Includes: */
+               #include "../../../../Common/Common.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Macros: */
+                       #define USB_INT_Enable(int)              MACROS{ USB_INT_GET_EN_REG(int)   |=   USB_INT_GET_EN_MASK(int);   }MACROE
+                       #define USB_INT_Disable(int)             MACROS{ USB_INT_GET_EN_REG(int)   &= ~(USB_INT_GET_EN_MASK(int));  }MACROE
+                       #define USB_INT_Clear(int)               MACROS{ USB_INT_GET_INT_REG(int)  &= ~(USB_INT_GET_INT_MASK(int)); }MACROE
+                       #define USB_INT_IsEnabled(int)                 ((USB_INT_GET_EN_REG(int)   &    USB_INT_GET_EN_MASK(int)) ? true : false)
+                       #define USB_INT_HasOccurred(int)               ((USB_INT_GET_INT_REG(int)  &    USB_INT_GET_INT_MASK(int)) ? true : false)
+
+                       #define USB_INT_GET_EN_REG(a, b, c, d)           a
+                       #define USB_INT_GET_EN_MASK(a, b, c, d)          b
+                       #define USB_INT_GET_INT_REG(a, b, c, d)          c
+                       #define USB_INT_GET_INT_MASK(a, b, c, d)         d
+
+                       #define USB_INT_VBUS                             USBCON, (1 << VBUSTE) , USBINT, (1 << VBUSTI)
+                       #define USB_INT_IDTI                             USBCON, (1 << IDTE)   , USBINT, (1 << IDTI)
+                       #define USB_INT_WAKEUPI                          UDIEN , (1 << WAKEUPE), UDINT , (1 << WAKEUPI)
+                       #define USB_INT_SUSPI                            UDIEN , (1 << SUSPE)  , UDINT , (1 << SUSPI)
+                       #define USB_INT_EORSTI                           UDIEN , (1 << EORSTE) , UDINT , (1 << EORSTI)
+                       #define USB_INT_DCONNI                           UHIEN , (1 << DCONNE) , UHINT , (1 << DCONNI)
+                       #define USB_INT_DDISCI                           UHIEN , (1 << DDISCE) , UHINT , (1 << DDISCI)
+                       #define USB_INT_BCERRI                           OTGIEN, (1 << BCERRE) , OTGINT, (1 << BCERRI)
+                       #define USB_INT_VBERRI                           OTGIEN, (1 << VBERRE) , OTGINT, (1 << VBERRI)
+                       #define USB_INT_SOFI                             UDIEN,  (1 << SOFE)   , UDINT , (1 << SOFI)
+                       #define USB_INT_HSOFI                            UHIEN,  (1 << HSOFE)  , UHINT , (1 << HSOFI)
+                       #define USB_INT_RSTI                             UHIEN , (1 << RSTE)   , UHINT , (1 << RSTI)
+                       #define USB_INT_SRPI                             OTGIEN, (1 << SRPE)   , OTGINT, (1 << SRPI)
+                       #define USB_INT_RXSTPI                           UEIENX, (1 << RXSTPE) , UEINTX, (1 << RXSTPI)
+
+               /* Includes: */
+                       #include "../USBMode.h"
+                       #include "../Events.h"
+                       #include "../USBController.h"
+
+               /* Function Prototypes: */
+                       void USB_INT_ClearAllInterrupts(void);
+                       void USB_INT_DisableAllInterrupts(void);
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/ConfigDescriptor.c b/LUFA/Drivers/USB/Core/ConfigDescriptor.c
new file mode 100644 (file)
index 0000000..9671659
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "ConfigDescriptor.h"
+
+#if defined(USB_CAN_BE_HOST)
+uint8_t USB_Host_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr,
+                                           void* BufferPtr, uint16_t BufferSize)
+{
+       uint8_t ErrorCode;
+       uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
+
+       USB_ControlRequest = (USB_Request_Header_t)
+               {
+                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+                       .bRequest      = REQ_GetDescriptor,
+                       .wValue        = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)),
+                       .wIndex        = 0,
+                       .wLength       = sizeof(USB_Descriptor_Configuration_Header_t),
+               };
+
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+       if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful)
+         return ErrorCode;
+
+       *ConfigSizePtr = DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize;
+
+       if (*ConfigSizePtr > BufferSize)
+         return HOST_GETCONFIG_BuffOverflow;
+
+       USB_ControlRequest.wLength = *ConfigSizePtr;
+
+       if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful)
+         return ErrorCode;
+
+       if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)
+         return HOST_GETCONFIG_InvalidData;
+
+       return HOST_GETCONFIG_Successful;
+}
+#endif
+
+void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
+                                 void** const CurrConfigLoc,
+                                 const uint8_t Type)
+{
+       while (*BytesRem)
+       {
+               USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
+
+               if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type)
+                 return;
+       }
+}
+
+void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
+                                       void** const CurrConfigLoc,
+                                       const uint8_t Type,
+                                       const uint8_t BeforeType)
+{
+       while (*BytesRem)
+       {
+               USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
+
+               if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type)
+               {
+                       return;
+               }
+               else if (DESCRIPTOR_TYPE(*CurrConfigLoc) == BeforeType)
+               {
+                       *BytesRem = 0;
+                       return;
+               }
+       }
+}
+
+void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
+                                      void** const CurrConfigLoc,
+                                      const uint8_t Type,
+                                      const uint8_t AfterType)
+{
+       USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, AfterType);
+
+       if (*BytesRem)
+         USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, Type);
+}
+
+uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem, void** const CurrConfigLoc, ConfigComparatorPtr_t const ComparatorRoutine)
+{
+       uint8_t ErrorCode;
+
+       while (*BytesRem)
+       {
+               uint8_t* PrevDescLoc  = *CurrConfigLoc;
+               uint16_t PrevBytesRem = *BytesRem;
+
+               USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
+
+               if ((ErrorCode = ComparatorRoutine(*CurrConfigLoc)) != DESCRIPTOR_SEARCH_NotFound)
+               {
+                       if (ErrorCode == DESCRIPTOR_SEARCH_Fail)
+                       {
+                               *CurrConfigLoc = PrevDescLoc;
+                               *BytesRem      = PrevBytesRem;
+                       }
+
+                       return ErrorCode;
+               }
+       }
+
+       return DESCRIPTOR_SEARCH_COMP_EndOfDescriptor;
+}
+
diff --git a/LUFA/Drivers/USB/Core/ConfigDescriptor.h b/LUFA/Drivers/USB/Core/ConfigDescriptor.h
new file mode 100644 (file)
index 0000000..2f0ac8e
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief Configuration descriptor parser API.
+ *
+ *  This section of the library gives a friendly API which can be used in host applications to easily
+ *  parse an attached device's configuration descriptor so that endpoint, interface and other descriptor
+ *  data can be extracted and used as needed.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Descriptors
+ *  \defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser
+ *
+ *  Functions, macros, variables, enums and types related to the parsing of Configuration Descriptors.
+ *
+ *  @{
+ */
+
+#ifndef __CONFIGDESCRIPTOR_H__
+#define __CONFIGDESCRIPTOR_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+               #include "HostStandardReq.h"
+               #include "USBMode.h"
+               #include "StdDescriptors.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared
+                        *  with the \c EP_TYPE_* masks to determine the exact type of the endpoint.
+                        */
+                       #define EP_TYPE_MASK                       0x03
+
+                       /** Casts a pointer to a descriptor inside the configuration descriptor into a pointer to the given
+                        *  descriptor type.
+                        *
+                        *  Usage Example:
+                        *  \code
+                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
+                        *  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor,
+                        *                                                           USB_Descriptor_Configuration_Header_t);
+                        *
+                        *  // Can now access elements of the configuration header struct using the -> indirection operator
+                        *  \endcode
+                        */
+                       #define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr))
+
+                       /** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor
+                        *  type (as an actual struct instance rather than a pointer to a struct).
+                        *
+                        *  Usage Example:
+                        *  \code
+                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
+                        *  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor,
+                        *                                                       USB_Descriptor_Configuration_Header_t);
+                        *
+                        *  // Can now access elements of the configuration header struct using the . operator
+                        *  \endcode
+                        */
+                       #define DESCRIPTOR_CAST(DescriptorPtr, Type)  (*DESCRIPTOR_PCAST(DescriptorPtr, Type))
+
+                       /** Returns the descriptor's type, expressed as the 8-bit type value in the header of the descriptor.
+                        *  This value's meaning depends on the descriptor's placement in the descriptor, but standard type
+                        *  values can be accessed in the \ref USB_DescriptorTypes_t enum.
+                        */
+                       #define DESCRIPTOR_TYPE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Type
+
+                       /** Returns the descriptor's size, expressed as the 8-bit value indicating the number of bytes. */
+                       #define DESCRIPTOR_SIZE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Size
+
+               /* Type Defines: */
+                       /** Type define for a Configuration Descriptor comparator function (function taking a pointer to an array
+                        *  of type void, returning a uint8_t value).
+                        *
+                        *  \see \ref USB_GetNextDescriptorComp function for more details.
+                        */
+                       typedef uint8_t (* ConfigComparatorPtr_t)(void*);
+
+               /* Enums: */
+                       /** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */
+                       enum USB_Host_GetConfigDescriptor_ErrorCodes_t
+                       {
+                               HOST_GETCONFIG_Successful       = 0, /**< No error occurred while retrieving the configuration descriptor. */
+                               HOST_GETCONFIG_DeviceDisconnect = 1, /**< The attached device was disconnected while retrieving the configuration
+                                                                       * descriptor.
+                                                                       */
+                               HOST_GETCONFIG_PipeError        = 2, /**< An error occurred in the pipe while sending the request. */
+                               HOST_GETCONFIG_SetupStalled     = 3, /**< The attached device stalled the request to retrieve the configuration
+                                                                       * descriptor.
+                                                                       */
+                               HOST_GETCONFIG_SoftwareTimeOut  = 4, /**< The request or data transfer timed out. */
+                               HOST_GETCONFIG_BuffOverflow     = 5, /**< The device's configuration descriptor is too large to fit into the allocated
+                                                                       * buffer.
+                                                                       */
+                               HOST_GETCONFIG_InvalidData      = 6, /**< The device returned invalid configuration descriptor data. */
+                       };
+
+                       /** Enum for return values of a descriptor comparator function. */
+                       enum DSearch_Return_ErrorCodes_t
+                       {
+                               DESCRIPTOR_SEARCH_Found                = 0, /**< Current descriptor matches comparator criteria. */
+                               DESCRIPTOR_SEARCH_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */
+                               DESCRIPTOR_SEARCH_NotFound             = 2, /**< Current descriptor does not match comparator criteria. */
+                       };
+
+                       /** Enum for return values of \ref USB_GetNextDescriptorComp(). */
+                       enum DSearch_Comp_Return_ErrorCodes_t
+                       {
+                               DESCRIPTOR_SEARCH_COMP_Found           = 0, /**< Configuration descriptor now points to descriptor which matches
+                                                                            *   search criteria of the given comparator function. */
+                               DESCRIPTOR_SEARCH_COMP_Fail            = 1, /**< Comparator function returned \ref DESCRIPTOR_SEARCH_Fail. */
+                               DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2, /**< End of configuration descriptor reached before match found. */
+                       };
+
+               /* Function Prototypes: */
+                       /** Retrieves the configuration descriptor data from an attached device via a standard request into a buffer,
+                        *  including validity and size checking to prevent a buffer overflow.
+                        *
+                        *  \param[in]     ConfigNumber   Device configuration descriptor number to fetch from the device (usually set to 1 for
+                        *                                single configuration devices).
+                        *  \param[in,out] ConfigSizePtr  Pointer to a location for storing the retrieved configuration descriptor size.
+                        *  \param[out]    BufferPtr      Pointer to the buffer for storing the configuration descriptor data.
+                        *  \param[out]    BufferSize     Size of the allocated buffer where the configuration descriptor is to be stored.
+                        *
+                        *  \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum.
+                        */
+                       uint8_t USB_Host_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr, void* BufferPtr,
+                                                                  uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
+
+                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value.
+                        *  The bytes remaining value is automatically decremented.
+                        *
+                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+                        * \param[in]     Type           Descriptor type value to search for.
+                        */
+                       void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
+                                                        void** const CurrConfigLoc,
+                                                        const uint8_t Type)
+                                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
+                        *  which must come before a descriptor of the second given type value. If the BeforeType type
+                        *  descriptor is reached first, the number of bytes remaining to process is set to zero and the
+                        *  function exits. The bytes remaining value is automatically decremented.
+                        *
+                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+                        * \param[in]     Type           Descriptor type value to search for.
+                        * \param[in]     BeforeType     Descriptor type value which must not be reached before the given Type descriptor.
+                        */
+                       void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
+                                                              void** const CurrConfigLoc,
+                                                              const uint8_t Type,
+                                                              const uint8_t BeforeType)
+                                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
+                        *  which must come after a descriptor of the second given type value. The bytes remaining value is
+                        *  automatically decremented.
+                        *
+                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+                        * \param[in]     Type           Descriptor type value to search for.
+                        * \param[in]     AfterType      Descriptor type value which must be reached before the given Type descriptor.
+                        */
+                       void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
+                                                             void** const CurrConfigLoc,
+                                                             const uint8_t Type,
+                                                             const uint8_t AfterType)
+                                                             ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+                       /** Searches for the next descriptor in the given configuration descriptor using a pre-made comparator
+                        *  function. The routine updates the position and remaining configuration descriptor bytes values
+                        *  automatically. If a comparator routine fails a search, the descriptor pointer is retreated back
+                        *  so that the next descriptor search invocation will start from the descriptor which first caused the
+                        *  original search to fail. This behaviour allows for one comparator to be used immediately after another
+                        *  has failed, starting the second search from the descriptor which failed the first.
+                        *
+                        *  Comparator functions should be standard functions which accept a pointer to the header of the current
+                        *  descriptor inside the configuration descriptor which is being compared, and should return a value from
+                        *  the \ref DSearch_Return_ErrorCodes_t enum as a uint8_t value.
+                        *
+                        *  \note This function is available in USB Host mode only.
+                        *
+                        *  \param[in,out] BytesRem           Pointer to an int storing the remaining bytes in the configuration descriptor.
+                        *  \param[in,out] CurrConfigLoc      Pointer to the current position in the configuration descriptor.
+                        *  \param[in]     ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor.
+                        *
+                        *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum.
+                        *
+                        *  Usage Example:
+                        *  \code
+                        *  uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype
+                        *
+                        *  uint8_t EndpointSearcher(void* CurrentDescriptor)
+                        *  {
+                        *     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
+                        *         return DESCRIPTOR_SEARCH_Found;
+                        *     else
+                        *         return DESCRIPTOR_SEARCH_NotFound;
+                        *  }
+                        *
+                        *  //...
+                        *  // After retrieving configuration descriptor:
+                        *  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) ==
+                        *      Descriptor_Search_Comp_Found)
+                        *  {
+                        *      // Do something with the endpoint descriptor
+                        *  }
+                        *  \endcode
+                        */
+                       uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem,
+                                                         void** const CurrConfigLoc,
+                                                         ConfigComparatorPtr_t const ComparatorRoutine);
+
+               /* Inline Functions: */
+                       /** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
+                           points to the next sub-descriptor. The bytes remaining value is automatically decremented.
+                        *
+                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+                        */
+                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
+                                                                void** CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
+                                                                void** CurrConfigLoc)
+                       {
+                               uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
+
+                               *CurrConfigLoc  = ((uint8_t*)*CurrConfigLoc) + CurrDescriptorSize;
+                               *BytesRem      -= CurrDescriptorSize;
+                       }
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Device.h b/LUFA/Drivers/USB/Core/Device.h
new file mode 100644 (file)
index 0000000..8c85451
--- /dev/null
@@ -0,0 +1,71 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief Common USB device mode definitions.\r
+ *\r
+ *  This file contains common structures, function prototypes and macros related to USB device mode for all\r
+ *  architectures.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_USB\r
+ *  \defgroup Group_Device Device Management\r
+ *\r
+ *  USB Device mode related definitions common to all architectures. This module contains definitions which\r
+ *  are used when the USB controller is initialized in device mode.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __USBDEVICE_H__\r
+#define __USBDEVICE_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+               #include "StdDescriptors.h"\r
+               #include "USBInterrupt.h"\r
+               #include "Endpoint.h"\r
+               \r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/Device.h"\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r
diff --git a/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/LUFA/Drivers/USB/Core/DeviceStandardReq.c
new file mode 100644 (file)
index 0000000..f0c336e
--- /dev/null
@@ -0,0 +1,361 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_DEVICESTDREQ_C
+#include "DeviceStandardReq.h"
+
+uint8_t USB_ConfigurationNumber;
+
+#if !defined(NO_DEVICE_SELF_POWER)
+bool    USB_CurrentlySelfPowered;
+#endif
+
+#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+bool    USB_RemoteWakeupEnabled;
+#endif
+
+void USB_Device_ProcessControlRequest(void)
+{
+       uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest;
+
+       for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)
+         *(RequestHeader++) = Endpoint_Read_Byte();
+
+       EVENT_USB_Device_ControlRequest();
+
+       if (Endpoint_IsSETUPReceived())
+       {
+               uint8_t bmRequestType = USB_ControlRequest.bmRequestType;
+
+               switch (USB_ControlRequest.bRequest)
+               {
+                       case REQ_GetStatus:
+                               if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+                                       (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT)))
+                               {
+                                       USB_Device_GetStatus();
+                               }
+
+                               break;
+                       case REQ_ClearFeature:
+                       case REQ_SetFeature:
+                               if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+                                       (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT)))
+                               {
+                                       USB_Device_ClearSetFeature();
+                               }
+
+                               break;
+                       case REQ_SetAddress:
+                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+                                 USB_Device_SetAddress();
+
+                               break;
+                       case REQ_GetDescriptor:
+                               if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+                                       (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE)))
+                               {
+                                       USB_Device_GetDescriptor();
+                               }
+
+                               break;
+                       case REQ_GetConfiguration:
+                               if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))
+                                 USB_Device_GetConfiguration();
+
+                               break;
+                       case REQ_SetConfiguration:
+                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+                                 USB_Device_SetConfiguration();
+
+                               break;
+               }
+       }
+
+       if (Endpoint_IsSETUPReceived())
+       {
+               Endpoint_StallTransaction();
+               Endpoint_ClearSETUP();
+       }
+}
+
+static void USB_Device_SetAddress(void)
+{
+       uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+       {
+               Endpoint_ClearSETUP();
+
+               Endpoint_ClearStatusStage();
+
+               while (!(Endpoint_IsINReady()));
+
+               USB_Device_SetDeviceAddress(DeviceAddress);
+       }
+       
+       USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
+}
+
+static void USB_Device_SetConfiguration(void)
+{
+       #if defined(FIXED_NUM_CONFIGURATIONS)
+       if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)
+         return;
+       #else
+       USB_Descriptor_Device_t* DevDescriptorPtr;
+
+       #if defined(USE_FLASH_DESCRIPTORS)
+               #define MemoryAddressSpace  MEMSPACE_FLASH
+       #elif defined(USE_EEPROM_DESCRIPTORS)
+               #define MemoryAddressSpace  MEMSPACE_EEPROM
+       #elif defined(USE_SRAM_DESCRIPTORS)
+               #define MemoryAddressSpace  MEMSPACE_SRAM
+       #else
+               uint8_t MemoryAddressSpace;
+       #endif
+
+       if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr
+       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
+                                      , &MemoryAddressSpace
+       #endif
+                                      ) == NO_DESCRIPTOR)
+       {
+               return;
+       }
+
+       if (MemoryAddressSpace == MEMSPACE_FLASH)
+       {
+               if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
+                 return;
+       }
+       else if (MemoryAddressSpace == MEMSPACE_EEPROM)
+       {
+               if (((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
+                 return;
+       }
+       else
+       {
+               if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
+                 return;
+       }
+       #endif
+
+       Endpoint_ClearSETUP();
+
+       USB_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue;
+
+       Endpoint_ClearStatusStage();
+
+       if (USB_ConfigurationNumber)
+         USB_DeviceState = DEVICE_STATE_Configured;
+       else
+         USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
+
+       EVENT_USB_Device_ConfigurationChanged();
+}
+
+static void USB_Device_GetConfiguration(void)
+{
+       Endpoint_ClearSETUP();
+
+       Endpoint_Write_Byte(USB_ConfigurationNumber);
+       Endpoint_ClearIN();
+
+       Endpoint_ClearStatusStage();
+}
+
+#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+static void USB_Device_GetInternalSerialDescriptor(void)
+{
+       struct
+       {
+               USB_Descriptor_Header_t Header;
+               wchar_t                 UnicodeString[20];
+       } SignatureDescriptor;
+
+       SignatureDescriptor.Header.Type = DTYPE_String;
+       SignatureDescriptor.Header.Size = USB_Device_GetSerialString(SignatureDescriptor.UnicodeString,
+                                                                    sizeof(SignatureDescriptor.UnicodeString));
+
+       Endpoint_ClearSETUP();
+
+       Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
+       Endpoint_ClearOUT();
+}
+#endif
+
+static void USB_Device_GetDescriptor(void)
+{
+       const void* DescriptorPointer;
+       uint16_t    DescriptorSize;
+
+       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
+       uint8_t DescriptorAddressSpace;
+       #endif
+
+       #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+       if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
+       {
+               USB_Device_GetInternalSerialDescriptor();
+               return;
+       }
+       #endif
+
+       if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,
+                                                        &DescriptorPointer
+       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
+                                                        , &DescriptorAddressSpace
+       #endif
+                                                                                                        )) == NO_DESCRIPTOR)
+       {
+               return;
+       }
+
+       Endpoint_ClearSETUP();
+
+       #if defined(USE_RAM_DESCRIPTORS)
+       Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
+       #elif defined(USE_EEPROM_DESCRIPTORS)
+       Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
+       #elif defined(USE_FLASH_DESCRIPTORS)
+       Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
+       #else
+       if (DescriptorAddressSpace == MEMSPACE_FLASH)
+         Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
+       else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
+         Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
+       else
+         Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
+       #endif
+
+       Endpoint_ClearOUT();
+}
+
+static void USB_Device_GetStatus(void)
+{
+       uint8_t CurrentStatus = 0;
+
+       switch (USB_ControlRequest.bmRequestType)
+       {
+               #if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP)
+               case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):
+                       #if !defined(NO_DEVICE_SELF_POWER)
+                       if (USB_CurrentlySelfPowered)
+                         CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
+                       #endif
+
+                       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+                       if (USB_RemoteWakeupEnabled)
+                         CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
+                       #endif
+                       break;
+               #endif
+               #if !defined(CONTROL_ONLY_DEVICE)
+               case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
+                       Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+
+                       CurrentStatus = Endpoint_IsStalled();
+
+                       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+                       break;
+               #endif
+               default:
+                       return;
+       }
+
+       Endpoint_ClearSETUP();
+
+       Endpoint_Write_Word_LE(CurrentStatus);
+       Endpoint_ClearIN();
+
+       Endpoint_ClearStatusStage();
+}
+
+static void USB_Device_ClearSetFeature(void)
+{
+       switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT)
+       {
+               #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+               case REQREC_DEVICE:
+                       if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup)
+                         USB_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
+                       else
+                         return;
+
+                       break;
+               #endif
+               #if !defined(CONTROL_ONLY_DEVICE)
+               case REQREC_ENDPOINT:
+                       if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt)
+                       {
+                               uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+
+                               if (EndpointIndex == ENDPOINT_CONTROLEP)
+                                 return;
+
+                               Endpoint_SelectEndpoint(EndpointIndex);
+
+                               if (Endpoint_IsEnabled())
+                               {
+                                       if (USB_ControlRequest.bRequest == REQ_SetFeature)
+                                       {
+                                               Endpoint_StallTransaction();
+                                       }
+                                       else
+                                       {
+                                               Endpoint_ClearStall();
+                                               Endpoint_ResetFIFO(EndpointIndex);
+                                               Endpoint_ResetDataToggle();
+                                       }
+                               }
+                       }
+
+                       break;
+               #endif
+               default:
+                       return;
+       }
+
+       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+       Endpoint_ClearSETUP();
+
+       Endpoint_ClearStatusStage();
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/DeviceStandardReq.h b/LUFA/Drivers/USB/Core/DeviceStandardReq.h
new file mode 100644 (file)
index 0000000..0ab297d
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB device standard request management.
+ *
+ *  This file contains the function prototypes necessary for the processing of incoming standard control requests
+ *  when the library is in USB device mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __DEVICESTDREQ_H__
+#define __DEVICESTDREQ_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+               #include "StdDescriptors.h"
+               #include "Events.h"
+               #include "StdRequestType.h"
+               #include "USBTask.h"
+               #include "USBController.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       #if defined(USE_SINGLE_DEVICE_CONFIGURATION)
+                               #define FIXED_NUM_CONFIGURATIONS           1
+                       #endif
+
+               /* Enums: */
+                       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
+                               /** Enum for the possible descriptor memory spaces, for the \c MemoryAddressSpace parameter of the
+                                *  \ref CALLBACK_USB_GetDescriptor() function. This can be used when none of the \c USE_*_DESCRIPTORS
+                                *  compile time options are used, to indicate in which memory space the descriptor is stored.
+                                *
+                                *  \ingroup Group_Device
+                                */
+                               enum USB_DescriptorMemorySpaces_t
+                               {
+                                       MEMSPACE_FLASH    = 0, /**< Indicates the requested descriptor is located in FLASH memory. */
+                                       MEMSPACE_EEPROM   = 1, /**< Indicates the requested descriptor is located in EEPROM memory. */
+                                       MEMSPACE_RAM      = 2, /**< Indicates the requested descriptor is located in RAM memory. */
+                               };
+                       #endif
+
+               /* Global Variables: */
+                       /** Indicates the currently set configuration number of the device. USB devices may have several
+                        *  different configurations which the host can select between; this indicates the currently selected
+                        *  value, or 0 if no configuration has been selected.
+                        *
+                        *  \note This variable should be treated as read-only in the user application, and never manually
+                        *        changed in value.
+                        *
+                        *  \ingroup Group_Device
+                        */
+                       extern uint8_t USB_ConfigurationNumber;
+
+                       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
+                               /** Indicates if the host is currently allowing the device to issue remote wakeup events. If this
+                                *  flag is cleared, the device should not issue remote wakeup events to the host.
+                                *
+                                *  \note This variable should be treated as read-only in the user application, and never manually
+                                *        changed in value.
+                                *        \n\n
+                                *
+                                *  \note To reduce FLASH usage of the compiled applications where Remote Wakeup is not supported,
+                                *        this global and the underlying management code can be disabled by defining the
+                                *        \c NO_DEVICE_REMOTE_WAKEUP token in the project makefile and passing it to the compiler via
+                                *        the -D switch.
+                                *
+                                *  \ingroup Group_Device
+                                */
+                               extern bool USB_RemoteWakeupEnabled;
+                       #endif
+
+                       #if !defined(NO_DEVICE_SELF_POWER)
+                               /** Indicates if the device is currently being powered by its own power supply, rather than being
+                                *  powered by the host's USB supply. This flag should remain cleared if the device does not
+                                *  support self powered mode, as indicated in the device descriptors.
+                                *
+                                *  \ingroup Group_Device
+                                */
+                               extern bool USB_CurrentlySelfPowered;
+                       #endif
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               #if defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
+                       #error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+               #elif defined(USE_RAM_DESCRIPTORS) && defined(USE_FLASH_DESCRIPTORS)
+                       #error USE_RAM_DESCRIPTORS and USE_FLASH_DESCRIPTORS are mutually exclusive.
+               #elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
+                       #error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+               #elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)
+                       #error Only one of the USE_*_DESCRIPTORS modes should be selected.
+               #endif
+
+               /* Function Prototypes: */
+                       void USB_Device_ProcessControlRequest(void);
+
+                       #if defined(__INCLUDE_FROM_DEVICESTDREQ_C)
+                               static void USB_Device_SetAddress(void);
+                               static void USB_Device_SetConfiguration(void);
+                               static void USB_Device_GetConfiguration(void);
+                               static void USB_Device_GetDescriptor(void);
+                               static void USB_Device_GetStatus(void);
+                               static void USB_Device_ClearSetFeature(void);
+
+                               #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+                                       static void USB_Device_GetInternalSerialDescriptor(void);
+                               #endif
+                       #endif
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/Endpoint.h b/LUFA/Drivers/USB/Core/Endpoint.h
new file mode 100644 (file)
index 0000000..302c368
--- /dev/null
@@ -0,0 +1,88 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB device endpoint management definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to the management of the device's\r
+ *  data endpoints when the library is initialized in USB device mode.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_EndpointManagement\r
+ *  \defgroup Group_EndpointRW Endpoint Data Reading and Writing\r
+ *\r
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.\r
+ */\r
+\r
+/** \ingroup Group_EndpointRW\r
+ *  \defgroup Group_EndpointPrimitiveRW Read/Write of Primitive Data Types\r
+ *\r
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types\r
+ *  from and to endpoints.\r
+ */\r
+\r
+/** \ingroup Group_EndpointManagement\r
+ *  \defgroup Group_EndpointPacketManagement Endpoint Packet Management\r
+ *\r
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.\r
+ */\r
+\r
+/** \ingroup Group_USB\r
+ *  \defgroup Group_EndpointManagement Endpoint Management\r
+ *\r
+ *  Functions, macros and enums related to endpoint management when in USB Device mode. This\r
+ *  module contains the endpoint management macros, as well as endpoint interrupt and data\r
+ *  send/receive functions for various data types.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __ENDPOINT_H__\r
+#define __ENDPOINT_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/Endpoint.h"\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r
diff --git a/LUFA/Drivers/USB/Core/EndpointStream.c b/LUFA/Drivers/USB/Core/EndpointStream.c
new file mode 100644 (file)
index 0000000..974af68
--- /dev/null
@@ -0,0 +1,259 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+              \r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+#define  __INCLUDE_FROM_USB_DRIVER\r
+#include "USBMode.h"\r
+\r
+#if defined(USB_CAN_BE_DEVICE)\r
+\r
+#include "EndpointStream.h"\r
+\r
+#if !defined(CONTROL_ONLY_DEVICE)\r
+uint8_t Endpoint_Discard_Stream(uint16_t Length,\r
+                                uint16_t* const BytesProcessed)\r
+{\r
+       uint8_t  ErrorCode;\r
+       uint16_t BytesInTransfer = 0;\r
+       \r
+       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
+         return ErrorCode;\r
+         \r
+       if (BytesProcessed != NULL)\r
+         Length -= *BytesProcessed;\r
+\r
+       while (Length)\r
+       {\r
+               if (!(Endpoint_IsReadWriteAllowed()))\r
+               {\r
+                       Endpoint_ClearOUT();\r
+\r
+                       if (BytesProcessed != NULL)\r
+                       {\r
+                               *BytesProcessed += BytesInTransfer;\r
+                               return ENDPOINT_RWSTREAM_IncompleteTransfer;\r
+                       }\r
+\r
+                       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
+                         return ErrorCode;\r
+               }\r
+               else\r
+               {\r
+                       Endpoint_Discard_Byte();\r
+\r
+                       Length--;\r
+                       BytesInTransfer++;\r
+               }\r
+       }\r
+       \r
+       return ENDPOINT_RWSTREAM_NoError;\r
+}\r
+\r
+uint8_t Endpoint_Null_Stream(uint16_t Length,\r
+                             uint16_t* const BytesProcessed)\r
+{\r
+       uint8_t  ErrorCode;\r
+       uint16_t BytesInTransfer = 0;\r
+       \r
+       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
+         return ErrorCode;\r
+         \r
+       if (BytesProcessed != NULL)\r
+         Length -= *BytesProcessed;\r
+\r
+       while (Length)\r
+       {\r
+               if (!(Endpoint_IsReadWriteAllowed()))\r
+               {\r
+                       Endpoint_ClearIN();\r
+\r
+                       if (BytesProcessed != NULL)\r
+                       {\r
+                               *BytesProcessed += BytesInTransfer;\r
+                               return ENDPOINT_RWSTREAM_IncompleteTransfer;\r
+                       }\r
+\r
+                       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
+                         return ErrorCode;\r
+               }\r
+               else\r
+               {\r
+                       Endpoint_Write_Byte(0);\r
+\r
+                       Length--;\r
+                       BytesInTransfer++;\r
+               }\r
+       }\r
+       \r
+       return ENDPOINT_RWSTREAM_NoError;\r
+}\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#endif\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
+#include "Template/Template_Endpoint_Control_W.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_Control_W.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_Control_W.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
+#include "Template/Template_Endpoint_Control_W.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_Control_W.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
+#include "Template/Template_Endpoint_Control_W.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
+#include "Template/Template_Endpoint_Control_R.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
+#include "Template/Template_Endpoint_Control_R.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
+#include "Template/Template_Endpoint_Control_R.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
+#include "Template/Template_Endpoint_Control_R.c"\r
+\r
+#endif
diff --git a/LUFA/Drivers/USB/Core/EndpointStream.h b/LUFA/Drivers/USB/Core/EndpointStream.h
new file mode 100644 (file)
index 0000000..4d4f33a
--- /dev/null
@@ -0,0 +1,683 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+              \r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB device endpoint stream function definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to the sending and receiving of\r
+ *  arbitrary data streams through the device's data endpoints when the library is initialized in USB device mode.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_EndpointRW  \r
+ *  \defgroup Group_EndpointStreamRW Read/Write of Multi-Byte Streams\r
+ *\r
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from\r
+ *  and to endpoints.\r
+ *\r
+ *  @{\r
+ */ \r
+\r
+#ifndef __ENDPOINT_STREAM_H__\r
+#define __ENDPOINT_STREAM_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+               #include "USBTask.h"\r
+               \r
+       /* Enable C linkage for C++ Compilers: */\r
+               #if defined(__cplusplus)\r
+                       extern "C" {\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+       /* Public Interface - May be used in end-application: */\r
+               /* Enums: */\r
+                       /** Enum for the possible error return codes of the \c Endpoint_*_Stream_* functions. */\r
+                       enum Endpoint_Stream_RW_ErrorCodes_t\r
+                       {\r
+                               ENDPOINT_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
+                               ENDPOINT_RWSTREAM_EndpointStalled    = 1, /**< The endpoint was stalled during the stream\r
+                                                                          *   transfer by the host or device.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during\r
+                                                                          *   the transfer.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_BusSuspended       = 3, /**< The USB bus has been suspended by the host and\r
+                                                                          *   no USB endpoint traffic can occur until the bus\r
+                                                                          *   has resumed.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_Timeout            = 4, /**< The host failed to accept or send the next packet\r
+                                                                          *   within the software timeout period set by the\r
+                                                                          *   \ref USB_STREAM_TIMEOUT_MS macro.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_IncompleteTransfer = 5, /**< Indicates that the endpoint bank became full or empty before\r
+                                                                          *   the complete contents of the current stream could be\r
+                                                                          *   transferred. The endpoint stream function should be called\r
+                                                                          *   again to process the next chunk of data in the transfer.\r
+                                                                          */\r
+                       };\r
+                       \r
+                       /** Enum for the possible error return codes of the \c Endpoint_*_Control_Stream_* functions. */\r
+                       enum Endpoint_ControlStream_RW_ErrorCodes_t\r
+                       {\r
+                               ENDPOINT_RWCSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
+                               ENDPOINT_RWCSTREAM_HostAborted        = 1, /**< The aborted the transfer prematurely. */\r
+                               ENDPOINT_RWCSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during\r
+                                                                           *   the transfer.\r
+                                                                           */\r
+                               ENDPOINT_RWCSTREAM_BusSuspended       = 3, /**< The USB bus has been suspended by the host and\r
+                                                                           *   no USB endpoint traffic can occur until the bus\r
+                                                                           *   has resumed.\r
+                                                                           */\r
+                       };\r
+\r
+               /* Function Prototypes: */\r
+\r
+                       /** \name Stream functions for null data */\r
+                       //@{\r
+\r
+                       /** Reads and discards the given number of bytes from the currently selected endpoint's bank,\r
+                        *  discarding fully read packets from the host as needed. The last packet is not automatically\r
+                        *  discarded once the remaining bytes has been read; the user is responsible for manually\r
+                        *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
+                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
+                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
+                        *  the endpoint bank becomes empty while there is still data to process (and after the current\r
+                        *  packet has been acknowledged) the BytesProcessed location will be updated with the total number\r
+                        *  of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
+                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
+                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note This routine should not be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \param[in] Length          Number of bytes to discard via the currently selected endpoint.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Discard_Stream(uint16_t Length,\r
+                                                       uint16_t* const BytesProcessed);\r
+\r
+                       /** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending\r
+                        *  full packets to the host as needed. The last packet is not automatically sent once the \r
+                        *  remaining bytes have been written; the user is responsible for manually sending the last\r
+                        *  packet to the host via the \ref Endpoint_ClearIN() macro.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
+                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
+                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
+                        *  the endpoint bank becomes full while there is still data to process (and after the current\r
+                        *  packet transmission has been initiated) the BytesProcessed location will be updated with the\r
+                        *  total number of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
+                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
+                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note This routine should not be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Null_Stream(uint16_t Length,\r
+                                                    uint16_t* const BytesProcessed);\r
+\r
+                       //@}\r
+\r
+                       /** \name Stream functions for RAM source/destination data */\r
+                       //@{\r
+               \r
+                       /** Writes the given number of bytes to the endpoint from the given buffer in little endian,\r
+                        *  sending full packets to the host as needed. The last packet filled is not automatically sent;\r
+                        *  the user is responsible for manually sending the last written packet to the host via the\r
+                        *  \ref Endpoint_ClearIN() macro.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
+                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
+                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
+                        *  the endpoint bank becomes full while there is still data to process (and after the current\r
+                        *  packet transmission has been initiated) the BytesProcessed location will be updated with the\r
+                        *  total number of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
+                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
+                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t DataStream[512];\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                            NULL)) != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  DataStream[512];\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note This routine should not be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Stream_LE(const void* const Buffer,\r
+                                                        uint16_t Length,\r
+                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Writes the given number of bytes to the endpoint from the given buffer in big endian,\r
+                        *  sending full packets to the host as needed. The last packet filled is not automatically sent;\r
+                        *  the user is responsible for manually sending the last written packet to the host via the\r
+                        *  \ref Endpoint_ClearIN() macro.\r
+                        *\r
+                        *  \note This routine should not be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Stream_BE(const void* const Buffer,\r
+                                                        uint16_t Length,\r
+                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       \r
+                       /** Reads the given number of bytes from the endpoint from the given buffer in little endian,\r
+                        *  discarding fully read packets from the host as needed. The last packet is not automatically\r
+                        *  discarded once the remaining bytes has been read; the user is responsible for manually\r
+                        *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
+                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
+                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
+                        *  the endpoint bank becomes empty while there is still data to process (and after the current\r
+                        *  packet has been acknowledged) the BytesProcessed location will be updated with the total number\r
+                        *  of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
+                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
+                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t DataStream[512];\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                           NULL)) != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  DataStream[512];\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note This routine should not be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the destination data buffer to write to.\r
+                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_Stream_LE(void* const Buffer,\r
+                                                       uint16_t Length,\r
+                                                       uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Reads the given number of bytes from the endpoint from the given buffer in big endian,\r
+                        *  discarding fully read packets from the host as needed. The last packet is not automatically\r
+                        *  discarded once the remaining bytes has been read; the user is responsible for manually\r
+                        *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.\r
+                        *\r
+                        *  \note This routine should not be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the destination data buffer to write to.\r
+                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_Stream_BE(void* const Buffer,\r
+                                                       uint16_t Length,\r
+                                                       uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,\r
+                        *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared\r
+                        *  in both failure and success states; the user is responsible for manually clearing the setup OUT to\r
+                        *  finalize the transfer via the \ref Endpoint_ClearOUT() macro.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer,\r
+                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,\r
+                        *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared\r
+                        *  in both failure and success states; the user is responsible for manually clearing the setup OUT to\r
+                        *  finalize the transfer via the \ref Endpoint_ClearOUT() macro.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer,\r
+                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,\r
+                        *  discarding fully read packets from the host as needed. The device IN acknowledgement is not\r
+                        *  automatically sent after success or failure states; the user is responsible for manually sending the\r
+                        *  setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
+                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer,\r
+                                                               uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,\r
+                        *  discarding fully read packets from the host as needed. The device IN acknowledgement is not\r
+                        *  automatically sent after success or failure states; the user is responsible for manually sending the\r
+                        *  setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
+                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer,\r
+                                                               uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+                       //@}\r
+\r
+                       /** \name Stream functions for EEPROM source/destination data */\r
+                       //@{\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_EStream_LE(const void* const Buffer,\r
+                                                         uint16_t Length,\r
+                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE().\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_EStream_BE(const void* const Buffer,\r
+                                                         uint16_t Length,\r
+                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Read_Stream_LE().\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.\r
+                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_EStream_LE(void* const Buffer,\r
+                                                        uint16_t Length,\r
+                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Read_Stream_BE().\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.\r
+                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_EStream_BE(void* const Buffer,\r
+                                                        uint16_t Length,\r
+                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer,\r
+                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer,\r
+                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
+                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer,\r
+                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
+                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer,\r
+                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+                       //@}\r
+\r
+                       /** \name Stream functions for PROGMEM source/destination data */\r
+                       //@{\r
+\r
+                       /** FLASH buffer source version of \ref Endpoint_Write_Stream_LE().\r
+                        *\r
+                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_PStream_LE(const void* const Buffer,\r
+                                                         uint16_t Length,\r
+                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** FLASH buffer source version of \ref Endpoint_Write_Stream_BE().\r
+                        *\r
+                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
+                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_PStream_BE(const void* const Buffer,\r
+                                                         uint16_t Length,\r
+                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE().\r
+                        *\r
+                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer,\r
+                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().\r
+                        *\r
+                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
+                        *\r
+                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
+                        *        to clear the status stage when using this routine in a control transaction.\r
+                        *        \n\n\r
+                        *\r
+                        *  \note This routine should only be used on CONTROL type endpoints.\r
+                        *\r
+                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
+                        *           together; i.e. the entire stream data must be read or written at the one time.\r
+                        *\r
+                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
+                        *\r
+                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer,\r
+                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
+                       //@}\r
+\r
+       /* Disable C linkage for C++ Compilers: */\r
+               #if defined(__cplusplus)\r
+                       }\r
+               #endif\r
+               \r
+#endif\r
+\r
+/** @} */\r
+
diff --git a/LUFA/Drivers/USB/Core/Events.c b/LUFA/Drivers/USB/Core/Events.c
new file mode 100644 (file)
index 0000000..cd340fb
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_EVENTS_C
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "Events.h"
+
+void USB_Event_Stub(void)
+{
+
+}
+
diff --git a/LUFA/Drivers/USB/Core/Events.h b/LUFA/Drivers/USB/Core/Events.h
new file mode 100644 (file)
index 0000000..4a3a1a1
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB controller events manager.
+ *
+ *  This file contains macros and functions relating to the management of library events, which are small
+ *  pieces of code similar to ISRs which are run when a given condition is met. Each event can be fired from
+ *  multiple places in the user or library code, which may or may not be inside an ISR, thus each handler
+ *  should be written to be as small and fast as possible to prevent possible problems.
+ *
+ *  Events can be hooked by the user application by declaring a handler function with the same name and parameters
+ *  listed here. If an event with no user-associated handler is fired within the library, it by default maps to an
+ *  internal empty stub function.
+ *
+ *  Each event must only have one associated event handler, but can be raised by multiple sources by calling the
+ *  event handler function (with any required event parameters).
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_Events USB Events
+ *
+ *  This module contains macros and functions relating to the management of library events, which are small
+ *  pieces of code similar to ISRs which are run when a given condition is met. Each event can be fired from
+ *  multiple places in the user or library code, which may or may not be inside an ISR, thus each handler
+ *  should be written to be as small and fast as possible to prevent possible problems.
+ *
+ *  Events can be hooked by the user application by declaring a handler function with the same name and parameters
+ *  listed here. If an event with no user-associated handler is fired within the library, it by default maps to an
+ *  internal empty stub function.
+ *
+ *  Each event must only have one associated event handler, but can be raised by multiple sources by calling the
+ *  event handler function (with any required event parameters).
+ *
+ *  @{
+ */
+
+#ifndef __USBEVENTS_H__
+#define __USBEVENTS_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+               #include "USBMode.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Pseudo-Functions for Doxygen: */
+               #if !defined(__INCLUDE_FROM_EVENTS_C) || defined(__DOXYGEN__)
+                       /** Event for USB mode pin level change. This event fires when the USB interface is set to dual role
+                        *  mode, and the UID pin level has changed to indicate a new mode (device or host). This event fires
+                        *  before the mode is switched to the newly indicated mode but after the \ref EVENT_USB_Device_Disconnect
+                        *  event has fired (if connected before the role change).
+                        *
+                        *  \note This event only exists on microcontrollers that support dual role USB modes.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY tokens have been supplied
+                        *        to the compiler (see \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_UIDChange(void);
+
+                       /** Event for USB host error. This event fires when a hardware fault has occurred whilst the USB
+                        *  interface is in host mode.
+                        *
+                        *  \param[in] ErrorCode  Error code indicating the failure reason, a value in \ref USB_Host_ErrorCodes_t.
+                        *
+                        *  \note This event only exists on microcontrollers that supports USB host mode.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
+
+                       /** Event for USB device attachment. This event fires when a the USB interface is in host mode, and
+                        *  a USB device has been connected to the USB interface. This is interrupt driven, thus fires before
+                        *  the standard \ref EVENT_USB_Device_Connect() event and so can be used to programmatically start the USB
+                        *  management task to reduce CPU consumption.
+                        *
+                        *  \note This event only exists on microcontrollers that supports USB host mode.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        *
+                        *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
+                        */
+                       void EVENT_USB_Host_DeviceAttached(void);
+
+                       /** Event for USB device removal. This event fires when a the USB interface is in host mode, and
+                        *  a USB device has been removed the USB interface whether or not it has been enumerated. This
+                        *  can be used to programmatically stop the USB management task to reduce CPU consumption.
+                        *
+                        *  \note This event only exists on microcontrollers that supports USB host mode.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        *
+                        *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
+                        */
+                       void EVENT_USB_Host_DeviceUnattached(void);
+
+                       /** Event for USB device enumeration failure. This event fires when a the USB interface is
+                        *  in host mode, and an attached USB device has failed to enumerate completely.
+                        *
+                        *  \param[in] ErrorCode     Error code indicating the failure reason, a value in
+                        *                           \ref USB_Host_EnumerationErrorCodes_t.
+                        *
+                        *  \param[in] SubErrorCode  Sub error code indicating the reason for failure - for example, if the
+                        *                           ErrorCode parameter indicates a control error, this will give the error
+                        *                           code returned by the \ref USB_Host_SendControlRequest() function.
+                        *
+                        *  \note This event only exists on microcontrollers that supports USB host mode.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
+                                                                   const uint8_t SubErrorCode);
+
+                       /** Event for USB device enumeration completion. This event fires when a the USB interface is
+                        *  in host mode and an attached USB device has been completely enumerated and is ready to be
+                        *  controlled by the user application.
+                        *
+                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+                        *  1 second) when a transaction is waiting to be processed by the device will prevent break communications
+                        *  and cause the host to reset the USB bus.
+                        */
+                       void EVENT_USB_Host_DeviceEnumerationComplete(void);
+
+                       /** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
+                        *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate
+                        *  millisecond timer source when the USB bus is not suspended while in host mode.
+                        *
+                        *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly
+                        *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
+                        *
+                        *  \note This event is not normally active - it must be manually enabled and disabled via the
+                        *        \ref USB_Host_EnableSOFEvents() and \ref USB_Host_DisableSOFEvents() commands after enumeration of
+                        *        a USB device.
+                        *        \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_Host_StartOfFrame(void);
+
+                       /** Event for USB device connection. This event fires when the microcontroller is in USB Device mode
+                        *  and the device is connected to a USB host, beginning the enumeration process measured by a rising
+                        *  level on the microcontroller's VBUS sense pin.
+                        *
+                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+                        *  two seconds) will prevent the device from enumerating correctly.
+                        *
+                        *  \note For the smaller series 2 USB AVRs with limited USB controllers, VBUS is not available to the USB controller.
+                        *        this means that the current connection state is derived from the bus suspension and wake up events by default,
+                        *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
+                        *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
+                        *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
+                        *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
+                        *        \n\n
+                        *
+                        *  \note This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers
+                        *        if \c NO_LIMITED_CONTROLLER_CONNECT is not defined.
+                        *
+                        *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage.
+                        */
+                       void EVENT_USB_Device_Connect(void);
+
+                       /** Event for USB device disconnection. This event fires when the microcontroller is in USB Device mode and the device is
+                        *  disconnected from a host, measured by a falling level on the microcontroller's VBUS sense pin.
+                        *
+                        *  \note For the microcontrollers with limited USB controllers, VBUS sense is not available to the USB controller.
+                        *        this means that the current connection state is derived from the bus suspension and wake up events by default,
+                        *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
+                        *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
+                        *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
+                        *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
+                        *        \n\n
+                        *
+                        *  \note This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers
+                        *        if \c NO_LIMITED_CONTROLLER_CONNECT is not defined.
+                        *
+                        *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage.
+                        */
+                       void EVENT_USB_Device_Disconnect(void);
+
+                       /** Event for control requests. This event fires when a the USB host issues a control request
+                        *  to the mandatory device control endpoint (of address 0). This may either be a standard 
+                        *  request that the library may have a handler code for internally, or a class specific request
+                        *  issued to the device which must be handled appropriately. If a request is not processed in the
+                        *  user application via this event, it will be passed to the library for processing internally
+                        *  if a suitable handler exists.
+                        *
+                        *  This event is time-critical; each packet within the request transaction must be acknowledged or
+                        *  sent within 50ms or the host will abort the transfer.
+                        *
+                        *  The library internally handles all standard control requests with the exceptions of SYNC FRAME,
+                        *  SET DESCRIPTOR and SET INTERFACE. These and all other non-standard control requests will be left
+                        *  for the user to process via this event if desired. If not handled in the user application or by
+                        *  the library internally, unknown requests are automatically STALLed.
+                        *
+                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        *        \n\n
+                        *
+                        *  \note Requests should be handled in the same manner as described in the USB 2.0 Specification,
+                        *        or appropriate class specification. In all instances, the library has already read the
+                        *        request SETUP parameters into the \ref USB_ControlRequest structure which should then be used
+                        *        by the application to determine how to handle the issued request.
+                        */
+                       void EVENT_USB_Device_ControlRequest(void);
+
+                       /** Event for USB configuration number changed. This event fires when a the USB host changes the
+                        *  selected configuration number while in device mode. This event should be hooked in device
+                        *  applications to create the endpoints and configure the device for the selected configuration.
+                        *
+                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+                        *  one second) will prevent the device from enumerating correctly.
+                        *
+                        *  This event fires after the value of \ref USB_ConfigurationNumber has been changed.
+                        *
+                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_Device_ConfigurationChanged(void);
+
+                       /** Event for USB suspend. This event fires when a the USB host suspends the device by halting its
+                        *  transmission of Start Of Frame pulses to the device. This is generally hooked in order to move
+                        *  the device over to a low power state until the host wakes up the device. If the USB interface is
+                        *  enumerated with the \ref USB_OPT_AUTO_PLL option set, the library will automatically suspend the
+                        *  USB PLL before the event is fired to save power.
+                        *
+                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        *        \n\n
+                        *
+                        *  \note This event does not exist on the microcontrollers with limited USB VBUS sensing abilities
+                        *        when the \c NO_LIMITED_CONTROLLER_CONNECT compile time token is not set - see
+                        *        \ref EVENT_USB_Device_Disconnect.
+                        *
+                        *  \see \ref EVENT_USB_Device_WakeUp() event for accompanying Wake Up event.
+                        */
+                       void EVENT_USB_Device_Suspend(void);
+
+                       /** Event for USB wake up. This event fires when a the USB interface is suspended while in device
+                        *  mode, and the host wakes up the device by supplying Start Of Frame pulses. This is generally
+                        *  hooked to pull the user application out of a low power state and back into normal operating
+                        *  mode. If the USB interface is enumerated with the \ref USB_OPT_AUTO_PLL option set, the library
+                        *  will automatically restart the USB PLL before the event is fired.
+                        *
+                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        *        \n\n
+                        *
+                        *  \note This event does not exist on the microcontrollers with limited USB VBUS sensing abilities
+                        *        when the \c NO_LIMITED_CONTROLLER_CONNECT compile time token is not set - see
+                        *        \ref EVENT_USB_Device_Disconnect.
+                        *
+                        *  \see \ref EVENT_USB_Device_Suspend() event for accompanying Suspend event.
+                        */
+                       void EVENT_USB_Device_WakeUp(void);
+
+                       /** Event for USB interface reset. This event fires when the USB interface is in device mode, and
+                        *  a the USB host requests that the device reset its interface. This event fires after the control
+                        *  endpoint has been automatically configured by the library.
+                        *
+                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+                        *  two seconds) will prevent the device from enumerating correctly.
+                        *
+                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_Device_Reset(void);
+
+                       /** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
+                        *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate
+                        *  millisecond timer source when the USB bus is enumerated in device mode to a USB host.
+                        *
+                        *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly
+                        *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
+                        *
+                        *  \pre This event is not normally active - it must be manually enabled and disabled via the
+                        *       \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration.
+                        *       \n\n
+                        *
+                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+                        *        \ref Group_USBManagement documentation).
+                        */
+                       void EVENT_USB_Device_StartOfFrame(void);
+               #endif
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Function Prototypes: */
+                       #if defined(__INCLUDE_FROM_EVENTS_C)
+                               void USB_Event_Stub(void) ATTR_CONST;
+
+                               #if defined(USB_CAN_BE_BOTH)
+                                       void EVENT_USB_UIDChange(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                               #endif
+
+                               #if defined(USB_CAN_BE_HOST)
+                                       void EVENT_USB_Host_HostError(const uint8_t ErrorCode) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Host_DeviceAttached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Host_DeviceUnattached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Host_DeviceEnumerationComplete(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
+                                                                const uint8_t SubErrorCode)
+                                                                                   ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Host_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                               #endif
+
+                               #if defined(USB_CAN_BE_DEVICE)
+                                       void EVENT_USB_Device_Connect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_Disconnect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_ControlRequest(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_ConfigurationChanged(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_Suspend(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_WakeUp(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_Reset(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                                       void EVENT_USB_Device_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+                               #endif
+                       #endif
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Host.h b/LUFA/Drivers/USB/Core/Host.h
new file mode 100644 (file)
index 0000000..8a6ac43
--- /dev/null
@@ -0,0 +1,68 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB host mode definitions.\r
+ *\r
+ *  USB Host mode related macros and enums. This module contains macros and enums which are used when\r
+ *  the USB controller is initialized in host mode.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_USB\r
+ *  \defgroup Group_Host Host Management\r
+ *\r
+ *  USB Host mode related macros and enums. This module contains macros and enums which are used when\r
+ *  the USB controller is initialized in host mode.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __USBHOST_H__\r
+#define __USBHOST_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/Host.h"\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r
diff --git a/LUFA/Drivers/USB/Core/HostStandardReq.c b/LUFA/Drivers/USB/Core/HostStandardReq.c
new file mode 100644 (file)
index 0000000..16d0ffb
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_HOSTSTDREQ_C
+#include "HostStandardReq.h"
+
+uint8_t USB_Host_SendControlRequest(void* const BufferPtr)
+{
+       uint8_t* HeaderStream   = (uint8_t*)&USB_ControlRequest;
+       uint8_t* DataStream     = (uint8_t*)BufferPtr;
+       bool     BusSuspended   = USB_Host_IsBusSuspended();
+       uint8_t  ReturnStatus   = HOST_SENDCONTROL_Successful;
+       uint16_t DataLen        = USB_ControlRequest.wLength;
+
+       USB_Host_ResumeBus();
+
+       if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+         goto End_Of_Control_Send;
+
+       Pipe_SetPipeToken(PIPE_TOKEN_SETUP);
+       Pipe_ClearErrorFlags();
+
+       Pipe_Unfreeze();
+
+       for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Request_Header_t); HeaderByte++)
+         Pipe_Write_Byte(*(HeaderStream++));
+
+       Pipe_ClearSETUP();
+
+       if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful)
+         goto End_Of_Control_Send;
+
+       Pipe_Freeze();
+
+       if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+         goto End_Of_Control_Send;
+
+       if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
+       {
+               Pipe_SetPipeToken(PIPE_TOKEN_IN);
+
+               if (DataStream != NULL)
+               {
+                       while (DataLen)
+                       {
+                               Pipe_Unfreeze();
+
+                               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
+                                 goto End_Of_Control_Send;
+
+                               if (!(Pipe_BytesInPipe()))
+                                 DataLen = 0;
+
+                               while (Pipe_BytesInPipe() && DataLen)
+                               {
+                                       *(DataStream++) = Pipe_Read_Byte();
+                                       DataLen--;
+                               }
+
+                               Pipe_Freeze();
+                               Pipe_ClearIN();
+                       }
+               }
+
+               Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+               Pipe_Unfreeze();
+
+               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+                 goto End_Of_Control_Send;
+
+               Pipe_ClearOUT();
+
+               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+                 goto End_Of_Control_Send;
+       }
+       else
+       {
+               if (DataStream != NULL)
+               {
+                       Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+                       Pipe_Unfreeze();
+
+                       while (DataLen)
+                       {
+                               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+                                 goto End_Of_Control_Send;
+
+                               while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize))
+                               {
+                                       Pipe_Write_Byte(*(DataStream++));
+                                       DataLen--;
+                               }
+
+                               Pipe_ClearOUT();
+                       }
+
+                       if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+                         goto End_Of_Control_Send;
+
+                       Pipe_Freeze();
+               }
+
+               Pipe_SetPipeToken(PIPE_TOKEN_IN);
+               Pipe_Unfreeze();
+
+               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
+                 goto End_Of_Control_Send;
+
+               Pipe_ClearIN();
+       }
+
+End_Of_Control_Send:
+       Pipe_Freeze();
+
+       if (BusSuspended)
+         USB_Host_SuspendBus();
+
+       Pipe_ResetPipe(PIPE_CONTROLPIPE);
+
+       return ReturnStatus;
+}
+
+static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType)
+{
+       #if (USB_HOST_TIMEOUT_MS < 0xFF)
+       uint8_t  TimeoutCounter = USB_HOST_TIMEOUT_MS;
+       #else
+       uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
+       #endif
+
+       while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())  ||
+                ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
+                ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady())))
+       {
+               uint8_t ErrorCode;
+
+               if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+                 return ErrorCode;
+
+               if (!(TimeoutCounter--))
+                 return HOST_SENDCONTROL_SoftwareTimeOut;
+       }
+
+       return HOST_SENDCONTROL_Successful;
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/HostStandardReq.h b/LUFA/Drivers/USB/Core/HostStandardReq.h
new file mode 100644 (file)
index 0000000..4682222
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB host standard request management.
+ *
+ *  This file contains the function prototypes necessary for the issuing of outgoing standard control requests
+ *  when the library is in USB host mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __HOSTSTDREQ_H__
+#define __HOSTSTDREQ_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+               #include "USBMode.h"
+               #include "StdRequestType.h"
+               #include "USBController.h"
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Enums: */
+                       /** Enum for the \ref USB_Host_SendControlRequest() return code, indicating the reason for the error
+                        *  if the transfer of the request is unsuccessful.
+                        *
+                        *  \ingroup Group_PipeControlReq
+                        */
+                       enum USB_Host_SendControlErrorCodes_t
+                       {
+                               HOST_SENDCONTROL_Successful         = 0, /**< No error occurred in the request transfer. */
+                               HOST_SENDCONTROL_DeviceDisconnected = 1, /**< The attached device was disconnected during the
+                                                                       *   request transfer.
+                                                                       */
+                               HOST_SENDCONTROL_PipeError          = 2, /**< An error occurred in the pipe while sending the request. */
+                               HOST_SENDCONTROL_SetupStalled       = 3, /**< The attached device stalled the request, usually
+                                                                       *   indicating that the request is unsupported on the device.
+                                                                       */
+                               HOST_SENDCONTROL_SoftwareTimeOut    = 4, /**< The request or data transfer timed out. */
+                       };
+
+               /* Function Prototypes: */
+                       /** Sends the request stored in the \ref USB_ControlRequest global structure to the attached device,
+                        *  and transfers the data stored in the buffer to the device, or from the device to the buffer
+                        *  as requested. The transfer is made on the currently selected pipe.
+                        *
+                        *  \ingroup Group_PipeControlReq
+                        *
+                        *  \param[in] BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or
+                        *                        \c NULL if the request transfers no data to or from the device.
+                        *
+                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+                        */
+                       uint8_t USB_Host_SendControlRequest(void* const BufferPtr);
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Enums: */
+                       enum USB_WaitForTypes_t
+                       {
+                               USB_HOST_WAITFOR_SetupSent,
+                               USB_HOST_WAITFOR_InReceived,
+                               USB_HOST_WAITFOR_OutReady,
+                       };
+
+               /* Function Prototypes: */
+                       #if defined(__INCLUDE_FROM_HOSTSTDREQ_C)
+                               static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType);
+                       #endif
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/OTG.h b/LUFA/Drivers/USB/Core/OTG.h
new file mode 100644 (file)
index 0000000..3b41a0f
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB OTG mode definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to USB OTG mode, where two USB devices\r
+ *  may be linked directly together and exchange host/device roles as needed.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_USB\r
+ *  \defgroup Group_OTG USB On The Go (OTG) Management\r
+ *\r
+ *  This module contains macros for embedded USB hosts with dual role On The Go capabilities, for managing role\r
+ *  exchange. OTG is a way for two USB dual role devices to talk to one another directly without fixed device/host\r
+ *  roles.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __USBOTG_H__\r
+#define __USBOTG_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/OTG.h"\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r
diff --git a/LUFA/Drivers/USB/Core/Pipe.h b/LUFA/Drivers/USB/Core/Pipe.h
new file mode 100644 (file)
index 0000000..2ab14fc
--- /dev/null
@@ -0,0 +1,97 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB host pipe management definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to the management of the device's\r
+ *  data pipes when the library is initialized in USB host mode.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_PipeManagement\r
+ *  \defgroup Group_PipeRW Pipe Data Reading and Writing\r
+ *\r
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.\r
+ */\r
+\r
+/** \ingroup Group_PipeRW\r
+ *  \defgroup Group_PipePrimitiveRW Read/Write of Primitive Data Types\r
+ *\r
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types\r
+ *  from and to pipes.\r
+ */\r
+\r
+/** \ingroup Group_PipeManagement\r
+ *  \defgroup Group_PipePacketManagement Pipe Packet Management\r
+ *\r
+ *  Functions, macros, variables, enums and types related to packet management of pipes.\r
+ */\r
+\r
+/** \ingroup Group_PipeManagement\r
+ *  \defgroup Group_PipeControlReq Pipe Control Request Management\r
+ *\r
+ *  Module for host mode request processing. This module allows for the transmission of standard, class and\r
+ *  vendor control requests to the default control endpoint of an attached device while in host mode.\r
+ *\r
+ *  \see Chapter 9 of the USB 2.0 specification.\r
+ */\r
+\r
+/** \ingroup Group_USB\r
+ *  \defgroup Group_PipeManagement Pipe Management\r
+ *\r
+ *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This\r
+ *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions\r
+ *  for various data types.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __PIPE_H__\r
+#define __PIPE_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/Pipe.h"\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r
diff --git a/LUFA/Drivers/USB/Core/PipeStream.c b/LUFA/Drivers/USB/Core/PipeStream.c
new file mode 100644 (file)
index 0000000..4465471
--- /dev/null
@@ -0,0 +1,216 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+              \r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+#define  __INCLUDE_FROM_USB_DRIVER\r
+#include "USBMode.h"\r
+\r
+#if defined(USB_CAN_BE_HOST)\r
+\r
+#include "PipeStream.h"\r
+\r
+uint8_t Pipe_Discard_Stream(uint16_t Length,\r
+                            uint16_t* const BytesProcessed)\r
+{\r
+       uint8_t  ErrorCode;\r
+       uint16_t BytesInTransfer = 0;\r
+       \r
+       Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+\r
+       if ((ErrorCode = Pipe_WaitUntilReady()))\r
+         return ErrorCode;\r
+\r
+       if (BytesProcessed != NULL)\r
+         Length -= *BytesProcessed;\r
+\r
+       while (Length)\r
+       {\r
+               if (!(Pipe_IsReadWriteAllowed()))\r
+               {\r
+                       Pipe_ClearIN();\r
+                               \r
+                       if (BytesProcessed != NULL)\r
+                       {\r
+                               *BytesProcessed += BytesInTransfer;\r
+                               return PIPE_RWSTREAM_IncompleteTransfer;\r
+                       }\r
+\r
+                       if ((ErrorCode = Pipe_WaitUntilReady()))\r
+                         return ErrorCode;\r
+               }\r
+               else\r
+               {\r
+                       Pipe_Discard_Byte();\r
+                       \r
+                       Length--;\r
+                       BytesInTransfer++;\r
+               }\r
+       }\r
+\r
+       return PIPE_RWSTREAM_NoError;\r
+}\r
+\r
+uint8_t Pipe_Null_Stream(uint16_t Length,\r
+                         uint16_t* const BytesProcessed)\r
+{\r
+       uint8_t  ErrorCode;\r
+       uint16_t BytesInTransfer = 0;\r
+       \r
+       Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
+\r
+       if ((ErrorCode = Pipe_WaitUntilReady()))\r
+         return ErrorCode;\r
+\r
+       if (BytesProcessed != NULL)\r
+         Length -= *BytesProcessed;\r
+\r
+       while (Length)\r
+       {\r
+               if (!(Pipe_IsReadWriteAllowed()))\r
+               {\r
+                       Pipe_ClearOUT();\r
+                               \r
+                       if (BytesProcessed != NULL)\r
+                       {\r
+                               *BytesProcessed += BytesInTransfer;\r
+                               return PIPE_RWSTREAM_IncompleteTransfer;\r
+                       }\r
+                       \r
+                       USB_USBTask();\r
+\r
+                       if ((ErrorCode = Pipe_WaitUntilReady()))\r
+                         return ErrorCode;\r
+               }\r
+               else\r
+               {\r
+                       Pipe_Write_Byte(0);\r
+                       \r
+                       Length--;\r
+                       BytesInTransfer++;\r
+               }\r
+       }\r
+\r
+       return PIPE_RWSTREAM_NoError;\r
+}\r
+\r
+/* The following abuses the C preprocessor in order to copy-past common code with slight alterations,\r
+ * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*BufferPtr)\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte(BufferPtr))\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte(BufferPtr))\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*BufferPtr)\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte(BufferPtr))\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      const void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte(BufferPtr))\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_Byte()\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_LE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_Byte())\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_Byte()\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_BE\r
+#define  TEMPLATE_BUFFER_TYPE                      void*\r
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_Byte())\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#endif\r
+
diff --git a/LUFA/Drivers/USB/Core/PipeStream.h b/LUFA/Drivers/USB/Core/PipeStream.h
new file mode 100644 (file)
index 0000000..86c544e
--- /dev/null
@@ -0,0 +1,461 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+              \r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
\r
+/** \file\r
+ *  \brief USB host pipe stream function definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to the sending and receiving of\r
+ *  arbitrary data streams through the device's data pipes when the library is initialized in USB host mode.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_PipeRW  \r
+ *  \defgroup Group_PipeStreamRW Read/Write of Multi-Byte Streams\r
+ *\r
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from\r
+ *  and to pipes.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __PIPE_STREAM_H__\r
+#define __PIPE_STREAM_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+               #include "USBTask.h"\r
+               \r
+       /* Enable C linkage for C++ Compilers: */\r
+               #if defined(__cplusplus)\r
+                       extern "C" {\r
+               #endif\r
+\r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+               \r
+       /* Public Interface - May be used in end-application: */\r
+               /* Enums: */\r
+                       /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */\r
+                       enum Pipe_Stream_RW_ErrorCodes_t\r
+                       {\r
+                               PIPE_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
+                               PIPE_RWSTREAM_PipeStalled        = 1, /**< The device stalled the pipe during the transfer. */          \r
+                               PIPE_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during\r
+                                                                  *   the transfer.\r
+                                                                  */           \r
+                               PIPE_RWSTREAM_Timeout            = 3, /**< The device failed to accept or send the next packet\r
+                                                                      *   within the software timeout period set by the\r
+                                                                      *   \ref USB_STREAM_TIMEOUT_MS macro.\r
+                                                                      */\r
+                               PIPE_RWSTREAM_IncompleteTransfer = 4, /**< Indicates that the pipe bank became full/empty before the\r
+                                                                      *   complete contents of the stream could be transferred.\r
+                                                                      */\r
+                       };\r
+\r
+               /* Function Prototypes: */\r
+\r
+                       /** \name Stream functions for null data */\r
+                       //@{\r
+\r
+                       /** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host\r
+                        *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the\r
+                        *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or\r
+                        *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer\r
+                        *  will instead be performed as a series of chunks. Each time the pipe bank becomes empty while there is still data\r
+                        *  to process (and after the current packet has been acknowledged) the BytesProcessed location will be updated with\r
+                        *  the total number of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to\r
+                        *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed\r
+                        *  value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Pipe_Discard_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Pipe_Discard_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
+                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
+                        *\r
+                        *  \param[in] Length          Number of bytes to discard via the currently selected pipe.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be processed at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Discard_Stream(uint16_t Length,\r
+                                                   uint16_t* const BytesProcessed);\r
+\r
+                       /** Writes a given number of zeroed bytes to the pipe, sending full pipe packets from the host to the device\r
+                        *  as needed. The last packet is not automatically sent once the remaining bytes has been written; the\r
+                        *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearOUT() macro.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or\r
+                        *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer\r
+                        *  will instead be performed as a series of chunks. Each time the pipe bank becomes full while there is still data\r
+                        *  to process (and after the current packet transmission has been initiated) the BytesProcessed location will be\r
+                        *  updated with the total number of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to\r
+                        *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed\r
+                        *  value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Pipe_Null_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Pipe_Null_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
+                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
+                        *\r
+                        *  \param[in] Length          Number of zero bytes to write via the currently selected pipe.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be processed at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Null_Stream(uint16_t Length,\r
+                                                uint16_t* const BytesProcessed);\r
+\r
+                       //@}\r
+\r
+                       /** \name Stream functions for RAM source/destination data */\r
+                       //@{\r
+                       \r
+                       /** Writes the given number of bytes to the pipe from the given buffer in little endian,\r
+                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
+                        *  the user is responsible for manually sending the last written packet to the host via the\r
+                        *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is\r
+                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
+                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
+                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
+                        *  the pipe bank becomes full while there is still data to process (and after the current\r
+                        *  packet transmission has been initiated) the BytesProcessed location will be updated with the\r
+                        *  total number of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
+                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
+                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t DataStream[512];\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                        NULL)) != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  DataStream[512];\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                           &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
+                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Write_Stream_LE(const void* const Buffer,\r
+                                                    uint16_t Length,\r
+                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Writes the given number of bytes to the pipe from the given buffer in big endian,\r
+                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
+                        *  the user is responsible for manually sending the last written packet to the host via the\r
+                        *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is\r
+                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
+                        *\r
+                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
+                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Write_Stream_BE(const void* const Buffer,\r
+                                                    uint16_t Length,\r
+                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Reads the given number of bytes from the pipe into the given buffer in little endian,\r
+                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
+                        *  the user is responsible for manually sending the last written packet to the host via the\r
+                        *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is\r
+                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
+                        *\r
+                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
+                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
+                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
+                        *  the pipe bank becomes empty while there is still data to process (and after the current\r
+                        *  packet has been acknowledged) the BytesProcessed location will be updated with the total number\r
+                        *  of bytes processed in the stream, and the function will exit with an error code of\r
+                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
+                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
+                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
+                        *\r
+                        *  <b>Single Stream Transfer Example:</b>\r
+                        *  \code\r
+                        *  uint8_t DataStream[512];\r
+                        *  uint8_t ErrorCode;\r
+                        *\r
+                        *  if ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                       NULL)) != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *       // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  <b>Partial Stream Transfers Example:</b>\r
+                        *  \code\r
+                        *  uint8_t  DataStream[512];\r
+                        *  uint8_t  ErrorCode;\r
+                        *  uint16_t BytesProcessed;\r
+                        *\r
+                        *  BytesProcessed = 0;\r
+                        *  while ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),\r
+                        *                                          &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
+                        *  {\r
+                        *      // Stream not yet complete - do other actions here, abort if required\r
+                        *  }\r
+                        *\r
+                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
+                        *  {\r
+                        *      // Stream failed to complete - check ErrorCode here\r
+                        *  }\r
+                        *  \endcode\r
+                        *\r
+                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
+                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
+                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                              updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Read_Stream_LE(void* const Buffer,\r
+                                                   uint16_t Length,\r
+                                                   uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** Reads the given number of bytes from the pipe into the given buffer in big endian,\r
+                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
+                        *  the user is responsible for manually sending the last written packet to the host via the\r
+                        *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is\r
+                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
+                        *\r
+                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
+                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
+                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                              updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Read_Stream_BE(void* const Buffer,\r
+                                                   uint16_t Length,\r
+                                                   uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       //@}\r
+\r
+                       /** \name Stream functions for EEPROM source/destination data */\r
+                       //@{\r
+                       \r
+                       /** EEPROM buffer source version of \ref Pipe_Write_Stream_LE().\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Write_EStream_LE(const void* const Buffer,\r
+                                                     uint16_t Length,\r
+                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       \r
+                       /** EEPROM buffer source version of \ref Pipe_Write_Stream_BE().\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Write_EStream_BE(const void* const Buffer,\r
+                                                     uint16_t Length,\r
+                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+\r
+                       /** EEPROM buffer source version of \ref Pipe_Read_Stream_LE().\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
+                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                              updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Read_EStream_LE(void* const Buffer,\r
+                                                    uint16_t Length,\r
+                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       \r
+                       /** EEPROM buffer source version of \ref Pipe_Read_Stream_BE().\r
+                        *\r
+                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
+                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
+                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                              updated, \c NULL if the entire stream should be read at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Read_EStream_BE(void* const Buffer,\r
+                                                    uint16_t Length,\r
+                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       //@}\r
+\r
+                       /** \name Stream functions for PROGMEM source/destination data */\r
+                       //@{\r
+                       \r
+                       /** FLASH buffer source version of \ref Pipe_Write_Stream_LE().\r
+                        *\r
+                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Write_PStream_LE(const void* const Buffer,\r
+                                                     uint16_t Length,\r
+                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       \r
+                       /** FLASH buffer source version of \ref Pipe_Write_Stream_BE().\r
+                        *\r
+                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
+                        *\r
+                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
+                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
+                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
+                        *                             updated, \c NULL if the entire stream should be written at once.\r
+                        *\r
+                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
+                        */\r
+                       uint8_t Pipe_Write_PStream_BE(const void* const Buffer,\r
+                                                     uint16_t Length,\r
+                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
+                       //@}\r
+\r
+       /* Disable C linkage for C++ Compilers: */\r
+               #if defined(__cplusplus)\r
+                       }\r
+               #endif\r
+       \r
+#endif\r
+\r
+/** @} */\r
+
diff --git a/LUFA/Drivers/USB/Core/StdDescriptors.h b/LUFA/Drivers/USB/Core/StdDescriptors.h
new file mode 100644 (file)
index 0000000..ed4ecf9
--- /dev/null
@@ -0,0 +1,669 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB standard descriptor definitions.
+ *
+ *  This file contains structures and macros for the easy creation of standard USB descriptors in USB device projects.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_Descriptors USB Descriptors
+ *
+ *  Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains
+ *  structures and macros for the easy creation of standard USB descriptors in USB device projects.
+ *
+ *  @{
+ */
+
+#ifndef __USBDESCRIPTORS_H__
+#define __USBDESCRIPTORS_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+               #include "USBMode.h"
+               #include "Events.h"
+
+               #if defined(USB_CAN_BE_DEVICE)
+                       #include "Device.h"
+               #endif
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** Indicates that a given descriptor does not exist in the device. This can be used inside descriptors
+                        *  for string descriptor indexes, or may be use as a return value for GetDescriptor when the specified
+                        *  descriptor does not exist.
+                        */
+                       #define NO_DESCRIPTOR                     0
+
+                       /** Macro to calculate the power value for the configuration descriptor, from a given number of milliamperes. */
+                       #define USB_CONFIG_POWER_MA(mA)           ((mA) >> 1)
+
+                       /** Macro to calculate the Unicode length of a string with a given number of Unicode characters.
+                        *  Should be used in string descriptor's headers for giving the string descriptor's byte length.
+                        */
+                       #define USB_STRING_LEN(str)               (sizeof(USB_Descriptor_Header_t) + ((str) << 1))
+
+                       /** Macro to encode a given four digit floating point version number (e.g. 01.23) into Binary Coded
+                        *  Decimal format for descriptor fields requiring BCD encoding, such as the USB version number in the
+                        *  standard device descriptor.
+                        */
+                       #define VERSION_BCD(x)                    ((((VERSION_TENS(x) << 4) | VERSION_ONES(x)) << 8) | \
+                                                                 ((VERSION_TENTHS(x) << 4) | VERSION_HUNDREDTHS(x)))
+
+                       /** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors
+                        *  to indicate that the English language is supported by the device in its string descriptors.
+                        */
+                       #define LANGUAGE_ID_ENG                   0x0409
+
+                       /** \name Endpoint Address Direction Masks */
+                       //@{
+                       /** Can be masked with an endpoint address for a \ref USB_Descriptor_Endpoint_t endpoint descriptor's
+                        *  EndpointAddress value to indicate to the host that the endpoint is of the IN direction (i.e, from
+                        *  device to host).
+                        */
+                       #define ENDPOINT_DESCRIPTOR_DIR_IN        0x80
+
+                       /** Can be masked with an endpoint address for a \ref USB_Descriptor_Endpoint_t endpoint descriptor's
+                        *  EndpointAddress value to indicate to the host that the endpoint is of the OUT direction (i.e, from
+                        *  host to device).
+                        */
+                       #define ENDPOINT_DESCRIPTOR_DIR_OUT       0x00
+                       //@}
+
+                       /** \name USB Configuration Descriptor Attribute Masks */
+                       //@{
+                       /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
+                        *  descriptor's ConfigAttributes value to indicate that the specified configuration can draw its power
+                        *  from the host's VBUS line.
+                        */
+                       #define USB_CONFIG_ATTR_BUSPOWERED        0x80
+
+                       /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
+                        *  descriptor's ConfigAttributes value to indicate that the specified configuration can draw its power
+                        *  from the device's own power source.
+                        */
+                       #define USB_CONFIG_ATTR_SELFPOWERED       0x40
+
+                       /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
+                        *  descriptor's ConfigAttributes value to indicate that the specified configuration supports the
+                        *  remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon
+                        *  request.
+                        */
+                       #define USB_CONFIG_ATTR_REMOTEWAKEUP      0x20
+                       //@}
+                       
+                       /** \name Endpoint Descriptor Attribute Masks */
+                       //@{
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is not synchronized.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint attributes.
+                        */
+                       #define ENDPOINT_ATTR_NO_SYNC             (0 << 2)
+
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is asynchronous.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint attributes.
+                        */
+                       #define ENDPOINT_ATTR_ASYNC               (1 << 2)
+
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is adaptive.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint attributes.
+                        */
+                       #define ENDPOINT_ATTR_ADAPTIVE            (2 << 2)
+
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is synchronized.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint attributes.
+                        */
+                       #define ENDPOINT_ATTR_SYNC                (3 << 2)
+                       //@}
+                       
+                       /** \name Endpoint Descriptor Usage Masks */
+                       //@{
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is used for data transfers.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint usage attributes.
+                        */
+                       #define ENDPOINT_USAGE_DATA               (0 << 4)
+
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is used for feedback.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint usage attributes.
+                        */
+                       #define ENDPOINT_USAGE_FEEDBACK           (1 << 4)
+
+                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+                        *  Attributes value to indicate that the specified endpoint is used for implicit feedback.
+                        *
+                        *  \see The USB specification for more details on the possible Endpoint usage attributes.
+                        */
+                       #define ENDPOINT_USAGE_IMPLICIT_FEEDBACK  (2 << 4)
+                       //@}
+                       
+               /* Enums: */
+                       /** Enum for the possible standard descriptor types, as given in each descriptor's header. */
+                       enum USB_DescriptorTypes_t
+                       {
+                               DTYPE_Device                    = 0x01, /**< Indicates that the descriptor is a device descriptor. */
+                               DTYPE_Configuration             = 0x02, /**< Indicates that the descriptor is a configuration descriptor. */
+                               DTYPE_String                    = 0x03, /**< Indicates that the descriptor is a string descriptor. */
+                               DTYPE_Interface                 = 0x04, /**< Indicates that the descriptor is an interface descriptor. */
+                               DTYPE_Endpoint                  = 0x05, /**< Indicates that the descriptor is an endpoint descriptor. */
+                               DTYPE_DeviceQualifier           = 0x06, /**< Indicates that the descriptor is a device qualifier descriptor. */
+                               DTYPE_Other                     = 0x07, /**< Indicates that the descriptor is of other type. */
+                               DTYPE_InterfacePower            = 0x08, /**< Indicates that the descriptor is an interface power descriptor. */
+                               DTYPE_InterfaceAssociation      = 0x0B, /**< Indicates that the descriptor is an interface association descriptor. */
+                               DTYPE_CSInterface               = 0x24, /**< Indicates that the descriptor is a class specific interface descriptor. */
+                               DTYPE_CSEndpoint                = 0x25, /**< Indicates that the descriptor is a class specific endpoint descriptor. */
+                       };
+
+                       /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors. */
+                       enum USB_Descriptor_ClassSubclassProtocol_t
+                       {
+                               USB_CSCP_NoDeviceClass          = 0x00, /**< Descriptor Class value indicating that the device does not belong
+                                                                        *   to a particular class at the device level.
+                                                                        */
+                               USB_CSCP_NoDeviceSubclass       = 0x00, /**< Descriptor Subclass value indicating that the device does not belong
+                                                                        *   to a particular subclass at the device level.
+                                                                        */
+                               USB_CSCP_NoDeviceProtocol       = 0x00, /**< Descriptor Protocol value indicating that the device does not belong
+                                                                        *   to a particular protocol at the device level.
+                                                                        */
+                               USB_CSCP_VendorSpecificClass    = 0xFF, /**< Descriptor Class value indicating that the device/interface belongs
+                                                                        *   to a vendor specific class.
+                                                                        */
+                               USB_CSCP_VendorSpecificSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device/interface belongs
+                                                                        *   to a vendor specific subclass.
+                                                                        */
+                               USB_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device/interface belongs
+                                                                        *   to a vendor specific protocol.
+                                                                        */
+                               USB_CSCP_IADDeviceClass         = 0xEF, /**< Descriptor Class value indicating that the device belongs to the
+                                                                        *   Interface Association Descriptor class.
+                                                                        */
+                               USB_CSCP_IADDeviceSubclass      = 0x02, /**< Descriptor Subclass value indicating that the device belongs to the
+                                                                        *   Interface Association Descriptor subclass.
+                                                                        */
+                               USB_CSCP_IADDeviceProtocol      = 0x01, /**< Descriptor Protocol value indicating that the device belongs to the
+                                                                        *   Interface Association Descriptor protocol.
+                                                                        */
+                       };
+
+               /* Type Defines: */
+                       /** \brief Standard USB Descriptor Header (LUFA naming conventions).
+                        *
+             *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure
+                        *  uses LUFA-specific element names to make each element's purpose clearer.
+                        *
+                        *  \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t Size; /**< Size of the descriptor, in bytes. */
+                               uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+                                              *   given by the specific class.
+                                              */
+                       } USB_Descriptor_Header_t;
+
+                       /** \brief Standard USB Descriptor Header (USB-IF naming conventions).
+                        *
+                        *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure
+                        *  uses the relevant standard's given element names to ensure compatibility with the standard.
+                        *
+                        *  \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+                                                         *   given by the specific class.
+                                                         */
+                       } USB_StdDescriptor_Header_t;
+
+                       /** \brief Standard USB Device Descriptor (LUFA naming conventions).
+                        *
+                        *  Type define for a standard Device Descriptor. This structure uses LUFA-specific element names to make each
+                        *  element's purpose clearer.
+                        *
+                        *  \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+                               uint16_t USBSpecification; /**< BCD of the supported USB specification. */
+                               uint8_t  Class; /**< USB device class. */
+                               uint8_t  SubClass; /**< USB device subclass. */
+                               uint8_t  Protocol; /**< USB device protocol. */
+
+                               uint8_t  Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */
+
+                               uint16_t VendorID; /**< Vendor ID for the USB product. */
+                               uint16_t ProductID; /**< Unique product ID for the USB product. */
+                               uint16_t ReleaseNumber; /**< Product release (version) number. */
+
+                               uint8_t  ManufacturerStrIndex; /**< String index for the manufacturer's name. The
+                                                               *   host will request this string via a separate
+                                                               *   control request for the string descriptor.
+                                                               *
+                                                               *   \note If no string supplied, use \ref NO_DESCRIPTOR.
+                                                               */
+                               uint8_t  ProductStrIndex; /**< String index for the product name/details.
+                                                          *
+                                                          *  \see ManufacturerStrIndex structure entry.
+                                                          */
+                               uint8_t  SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal
+                                                            *   serial number, in uppercase Unicode ASCII.
+                                                            *
+                                                            *  \note On some AVR models, there is an embedded serial number
+                                                            *        in the chip which can be used for the device serial number.
+                                                            *        To use this serial number, set this to USE_INTERNAL_SERIAL.
+                                                            *        On unsupported devices, this will evaluate to 0 and will cause
+                                                            *        the host to generate a pseudo-unique value for the device upon
+                                                            *        insertion.
+                                                            *
+                                                            *  \see ManufacturerStrIndex structure entry.
+                                                            */
+                               uint8_t  NumberOfConfigurations; /**< Total number of configurations supported by
+                                                                 *   the device.
+                                                                 */
+                       } USB_Descriptor_Device_t;
+
+                       /** \brief Standard USB Device Descriptor (USB-IF naming conventions).
+                        *
+                        *  Type define for a standard Device Descriptor. This structure uses the relevant standard's given element names
+                        *  to ensure compatibility with the standard.
+                        *
+                        *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+                                                             *   given by the specific class.
+                                                             */
+                               uint16_t bcdUSB; /**< BCD of the supported USB specification. */
+                               uint8_t  bDeviceClass; /**< USB device class. */
+                               uint8_t  bDeviceSubClass; /**< USB device subclass. */
+                               uint8_t  bDeviceProtocol; /**< USB device protocol. */
+                               uint8_t  bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */
+                               uint16_t idVendor; /**< Vendor ID for the USB product. */
+                               uint16_t idProduct; /**< Unique product ID for the USB product. */
+                               uint16_t bcdDevice; /**< Product release (version) number. */
+                               uint8_t  iManufacturer; /**< String index for the manufacturer's name. The
+                                                        *   host will request this string via a separate
+                                                        *   control request for the string descriptor.
+                                                        *
+                                                        *   \note If no string supplied, use \ref NO_DESCRIPTOR.
+                                                        */
+                               uint8_t  iProduct; /**< String index for the product name/details.
+                                                   *
+                                                   *  \see ManufacturerStrIndex structure entry.
+                                                   */
+                               uint8_t iSerialNumber; /**< String index for the product's globally unique hexadecimal
+                                                       *   serial number, in uppercase Unicode ASCII.
+                                                       *
+                                                       *  \note On some AVR models, there is an embedded serial number
+                                                       *        in the chip which can be used for the device serial number.
+                                                       *        To use this serial number, set this to USE_INTERNAL_SERIAL.
+                                                       *        On unsupported devices, this will evaluate to 0 and will cause
+                                                       *        the host to generate a pseudo-unique value for the device upon
+                                                       *        insertion.
+                                                       *
+                                                       *  \see ManufacturerStrIndex structure entry.
+                                                       */
+                               uint8_t  bNumConfigurations; /**< Total number of configurations supported by
+                                                             *   the device.
+                                                             */
+                       } USB_StdDescriptor_Device_t;
+
+                       /** \brief Standard USB Configuration Descriptor (LUFA naming conventions).
+                        *
+                        *  Type define for a standard Configuration Descriptor header. This structure uses LUFA-specific element names
+                        *  to make each element's purpose clearer.
+                        *
+                        *  \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+                               uint16_t TotalConfigurationSize; /**< Size of the configuration descriptor header,
+                                                                 *   and all sub descriptors inside the configuration.
+                                                                 */
+                               uint8_t  TotalInterfaces; /**< Total number of interfaces in the configuration. */
+
+                               uint8_t  ConfigurationNumber; /**< Configuration index of the current configuration. */
+                               uint8_t  ConfigurationStrIndex; /**< Index of a string descriptor describing the configuration. */
+
+                               uint8_t  ConfigAttributes; /**< Configuration attributes, comprised of a mask of zero or
+                                                           *   more USB_CONFIG_ATTR_* masks.
+                                                           */
+
+                               uint8_t  MaxPowerConsumption; /**< Maximum power consumption of the device while in the
+                                                              *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA()
+                                                              *   macro.
+                                                              */
+                       } USB_Descriptor_Configuration_Header_t;
+
+                       /** \brief Standard USB Configuration Descriptor (USB-IF naming conventions).
+                        *
+                        *  Type define for a standard Configuration Descriptor header. This structure uses the relevant standard's given element names
+                        *  to ensure compatibility with the standard.
+                        *
+                        *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+                                                             *   given by the specific class.
+                                                             */
+                               uint16_t wTotalLength; /**< Size of the configuration descriptor header,
+                                                          *   and all sub descriptors inside the configuration.
+                                                          */
+                               uint8_t  bNumInterfaces; /**< Total number of interfaces in the configuration. */
+                               uint8_t  bConfigurationValue; /**< Configuration index of the current configuration. */
+                               uint8_t  iConfiguration; /**< Index of a string descriptor describing the configuration. */
+                               uint8_t  bmAttributes; /**< Configuration attributes, comprised of a mask of zero or
+                                                       *   more USB_CONFIG_ATTR_* masks.
+                                                       */
+                               uint8_t  bMaxPower; /**< Maximum power consumption of the device while in the
+                                                    *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA()
+                                                    *   macro.
+                                                    */
+                       } USB_StdDescriptor_Configuration_Header_t;
+
+                       /** \brief Standard USB Interface Descriptor (LUFA naming conventions).
+                        *
+                        *  Type define for a standard Interface Descriptor. This structure uses LUFA-specific element names
+                        *  to make each element's purpose clearer.
+                        *
+                        *  \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+                               uint8_t InterfaceNumber; /**< Index of the interface in the current configuration. */
+                               uint8_t AlternateSetting; /**< Alternate setting for the interface number. The same
+                                                          *   interface number can have multiple alternate settings
+                                                          *   with different endpoint configurations, which can be
+                                                          *   selected by the host.
+                                                          */
+                               uint8_t TotalEndpoints; /**< Total number of endpoints in the interface. */
+
+                               uint8_t Class; /**< Interface class ID. */
+                               uint8_t SubClass; /**< Interface subclass ID. */
+                               uint8_t Protocol; /**< Interface protocol ID. */
+
+                               uint8_t InterfaceStrIndex; /**< Index of the string descriptor describing the interface. */
+                       } USB_Descriptor_Interface_t;
+
+                       /** \brief Standard USB Interface Descriptor (USB-IF naming conventions).
+                        *
+                        *  Type define for a standard Interface Descriptor. This structure uses the relevant standard's given element names
+                        *  to ensure compatibility with the standard.
+                        *
+                        *  \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+                                                         *   given by the specific class.
+                                                         */
+                               uint8_t bInterfaceNumber; /**< Index of the interface in the current configuration. */
+                               uint8_t bAlternateSetting; /**< Alternate setting for the interface number. The same
+                                                           *   interface number can have multiple alternate settings
+                                                           *   with different endpoint configurations, which can be
+                                                           *   selected by the host.
+                                                           */
+                               uint8_t bNumEndpoints; /**< Total number of endpoints in the interface. */
+                               uint8_t bInterfaceClass; /**< Interface class ID. */
+                               uint8_t bInterfaceSubClass; /**< Interface subclass ID. */
+                               uint8_t bInterfaceProtocol; /**< Interface protocol ID. */
+                               uint8_t iInterface; /**< Index of the string descriptor describing the
+                                                    *   interface.
+                                                    */
+                       } USB_StdDescriptor_Interface_t;
+
+                       /** \brief Standard USB Interface Association Descriptor (LUFA naming conventions).
+                        *
+                        *  Type define for a standard Interface Association Descriptor. This structure uses LUFA-specific element names
+                        *  to make each element's purpose clearer.
+                        *
+                        *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
+                        *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
+                        *  devices with multiple interfaces related to the same function to have the multiple interfaces bound
+                        *  together at the point of enumeration, loading one generic driver for all the interfaces in the single
+                        *  function. Read the ECN for more information.
+                        *
+                        *  \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+                               uint8_t FirstInterfaceIndex; /**< Index of the first associated interface. */
+                               uint8_t TotalInterfaces; /**< Total number of associated interfaces. */
+
+                               uint8_t Class; /**< Interface class ID. */
+                               uint8_t SubClass; /**< Interface subclass ID. */
+                               uint8_t Protocol; /**< Interface protocol ID. */
+
+                               uint8_t IADStrIndex; /**< Index of the string descriptor describing the
+                                                     *   interface association.
+                                                     */
+                       } USB_Descriptor_Interface_Association_t;
+
+                       /** \brief Standard USB Interface Association Descriptor (USB-IF naming conventions).
+                        *
+                        *  Type define for a standard Interface Association Descriptor. This structure uses the relevant standard's given
+                        *  element names to ensure compatibility with the standard.
+                        *
+                        *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
+                        *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
+                        *  devices with multiple interfaces related to the same function to have the multiple interfaces bound
+                        *  together at the point of enumeration, loading one generic driver for all the interfaces in the single
+                        *  function. Read the ECN for more information.
+                        *
+                        *  \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific
+                        *       element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+                                                         *   given by the specific class.
+                                                         */
+                               uint8_t bFirstInterface; /**< Index of the first associated interface. */
+                               uint8_t bInterfaceCount; /**< Total number of associated interfaces. */
+                               uint8_t bFunctionClass; /**< Interface class ID. */
+                               uint8_t bFunctionSubClass; /**< Interface subclass ID. */
+                               uint8_t bFunctionProtocol; /**< Interface protocol ID. */
+                               uint8_t iFunction; /**< Index of the string descriptor describing the
+                                                   *   interface association.
+                                                   */
+                       } USB_StdDescriptor_Interface_Association_t;
+
+                       /** \brief Standard USB Endpoint Descriptor (LUFA naming conventions).
+                        *
+                        *  Type define for a standard Endpoint Descriptor. This structure uses LUFA-specific element names
+                        *  to make each element's purpose clearer.
+                        *
+                        *  \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+                               uint8_t  EndpointAddress; /**< Logical address of the endpoint within the device for the current
+                                                          *   configuration, including direction mask.
+                                                          */
+                               uint8_t  Attributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*)
+                                                     *   and attributes (ENDPOINT_ATTR_*) masks.
+                                                     */
+                               uint16_t EndpointSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet
+                                                       *   size that the endpoint can receive at a time.
+                                                       */
+                               uint8_t  PollingIntervalMS; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT
+                                                            *   or ISOCHRONOUS type.
+                                                            */
+                       } USB_Descriptor_Endpoint_t;
+
+                       /** \brief Standard USB Endpoint Descriptor (USB-IF naming conventions).
+                        *
+                        *  Type define for a standard Endpoint Descriptor. This structure uses the relevant standard's given
+                        *  element names to ensure compatibility with the standard.
+                        *
+                        *  \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific
+                        *       element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a
+                                                          *   value given by the specific class.
+                                                          */
+                               uint8_t  bEndpointAddress; /**< Logical address of the endpoint within the device for the current
+                                                           *   configuration, including direction mask.
+                                                           */
+                               uint8_t  bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*)
+                                                       *   and attributes (ENDPOINT_ATTR_*) masks.
+                                                       */
+                               uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size
+                                                         *   that the endpoint can receive at a time.
+                                                         */
+                               uint8_t  bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or
+                                                    *   ISOCHRONOUS type.
+                                                    */
+                       } USB_StdDescriptor_Endpoint_t;
+
+                       /** \brief Standard USB String Descriptor (LUFA naming conventions).
+                        *
+                        *  Type define for a standard string descriptor. Unlike other standard descriptors, the length
+                        *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()
+                        *  macro rather than by the size of the descriptor structure, as the length is not fixed.
+                        *
+                        *  This structure should also be used for string index 0, which contains the supported language IDs for
+                        *  the device as an array.
+                        *
+                        *  This structure uses LUFA-specific element names to make each element's purpose clearer.
+                        *
+                        *  \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names.
+                        */
+                       typedef struct
+                       {
+                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+                               wchar_t UnicodeString[]; /**< String data, as unicode characters (alternatively,
+                                                         *   string language IDs). If normal ASCII characters are
+                                                         *   to be used, they must be added as an array of characters
+                                                         *   rather than a normal C string so that they are widened to
+                                                         *   Unicode size.
+                                                         *
+                                                         *   Under GCC, strings prefixed with the "L" character (before
+                                                         *   the opening string quotation mark) are considered to be
+                                                         *   Unicode strings, and may be used instead of an explicit
+                                                         *   array of ASCII characters.
+                                                         */
+                       } USB_Descriptor_String_t;
+
+                       /** \brief Standard USB String Descriptor (USB-IF naming conventions).
+                        *
+                        *  Type define for a standard string descriptor. Unlike other standard descriptors, the length
+                        *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()
+                        *  macro rather than by the size of the descriptor structure, as the length is not fixed.
+                        *
+                        *  This structure should also be used for string index 0, which contains the supported language IDs for
+                        *  the device as an array.
+                        *
+                        *  This structure uses the relevant standard's given element names to ensure compatibility with the standard.
+                        *
+                        *  \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific
+                        *       element names.
+                        */
+                       typedef struct
+                       {
+                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
+                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t
+                                                         *   or a value given by the specific class.
+                                                         */
+                               int16_t bString[]; /**< String data, as unicode characters (alternatively, string language IDs).
+                                                   *   If normal ASCII characters are to be used, they must be added as an array
+                                                   *   of characters rather than a normal C string so that they are widened to
+                                                   *   Unicode size.
+                                                   *
+                                                   *   Under GCC, strings prefixed with the "L" character (before the opening string
+                                                   *   quotation mark) are considered to be Unicode strings, and may be used instead
+                                                   *   of an explicit array of ASCII characters.
+                                                   */
+                       } USB_StdDescriptor_String_t;
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Macros: */
+                       #define VERSION_TENS(x)                   (int)((x) / 10)
+                       #define VERSION_ONES(x)                   (int)((x) - (10 * VERSION_TENS(x)))
+                       #define VERSION_TENTHS(x)                 (int)(((x) - (int)(x)) * 10)
+                       #define VERSION_HUNDREDTHS(x)             (int)((((x) - (int)(x)) * 100) - (10 * VERSION_TENTHS(x)))
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/StdRequestType.h b/LUFA/Drivers/USB/Core/StdRequestType.h
new file mode 100644 (file)
index 0000000..a8c3f09
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB control endpoint request definitions.
+ *
+ *  This file contains structures and macros for the easy creation and parsing of standard USB control requests.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_StdRequest Standard USB Requests
+ *
+ *  This module contains definitions for the various control request parameters, so that the request
+ *  details (such as data direction, request recipient, etc.) can be extracted via masking.
+ *
+ *  @{
+ */
+
+#ifndef __STDREQTYPE_H__
+#define __STDREQTYPE_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Macros: */
+                       /** Mask for the request type parameter, to indicate the direction of the request data (Host to Device
+                        *  or Device to Host). The result of this mask should then be compared to the request direction masks.
+                        *
+                        *  \see REQDIR_* macros for masks indicating the request data direction.
+                        */
+                       #define CONTROL_REQTYPE_DIRECTION  0x80
+
+                       /** Mask for the request type parameter, to indicate the type of request (Device, Class or Vendor
+                        *  Specific). The result of this mask should then be compared to the request type masks.
+                        *
+                        *  \see REQTYPE_* macros for masks indicating the request type.
+                        */
+                       #define CONTROL_REQTYPE_TYPE       0x60
+
+                       /** Mask for the request type parameter, to indicate the recipient of the request (Standard, Class
+                        *  or Vendor Specific). The result of this mask should then be compared to the request recipient
+                        *  masks.
+                        *
+                        *  \see REQREC_* macros for masks indicating the request recipient.
+                        */
+                       #define CONTROL_REQTYPE_RECIPIENT  0x1F
+
+                       /** \name Control Request Data Direction Masks */
+                       //@{
+                       /** Request data direction mask, indicating that the request data will flow from host to device.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_DIRECTION macro.
+                        */
+                       #define REQDIR_HOSTTODEVICE        (0 << 7)
+
+                       /** Request data direction mask, indicating that the request data will flow from device to host.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_DIRECTION macro.
+                        */
+                       #define REQDIR_DEVICETOHOST        (1 << 7)
+                       //@}
+
+                       /** \name Control Request Type Masks */
+                       //@{
+                       /** Request type mask, indicating that the request is a standard request.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_TYPE macro.
+                        */
+                       #define REQTYPE_STANDARD           (0 << 5)
+
+                       /** Request type mask, indicating that the request is a class-specific request.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_TYPE macro.
+                        */
+                       #define REQTYPE_CLASS              (1 << 5)
+
+                       /** Request type mask, indicating that the request is a vendor specific request.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_TYPE macro.
+                        */
+                       #define REQTYPE_VENDOR             (2 << 5)
+                       //@}
+
+                       /** \name Control Request Recipient Masks */
+                       //@{
+                       /** Request recipient mask, indicating that the request is to be issued to the device as a whole.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+                        */
+                       #define REQREC_DEVICE              (0 << 0)
+
+                       /** Request recipient mask, indicating that the request is to be issued to an interface in the
+                        *  currently selected configuration.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+                        */
+                       #define REQREC_INTERFACE           (1 << 0)
+
+                       /** Request recipient mask, indicating that the request is to be issued to an endpoint in the
+                        *  currently selected configuration.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+                        */
+                       #define REQREC_ENDPOINT            (2 << 0)
+
+                       /** Request recipient mask, indicating that the request is to be issued to an unspecified element
+                        *  in the currently selected configuration.
+                        *
+                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+                        */
+                       #define REQREC_OTHER               (3 << 0)
+                       //@}
+
+               /* Type Defines: */
+                       /** \brief Standard USB Control Request
+                        *
+                        *  Type define for a standard USB control request.
+                        *
+                        *  \see The USB 2.0 specification for more information on standard control requests.
+                        */
+                       typedef struct
+                       {
+                               uint8_t  bmRequestType; /**< Type of the request. */
+                               uint8_t  bRequest; /**< Request command code. */
+                               uint16_t wValue; /**< wValue parameter of the request. */
+                               uint16_t wIndex; /**< wIndex parameter of the request. */
+                               uint16_t wLength; /**< Length of the data to transfer in bytes. */
+                       } USB_Request_Header_t;
+
+               /* Enums: */
+                       /** Enumeration for the various standard request commands. These commands are applicable when the
+                        *  request type is \ref REQTYPE_STANDARD (with the exception of \ref REQ_GetDescriptor, which is always
+                        *  handled regardless of the request type value).
+                        *
+                        *  \see Chapter 9 of the USB 2.0 Specification.
+                        */
+                       enum USB_Control_Request_t
+                       {
+                               REQ_GetStatus           = 0, /**< Implemented in the library for device, endpoint and interface
+                                                             *   recipients. Passed to the user application for other recipients
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_ClearFeature        = 1, /**< Implemented in the library for device, endpoint and interface
+                                                             *   recipients. Passed to the user application for other recipients
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_SetFeature          = 3, /**< Implemented in the library for device, endpoint and interface
+                                                             *   recipients. Passed to the user application for other recipients
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_SetAddress          = 5, /**< Implemented in the library for the device recipient. Passed
+                                                             *   to the user application for other recipients via the
+                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_GetDescriptor       = 6, /**< Implemented in the library for device and interface recipients. Passed to the
+                                                             *   user application for other recipients via the
+                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_SetDescriptor       = 7, /**< Not implemented in the library, passed to the user application
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_GetConfiguration    = 8, /**< Implemented in the library for the device recipient. Passed
+                                                             *   to the user application for other recipients via the
+                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_SetConfiguration    = 9, /**< Implemented in the library for the device recipient. Passed
+                                                             *   to the user application for other recipients via the
+                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_GetInterface        = 10, /**< Not implemented in the library, passed to the user application
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_SetInterface        = 11, /**< Not implemented in the library, passed to the user application
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                               REQ_SynchFrame          = 12, /**< Not implemented in the library, passed to the user application
+                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+                                                             *   device mode. */
+                       };
+                       
+                       /** Feature Selector values for Set Feature and Clear Feature standard control requests directed to the device, interface
+                        *  and endpoint recipients.
+                        */
+                       enum USB_Feature_Selectors_t
+                       {
+                               FEATURE_SEL_EndpointHalt       = 0x00, /**< Feature selector for Clear Feature or Set Feature commands. When
+                                                                       *   used in a Set Feature or Clear Feature request this indicates that an
+                                                                       *   endpoint (whose address is given elsewhere in the request should have
+                                                                       *   its stall condition changed.
+                                                                       */
+                               FEATURE_SEL_DeviceRemoteWakeup = 0x01, /**< Feature selector for Device level Remote Wakeup enable set or clear.
+                                                                   *   This feature can be controlled by the host on devices which indicate
+                                                                   *   remote wakeup support in their descriptors to selectively disable or
+                                                                   *   enable remote wakeup.
+                                                                   */
+                               FEATURE_SEL_TestMode           = 0x02, /**< Feature selector for Test Mode features, used to test the USB controller
+                                                                   *   to check for incorrect operation.
+                                                                   */
+                       };
+
+       /* Private Interface - For use in library only: */
+               #if !defined(__DOXYGEN__)
+                       /* Macros: */
+                               #define FEATURE_SELFPOWERED_ENABLED     (1 << 0)
+                               #define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1)
+               #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_R.c
new file mode 100644 (file)
index 0000000..e746b51
--- /dev/null
@@ -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
diff --git a/LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_W.c
new file mode 100644 (file)
index 0000000..bdbbcfc
--- /dev/null
@@ -0,0 +1,58 @@
+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;
+
+       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_ControlEndpointSize))
+                       {
+                               TEMPLATE_TRANSFER_BYTE(DataStream);
+                               TEMPLATE_BUFFER_MOVE(DataStream, 1);
+                               Length--;
+                               BytesInEndpoint++;
+                       }
+
+                       LastPacketFull = (BytesInEndpoint == USB_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;
+       }
+
+       return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
diff --git a/LUFA/Drivers/USB/Core/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/Core/Template/Template_Endpoint_RW.c
new file mode 100644 (file)
index 0000000..a46d751
--- /dev/null
@@ -0,0 +1,54 @@
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+       uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+       uint16_t BytesInTransfer = 0;
+       uint8_t  ErrorCode;
+
+       if ((ErrorCode = Endpoint_WaitUntilReady()))
+         return ErrorCode;
+
+       if (BytesProcessed != NULL)
+       {
+               Length -= *BytesProcessed;
+               TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+       }
+
+       while (Length)
+       {
+               if (!(Endpoint_IsReadWriteAllowed()))
+               {
+                       TEMPLATE_CLEAR_ENDPOINT();
+
+                       if (BytesProcessed != NULL)
+                       {
+                               *BytesProcessed += BytesInTransfer;
+                               return ENDPOINT_RWSTREAM_IncompleteTransfer;
+                       }
+
+                       #if !defined(INTERRUPT_CONTROL_ENDPOINT)
+                       USB_USBTask();
+                       #endif
+
+                       if ((ErrorCode = Endpoint_WaitUntilReady()))
+                         return ErrorCode;
+               }
+               else
+               {
+                       TEMPLATE_TRANSFER_BYTE(DataStream);
+                       TEMPLATE_BUFFER_MOVE(DataStream, 1);
+                       Length--;
+                       BytesInTransfer++;
+               }
+       }
+
+       return ENDPOINT_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_ENDPOINT
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
diff --git a/LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c
new file mode 100644 (file)
index 0000000..147ce5a
--- /dev/null
@@ -0,0 +1,53 @@
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+       uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+       uint16_t BytesInTransfer = 0;
+       uint8_t  ErrorCode;
+
+       Pipe_SetPipeToken(TEMPLATE_TOKEN);
+
+       if ((ErrorCode = Pipe_WaitUntilReady()))
+         return ErrorCode;
+
+       if (BytesProcessed != NULL)
+       {
+               Length -= *BytesProcessed;
+               TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+       }
+       
+       while (Length)
+       {
+               if (!(Pipe_IsReadWriteAllowed()))
+               {
+                       TEMPLATE_CLEAR_PIPE();
+
+                       if (BytesProcessed != NULL)
+                       {
+                               *BytesProcessed += BytesInTransfer;
+                               return PIPE_RWSTREAM_IncompleteTransfer;
+                       }
+
+                       if ((ErrorCode = Pipe_WaitUntilReady()))
+                         return ErrorCode;
+               }
+               else
+               {
+                       TEMPLATE_TRANSFER_BYTE(DataStream);
+                       TEMPLATE_BUFFER_MOVE(DataStream, 1);
+                       Length--;
+                       BytesInTransfer++;
+               }
+       }
+
+       return PIPE_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TOKEN
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_PIPE
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
diff --git a/LUFA/Drivers/USB/Core/USBController.h b/LUFA/Drivers/USB/Core/USBController.h
new file mode 100644 (file)
index 0000000..475aeb1
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB low level USB controller definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to the low level configuration of the\r
+ *  USB controller, to start, stop and reset the USB library core.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+/** \ingroup Group_USB\r
+ *  \defgroup Group_USBManagement USB Interface Management\r
+ *\r
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.\r
+ *\r
+ *  @{\r
+ */\r
+\r
+#ifndef __USBCONTROLLER_H__\r
+#define __USBCONTROLLER_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/USBController.h"\r
+               #endif\r
+\r
+       /* Preprocessor Checks and Defines: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
+/** @} */\r
+\r
diff --git a/LUFA/Drivers/USB/Core/USBInterrupt.h b/LUFA/Drivers/USB/Core/USBInterrupt.h
new file mode 100644 (file)
index 0000000..00adc40
--- /dev/null
@@ -0,0 +1,57 @@
+/*\r
+             LUFA Library\r
+     Copyright (C) Dean Camera, 2011.\r
+\r
+  dean [at] fourwalledcubicle [dot] com\r
+           www.lufa-lib.org\r
+*/\r
+\r
+/*\r
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this\r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in\r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting\r
+  documentation, and that the name of the author not be used in\r
+  advertising or publicity pertaining to distribution of the\r
+  software without specific, written prior permission.\r
+\r
+  The author disclaim all warranties with regard to this\r
+  software, including all implied warranties of merchantability\r
+  and fitness.  In no event shall the author be liable for any\r
+  special, indirect or consequential damages or any damages\r
+  whatsoever resulting from loss of use, data or profits, whether\r
+  in an action of contract, negligence or other tortious action,\r
+  arising out of or in connection with the use or performance of\r
+  this software.\r
+*/\r
+\r
+/** \file\r
+ *  \brief USB controller interrupt service routine management.\r
+ *\r
+ *  This file contains definitions required for the correct handling of low level USB service routine interrupts\r
+ *  from the USB controller.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
+\r
+#ifndef __USBINTERRUPT_H__\r
+#define __USBINTERRUPT_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../Common/Common.h"\r
+\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/USBInterrupt.h"\r
+               #endif\r
+               \r
+       /* Preprocessor Checks: */\r
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
+               #endif\r
+\r
+#endif\r
+\r
diff --git a/LUFA/Drivers/USB/Core/USBMode.h b/LUFA/Drivers/USB/Core/USBMode.h
new file mode 100644 (file)
index 0000000..58f9927
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief USB mode and capability macros.
+ *
+ *  This file defines macros indicating the type of USB controller the library is being compiled for, and its
+ *  capabilities. These macros may then be referenced in the user application to selectively enable or disable
+ *  code sections depending on if they are defined or not.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_USBMode USB Mode Tokens
+ *
+ *  After the inclusion of the master USB driver header, one or more of the following
+ *  tokens may be defined, to allow the user code to conditionally enable or disable
+ *  code based on the USB controller family and allowable USB modes. These tokens may
+ *  be tested against to eliminate code relating to a USB mode which is not enabled for
+ *  the given compilation.
+ *
+ *  @{
+ */
+
+#ifndef __USBMODE_H__
+#define __USBMODE_H__
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+       #if defined(__DOXYGEN__)
+               /** Indicates that the target AVR microcontroller belongs to the Series 2 USB controller
+                *  (i.e. AT90USBxxx2 or ATMEGAxxU2) when defined.
+                */
+               #define USB_SERIES_2_AVR
+
+               /** Indicates that the target AVR microcontroller belongs to the Series 4 USB controller
+                *  (i.e. ATMEGAxxU4) when defined.
+                */
+               #define USB_SERIES_4_AVR
+
+               /** Indicates that the target AVR microcontroller belongs to the Series 6 USB controller
+                *  (i.e. AT90USBxxx6) when defined.
+                */
+               #define USB_SERIES_6_AVR
+
+               /** Indicates that the target AVR microcontroller belongs to the Series 7 USB controller
+                *  (i.e. AT90USBxxx7) when defined.
+                */
+               #define USB_SERIES_7_AVR
+
+               /** Indicates that the target AVR microcontroller and compilation settings allow for the
+                *  target to be configured in USB Device mode when defined.
+                */
+               #define USB_CAN_BE_DEVICE
+
+               /** Indicates that the target AVR microcontroller and compilation settings allow for the
+                *  target to be configured in USB Host mode when defined.
+                */
+               #define USB_CAN_BE_HOST
+
+               /** Indicates that the target AVR microcontroller and compilation settings allow for the
+                *  target to be configured in either USB Device or Host mode when defined.
+                */
+               #define USB_CAN_BE_BOTH
+       #else
+               /* Macros: */
+                       #if (defined(__AVR_AT90USB162__) || defined(__AVR_AT90USB82__)  || \
+                            defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__))
+                               #define USB_SERIES_2_AVR
+                       #elif (defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__))
+                               #define USB_SERIES_4_AVR
+                       #elif (defined(__AVR_ATmega32U6__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
+                               #define USB_SERIES_6_AVR
+                       #elif (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__))
+                               #define USB_SERIES_7_AVR
+                       #endif
+
+                       #if !defined(USB_SERIES_7_AVR)
+                               #if defined(USB_HOST_ONLY)
+                                       #error USB_HOST_ONLY is not available for the currently selected USB AVR model.
+                               #endif
+
+                               #if !defined(USB_DEVICE_ONLY)
+                                       #define USB_DEVICE_ONLY
+                               #endif
+                       #endif
+
+                       #if (!defined(USB_DEVICE_ONLY) && !defined(USB_HOST_ONLY))
+                               #define USB_CAN_BE_BOTH
+                               #define USB_CAN_BE_HOST
+                               #define USB_CAN_BE_DEVICE
+                       #elif defined(USB_HOST_ONLY)
+                               #define USB_CAN_BE_HOST
+                       #elif defined(USB_DEVICE_ONLY)
+                               #define USB_CAN_BE_DEVICE
+                       #endif
+
+                       #if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY))
+                               #error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive.
+                       #endif
+       #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/USB/Core/USBTask.c b/LUFA/Drivers/USB/Core/USBTask.c
new file mode 100644 (file)
index 0000000..c0cd711
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+#define  __INCLUDE_FROM_USBTASK_C
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBTask.h"
+
+volatile bool        USB_IsInitialized;
+USB_Request_Header_t USB_ControlRequest;
+
+#if defined(USB_CAN_BE_HOST) && !defined(HOST_STATE_AS_GPIOR)
+volatile uint8_t     USB_HostState;
+#endif
+
+#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR)
+volatile uint8_t     USB_DeviceState;
+#endif
+
+void USB_USBTask(void)
+{
+       #if defined(USB_HOST_ONLY)
+               USB_HostTask();
+       #elif defined(USB_DEVICE_ONLY)
+               USB_DeviceTask();
+       #else
+               if (USB_CurrentMode == USB_MODE_Device)
+                 USB_DeviceTask();
+               else if (USB_CurrentMode == USB_MODE_Host)
+                 USB_HostTask();
+       #endif
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_DeviceTask(void)
+{
+       if (USB_DeviceState != DEVICE_STATE_Unattached)
+       {
+               uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
+
+               Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+               if (Endpoint_IsSETUPReceived())
+                 USB_Device_ProcessControlRequest();
+
+               Endpoint_SelectEndpoint(PrevEndpoint);
+       }
+}
+#endif
+
+#if defined(USB_CAN_BE_HOST)
+static void USB_HostTask(void)
+{
+       uint8_t PrevPipe = Pipe_GetCurrentPipe();
+
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+       USB_Host_ProcessNextHostState();
+
+       Pipe_SelectPipe(PrevPipe);
+}
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/USBTask.h b/LUFA/Drivers/USB/Core/USBTask.h
new file mode 100644 (file)
index 0000000..b5cf381
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2011.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2011  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 disclaim 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.
+*/
+
+/** \file
+ *  \brief Main USB service task management.
+ *
+ *  This file contains the function definitions required for the main USB service task, which must be called
+ *  from the user application to ensure that the USB connection to or from a connected USB device is maintained.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBTASK_H__
+#define __USBTASK_H__
+
+       /* Includes: */
+               #include "../../../Common/Common.h"
+               #include "USBController.h"
+               #include "Events.h"
+               #include "StdRequestType.h"
+               #include "StdDescriptors.h"
+               #include "USBMode.h"
+
+               #if defined(USB_CAN_BE_DEVICE)
+                       #include "DeviceStandardReq.h"
+               #endif
+
+               #if defined(USB_CAN_BE_HOST)
+                       #include "HostStandardReq.h"
+               #endif
+
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+
+       /* Public Interface - May be used in end-application: */
+               /* Global Variables: */
+                       /** Indicates if the USB interface is currently initialized but not necessarily connected to a host
+                        *  or device (i.e. if \ref USB_Init() has been run). If this is false, all other library globals related
+                        *  to the USB driver are invalid.
+                        *
+                        *  \note This variable should be treated as read-only in the user application, and never manually
+                        *        changed in value.
+                        *
+                        *  \ingroup Group_USBManagement
+                        */
+                       extern volatile bool USB_IsInitialized;
+
+                       /** Structure containing the last received Control request when in Device mode (for use in user-applications
+                        *  inside of the \ref EVENT_USB_Device_ControlRequest() event, or for filling up with a control request to 
+                        *  issue when in Host mode before calling \ref USB_Host_SendControlRequest().
+                        *
+                        *  \ingroup Group_USBManagement
+                        */
+                        extern USB_Request_Header_t USB_ControlRequest;
+
+                       #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+                               #if !defined(HOST_STATE_AS_GPIOR) || defined(__DOXYGEN__)
+                                       /** Indicates the current host state machine state. When in host mode, this indicates the state
+                                        *  via one of the values of the \ref USB_Host_States_t enum values.
+                                        *
+                                        *  This value may be altered by the user application to implement the \ref HOST_STATE_Addressed,
+                                        *  \ref HOST_STATE_Configured and \ref HOST_STATE_Suspended states which are not implemented by
+                                        *  the library internally.
+                                        *
+                                        *  To reduce program size and speed up checks of this global on the AVR8 architecture, it can be
+                                        *  placed into one of the AVR's GPIOR hardware registers instead of RAM by defining the
+                                        *  HOST_STATE_AS_GPIOR token to a value between 0 and 2 in the project makefile and passing it to
+                                        *  the compiler via the -D switch. When defined, the corresponding GPIOR register should not be used
+                                        *  in the user application except implicitly via the library APIs.
+                                        *
+                                        *  \note This global is only present if the user application can be a USB host.
+                                        *
+                                        *  \see \ref USB_Host_States_t for a list of possible device states.
+                                        *
+                                        *  \ingroup Group_Host
+                                        */
+                                       extern volatile uint8_t USB_HostState;
+                               #else
+                                       #define _GET_HOST_GPIOR_NAME2(y) GPIOR ## y
+                                       #define _GET_HOST_GPIOR_NAME(x)  _GET_HOST_GPIOR_NAME2(x)
+                                       #define USB_HostState            _GET_HOST_GPIOR_NAME(HOST_STATE_AS_GPIOR)
+                               #endif
+                       #endif
+
+                       #if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+                               #if !defined(DEVICE_STATE_AS_GPIOR) || defined(__DOXYGEN__)
+                                       /** Indicates the current device state machine state. When in device mode, this indicates the state
+                                        *  via one of the values of the \ref USB_Device_States_t enum values.
+                                        *
+                                        *  This value should not be altered by the user application as it is handled automatically by the
+                                        *  library. The only exception to this rule is if the NO_LIMITED_CONTROLLER_CONNECT token is used
+                                        *  (see \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events).
+                                        *
+                                        *  To reduce program size and speed up checks of this global on the AVR8 architecture, it can be
+                                        *  placed into one of the AVR's GPIOR hardware registers instead of RAM by defining the
+                                        *  DEVICE_STATE_AS_GPIOR token to a value between 0 and 2 in the project makefile and passing it to
+                                        *  the compiler via the -D switch. When defined, the corresponding GPIOR register should not be used
+                                        *  in the user application except implicitly via the library APIs.
+                                        *
+                                        *  \note This global is only present if the user application can be a USB device.
+                                        *        \n\n
+                                        *
+                                        *  \note This variable should be treated as read-only in the user application, and never manually
+                                        *        changed in value except in the circumstances outlined above.
+                                        *
+                                        *  \see \ref USB_Device_States_t for a list of possible device states.
+                                        *
+                                        *  \ingroup Group_Device
+                                        */
+                                       extern volatile uint8_t USB_DeviceState;
+                               #else
+                                       #define _GET_DEVICE_GPIOR_NAME2(y) GPIOR ## y
+                                       #define _GET_DEVICE_GPIOR_NAME(x)  _GET_DEVICE_GPIOR_NAME2(x)
+                                       #define USB_DeviceState            _GET_DEVICE_GPIOR_NAME(DEVICE_STATE_AS_GPIOR)
+                               #endif
+                       #endif
+
+               /* Function Prototypes: */
+                       /** This is the main USB management task. The USB driver requires this task to be executed
+                        *  continuously when the USB system is active (device attached in host mode, or attached to a host
+                        *  in device mode) in order to manage USB communications. This task may be executed inside an RTOS,
+                        *  fast timer ISR or the main user application loop.
+                        *
+                        *  The USB task must be serviced within 30ms while in device mode, or within 1ms while in host mode.
+                        *  The task may be serviced at all times, or (for minimum CPU consumption):
+                        *
+                        *    - In device mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Device_Connect()
+                        *      event and disabled again on the firing of the \ref EVENT_USB_Device_Disconnect() event.
+                        *
+                        *    - In host mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Host_DeviceAttached()
+                        *      event and disabled again on the firing of the \ref EVENT_USB_Host_DeviceEnumerationComplete() or
+                        *      \ref EVENT_USB_Host_DeviceEnumerationFailed() events.
+                        *
+                        *  If in device mode (only), the control endpoint can instead be managed via interrupts entirely by the library
+                        *  by defining the INTERRUPT_CONTROL_ENDPOINT token and passing it to the compiler via the -D switch.
+                        *
+                        *  \see \ref Group_Events for more information on the USB events.
+                        *
+                        *  \ingroup Group_USBManagement
+                        */
+                       void USB_USBTask(void);
+
+       /* Private Interface - For use in library only: */
+       #if !defined(__DOXYGEN__)
+               /* Function Prototypes: */
+                       #if defined(__INCLUDE_FROM_USBTASK_C)
+                               #if defined(USB_CAN_BE_HOST)
+                                       static void USB_HostTask(void);
+                               #endif
+
+                               #if defined(USB_CAN_BE_DEVICE)
+                                       static void USB_DeviceTask(void);
+                               #endif
+                       #endif
+
+               /* Macros: */
+                       #define HOST_TASK_NONBLOCK_WAIT(Duration, NextState) MACROS{ USB_HostState   = HOST_STATE_WaitForDevice; \
+                                                                                    WaitMSRemaining = (Duration);               \
+                                                                                    PostWaitState   = (NextState);        }MACROE
+       #endif
+
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c b/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c
deleted file mode 100644 (file)
index 9671659..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "ConfigDescriptor.h"
-
-#if defined(USB_CAN_BE_HOST)
-uint8_t USB_Host_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr,
-                                           void* BufferPtr, uint16_t BufferSize)
-{
-       uint8_t ErrorCode;
-       uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
-
-       USB_ControlRequest = (USB_Request_Header_t)
-               {
-                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
-                       .bRequest      = REQ_GetDescriptor,
-                       .wValue        = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)),
-                       .wIndex        = 0,
-                       .wLength       = sizeof(USB_Descriptor_Configuration_Header_t),
-               };
-
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
-       if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful)
-         return ErrorCode;
-
-       *ConfigSizePtr = DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize;
-
-       if (*ConfigSizePtr > BufferSize)
-         return HOST_GETCONFIG_BuffOverflow;
-
-       USB_ControlRequest.wLength = *ConfigSizePtr;
-
-       if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful)
-         return ErrorCode;
-
-       if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)
-         return HOST_GETCONFIG_InvalidData;
-
-       return HOST_GETCONFIG_Successful;
-}
-#endif
-
-void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
-                                 void** const CurrConfigLoc,
-                                 const uint8_t Type)
-{
-       while (*BytesRem)
-       {
-               USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
-
-               if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type)
-                 return;
-       }
-}
-
-void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
-                                       void** const CurrConfigLoc,
-                                       const uint8_t Type,
-                                       const uint8_t BeforeType)
-{
-       while (*BytesRem)
-       {
-               USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
-
-               if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type)
-               {
-                       return;
-               }
-               else if (DESCRIPTOR_TYPE(*CurrConfigLoc) == BeforeType)
-               {
-                       *BytesRem = 0;
-                       return;
-               }
-       }
-}
-
-void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
-                                      void** const CurrConfigLoc,
-                                      const uint8_t Type,
-                                      const uint8_t AfterType)
-{
-       USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, AfterType);
-
-       if (*BytesRem)
-         USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, Type);
-}
-
-uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem, void** const CurrConfigLoc, ConfigComparatorPtr_t const ComparatorRoutine)
-{
-       uint8_t ErrorCode;
-
-       while (*BytesRem)
-       {
-               uint8_t* PrevDescLoc  = *CurrConfigLoc;
-               uint16_t PrevBytesRem = *BytesRem;
-
-               USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
-
-               if ((ErrorCode = ComparatorRoutine(*CurrConfigLoc)) != DESCRIPTOR_SEARCH_NotFound)
-               {
-                       if (ErrorCode == DESCRIPTOR_SEARCH_Fail)
-                       {
-                               *CurrConfigLoc = PrevDescLoc;
-                               *BytesRem      = PrevBytesRem;
-                       }
-
-                       return ErrorCode;
-               }
-       }
-
-       return DESCRIPTOR_SEARCH_COMP_EndOfDescriptor;
-}
-
diff --git a/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h b/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h
deleted file mode 100644 (file)
index d51eb3d..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief Configuration descriptor parser API.
- *
- *  This section of the library gives a friendly API which can be used in host applications to easily
- *  parse an attached device's configuration descriptor so that endpoint, interface and other descriptor
- *  data can be extracted and used as needed.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_Descriptors
- *  \defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser
- *
- *  Functions, macros, variables, enums and types related to the parsing of Configuration Descriptors.
- *
- *  @{
- */
-
-#ifndef __CONFIGDESCRIPTOR_H__
-#define __CONFIGDESCRIPTOR_H__
-
-       /* Includes: */
-               #include <stdint.h>
-
-               #include "../../../Common/Common.h"
-               #include "HostStandardReq.h"
-               #include "USBMode.h"
-               #include "StdDescriptors.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared
-                        *  with the \c EP_TYPE_* masks to determine the exact type of the endpoint.
-                        */
-                       #define EP_TYPE_MASK                       0x03
-
-                       /** Casts a pointer to a descriptor inside the configuration descriptor into a pointer to the given
-                        *  descriptor type.
-                        *
-                        *  Usage Example:
-                        *  \code
-                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
-                        *  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor,
-                        *                                                           USB_Descriptor_Configuration_Header_t);
-                        *
-                        *  // Can now access elements of the configuration header struct using the -> indirection operator
-                        *  \endcode
-                        */
-                       #define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr))
-
-                       /** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor
-                        *  type (as an actual struct instance rather than a pointer to a struct).
-                        *
-                        *  Usage Example:
-                        *  \code
-                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
-                        *  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor,
-                        *                                                       USB_Descriptor_Configuration_Header_t);
-                        *
-                        *  // Can now access elements of the configuration header struct using the . operator
-                        *  \endcode
-                        */
-                       #define DESCRIPTOR_CAST(DescriptorPtr, Type)  (*DESCRIPTOR_PCAST(DescriptorPtr, Type))
-
-                       /** Returns the descriptor's type, expressed as the 8-bit type value in the header of the descriptor.
-                        *  This value's meaning depends on the descriptor's placement in the descriptor, but standard type
-                        *  values can be accessed in the \ref USB_DescriptorTypes_t enum.
-                        */
-                       #define DESCRIPTOR_TYPE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Type
-
-                       /** Returns the descriptor's size, expressed as the 8-bit value indicating the number of bytes. */
-                       #define DESCRIPTOR_SIZE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Size
-
-               /* Type Defines: */
-                       /** Type define for a Configuration Descriptor comparator function (function taking a pointer to an array
-                        *  of type void, returning a uint8_t value).
-                        *
-                        *  \see \ref USB_GetNextDescriptorComp function for more details.
-                        */
-                       typedef uint8_t (* ConfigComparatorPtr_t)(void*);
-
-               /* Enums: */
-                       /** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */
-                       enum USB_Host_GetConfigDescriptor_ErrorCodes_t
-                       {
-                               HOST_GETCONFIG_Successful       = 0, /**< No error occurred while retrieving the configuration descriptor. */
-                               HOST_GETCONFIG_DeviceDisconnect = 1, /**< The attached device was disconnected while retrieving the configuration
-                                                                       * descriptor.
-                                                                       */
-                               HOST_GETCONFIG_PipeError        = 2, /**< An error occurred in the pipe while sending the request. */
-                               HOST_GETCONFIG_SetupStalled     = 3, /**< The attached device stalled the request to retrieve the configuration
-                                                                       * descriptor.
-                                                                       */
-                               HOST_GETCONFIG_SoftwareTimeOut  = 4, /**< The request or data transfer timed out. */
-                               HOST_GETCONFIG_BuffOverflow     = 5, /**< The device's configuration descriptor is too large to fit into the allocated
-                                                                       * buffer.
-                                                                       */
-                               HOST_GETCONFIG_InvalidData      = 6, /**< The device returned invalid configuration descriptor data. */
-                       };
-
-                       /** Enum for return values of a descriptor comparator function. */
-                       enum DSearch_Return_ErrorCodes_t
-                       {
-                               DESCRIPTOR_SEARCH_Found                = 0, /**< Current descriptor matches comparator criteria. */
-                               DESCRIPTOR_SEARCH_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */
-                               DESCRIPTOR_SEARCH_NotFound             = 2, /**< Current descriptor does not match comparator criteria. */
-                       };
-
-                       /** Enum for return values of \ref USB_GetNextDescriptorComp(). */
-                       enum DSearch_Comp_Return_ErrorCodes_t
-                       {
-                               DESCRIPTOR_SEARCH_COMP_Found           = 0, /**< Configuration descriptor now points to descriptor which matches
-                                                                            *   search criteria of the given comparator function. */
-                               DESCRIPTOR_SEARCH_COMP_Fail            = 1, /**< Comparator function returned \ref DESCRIPTOR_SEARCH_Fail. */
-                               DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2, /**< End of configuration descriptor reached before match found. */
-                       };
-
-               /* Function Prototypes: */
-                       /** Retrieves the configuration descriptor data from an attached device via a standard request into a buffer,
-                        *  including validity and size checking to prevent a buffer overflow.
-                        *
-                        *  \param[in]     ConfigNumber   Device configuration descriptor number to fetch from the device (usually set to 1 for
-                        *                                single configuration devices).
-                        *  \param[in,out] ConfigSizePtr  Pointer to a location for storing the retrieved configuration descriptor size.
-                        *  \param[out]    BufferPtr      Pointer to the buffer for storing the configuration descriptor data.
-                        *  \param[out]    BufferSize     Size of the allocated buffer where the configuration descriptor is to be stored.
-                        *
-                        *  \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum.
-                        */
-                       uint8_t USB_Host_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr, void* BufferPtr,
-                                                                  uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
-
-                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value.
-                        *  The bytes remaining value is automatically decremented.
-                        *
-                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
-                        * \param[in]     Type           Descriptor type value to search for.
-                        */
-                       void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
-                                                        void** const CurrConfigLoc,
-                                                        const uint8_t Type)
-                                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
-
-                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
-                        *  which must come before a descriptor of the second given type value. If the BeforeType type
-                        *  descriptor is reached first, the number of bytes remaining to process is set to zero and the
-                        *  function exits. The bytes remaining value is automatically decremented.
-                        *
-                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
-                        * \param[in]     Type           Descriptor type value to search for.
-                        * \param[in]     BeforeType     Descriptor type value which must not be reached before the given Type descriptor.
-                        */
-                       void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
-                                                              void** const CurrConfigLoc,
-                                                              const uint8_t Type,
-                                                              const uint8_t BeforeType)
-                                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
-
-                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
-                        *  which must come after a descriptor of the second given type value. The bytes remaining value is
-                        *  automatically decremented.
-                        *
-                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
-                        * \param[in]     Type           Descriptor type value to search for.
-                        * \param[in]     AfterType      Descriptor type value which must be reached before the given Type descriptor.
-                        */
-                       void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
-                                                             void** const CurrConfigLoc,
-                                                             const uint8_t Type,
-                                                             const uint8_t AfterType)
-                                                             ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
-
-                       /** Searches for the next descriptor in the given configuration descriptor using a pre-made comparator
-                        *  function. The routine updates the position and remaining configuration descriptor bytes values
-                        *  automatically. If a comparator routine fails a search, the descriptor pointer is retreated back
-                        *  so that the next descriptor search invocation will start from the descriptor which first caused the
-                        *  original search to fail. This behaviour allows for one comparator to be used immediately after another
-                        *  has failed, starting the second search from the descriptor which failed the first.
-                        *
-                        *  Comparator functions should be standard functions which accept a pointer to the header of the current
-                        *  descriptor inside the configuration descriptor which is being compared, and should return a value from
-                        *  the \ref DSearch_Return_ErrorCodes_t enum as a uint8_t value.
-                        *
-                        *  \note This function is available in USB Host mode only.
-                        *
-                        *  \param[in,out] BytesRem           Pointer to an int storing the remaining bytes in the configuration descriptor.
-                        *  \param[in,out] CurrConfigLoc      Pointer to the current position in the configuration descriptor.
-                        *  \param[in]     ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor.
-                        *
-                        *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum.
-                        *
-                        *  Usage Example:
-                        *  \code
-                        *  uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype
-                        *
-                        *  uint8_t EndpointSearcher(void* CurrentDescriptor)
-                        *  {
-                        *     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
-                        *         return DESCRIPTOR_SEARCH_Found;
-                        *     else
-                        *         return DESCRIPTOR_SEARCH_NotFound;
-                        *  }
-                        *
-                        *  //...
-                        *  // After retrieving configuration descriptor:
-                        *  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) ==
-                        *      Descriptor_Search_Comp_Found)
-                        *  {
-                        *      // Do something with the endpoint descriptor
-                        *  }
-                        *  \endcode
-                        */
-                       uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem,
-                                                         void** const CurrConfigLoc,
-                                                         ConfigComparatorPtr_t const ComparatorRoutine);
-
-               /* Inline Functions: */
-                       /** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
-                           points to the next sub-descriptor. The bytes remaining value is automatically decremented.
-                        *
-                        * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
-                        */
-                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
-                                                                void** CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
-                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
-                                                                void** CurrConfigLoc)
-                       {
-                               uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
-
-                               *CurrConfigLoc  = ((uint8_t*)*CurrConfigLoc) + CurrDescriptorSize;
-                               *BytesRem      -= CurrDescriptorSize;
-                       }
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c
deleted file mode 100644 (file)
index f9cec41..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "USBMode.h"
-
-#if defined(USB_CAN_BE_DEVICE)
-
-#define  __INCLUDE_FROM_DEVICESTDREQ_C
-#include "DeviceStandardReq.h"
-
-uint8_t USB_ConfigurationNumber;
-
-#if !defined(NO_DEVICE_SELF_POWER)
-bool    USB_CurrentlySelfPowered;
-#endif
-
-#if !defined(NO_DEVICE_REMOTE_WAKEUP)
-bool    USB_RemoteWakeupEnabled;
-#endif
-
-void USB_Device_ProcessControlRequest(void)
-{
-       uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest;
-
-       for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)
-         *(RequestHeader++) = Endpoint_Read_Byte();
-
-       EVENT_USB_Device_ControlRequest();
-
-       if (Endpoint_IsSETUPReceived())
-       {
-               uint8_t bmRequestType = USB_ControlRequest.bmRequestType;
-
-               switch (USB_ControlRequest.bRequest)
-               {
-                       case REQ_GetStatus:
-                               if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
-                                       (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT)))
-                               {
-                                       USB_Device_GetStatus();
-                               }
-
-                               break;
-                       case REQ_ClearFeature:
-                       case REQ_SetFeature:
-                               if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) ||
-                                       (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT)))
-                               {
-                                       USB_Device_ClearSetFeature();
-                               }
-
-                               break;
-                       case REQ_SetAddress:
-                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
-                                 USB_Device_SetAddress();
-
-                               break;
-                       case REQ_GetDescriptor:
-                               if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
-                                       (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE)))
-                               {
-                                       USB_Device_GetDescriptor();
-                               }
-
-                               break;
-                       case REQ_GetConfiguration:
-                               if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))
-                                 USB_Device_GetConfiguration();
-
-                               break;
-                       case REQ_SetConfiguration:
-                               if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
-                                 USB_Device_SetConfiguration();
-
-                               break;
-               }
-       }
-
-       if (Endpoint_IsSETUPReceived())
-       {
-               Endpoint_StallTransaction();
-               Endpoint_ClearSETUP();
-       }
-}
-
-static void USB_Device_SetAddress(void)
-{
-       uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
-
-       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
-       {
-               Endpoint_ClearSETUP();
-
-               Endpoint_ClearStatusStage();
-
-               while (!(Endpoint_IsINReady()));
-
-               USB_Device_SetDeviceAddress(DeviceAddress);
-       }
-       
-       USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
-}
-
-static void USB_Device_SetConfiguration(void)
-{
-       #if defined(FIXED_NUM_CONFIGURATIONS)
-       if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)
-         return;
-       #else
-       USB_Descriptor_Device_t* DevDescriptorPtr;
-
-       #if defined(USE_FLASH_DESCRIPTORS)
-               #define MemoryAddressSpace  MEMSPACE_FLASH
-       #elif defined(USE_EEPROM_DESCRIPTORS)
-               #define MemoryAddressSpace  MEMSPACE_EEPROM
-       #elif defined(USE_SRAM_DESCRIPTORS)
-               #define MemoryAddressSpace  MEMSPACE_SRAM
-       #else
-               uint8_t MemoryAddressSpace;
-       #endif
-
-       if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr
-       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
-                                      , &MemoryAddressSpace
-       #endif
-                                      ) == NO_DESCRIPTOR)
-       {
-               return;
-       }
-
-       if (MemoryAddressSpace == MEMSPACE_FLASH)
-       {
-               if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
-                 return;
-       }
-       else if (MemoryAddressSpace == MEMSPACE_EEPROM)
-       {
-               if (((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
-                 return;
-       }
-       else
-       {
-               if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
-                 return;
-       }
-       #endif
-
-       Endpoint_ClearSETUP();
-
-       USB_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue;
-
-       Endpoint_ClearStatusStage();
-
-       if (USB_ConfigurationNumber)
-         USB_DeviceState = DEVICE_STATE_Configured;
-       else
-         USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
-
-       EVENT_USB_Device_ConfigurationChanged();
-}
-
-static void USB_Device_GetConfiguration(void)
-{
-       Endpoint_ClearSETUP();
-
-       Endpoint_Write_Byte(USB_ConfigurationNumber);
-       Endpoint_ClearIN();
-
-       Endpoint_ClearStatusStage();
-}
-
-#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
-static void USB_Device_GetInternalSerialDescriptor(void)
-{
-       struct
-       {
-               USB_Descriptor_Header_t Header;
-               wchar_t                 UnicodeString[20];
-       } SignatureDescriptor;
-
-       SignatureDescriptor.Header.Type = DTYPE_String;
-       SignatureDescriptor.Header.Size = sizeof(SignatureDescriptor);
-
-       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
-       {
-               uint8_t SigReadAddress = 0x0E;
-
-               for (uint8_t SerialCharNum = 0; SerialCharNum < 20; SerialCharNum++)
-               {
-                       uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
-
-                       if (SerialCharNum & 0x01)
-                       {
-                               SerialByte >>= 4;
-                               SigReadAddress++;
-                       }
-
-                       SerialByte &= 0x0F;
-
-                       SignatureDescriptor.UnicodeString[SerialCharNum] = (SerialByte >= 10) ?
-                                                                          (('A' - 10) + SerialByte) : ('0' + SerialByte);
-               }
-       }
-
-       Endpoint_ClearSETUP();
-
-       Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
-
-       Endpoint_ClearOUT();
-}
-#endif
-
-static void USB_Device_GetDescriptor(void)
-{
-       const void* DescriptorPointer;
-       uint16_t    DescriptorSize;
-
-       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
-       uint8_t DescriptorAddressSpace;
-       #endif
-
-       #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
-       if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
-       {
-               USB_Device_GetInternalSerialDescriptor();
-               return;
-       }
-       #endif
-
-       if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,
-                                                        &DescriptorPointer
-       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
-                                                        , &DescriptorAddressSpace
-       #endif
-                                                                                                        )) == NO_DESCRIPTOR)
-       {
-               return;
-       }
-
-       Endpoint_ClearSETUP();
-
-       #if defined(USE_RAM_DESCRIPTORS)
-       Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
-       #elif defined(USE_EEPROM_DESCRIPTORS)
-       Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
-       #elif defined(USE_FLASH_DESCRIPTORS)
-       Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
-       #else
-       if (DescriptorAddressSpace == MEMSPACE_FLASH)
-         Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
-       else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
-         Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
-       else
-         Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
-       #endif
-
-       Endpoint_ClearOUT();
-}
-
-static void USB_Device_GetStatus(void)
-{
-       uint8_t CurrentStatus = 0;
-
-       switch (USB_ControlRequest.bmRequestType)
-       {
-               #if !defined(NO_DEVICE_SELF_POWER) || !defined(NO_DEVICE_REMOTE_WAKEUP)
-               case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):
-                       #if !defined(NO_DEVICE_SELF_POWER)
-                       if (USB_CurrentlySelfPowered)
-                         CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
-                       #endif
-
-                       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
-                       if (USB_RemoteWakeupEnabled)
-                         CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
-                       #endif
-                       break;
-               #endif
-               #if !defined(CONTROL_ONLY_DEVICE)
-               case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
-                       Endpoint_SelectEndpoint((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
-
-                       CurrentStatus = Endpoint_IsStalled();
-
-                       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-
-                       break;
-               #endif
-               default:
-                       return;
-       }
-
-       Endpoint_ClearSETUP();
-
-       Endpoint_Write_Word_LE(CurrentStatus);
-       Endpoint_ClearIN();
-
-       Endpoint_ClearStatusStage();
-}
-
-static void USB_Device_ClearSetFeature(void)
-{
-       switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT)
-       {
-               #if !defined(NO_DEVICE_REMOTE_WAKEUP)
-               case REQREC_DEVICE:
-                       if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup)
-                         USB_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
-                       else
-                         return;
-
-                       break;
-               #endif
-               #if !defined(CONTROL_ONLY_DEVICE)
-               case REQREC_ENDPOINT:
-                       if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt)
-                       {
-                               uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
-
-                               if (EndpointIndex == ENDPOINT_CONTROLEP)
-                                 return;
-
-                               Endpoint_SelectEndpoint(EndpointIndex);
-
-                               if (Endpoint_IsEnabled())
-                               {
-                                       if (USB_ControlRequest.bRequest == REQ_SetFeature)
-                                       {
-                                               Endpoint_StallTransaction();
-                                       }
-                                       else
-                                       {
-                                               Endpoint_ClearStall();
-                                               Endpoint_ResetFIFO(EndpointIndex);
-                                               Endpoint_ResetDataToggle();
-                                       }
-                               }
-                       }
-
-                       break;
-               #endif
-               default:
-                       return;
-       }
-
-       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-
-       Endpoint_ClearSETUP();
-
-       Endpoint_ClearStatusStage();
-}
-
-#endif
-
diff --git a/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.h b/LUFA/Drivers/USB/HighLevel/DeviceStandardReq.h
deleted file mode 100644 (file)
index 4e67f8a..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB device standard request management.
- *
- *  This file contains the function prototypes necessary for the processing of incoming standard control requests
- *  when the library is in USB device mode.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-#ifndef __DEVICESTDREQ_H__
-#define __DEVICESTDREQ_H__
-
-       /* Includes: */
-               #include <avr/pgmspace.h>
-               #include <avr/eeprom.h>
-               #include <avr/boot.h>
-               #include <util/atomic.h>
-               #include <stdint.h>
-               #include <stdbool.h>
-
-               #include "StdDescriptors.h"
-               #include "Events.h"
-               #include "StdRequestType.h"
-               #include "USBTask.h"
-               #include "../LowLevel/USBController.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       #if defined(USE_SINGLE_DEVICE_CONFIGURATION)
-                               #define FIXED_NUM_CONFIGURATIONS           1
-                       #endif
-
-               /* Enums: */
-                       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
-                               /** Enum for the possible descriptor memory spaces, for the \c MemoryAddressSpace parameter of the
-                                *  \ref CALLBACK_USB_GetDescriptor() function. This can be used when none of the \c USE_*_DESCRIPTORS
-                                *  compile time options are used, to indicate in which memory space the descriptor is stored.
-                                *
-                                *  \ingroup Group_Device
-                                */
-                               enum USB_DescriptorMemorySpaces_t
-                               {
-                                       MEMSPACE_FLASH    = 0, /**< Indicates the requested descriptor is located in FLASH memory. */
-                                       MEMSPACE_EEPROM   = 1, /**< Indicates the requested descriptor is located in EEPROM memory. */
-                                       MEMSPACE_RAM      = 2, /**< Indicates the requested descriptor is located in RAM memory. */
-                               };
-                       #endif
-
-               /* Global Variables: */
-                       /** Indicates the currently set configuration number of the device. USB devices may have several
-                        *  different configurations which the host can select between; this indicates the currently selected
-                        *  value, or 0 if no configuration has been selected.
-                        *
-                        *  \note This variable should be treated as read-only in the user application, and never manually
-                        *        changed in value.
-                        *
-                        *  \ingroup Group_Device
-                        */
-                       extern uint8_t USB_ConfigurationNumber;
-
-                       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
-                               /** Indicates if the host is currently allowing the device to issue remote wakeup events. If this
-                                *  flag is cleared, the device should not issue remote wakeup events to the host.
-                                *
-                                *  \note This variable should be treated as read-only in the user application, and never manually
-                                *        changed in value.
-                                *        \n\n
-                                *
-                                *  \note To reduce FLASH usage of the compiled applications where Remote Wakeup is not supported,
-                                *        this global and the underlying management code can be disabled by defining the
-                                *        \c NO_DEVICE_REMOTE_WAKEUP token in the project makefile and passing it to the compiler via
-                                *        the -D switch.
-                                *
-                                *  \ingroup Group_Device
-                                */
-                               extern bool USB_RemoteWakeupEnabled;
-                       #endif
-
-                       #if !defined(NO_DEVICE_SELF_POWER)
-                               /** Indicates if the device is currently being powered by its own power supply, rather than being
-                                *  powered by the host's USB supply. This flag should remain cleared if the device does not
-                                *  support self powered mode, as indicated in the device descriptors.
-                                *
-                                *  \ingroup Group_Device
-                                */
-                               extern bool USB_CurrentlySelfPowered;
-                       #endif
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               #if defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
-                       #error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
-               #elif defined(USE_RAM_DESCRIPTORS) && defined(USE_FLASH_DESCRIPTORS)
-                       #error USE_RAM_DESCRIPTORS and USE_FLASH_DESCRIPTORS are mutually exclusive.
-               #elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
-                       #error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
-               #elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)
-                       #error Only one of the USE_*_DESCRIPTORS modes should be selected.
-               #endif
-
-               /* Function Prototypes: */
-                       void USB_Device_ProcessControlRequest(void);
-
-                       #if defined(__INCLUDE_FROM_DEVICESTDREQ_C)
-                               static void USB_Device_SetAddress(void);
-                               static void USB_Device_SetConfiguration(void);
-                               static void USB_Device_GetConfiguration(void);
-                               static void USB_Device_GetDescriptor(void);
-                               static void USB_Device_GetStatus(void);
-                               static void USB_Device_ClearSetFeature(void);
-
-                               #if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
-                                       static void USB_Device_GetInternalSerialDescriptor(void);
-                               #endif
-                       #endif
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
diff --git a/LUFA/Drivers/USB/HighLevel/EndpointStream.c b/LUFA/Drivers/USB/HighLevel/EndpointStream.c
deleted file mode 100644 (file)
index 974af68..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2011.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-#define  __INCLUDE_FROM_USB_DRIVER\r
-#include "USBMode.h"\r
-\r
-#if defined(USB_CAN_BE_DEVICE)\r
-\r
-#include "EndpointStream.h"\r
-\r
-#if !defined(CONTROL_ONLY_DEVICE)\r
-uint8_t Endpoint_Discard_Stream(uint16_t Length,\r
-                                uint16_t* const BytesProcessed)\r
-{\r
-       uint8_t  ErrorCode;\r
-       uint16_t BytesInTransfer = 0;\r
-       \r
-       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
-         return ErrorCode;\r
-         \r
-       if (BytesProcessed != NULL)\r
-         Length -= *BytesProcessed;\r
-\r
-       while (Length)\r
-       {\r
-               if (!(Endpoint_IsReadWriteAllowed()))\r
-               {\r
-                       Endpoint_ClearOUT();\r
-\r
-                       if (BytesProcessed != NULL)\r
-                       {\r
-                               *BytesProcessed += BytesInTransfer;\r
-                               return ENDPOINT_RWSTREAM_IncompleteTransfer;\r
-                       }\r
-\r
-                       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
-                         return ErrorCode;\r
-               }\r
-               else\r
-               {\r
-                       Endpoint_Discard_Byte();\r
-\r
-                       Length--;\r
-                       BytesInTransfer++;\r
-               }\r
-       }\r
-       \r
-       return ENDPOINT_RWSTREAM_NoError;\r
-}\r
-\r
-uint8_t Endpoint_Null_Stream(uint16_t Length,\r
-                             uint16_t* const BytesProcessed)\r
-{\r
-       uint8_t  ErrorCode;\r
-       uint16_t BytesInTransfer = 0;\r
-       \r
-       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
-         return ErrorCode;\r
-         \r
-       if (BytesProcessed != NULL)\r
-         Length -= *BytesProcessed;\r
-\r
-       while (Length)\r
-       {\r
-               if (!(Endpoint_IsReadWriteAllowed()))\r
-               {\r
-                       Endpoint_ClearIN();\r
-\r
-                       if (BytesProcessed != NULL)\r
-                       {\r
-                               *BytesProcessed += BytesInTransfer;\r
-                               return ENDPOINT_RWSTREAM_IncompleteTransfer;\r
-                       }\r
-\r
-                       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
-                         return ErrorCode;\r
-               }\r
-               else\r
-               {\r
-                       Endpoint_Write_Byte(0);\r
-\r
-                       Length--;\r
-                       BytesInTransfer++;\r
-               }\r
-       }\r
-       \r
-       return ENDPOINT_RWSTREAM_NoError;\r
-}\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#endif\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
-#include "Template/Template_Endpoint_Control_W.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_Control_W.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_Control_W.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
-#include "Template/Template_Endpoint_Control_W.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_Control_W.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
-#include "Template/Template_Endpoint_Control_W.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
-#include "Template/Template_Endpoint_Control_R.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
-#include "Template/Template_Endpoint_Control_R.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
-#include "Template/Template_Endpoint_Control_R.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
-#include "Template/Template_Endpoint_Control_R.c"\r
-\r
-#endif
diff --git a/LUFA/Drivers/USB/HighLevel/EndpointStream.h b/LUFA/Drivers/USB/HighLevel/EndpointStream.h
deleted file mode 100644 (file)
index 726378b..0000000
+++ /dev/null
@@ -1,687 +0,0 @@
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2011.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-/** \file\r
- *  \brief USB device endpoint stream function definitions.\r
- *\r
- *  This file contains structures, function prototypes and macros related to the sending and receiving of\r
- *  arbitrary data streams through the device's data endpoints when the library is initialized in USB device mode.\r
- *\r
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
- *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
- */\r
-\r
-/** \ingroup Group_EndpointRW  \r
- *  \defgroup Group_EndpointStreamRW Read/Write of Multi-Byte Streams\r
- *\r
- *  Functions, macros, variables, enums and types related to data reading and writing of data streams from\r
- *  and to endpoints.\r
- *\r
- *  @{\r
- */ \r
-\r
-#ifndef __ENDPOINT_STREAM_H__\r
-#define __ENDPOINT_STREAM_H__\r
-\r
-       /* Includes: */\r
-               #include <avr/pgmspace.h>\r
-               #include <avr/eeprom.h>\r
-               #include <stdbool.h>\r
-\r
-               #include "../../../Common/Common.h"\r
-               #include "USBTask.h"\r
-               \r
-       /* Enable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       extern "C" {\r
-               #endif\r
-\r
-       /* Preprocessor Checks: */\r
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
-               #endif\r
-\r
-       /* Public Interface - May be used in end-application: */\r
-               /* Enums: */\r
-                       /** Enum for the possible error return codes of the \c Endpoint_*_Stream_* functions. */\r
-                       enum Endpoint_Stream_RW_ErrorCodes_t\r
-                       {\r
-                               ENDPOINT_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
-                               ENDPOINT_RWSTREAM_EndpointStalled    = 1, /**< The endpoint was stalled during the stream\r
-                                                                          *   transfer by the host or device.\r
-                                                                          */\r
-                               ENDPOINT_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during\r
-                                                                          *   the transfer.\r
-                                                                          */\r
-                               ENDPOINT_RWSTREAM_BusSuspended       = 3, /**< The USB bus has been suspended by the host and\r
-                                                                          *   no USB endpoint traffic can occur until the bus\r
-                                                                          *   has resumed.\r
-                                                                          */\r
-                               ENDPOINT_RWSTREAM_Timeout            = 4, /**< The host failed to accept or send the next packet\r
-                                                                          *   within the software timeout period set by the\r
-                                                                          *   \ref USB_STREAM_TIMEOUT_MS macro.\r
-                                                                          */\r
-                               ENDPOINT_RWSTREAM_IncompleteTransfer = 5, /**< Indicates that the endpoint bank became full or empty before\r
-                                                                          *   the complete contents of the current stream could be\r
-                                                                          *   transferred. The endpoint stream function should be called\r
-                                                                          *   again to process the next chunk of data in the transfer.\r
-                                                                          */\r
-                       };\r
-                       \r
-                       /** Enum for the possible error return codes of the \c Endpoint_*_Control_Stream_* functions. */\r
-                       enum Endpoint_ControlStream_RW_ErrorCodes_t\r
-                       {\r
-                               ENDPOINT_RWCSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
-                               ENDPOINT_RWCSTREAM_HostAborted        = 1, /**< The aborted the transfer prematurely. */\r
-                               ENDPOINT_RWCSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during\r
-                                                                           *   the transfer.\r
-                                                                           */\r
-                               ENDPOINT_RWCSTREAM_BusSuspended       = 3, /**< The USB bus has been suspended by the host and\r
-                                                                           *   no USB endpoint traffic can occur until the bus\r
-                                                                           *   has resumed.\r
-                                                                           */\r
-                       };\r
-\r
-               /* Function Prototypes: */\r
-\r
-                       /** \name Stream functions for null data */\r
-                       //@{\r
-\r
-                       /** Reads and discards the given number of bytes from the currently selected endpoint's bank,\r
-                        *  discarding fully read packets from the host as needed. The last packet is not automatically\r
-                        *  discarded once the remaining bytes has been read; the user is responsible for manually\r
-                        *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
-                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
-                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
-                        *  the endpoint bank becomes empty while there is still data to process (and after the current\r
-                        *  packet has been acknowledged) the BytesProcessed location will be updated with the total number\r
-                        *  of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
-                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
-                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note This routine should not be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \param[in] Length          Number of bytes to discard via the currently selected endpoint.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Discard_Stream(uint16_t Length,\r
-                                                       uint16_t* const BytesProcessed);\r
-\r
-                       /** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending\r
-                        *  full packets to the host as needed. The last packet is not automatically sent once the \r
-                        *  remaining bytes have been written; the user is responsible for manually sending the last\r
-                        *  packet to the host via the \ref Endpoint_ClearIN() macro.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
-                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
-                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
-                        *  the endpoint bank becomes full while there is still data to process (and after the current\r
-                        *  packet transmission has been initiated) the BytesProcessed location will be updated with the\r
-                        *  total number of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
-                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
-                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note This routine should not be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Null_Stream(uint16_t Length,\r
-                                                    uint16_t* const BytesProcessed);\r
-\r
-                       //@}\r
-\r
-                       /** \name Stream functions for RAM source/destination data */\r
-                       //@{\r
-               \r
-                       /** Writes the given number of bytes to the endpoint from the given buffer in little endian,\r
-                        *  sending full packets to the host as needed. The last packet filled is not automatically sent;\r
-                        *  the user is responsible for manually sending the last written packet to the host via the\r
-                        *  \ref Endpoint_ClearIN() macro.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
-                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
-                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
-                        *  the endpoint bank becomes full while there is still data to process (and after the current\r
-                        *  packet transmission has been initiated) the BytesProcessed location will be updated with the\r
-                        *  total number of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
-                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
-                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t DataStream[512];\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                            NULL)) != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  DataStream[512];\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note This routine should not be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Stream_LE(const void* const Buffer,\r
-                                                        uint16_t Length,\r
-                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Writes the given number of bytes to the endpoint from the given buffer in big endian,\r
-                        *  sending full packets to the host as needed. The last packet filled is not automatically sent;\r
-                        *  the user is responsible for manually sending the last written packet to the host via the\r
-                        *  \ref Endpoint_ClearIN() macro.\r
-                        *\r
-                        *  \note This routine should not be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Stream_BE(const void* const Buffer,\r
-                                                        uint16_t Length,\r
-                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       \r
-                       /** Reads the given number of bytes from the endpoint from the given buffer in little endian,\r
-                        *  discarding fully read packets from the host as needed. The last packet is not automatically\r
-                        *  discarded once the remaining bytes has been read; the user is responsible for manually\r
-                        *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
-                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
-                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
-                        *  the endpoint bank becomes empty while there is still data to process (and after the current\r
-                        *  packet has been acknowledged) the BytesProcessed location will be updated with the total number\r
-                        *  of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
-                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
-                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t DataStream[512];\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                           NULL)) != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  DataStream[512];\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note This routine should not be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the destination data buffer to write to.\r
-                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_Stream_LE(void* const Buffer,\r
-                                                       uint16_t Length,\r
-                                                       uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Reads the given number of bytes from the endpoint from the given buffer in big endian,\r
-                        *  discarding fully read packets from the host as needed. The last packet is not automatically\r
-                        *  discarded once the remaining bytes has been read; the user is responsible for manually\r
-                        *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.\r
-                        *\r
-                        *  \note This routine should not be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the destination data buffer to write to.\r
-                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_Stream_BE(void* const Buffer,\r
-                                                       uint16_t Length,\r
-                                                       uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,\r
-                        *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared\r
-                        *  in both failure and success states; the user is responsible for manually clearing the setup OUT to\r
-                        *  finalize the transfer via the \ref Endpoint_ClearOUT() macro.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer,\r
-                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,\r
-                        *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared\r
-                        *  in both failure and success states; the user is responsible for manually clearing the setup OUT to\r
-                        *  finalize the transfer via the \ref Endpoint_ClearOUT() macro.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer,\r
-                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,\r
-                        *  discarding fully read packets from the host as needed. The device IN acknowledgement is not\r
-                        *  automatically sent after success or failure states; the user is responsible for manually sending the\r
-                        *  setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
-                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer,\r
-                                                               uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,\r
-                        *  discarding fully read packets from the host as needed. The device IN acknowledgement is not\r
-                        *  automatically sent after success or failure states; the user is responsible for manually sending the\r
-                        *  setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
-                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer,\r
-                                                               uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-                       //@}\r
-\r
-                       /** \name Stream functions for EEPROM source/destination data */\r
-                       //@{\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_EStream_LE(const void* const Buffer,\r
-                                                         uint16_t Length,\r
-                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE().\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_EStream_BE(const void* const Buffer,\r
-                                                         uint16_t Length,\r
-                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Read_Stream_LE().\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.\r
-                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_EStream_LE(void* const Buffer,\r
-                                                        uint16_t Length,\r
-                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Read_Stream_BE().\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.\r
-                        *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                              transaction should be updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_EStream_BE(void* const Buffer,\r
-                                                        uint16_t Length,\r
-                                                        uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer,\r
-                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer,\r
-                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
-                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer,\r
-                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[out] Buffer  Pointer to the destination data buffer to write to.\r
-                        *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer,\r
-                                                                uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-                       //@}\r
-\r
-                       /** \name Stream functions for PROGMEM source/destination data */\r
-                       //@{\r
-\r
-                       /** FLASH buffer source version of \ref Endpoint_Write_Stream_LE().\r
-                        *\r
-                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_PStream_LE(const void* const Buffer,\r
-                                                         uint16_t Length,\r
-                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** FLASH buffer source version of \ref Endpoint_Write_Stream_BE().\r
-                        *\r
-                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current\r
-                        *                             transaction should be updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_PStream_BE(const void* const Buffer,\r
-                                                         uint16_t Length,\r
-                                                         uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE().\r
-                        *\r
-                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer,\r
-                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().\r
-                        *\r
-                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
-                        *\r
-                        *  \note This function automatically clears the control transfer's status stage. Do not manually attempt\r
-                        *        to clear the status stage when using this routine in a control transaction.\r
-                        *        \n\n\r
-                        *\r
-                        *  \note This routine should only be used on CONTROL type endpoints.\r
-                        *\r
-                        *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained\r
-                        *           together; i.e. the entire stream data must be read or written at the one time.\r
-                        *\r
-                        *  \param[in] Buffer  Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.\r
-                        *\r
-                        *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer,\r
-                                                                 uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);\r
-                       //@}\r
-\r
-       /* Disable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       }\r
-               #endif\r
-               \r
-#endif\r
-\r
-/** @} */\r
-
diff --git a/LUFA/Drivers/USB/HighLevel/Events.c b/LUFA/Drivers/USB/HighLevel/Events.c
deleted file mode 100644 (file)
index cd340fb..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_EVENTS_C
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "Events.h"
-
-void USB_Event_Stub(void)
-{
-
-}
-
diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h
deleted file mode 100644 (file)
index 368774b..0000000
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB controller events manager.
- *
- *  This file contains macros and functions relating to the management of library events, which are small
- *  pieces of code similar to ISRs which are run when a given condition is met. Each event can be fired from
- *  multiple places in the user or library code, which may or may not be inside an ISR, thus each handler
- *  should be written to be as small and fast as possible to prevent possible problems.
- *
- *  Events can be hooked by the user application by declaring a handler function with the same name and parameters
- *  listed here. If an event with no user-associated handler is fired within the library, it by default maps to an
- *  internal empty stub function.
- *
- *  Each event must only have one associated event handler, but can be raised by multiple sources by calling the
- *  event handler function (with any required event parameters).
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_Events USB Events
- *
- *  This module contains macros and functions relating to the management of library events, which are small
- *  pieces of code similar to ISRs which are run when a given condition is met. Each event can be fired from
- *  multiple places in the user or library code, which may or may not be inside an ISR, thus each handler
- *  should be written to be as small and fast as possible to prevent possible problems.
- *
- *  Events can be hooked by the user application by declaring a handler function with the same name and parameters
- *  listed here. If an event with no user-associated handler is fired within the library, it by default maps to an
- *  internal empty stub function.
- *
- *  Each event must only have one associated event handler, but can be raised by multiple sources by calling the
- *  event handler function (with any required event parameters).
- *
- *  @{
- */
-
-#ifndef __USBEVENTS_H__
-#define __USBEVENTS_H__
-
-       /* Includes: */
-               #include <stdint.h>
-
-               #include "../../../Common/Common.h"
-               #include "USBMode.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Pseudo-Functions for Doxygen: */
-               #if !defined(__INCLUDE_FROM_EVENTS_C) || defined(__DOXYGEN__)
-                       /** Event for USB mode pin level change. This event fires when the USB interface is set to dual role
-                        *  mode, and the UID pin level has changed to indicate a new mode (device or host). This event fires
-                        *  before the mode is switched to the newly indicated mode but after the \ref EVENT_USB_Device_Disconnect
-                        *  event has fired (if connected before the role change).
-                        *
-                        *  \note This event only exists on USB AVR models which support dual role modes.
-                        *        \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY tokens have been supplied
-                        *        to the compiler (see \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_UIDChange(void);
-
-                       /** Event for USB host error. This event fires when a hardware fault has occurred whilst the USB
-                        *  interface is in host mode.
-                        *
-                        *  \param[in] ErrorCode  Error code indicating the failure reason, a value in \ref USB_Host_ErrorCodes_t.
-                        *
-                        *  \note This event only exists on USB AVR models which supports host mode.
-                        *        \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
-
-                       /** Event for USB device attachment. This event fires when a the USB interface is in host mode, and
-                        *  a USB device has been connected to the USB interface. This is interrupt driven, thus fires before
-                        *  the standard \ref EVENT_USB_Device_Connect() event and so can be used to programmatically start the USB
-                        *  management task to reduce CPU consumption.
-                        *
-                        *  \note This event only exists on USB AVR models which supports host mode.
-                        *        \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        *
-                        *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
-                        */
-                       void EVENT_USB_Host_DeviceAttached(void);
-
-                       /** Event for USB device removal. This event fires when a the USB interface is in host mode, and
-                        *  a USB device has been removed the USB interface whether or not it has been enumerated. This
-                        *  can be used to programmatically stop the USB management task to reduce CPU consumption.
-                        *
-                        *  \note This event only exists on USB AVR models which supports host mode.
-                        *        \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        *
-                        *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
-                        */
-                       void EVENT_USB_Host_DeviceUnattached(void);
-
-                       /** Event for USB device enumeration failure. This event fires when a the USB interface is
-                        *  in host mode, and an attached USB device has failed to enumerate completely.
-                        *
-                        *  \param[in] ErrorCode     Error code indicating the failure reason, a value in
-                        *                           \ref USB_Host_EnumerationErrorCodes_t.
-                        *
-                        *  \param[in] SubErrorCode  Sub error code indicating the reason for failure - for example, if the
-                        *                           ErrorCode parameter indicates a control error, this will give the error
-                        *                           code returned by the \ref USB_Host_SendControlRequest() function.
-                        *
-                        *  \note This event only exists on USB AVR models which supports host mode.
-                        *        \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
-                                                                   const uint8_t SubErrorCode);
-
-                       /** Event for USB device enumeration completion. This event fires when a the USB interface is
-                        *  in host mode and an attached USB device has been completely enumerated and is ready to be
-                        *  controlled by the user application.
-                        *
-                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
-                        *  1 second) when a transaction is waiting to be processed by the device will prevent break communications
-                        *  and cause the host to reset the USB bus.
-                        */
-                       void EVENT_USB_Host_DeviceEnumerationComplete(void);
-
-                       /** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
-                        *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate
-                        *  millisecond timer source when the USB bus is not suspended while in host mode.
-                        *
-                        *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly
-                        *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
-                        *
-                        *  \note This event is not normally active - it must be manually enabled and disabled via the
-                        *        \ref USB_Host_EnableSOFEvents() and \ref USB_Host_DisableSOFEvents() commands after enumeration of
-                        *        a USB device.
-                        *        \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_Host_StartOfFrame(void);
-
-                       /** Event for USB device connection. This event fires when the AVR in device mode and the device is connected
-                        *  to a host, beginning the enumeration process, measured by a rising level on the AVR's VBUS pin.
-                        *
-                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
-                        *  two seconds) will prevent the device from enumerating correctly.
-                        *
-                        *  \note For the smaller series 2 USB AVRs with limited USB controllers, VBUS is not available to the USB controller.
-                        *        this means that the current connection state is derived from the bus suspension and wake up events by default,
-                        *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
-                        *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
-                        *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
-                        *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
-                        *        \n\n
-                        *
-                        *  \note This event may fire multiple times during device enumeration on the series 2 USB AVRs with limited USB controllers
-                        *        if \c NO_LIMITED_CONTROLLER_CONNECT is not defined.
-                        *
-                        *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage.
-                        */
-                       void EVENT_USB_Device_Connect(void);
-
-                       /** Event for USB device disconnection. This event fires when the AVR in device mode and the device is disconnected
-                        *  from a host, measured by a falling level on the AVR's VBUS pin.
-                        *
-                        *  \note For the smaller series 2 USB AVRs with limited USB controllers, VBUS is not available to the USB controller.
-                        *        this means that the current connection state is derived from the bus suspension and wake up events by default,
-                        *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
-                        *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
-                        *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
-                        *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
-                        *        \n\n
-                        *
-                        *  \note This event may fire multiple times during device enumeration on the series 2 USB AVRs with limited USB controllers
-                        *        if \c NO_LIMITED_CONTROLLER_CONNECT is not defined.
-                        *
-                        *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage.
-                        */
-                       void EVENT_USB_Device_Disconnect(void);
-
-                       /** Event for control requests. This event fires when a the USB host issues a control request
-                        *  to the mandatory device control endpoint (of address 0). This may either be a standard 
-                        *  request that the library may have a handler code for internally, or a class specific request
-                        *  issued to the device which must be handled appropriately. If a request is not processed in the
-                        *  user application via this event, it will be passed to the library for processing internally
-                        *  if a suitable handler exists.
-                        *
-                        *  This event is time-critical; each packet within the request transaction must be acknowledged or
-                        *  sent within 50ms or the host will abort the transfer.
-                        *
-                        *  The library internally handles all standard control requests with the exceptions of SYNC FRAME,
-                        *  SET DESCRIPTOR and SET INTERFACE. These and all other non-standard control requests will be left
-                        *  for the user to process via this event if desired. If not handled in the user application or by
-                        *  the library internally, unknown requests are automatically STALLed.
-                        *
-                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        *        \n\n
-                        *
-                        *  \note Requests should be handled in the same manner as described in the USB 2.0 Specification,
-                        *        or appropriate class specification. In all instances, the library has already read the
-                        *        request SETUP parameters into the \ref USB_ControlRequest structure which should then be used
-                        *        by the application to determine how to handle the issued request.
-                        */
-                       void EVENT_USB_Device_ControlRequest(void);
-
-                       /** Event for USB configuration number changed. This event fires when a the USB host changes the
-                        *  selected configuration number while in device mode. This event should be hooked in device
-                        *  applications to create the endpoints and configure the device for the selected configuration.
-                        *
-                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
-                        *  one second) will prevent the device from enumerating correctly.
-                        *
-                        *  This event fires after the value of \ref USB_ConfigurationNumber has been changed.
-                        *
-                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_Device_ConfigurationChanged(void);
-
-                       /** Event for USB suspend. This event fires when a the USB host suspends the device by halting its
-                        *  transmission of Start Of Frame pulses to the device. This is generally hooked in order to move
-                        *  the device over to a low power state until the host wakes up the device. If the USB interface is
-                        *  enumerated with the \ref USB_OPT_AUTO_PLL option set, the library will automatically suspend the
-                        *  USB PLL before the event is fired to save power.
-                        *
-                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        *        \n\n
-                        *
-                        *  \note This event does not exist on the series 2 USB AVRs when the \c NO_LIMITED_CONTROLLER_CONNECT
-                        *        compile time token is not set - see \ref EVENT_USB_Device_Disconnect.
-                        *
-                        *  \see \ref EVENT_USB_Device_WakeUp() event for accompanying Wake Up event.
-                        */
-                       void EVENT_USB_Device_Suspend(void);
-
-                       /** Event for USB wake up. This event fires when a the USB interface is suspended while in device
-                        *  mode, and the host wakes up the device by supplying Start Of Frame pulses. This is generally
-                        *  hooked to pull the user application out of a low power state and back into normal operating
-                        *  mode. If the USB interface is enumerated with the \ref USB_OPT_AUTO_PLL option set, the library
-                        *  will automatically restart the USB PLL before the event is fired.
-                        *
-                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        *        \n\n
-                        *
-                        *  \note This event does not exist on the series 2 USB AVRs when the \c NO_LIMITED_CONTROLLER_CONNECT
-                        *        compile time token is not set - see \ref EVENT_USB_Device_Connect.
-                        *
-                        *  \see \ref EVENT_USB_Device_Suspend() event for accompanying Suspend event.
-                        */
-                       void EVENT_USB_Device_WakeUp(void);
-
-                       /** Event for USB interface reset. This event fires when the USB interface is in device mode, and
-                        *  a the USB host requests that the device reset its interface. This event fires after the control
-                        *  endpoint has been automatically configured by the library.
-                        *
-                        *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
-                        *  two seconds) will prevent the device from enumerating correctly.
-                        *
-                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_Device_Reset(void);
-
-                       /** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
-                        *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate
-                        *  millisecond timer source when the USB bus is enumerated in device mode to a USB host.
-                        *
-                        *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly
-                        *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
-                        *
-                        *  \pre This event is not normally active - it must be manually enabled and disabled via the
-                        *       \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration.
-                        *       \n\n
-                        *
-                        *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
-                        *        \ref Group_USBManagement documentation).
-                        */
-                       void EVENT_USB_Device_StartOfFrame(void);
-               #endif
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Function Prototypes: */
-                       #if defined(__INCLUDE_FROM_EVENTS_C)
-                               void USB_Event_Stub(void) ATTR_CONST;
-
-                               #if defined(USB_CAN_BE_BOTH)
-                                       void EVENT_USB_UIDChange(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                               #endif
-
-                               #if defined(USB_CAN_BE_HOST)
-                                       void EVENT_USB_Host_HostError(const uint8_t ErrorCode) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Host_DeviceAttached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Host_DeviceUnattached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Host_DeviceEnumerationComplete(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
-                                                                const uint8_t SubErrorCode)
-                                                                                   ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Host_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                               #endif
-
-                               #if defined(USB_CAN_BE_DEVICE)
-                                       void EVENT_USB_Device_Connect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_Disconnect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_ControlRequest(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_ConfigurationChanged(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_Suspend(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_WakeUp(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_Reset(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                                       void EVENT_USB_Device_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
-                               #endif
-                       #endif
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/HighLevel/HostStandardReq.c b/LUFA/Drivers/USB/HighLevel/HostStandardReq.c
deleted file mode 100644 (file)
index 16d0ffb..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "USBMode.h"
-
-#if defined(USB_CAN_BE_HOST)
-
-#define  __INCLUDE_FROM_HOSTSTDREQ_C
-#include "HostStandardReq.h"
-
-uint8_t USB_Host_SendControlRequest(void* const BufferPtr)
-{
-       uint8_t* HeaderStream   = (uint8_t*)&USB_ControlRequest;
-       uint8_t* DataStream     = (uint8_t*)BufferPtr;
-       bool     BusSuspended   = USB_Host_IsBusSuspended();
-       uint8_t  ReturnStatus   = HOST_SENDCONTROL_Successful;
-       uint16_t DataLen        = USB_ControlRequest.wLength;
-
-       USB_Host_ResumeBus();
-
-       if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
-         goto End_Of_Control_Send;
-
-       Pipe_SetPipeToken(PIPE_TOKEN_SETUP);
-       Pipe_ClearErrorFlags();
-
-       Pipe_Unfreeze();
-
-       for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Request_Header_t); HeaderByte++)
-         Pipe_Write_Byte(*(HeaderStream++));
-
-       Pipe_ClearSETUP();
-
-       if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful)
-         goto End_Of_Control_Send;
-
-       Pipe_Freeze();
-
-       if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
-         goto End_Of_Control_Send;
-
-       if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
-       {
-               Pipe_SetPipeToken(PIPE_TOKEN_IN);
-
-               if (DataStream != NULL)
-               {
-                       while (DataLen)
-                       {
-                               Pipe_Unfreeze();
-
-                               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
-                                 goto End_Of_Control_Send;
-
-                               if (!(Pipe_BytesInPipe()))
-                                 DataLen = 0;
-
-                               while (Pipe_BytesInPipe() && DataLen)
-                               {
-                                       *(DataStream++) = Pipe_Read_Byte();
-                                       DataLen--;
-                               }
-
-                               Pipe_Freeze();
-                               Pipe_ClearIN();
-                       }
-               }
-
-               Pipe_SetPipeToken(PIPE_TOKEN_OUT);
-               Pipe_Unfreeze();
-
-               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
-                 goto End_Of_Control_Send;
-
-               Pipe_ClearOUT();
-
-               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
-                 goto End_Of_Control_Send;
-       }
-       else
-       {
-               if (DataStream != NULL)
-               {
-                       Pipe_SetPipeToken(PIPE_TOKEN_OUT);
-                       Pipe_Unfreeze();
-
-                       while (DataLen)
-                       {
-                               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
-                                 goto End_Of_Control_Send;
-
-                               while (DataLen && (Pipe_BytesInPipe() < USB_ControlPipeSize))
-                               {
-                                       Pipe_Write_Byte(*(DataStream++));
-                                       DataLen--;
-                               }
-
-                               Pipe_ClearOUT();
-                       }
-
-                       if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
-                         goto End_Of_Control_Send;
-
-                       Pipe_Freeze();
-               }
-
-               Pipe_SetPipeToken(PIPE_TOKEN_IN);
-               Pipe_Unfreeze();
-
-               if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
-                 goto End_Of_Control_Send;
-
-               Pipe_ClearIN();
-       }
-
-End_Of_Control_Send:
-       Pipe_Freeze();
-
-       if (BusSuspended)
-         USB_Host_SuspendBus();
-
-       Pipe_ResetPipe(PIPE_CONTROLPIPE);
-
-       return ReturnStatus;
-}
-
-static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType)
-{
-       #if (USB_HOST_TIMEOUT_MS < 0xFF)
-       uint8_t  TimeoutCounter = USB_HOST_TIMEOUT_MS;
-       #else
-       uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
-       #endif
-
-       while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())  ||
-                ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
-                ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady())))
-       {
-               uint8_t ErrorCode;
-
-               if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
-                 return ErrorCode;
-
-               if (!(TimeoutCounter--))
-                 return HOST_SENDCONTROL_SoftwareTimeOut;
-       }
-
-       return HOST_SENDCONTROL_Successful;
-}
-
-#endif
-
diff --git a/LUFA/Drivers/USB/HighLevel/HostStandardReq.h b/LUFA/Drivers/USB/HighLevel/HostStandardReq.h
deleted file mode 100644 (file)
index 9d2c205..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB host standard request management.
- *
- *  This file contains the function prototypes necessary for the issuing of outgoing standard control requests
- *  when the library is in USB host mode.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-#ifndef __HOSTSTDREQ_H__
-#define __HOSTSTDREQ_H__
-
-       /* Includes: */
-               #include <stdint.h>
-               #include <stdbool.h>
-
-               #include "USBMode.h"
-               #include "StdRequestType.h"
-               #include "../LowLevel/USBController.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Enums: */
-                       /** Enum for the \ref USB_Host_SendControlRequest() return code, indicating the reason for the error
-                        *  if the transfer of the request is unsuccessful.
-                        *
-                        *  \ingroup Group_PipeControlReq
-                        */
-                       enum USB_Host_SendControlErrorCodes_t
-                       {
-                               HOST_SENDCONTROL_Successful         = 0, /**< No error occurred in the request transfer. */
-                               HOST_SENDCONTROL_DeviceDisconnected = 1, /**< The attached device was disconnected during the
-                                                                       *   request transfer.
-                                                                       */
-                               HOST_SENDCONTROL_PipeError          = 2, /**< An error occurred in the pipe while sending the request. */
-                               HOST_SENDCONTROL_SetupStalled       = 3, /**< The attached device stalled the request, usually
-                                                                       *   indicating that the request is unsupported on the device.
-                                                                       */
-                               HOST_SENDCONTROL_SoftwareTimeOut    = 4, /**< The request or data transfer timed out. */
-                       };
-
-               /* Function Prototypes: */
-                       /** Sends the request stored in the \ref USB_ControlRequest global structure to the attached device,
-                        *  and transfers the data stored in the buffer to the device, or from the device to the buffer
-                        *  as requested. The transfer is made on the currently selected pipe.
-                        *
-                        *  \ingroup Group_PipeControlReq
-                        *
-                        *  \param[in] BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or
-                        *                        \c NULL if the request transfers no data to or from the device.
-                        *
-                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
-                        */
-                       uint8_t USB_Host_SendControlRequest(void* const BufferPtr);
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Enums: */
-                       enum USB_WaitForTypes_t
-                       {
-                               USB_HOST_WAITFOR_SetupSent,
-                               USB_HOST_WAITFOR_InReceived,
-                               USB_HOST_WAITFOR_OutReady,
-                       };
-
-               /* Function Prototypes: */
-                       #if defined(__INCLUDE_FROM_HOSTSTDREQ_C)
-                               static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType);
-                       #endif
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
diff --git a/LUFA/Drivers/USB/HighLevel/PipeStream.c b/LUFA/Drivers/USB/HighLevel/PipeStream.c
deleted file mode 100644 (file)
index 4465471..0000000
+++ /dev/null
@@ -1,216 +0,0 @@
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2011.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-#define  __INCLUDE_FROM_USB_DRIVER\r
-#include "USBMode.h"\r
-\r
-#if defined(USB_CAN_BE_HOST)\r
-\r
-#include "PipeStream.h"\r
-\r
-uint8_t Pipe_Discard_Stream(uint16_t Length,\r
-                            uint16_t* const BytesProcessed)\r
-{\r
-       uint8_t  ErrorCode;\r
-       uint16_t BytesInTransfer = 0;\r
-       \r
-       Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
-\r
-       if ((ErrorCode = Pipe_WaitUntilReady()))\r
-         return ErrorCode;\r
-\r
-       if (BytesProcessed != NULL)\r
-         Length -= *BytesProcessed;\r
-\r
-       while (Length)\r
-       {\r
-               if (!(Pipe_IsReadWriteAllowed()))\r
-               {\r
-                       Pipe_ClearIN();\r
-                               \r
-                       if (BytesProcessed != NULL)\r
-                       {\r
-                               *BytesProcessed += BytesInTransfer;\r
-                               return PIPE_RWSTREAM_IncompleteTransfer;\r
-                       }\r
-\r
-                       if ((ErrorCode = Pipe_WaitUntilReady()))\r
-                         return ErrorCode;\r
-               }\r
-               else\r
-               {\r
-                       Pipe_Discard_Byte();\r
-                       \r
-                       Length--;\r
-                       BytesInTransfer++;\r
-               }\r
-       }\r
-\r
-       return PIPE_RWSTREAM_NoError;\r
-}\r
-\r
-uint8_t Pipe_Null_Stream(uint16_t Length,\r
-                         uint16_t* const BytesProcessed)\r
-{\r
-       uint8_t  ErrorCode;\r
-       uint16_t BytesInTransfer = 0;\r
-       \r
-       Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
-\r
-       if ((ErrorCode = Pipe_WaitUntilReady()))\r
-         return ErrorCode;\r
-\r
-       if (BytesProcessed != NULL)\r
-         Length -= *BytesProcessed;\r
-\r
-       while (Length)\r
-       {\r
-               if (!(Pipe_IsReadWriteAllowed()))\r
-               {\r
-                       Pipe_ClearOUT();\r
-                               \r
-                       if (BytesProcessed != NULL)\r
-                       {\r
-                               *BytesProcessed += BytesInTransfer;\r
-                               return PIPE_RWSTREAM_IncompleteTransfer;\r
-                       }\r
-                       \r
-                       USB_USBTask();\r
-\r
-                       if ((ErrorCode = Pipe_WaitUntilReady()))\r
-                         return ErrorCode;\r
-               }\r
-               else\r
-               {\r
-                       Pipe_Write_Byte(0);\r
-                       \r
-                       Length--;\r
-                       BytesInTransfer++;\r
-               }\r
-       }\r
-\r
-       return PIPE_RWSTREAM_NoError;\r
-}\r
-\r
-/* The following abuses the C preprocessor in order to copy-past common code with slight alterations,\r
- * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*BufferPtr)\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte(BufferPtr))\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte(BufferPtr))\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*BufferPtr)\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte(BufferPtr))\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      const void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte(BufferPtr))\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_Byte()\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_LE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_Byte())\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_Byte()\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_BE\r
-#define  TEMPLATE_BUFFER_TYPE                      void*\r
-#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
-#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
-#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
-#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_Byte())\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#endif\r
-
diff --git a/LUFA/Drivers/USB/HighLevel/PipeStream.h b/LUFA/Drivers/USB/HighLevel/PipeStream.h
deleted file mode 100644 (file)
index 38ab09f..0000000
+++ /dev/null
@@ -1,465 +0,0 @@
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2011.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-           www.lufa-lib.org\r
-*/\r
-\r
-/*\r
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
\r
-/** \file\r
- *  \brief USB host pipe stream function definitions.\r
- *\r
- *  This file contains structures, function prototypes and macros related to the sending and receiving of\r
- *  arbitrary data streams through the device's data pipes when the library is initialized in USB host mode.\r
- *\r
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
- *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
- */\r
-\r
-/** \ingroup Group_PipeRW  \r
- *  \defgroup Group_PipeStreamRW Read/Write of Multi-Byte Streams\r
- *\r
- *  Functions, macros, variables, enums and types related to data reading and writing of data streams from\r
- *  and to pipes.\r
- *\r
- *  @{\r
- */\r
-\r
-#ifndef __PIPE_STREAM_H__\r
-#define __PIPE_STREAM_H__\r
-\r
-       /* Includes: */\r
-               #include <avr/pgmspace.h>\r
-               #include <avr/eeprom.h>\r
-               #include <stdbool.h>\r
-\r
-               #include "../../../Common/Common.h"\r
-               #include "USBTask.h"\r
-               \r
-       /* Enable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       extern "C" {\r
-               #endif\r
-\r
-       /* Preprocessor Checks: */\r
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
-               #endif\r
-               \r
-       /* Public Interface - May be used in end-application: */\r
-               /* Enums: */\r
-                       /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */\r
-                       enum Pipe_Stream_RW_ErrorCodes_t\r
-                       {\r
-                               PIPE_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
-                               PIPE_RWSTREAM_PipeStalled        = 1, /**< The device stalled the pipe during the transfer. */          \r
-                               PIPE_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during\r
-                                                                  *   the transfer.\r
-                                                                  */           \r
-                               PIPE_RWSTREAM_Timeout            = 3, /**< The device failed to accept or send the next packet\r
-                                                                      *   within the software timeout period set by the\r
-                                                                      *   \ref USB_STREAM_TIMEOUT_MS macro.\r
-                                                                      */\r
-                               PIPE_RWSTREAM_IncompleteTransfer = 4, /**< Indicates that the pipe bank became full/empty before the\r
-                                                                      *   complete contents of the stream could be transferred.\r
-                                                                      */\r
-                       };\r
-\r
-               /* Function Prototypes: */\r
-\r
-                       /** \name Stream functions for null data */\r
-                       //@{\r
-\r
-                       /** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host\r
-                        *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the\r
-                        *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or\r
-                        *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer\r
-                        *  will instead be performed as a series of chunks. Each time the pipe bank becomes empty while there is still data\r
-                        *  to process (and after the current packet has been acknowledged) the BytesProcessed location will be updated with\r
-                        *  the total number of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to\r
-                        *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed\r
-                        *  value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Pipe_Discard_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Pipe_Discard_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
-                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
-                        *\r
-                        *  \param[in] Length          Number of bytes to discard via the currently selected pipe.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be processed at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Discard_Stream(uint16_t Length,\r
-                                                   uint16_t* const BytesProcessed);\r
-\r
-                       /** Writes a given number of zeroed bytes to the pipe, sending full pipe packets from the host to the device\r
-                        *  as needed. The last packet is not automatically sent once the remaining bytes has been written; the\r
-                        *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearOUT() macro.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or\r
-                        *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer\r
-                        *  will instead be performed as a series of chunks. Each time the pipe bank becomes full while there is still data\r
-                        *  to process (and after the current packet transmission has been initiated) the BytesProcessed location will be\r
-                        *  updated with the total number of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to\r
-                        *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed\r
-                        *  value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Pipe_Null_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Pipe_Null_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
-                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
-                        *\r
-                        *  \param[in] Length          Number of zero bytes to write via the currently selected pipe.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be processed at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Null_Stream(uint16_t Length,\r
-                                                uint16_t* const BytesProcessed);\r
-\r
-                       //@}\r
-\r
-                       /** \name Stream functions for RAM source/destination data */\r
-                       //@{\r
-                       \r
-                       /** Writes the given number of bytes to the pipe from the given buffer in little endian,\r
-                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
-                        *  the user is responsible for manually sending the last written packet to the host via the\r
-                        *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is\r
-                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
-                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
-                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
-                        *  the pipe bank becomes full while there is still data to process (and after the current\r
-                        *  packet transmission has been initiated) the BytesProcessed location will be updated with the\r
-                        *  total number of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
-                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
-                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t DataStream[512];\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                        NULL)) != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  DataStream[512];\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                           &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
-                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Write_Stream_LE(const void* const Buffer,\r
-                                                    uint16_t Length,\r
-                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Writes the given number of bytes to the pipe from the given buffer in big endian,\r
-                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
-                        *  the user is responsible for manually sending the last written packet to the host via the\r
-                        *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is\r
-                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
-                        *\r
-                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
-                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Write_Stream_BE(const void* const Buffer,\r
-                                                    uint16_t Length,\r
-                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Reads the given number of bytes from the pipe into the given buffer in little endian,\r
-                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
-                        *  the user is responsible for manually sending the last written packet to the host via the\r
-                        *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is\r
-                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
-                        *\r
-                        *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,\r
-                        *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid\r
-                        *  storage location, the transfer will instead be performed as a series of chunks. Each time\r
-                        *  the pipe bank becomes empty while there is still data to process (and after the current\r
-                        *  packet has been acknowledged) the BytesProcessed location will be updated with the total number\r
-                        *  of bytes processed in the stream, and the function will exit with an error code of\r
-                        *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed\r
-                        *  in the user code - to continue the transfer, call the function again with identical parameters\r
-                        *  and it will resume until the BytesProcessed value reaches the total transfer length.\r
-                        *\r
-                        *  <b>Single Stream Transfer Example:</b>\r
-                        *  \code\r
-                        *  uint8_t DataStream[512];\r
-                        *  uint8_t ErrorCode;\r
-                        *\r
-                        *  if ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                       NULL)) != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *       // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  <b>Partial Stream Transfers Example:</b>\r
-                        *  \code\r
-                        *  uint8_t  DataStream[512];\r
-                        *  uint8_t  ErrorCode;\r
-                        *  uint16_t BytesProcessed;\r
-                        *\r
-                        *  BytesProcessed = 0;\r
-                        *  while ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),\r
-                        *                                          &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)\r
-                        *  {\r
-                        *      // Stream not yet complete - do other actions here, abort if required\r
-                        *  }\r
-                        *\r
-                        *  if (ErrorCode != PIPE_RWSTREAM_NoError)\r
-                        *  {\r
-                        *      // Stream failed to complete - check ErrorCode here\r
-                        *  }\r
-                        *  \endcode\r
-                        *\r
-                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
-                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
-                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                              updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Read_Stream_LE(void* const Buffer,\r
-                                                   uint16_t Length,\r
-                                                   uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** Reads the given number of bytes from the pipe into the given buffer in big endian,\r
-                        *  sending full packets to the device as needed. The last packet filled is not automatically sent;\r
-                        *  the user is responsible for manually sending the last written packet to the host via the\r
-                        *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is\r
-                        *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.\r
-                        *\r
-                        *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without\r
-                        *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
-                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                              updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Read_Stream_BE(void* const Buffer,\r
-                                                   uint16_t Length,\r
-                                                   uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       //@}\r
-\r
-                       /** \name Stream functions for EEPROM source/destination data */\r
-                       //@{\r
-                       \r
-                       /** EEPROM buffer source version of \ref Pipe_Write_Stream_LE().\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Write_EStream_LE(const void* const Buffer,\r
-                                                     uint16_t Length,\r
-                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       \r
-                       /** EEPROM buffer source version of \ref Pipe_Write_Stream_BE().\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Write_EStream_BE(const void* const Buffer,\r
-                                                     uint16_t Length,\r
-                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-\r
-                       /** EEPROM buffer source version of \ref Pipe_Read_Stream_LE().\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
-                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                              updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Read_EStream_LE(void* const Buffer,\r
-                                                    uint16_t Length,\r
-                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       \r
-                       /** EEPROM buffer source version of \ref Pipe_Read_Stream_BE().\r
-                        *\r
-                        *  \param[out] Buffer          Pointer to the source data buffer to write to.\r
-                        *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.\r
-                        *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                              updated, \c NULL if the entire stream should be read at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Read_EStream_BE(void* const Buffer,\r
-                                                    uint16_t Length,\r
-                                                    uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       //@}\r
-\r
-                       /** \name Stream functions for PROGMEM source/destination data */\r
-                       //@{\r
-                       \r
-                       /** FLASH buffer source version of \ref Pipe_Write_Stream_LE().\r
-                        *\r
-                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Write_PStream_LE(const void* const Buffer,\r
-                                                     uint16_t Length,\r
-                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       \r
-                       /** FLASH buffer source version of \ref Pipe_Write_Stream_BE().\r
-                        *\r
-                        *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.\r
-                        *\r
-                        *  \param[in] Buffer          Pointer to the source data buffer to read from.\r
-                        *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.\r
-                        *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should\r
-                        *                             updated, \c NULL if the entire stream should be written at once.\r
-                        *\r
-                        *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.\r
-                        */\r
-                       uint8_t Pipe_Write_PStream_BE(const void* const Buffer,\r
-                                                     uint16_t Length,\r
-                                                     uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);\r
-                       //@}\r
-\r
-       /* Disable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       }\r
-               #endif\r
-       \r
-#endif\r
-\r
-/** @} */\r
-
diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
deleted file mode 100644 (file)
index 7b8f4d7..0000000
+++ /dev/null
@@ -1,692 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB standard descriptor definitions.
- *
- *  This file contains structures and macros for the easy creation of standard USB descriptors in USB device projects.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_Descriptors USB Descriptors
- *
- *  Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains
- *  structures and macros for the easy creation of standard USB descriptors in USB device projects.
- *
- *  @{
- */
-
-#ifndef __USBDESCRIPTORS_H__
-#define __USBDESCRIPTORS_H__
-
-       /* Includes: */
-               #include <avr/pgmspace.h>
-               #include <stdbool.h>
-               #include <stdint.h>
-               #include <stddef.h>
-
-               #include "../../../Common/Common.h"
-               #include "USBMode.h"
-               #include "Events.h"
-
-               #if defined(USB_CAN_BE_DEVICE)
-                       #include "../LowLevel/Device.h"
-               #endif
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** Indicates that a given descriptor does not exist in the device. This can be used inside descriptors
-                        *  for string descriptor indexes, or may be use as a return value for GetDescriptor when the specified
-                        *  descriptor does not exist.
-                        */
-                       #define NO_DESCRIPTOR                     0
-
-                       #if (!defined(NO_INTERNAL_SERIAL) && \
-                            (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__) || \
-                             defined(__AVR_ATmega32U6__) || defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__) ||  \
-                             defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__)  || defined(__AVR_ATmega8U2__)))
-                               /** String descriptor index for the device's unique serial number string descriptor within the device.
-                                *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
-                                *  number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain
-                                *  a unique serial number internally, and setting the device descriptors serial number string index to this value
-                                *  will cause it to use the internal serial number.
-                                *
-                                *  On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseudo-serial
-                                *  number for the device.
-                                */
-                               #define USE_INTERNAL_SERIAL           0xDC
-                       #else
-                               #define USE_INTERNAL_SERIAL           NO_DESCRIPTOR
-                       #endif
-
-                       /** Macro to calculate the power value for the configuration descriptor, from a given number of milliamperes. */
-                       #define USB_CONFIG_POWER_MA(mA)           ((mA) >> 1)
-
-                       /** Macro to calculate the Unicode length of a string with a given number of Unicode characters.
-                        *  Should be used in string descriptor's headers for giving the string descriptor's byte length.
-                        */
-                       #define USB_STRING_LEN(str)               (sizeof(USB_Descriptor_Header_t) + ((str) << 1))
-
-                       /** Macro to encode a given four digit floating point version number (e.g. 01.23) into Binary Coded
-                        *  Decimal format for descriptor fields requiring BCD encoding, such as the USB version number in the
-                        *  standard device descriptor.
-                        */
-                       #define VERSION_BCD(x)                    ((((VERSION_TENS(x) << 4) | VERSION_ONES(x)) << 8) | \
-                                                                 ((VERSION_TENTHS(x) << 4) | VERSION_HUNDREDTHS(x)))
-
-                       /** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors
-                        *  to indicate that the English language is supported by the device in its string descriptors.
-                        */
-                       #define LANGUAGE_ID_ENG                   0x0409
-
-                       /** \name Endpoint Address Direction Masks */
-                       //@{
-                       /** Can be masked with an endpoint address for a \ref USB_Descriptor_Endpoint_t endpoint descriptor's
-                        *  EndpointAddress value to indicate to the host that the endpoint is of the IN direction (i.e, from
-                        *  device to host).
-                        */
-                       #define ENDPOINT_DESCRIPTOR_DIR_IN        0x80
-
-                       /** Can be masked with an endpoint address for a \ref USB_Descriptor_Endpoint_t endpoint descriptor's
-                        *  EndpointAddress value to indicate to the host that the endpoint is of the OUT direction (i.e, from
-                        *  host to device).
-                        */
-                       #define ENDPOINT_DESCRIPTOR_DIR_OUT       0x00
-                       //@}
-
-                       /** \name USB Configuration Descriptor Attribute Masks */
-                       //@{
-                       /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
-                        *  descriptor's ConfigAttributes value to indicate that the specified configuration can draw its power
-                        *  from the host's VBUS line.
-                        */
-                       #define USB_CONFIG_ATTR_BUSPOWERED        0x80
-
-                       /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
-                        *  descriptor's ConfigAttributes value to indicate that the specified configuration can draw its power
-                        *  from the device's own power source.
-                        */
-                       #define USB_CONFIG_ATTR_SELFPOWERED       0x40
-
-                       /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
-                        *  descriptor's ConfigAttributes value to indicate that the specified configuration supports the
-                        *  remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon
-                        *  request.
-                        */
-                       #define USB_CONFIG_ATTR_REMOTEWAKEUP      0x20
-                       //@}
-                       
-                       /** \name Endpoint Descriptor Attribute Masks */
-                       //@{
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is not synchronized.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint attributes.
-                        */
-                       #define ENDPOINT_ATTR_NO_SYNC             (0 << 2)
-
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is asynchronous.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint attributes.
-                        */
-                       #define ENDPOINT_ATTR_ASYNC               (1 << 2)
-
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is adaptive.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint attributes.
-                        */
-                       #define ENDPOINT_ATTR_ADAPTIVE            (2 << 2)
-
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is synchronized.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint attributes.
-                        */
-                       #define ENDPOINT_ATTR_SYNC                (3 << 2)
-                       //@}
-                       
-                       /** \name Endpoint Descriptor Usage Masks */
-                       //@{
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is used for data transfers.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint usage attributes.
-                        */
-                       #define ENDPOINT_USAGE_DATA               (0 << 4)
-
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is used for feedback.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint usage attributes.
-                        */
-                       #define ENDPOINT_USAGE_FEEDBACK           (1 << 4)
-
-                       /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
-                        *  Attributes value to indicate that the specified endpoint is used for implicit feedback.
-                        *
-                        *  \see The USB specification for more details on the possible Endpoint usage attributes.
-                        */
-                       #define ENDPOINT_USAGE_IMPLICIT_FEEDBACK  (2 << 4)
-                       //@}
-                       
-               /* Enums: */
-                       /** Enum for the possible standard descriptor types, as given in each descriptor's header. */
-                       enum USB_DescriptorTypes_t
-                       {
-                               DTYPE_Device                    = 0x01, /**< Indicates that the descriptor is a device descriptor. */
-                               DTYPE_Configuration             = 0x02, /**< Indicates that the descriptor is a configuration descriptor. */
-                               DTYPE_String                    = 0x03, /**< Indicates that the descriptor is a string descriptor. */
-                               DTYPE_Interface                 = 0x04, /**< Indicates that the descriptor is an interface descriptor. */
-                               DTYPE_Endpoint                  = 0x05, /**< Indicates that the descriptor is an endpoint descriptor. */
-                               DTYPE_DeviceQualifier           = 0x06, /**< Indicates that the descriptor is a device qualifier descriptor. */
-                               DTYPE_Other                     = 0x07, /**< Indicates that the descriptor is of other type. */
-                               DTYPE_InterfacePower            = 0x08, /**< Indicates that the descriptor is an interface power descriptor. */
-                               DTYPE_InterfaceAssociation      = 0x0B, /**< Indicates that the descriptor is an interface association descriptor. */
-                               DTYPE_CSInterface               = 0x24, /**< Indicates that the descriptor is a class specific interface descriptor. */
-                               DTYPE_CSEndpoint                = 0x25, /**< Indicates that the descriptor is a class specific endpoint descriptor. */
-                       };
-
-                       /** Enum for possible Class, Subclass and Protocol values of device and interface descriptors. */
-                       enum USB_Descriptor_ClassSubclassProtocol_t
-                       {
-                               USB_CSCP_NoDeviceClass          = 0x00, /**< Descriptor Class value indicating that the device does not belong
-                                                                        *   to a particular class at the device level.
-                                                                        */
-                               USB_CSCP_NoDeviceSubclass       = 0x00, /**< Descriptor Subclass value indicating that the device does not belong
-                                                                        *   to a particular subclass at the device level.
-                                                                        */
-                               USB_CSCP_NoDeviceProtocol       = 0x00, /**< Descriptor Protocol value indicating that the device does not belong
-                                                                        *   to a particular protocol at the device level.
-                                                                        */
-                               USB_CSCP_VendorSpecificClass    = 0xFF, /**< Descriptor Class value indicating that the device/interface belongs
-                                                                        *   to a vendor specific class.
-                                                                        */
-                               USB_CSCP_VendorSpecificSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device/interface belongs
-                                                                        *   to a vendor specific subclass.
-                                                                        */
-                               USB_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device/interface belongs
-                                                                        *   to a vendor specific protocol.
-                                                                        */
-                               USB_CSCP_IADDeviceClass         = 0xEF, /**< Descriptor Class value indicating that the device belongs to the
-                                                                        *   Interface Association Descriptor class.
-                                                                        */
-                               USB_CSCP_IADDeviceSubclass      = 0x02, /**< Descriptor Subclass value indicating that the device belongs to the
-                                                                        *   Interface Association Descriptor subclass.
-                                                                        */
-                               USB_CSCP_IADDeviceProtocol      = 0x01, /**< Descriptor Protocol value indicating that the device belongs to the
-                                                                        *   Interface Association Descriptor protocol.
-                                                                        */
-                       };
-
-               /* Type Defines: */
-                       /** \brief Standard USB Descriptor Header (LUFA naming conventions).
-                        *
-             *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure
-                        *  uses LUFA-specific element names to make each element's purpose clearer.
-                        *
-                        *  \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t Size; /**< Size of the descriptor, in bytes. */
-                               uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
-                                              *   given by the specific class.
-                                              */
-                       } USB_Descriptor_Header_t;
-
-                       /** \brief Standard USB Descriptor Header (USB-IF naming conventions).
-                        *
-                        *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure
-                        *  uses the relevant standard's given element names to ensure compatibility with the standard.
-                        *
-                        *  \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
-                                                         *   given by the specific class.
-                                                         */
-                       } USB_StdDescriptor_Header_t;
-
-                       /** \brief Standard USB Device Descriptor (LUFA naming conventions).
-                        *
-                        *  Type define for a standard Device Descriptor. This structure uses LUFA-specific element names to make each
-                        *  element's purpose clearer.
-                        *
-                        *  \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
-
-                               uint16_t USBSpecification; /**< BCD of the supported USB specification. */
-                               uint8_t  Class; /**< USB device class. */
-                               uint8_t  SubClass; /**< USB device subclass. */
-                               uint8_t  Protocol; /**< USB device protocol. */
-
-                               uint8_t  Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */
-
-                               uint16_t VendorID; /**< Vendor ID for the USB product. */
-                               uint16_t ProductID; /**< Unique product ID for the USB product. */
-                               uint16_t ReleaseNumber; /**< Product release (version) number. */
-
-                               uint8_t  ManufacturerStrIndex; /**< String index for the manufacturer's name. The
-                                                               *   host will request this string via a separate
-                                                               *   control request for the string descriptor.
-                                                               *
-                                                               *   \note If no string supplied, use \ref NO_DESCRIPTOR.
-                                                               */
-                               uint8_t  ProductStrIndex; /**< String index for the product name/details.
-                                                          *
-                                                          *  \see ManufacturerStrIndex structure entry.
-                                                          */
-                               uint8_t  SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal
-                                                            *   serial number, in uppercase Unicode ASCII.
-                                                            *
-                                                            *  \note On some AVR models, there is an embedded serial number
-                                                            *        in the chip which can be used for the device serial number.
-                                                            *        To use this serial number, set this to USE_INTERNAL_SERIAL.
-                                                            *        On unsupported devices, this will evaluate to 0 and will cause
-                                                            *        the host to generate a pseudo-unique value for the device upon
-                                                            *        insertion.
-                                                            *
-                                                            *  \see ManufacturerStrIndex structure entry.
-                                                            */
-                               uint8_t  NumberOfConfigurations; /**< Total number of configurations supported by
-                                                                 *   the device.
-                                                                 */
-                       } USB_Descriptor_Device_t;
-
-                       /** \brief Standard USB Device Descriptor (USB-IF naming conventions).
-                        *
-                        *  Type define for a standard Device Descriptor. This structure uses the relevant standard's given element names
-                        *  to ensure compatibility with the standard.
-                        *
-                        *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t  bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
-                                                             *   given by the specific class.
-                                                             */
-                               uint16_t bcdUSB; /**< BCD of the supported USB specification. */
-                               uint8_t  bDeviceClass; /**< USB device class. */
-                               uint8_t  bDeviceSubClass; /**< USB device subclass. */
-                               uint8_t  bDeviceProtocol; /**< USB device protocol. */
-                               uint8_t  bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */
-                               uint16_t idVendor; /**< Vendor ID for the USB product. */
-                               uint16_t idProduct; /**< Unique product ID for the USB product. */
-                               uint16_t bcdDevice; /**< Product release (version) number. */
-                               uint8_t  iManufacturer; /**< String index for the manufacturer's name. The
-                                                        *   host will request this string via a separate
-                                                        *   control request for the string descriptor.
-                                                        *
-                                                        *   \note If no string supplied, use \ref NO_DESCRIPTOR.
-                                                        */
-                               uint8_t  iProduct; /**< String index for the product name/details.
-                                                   *
-                                                   *  \see ManufacturerStrIndex structure entry.
-                                                   */
-                               uint8_t iSerialNumber; /**< String index for the product's globally unique hexadecimal
-                                                       *   serial number, in uppercase Unicode ASCII.
-                                                       *
-                                                       *  \note On some AVR models, there is an embedded serial number
-                                                       *        in the chip which can be used for the device serial number.
-                                                       *        To use this serial number, set this to USE_INTERNAL_SERIAL.
-                                                       *        On unsupported devices, this will evaluate to 0 and will cause
-                                                       *        the host to generate a pseudo-unique value for the device upon
-                                                       *        insertion.
-                                                       *
-                                                       *  \see ManufacturerStrIndex structure entry.
-                                                       */
-                               uint8_t  bNumConfigurations; /**< Total number of configurations supported by
-                                                             *   the device.
-                                                             */
-                       } USB_StdDescriptor_Device_t;
-
-                       /** \brief Standard USB Configuration Descriptor (LUFA naming conventions).
-                        *
-                        *  Type define for a standard Configuration Descriptor header. This structure uses LUFA-specific element names
-                        *  to make each element's purpose clearer.
-                        *
-                        *  \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
-
-                               uint16_t TotalConfigurationSize; /**< Size of the configuration descriptor header,
-                                                                 *   and all sub descriptors inside the configuration.
-                                                                 */
-                               uint8_t  TotalInterfaces; /**< Total number of interfaces in the configuration. */
-
-                               uint8_t  ConfigurationNumber; /**< Configuration index of the current configuration. */
-                               uint8_t  ConfigurationStrIndex; /**< Index of a string descriptor describing the configuration. */
-
-                               uint8_t  ConfigAttributes; /**< Configuration attributes, comprised of a mask of zero or
-                                                           *   more USB_CONFIG_ATTR_* masks.
-                                                           */
-
-                               uint8_t  MaxPowerConsumption; /**< Maximum power consumption of the device while in the
-                                                              *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA()
-                                                              *   macro.
-                                                              */
-                       } USB_Descriptor_Configuration_Header_t;
-
-                       /** \brief Standard USB Configuration Descriptor (USB-IF naming conventions).
-                        *
-                        *  Type define for a standard Configuration Descriptor header. This structure uses the relevant standard's given element names
-                        *  to ensure compatibility with the standard.
-                        *
-                        *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t  bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
-                                                             *   given by the specific class.
-                                                             */
-                               uint16_t wTotalLength; /**< Size of the configuration descriptor header,
-                                                          *   and all sub descriptors inside the configuration.
-                                                          */
-                               uint8_t  bNumInterfaces; /**< Total number of interfaces in the configuration. */
-                               uint8_t  bConfigurationValue; /**< Configuration index of the current configuration. */
-                               uint8_t  iConfiguration; /**< Index of a string descriptor describing the configuration. */
-                               uint8_t  bmAttributes; /**< Configuration attributes, comprised of a mask of zero or
-                                                       *   more USB_CONFIG_ATTR_* masks.
-                                                       */
-                               uint8_t  bMaxPower; /**< Maximum power consumption of the device while in the
-                                                    *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA()
-                                                    *   macro.
-                                                    */
-                       } USB_StdDescriptor_Configuration_Header_t;
-
-                       /** \brief Standard USB Interface Descriptor (LUFA naming conventions).
-                        *
-                        *  Type define for a standard Interface Descriptor. This structure uses LUFA-specific element names
-                        *  to make each element's purpose clearer.
-                        *
-                        *  \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
-
-                               uint8_t InterfaceNumber; /**< Index of the interface in the current configuration. */
-                               uint8_t AlternateSetting; /**< Alternate setting for the interface number. The same
-                                                          *   interface number can have multiple alternate settings
-                                                          *   with different endpoint configurations, which can be
-                                                          *   selected by the host.
-                                                          */
-                               uint8_t TotalEndpoints; /**< Total number of endpoints in the interface. */
-
-                               uint8_t Class; /**< Interface class ID. */
-                               uint8_t SubClass; /**< Interface subclass ID. */
-                               uint8_t Protocol; /**< Interface protocol ID. */
-
-                               uint8_t InterfaceStrIndex; /**< Index of the string descriptor describing the interface. */
-                       } USB_Descriptor_Interface_t;
-
-                       /** \brief Standard USB Interface Descriptor (USB-IF naming conventions).
-                        *
-                        *  Type define for a standard Interface Descriptor. This structure uses the relevant standard's given element names
-                        *  to ensure compatibility with the standard.
-                        *
-                        *  \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
-                                                         *   given by the specific class.
-                                                         */
-                               uint8_t bInterfaceNumber; /**< Index of the interface in the current configuration. */
-                               uint8_t bAlternateSetting; /**< Alternate setting for the interface number. The same
-                                                           *   interface number can have multiple alternate settings
-                                                           *   with different endpoint configurations, which can be
-                                                           *   selected by the host.
-                                                           */
-                               uint8_t bNumEndpoints; /**< Total number of endpoints in the interface. */
-                               uint8_t bInterfaceClass; /**< Interface class ID. */
-                               uint8_t bInterfaceSubClass; /**< Interface subclass ID. */
-                               uint8_t bInterfaceProtocol; /**< Interface protocol ID. */
-                               uint8_t iInterface; /**< Index of the string descriptor describing the
-                                                    *   interface.
-                                                    */
-                       } USB_StdDescriptor_Interface_t;
-
-                       /** \brief Standard USB Interface Association Descriptor (LUFA naming conventions).
-                        *
-                        *  Type define for a standard Interface Association Descriptor. This structure uses LUFA-specific element names
-                        *  to make each element's purpose clearer.
-                        *
-                        *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
-                        *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
-                        *  devices with multiple interfaces related to the same function to have the multiple interfaces bound
-                        *  together at the point of enumeration, loading one generic driver for all the interfaces in the single
-                        *  function. Read the ECN for more information.
-                        *
-                        *  \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
-
-                               uint8_t FirstInterfaceIndex; /**< Index of the first associated interface. */
-                               uint8_t TotalInterfaces; /**< Total number of associated interfaces. */
-
-                               uint8_t Class; /**< Interface class ID. */
-                               uint8_t SubClass; /**< Interface subclass ID. */
-                               uint8_t Protocol; /**< Interface protocol ID. */
-
-                               uint8_t IADStrIndex; /**< Index of the string descriptor describing the
-                                                     *   interface association.
-                                                     */
-                       } USB_Descriptor_Interface_Association_t;
-
-                       /** \brief Standard USB Interface Association Descriptor (USB-IF naming conventions).
-                        *
-                        *  Type define for a standard Interface Association Descriptor. This structure uses the relevant standard's given
-                        *  element names to ensure compatibility with the standard.
-                        *
-                        *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
-                        *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
-                        *  devices with multiple interfaces related to the same function to have the multiple interfaces bound
-                        *  together at the point of enumeration, loading one generic driver for all the interfaces in the single
-                        *  function. Read the ECN for more information.
-                        *
-                        *  \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific
-                        *       element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
-                                                         *   given by the specific class.
-                                                         */
-                               uint8_t bFirstInterface; /**< Index of the first associated interface. */
-                               uint8_t bInterfaceCount; /**< Total number of associated interfaces. */
-                               uint8_t bFunctionClass; /**< Interface class ID. */
-                               uint8_t bFunctionSubClass; /**< Interface subclass ID. */
-                               uint8_t bFunctionProtocol; /**< Interface protocol ID. */
-                               uint8_t iFunction; /**< Index of the string descriptor describing the
-                                                   *   interface association.
-                                                   */
-                       } USB_StdDescriptor_Interface_Association_t;
-
-                       /** \brief Standard USB Endpoint Descriptor (LUFA naming conventions).
-                        *
-                        *  Type define for a standard Endpoint Descriptor. This structure uses LUFA-specific element names
-                        *  to make each element's purpose clearer.
-                        *
-                        *  \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
-
-                               uint8_t  EndpointAddress; /**< Logical address of the endpoint within the device for the current
-                                                          *   configuration, including direction mask.
-                                                          */
-                               uint8_t  Attributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*)
-                                                     *   and attributes (ENDPOINT_ATTR_*) masks.
-                                                     */
-                               uint16_t EndpointSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet
-                                                       *   size that the endpoint can receive at a time.
-                                                       */
-                               uint8_t  PollingIntervalMS; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT
-                                                            *   or ISOCHRONOUS type.
-                                                            */
-                       } USB_Descriptor_Endpoint_t;
-
-                       /** \brief Standard USB Endpoint Descriptor (USB-IF naming conventions).
-                        *
-                        *  Type define for a standard Endpoint Descriptor. This structure uses the relevant standard's given
-                        *  element names to ensure compatibility with the standard.
-                        *
-                        *  \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific
-                        *       element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t  bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a
-                                                          *   value given by the specific class.
-                                                          */
-                               uint8_t  bEndpointAddress; /**< Logical address of the endpoint within the device for the current
-                                                           *   configuration, including direction mask.
-                                                           */
-                               uint8_t  bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*)
-                                                       *   and attributes (ENDPOINT_ATTR_*) masks.
-                                                       */
-                               uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size
-                                                         *   that the endpoint can receive at a time.
-                                                         */
-                               uint8_t  bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or
-                                                    *   ISOCHRONOUS type.
-                                                    */
-                       } USB_StdDescriptor_Endpoint_t;
-
-                       /** \brief Standard USB String Descriptor (LUFA naming conventions).
-                        *
-                        *  Type define for a standard string descriptor. Unlike other standard descriptors, the length
-                        *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()
-                        *  macro rather than by the size of the descriptor structure, as the length is not fixed.
-                        *
-                        *  This structure should also be used for string index 0, which contains the supported language IDs for
-                        *  the device as an array.
-                        *
-                        *  This structure uses LUFA-specific element names to make each element's purpose clearer.
-                        *
-                        *  \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names.
-                        */
-                       typedef struct
-                       {
-                               USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
-
-                               wchar_t UnicodeString[]; /**< String data, as unicode characters (alternatively,
-                                                         *   string language IDs). If normal ASCII characters are
-                                                         *   to be used, they must be added as an array of characters
-                                                         *   rather than a normal C string so that they are widened to
-                                                         *   Unicode size.
-                                                         *
-                                                         *   Under GCC, strings prefixed with the "L" character (before
-                                                         *   the opening string quotation mark) are considered to be
-                                                         *   Unicode strings, and may be used instead of an explicit
-                                                         *   array of ASCII characters.
-                                                         */
-                       } USB_Descriptor_String_t;
-
-                       /** \brief Standard USB String Descriptor (USB-IF naming conventions).
-                        *
-                        *  Type define for a standard string descriptor. Unlike other standard descriptors, the length
-                        *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()
-                        *  macro rather than by the size of the descriptor structure, as the length is not fixed.
-                        *
-                        *  This structure should also be used for string index 0, which contains the supported language IDs for
-                        *  the device as an array.
-                        *
-                        *  This structure uses the relevant standard's given element names to ensure compatibility with the standard.
-                        *
-                        *  \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific
-                        *       element names.
-                        */
-                       typedef struct
-                       {
-                               uint8_t bLength; /**< Size of the descriptor, in bytes. */
-                               uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t
-                                                         *   or a value given by the specific class.
-                                                         */
-                               int16_t bString[]; /**< String data, as unicode characters (alternatively, string language IDs).
-                                                   *   If normal ASCII characters are to be used, they must be added as an array
-                                                   *   of characters rather than a normal C string so that they are widened to
-                                                   *   Unicode size.
-                                                   *
-                                                   *   Under GCC, strings prefixed with the "L" character (before the opening string
-                                                   *   quotation mark) are considered to be Unicode strings, and may be used instead
-                                                   *   of an explicit array of ASCII characters.
-                                                   */
-                       } USB_StdDescriptor_String_t;
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Macros: */
-                       #define VERSION_TENS(x)                   (int)((x) / 10)
-                       #define VERSION_ONES(x)                   (int)((x) - (10 * VERSION_TENS(x)))
-                       #define VERSION_TENTHS(x)                 (int)(((x) - (int)(x)) * 10)
-                       #define VERSION_HUNDREDTHS(x)             (int)((((x) - (int)(x)) * 100) - (10 * VERSION_TENTHS(x)))
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/HighLevel/StdRequestType.h b/LUFA/Drivers/USB/HighLevel/StdRequestType.h
deleted file mode 100644 (file)
index c62aa50..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB control endpoint request definitions.
- *
- *  This file contains structures and macros for the easy creation and parsing of standard USB control requests.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_StdRequest Standard USB Requests
- *
- *  This module contains definitions for the various control request parameters, so that the request
- *  details (such as data direction, request recipient, etc.) can be extracted via masking.
- *
- *  @{
- */
-
-#ifndef __STDREQTYPE_H__
-#define __STDREQTYPE_H__
-
-       /* Includes: */
-               #include <stdint.h>
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** Mask for the request type parameter, to indicate the direction of the request data (Host to Device
-                        *  or Device to Host). The result of this mask should then be compared to the request direction masks.
-                        *
-                        *  \see REQDIR_* macros for masks indicating the request data direction.
-                        */
-                       #define CONTROL_REQTYPE_DIRECTION  0x80
-
-                       /** Mask for the request type parameter, to indicate the type of request (Device, Class or Vendor
-                        *  Specific). The result of this mask should then be compared to the request type masks.
-                        *
-                        *  \see REQTYPE_* macros for masks indicating the request type.
-                        */
-                       #define CONTROL_REQTYPE_TYPE       0x60
-
-                       /** Mask for the request type parameter, to indicate the recipient of the request (Standard, Class
-                        *  or Vendor Specific). The result of this mask should then be compared to the request recipient
-                        *  masks.
-                        *
-                        *  \see REQREC_* macros for masks indicating the request recipient.
-                        */
-                       #define CONTROL_REQTYPE_RECIPIENT  0x1F
-
-                       /** \name Control Request Data Direction Masks */
-                       //@{
-                       /** Request data direction mask, indicating that the request data will flow from host to device.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_DIRECTION macro.
-                        */
-                       #define REQDIR_HOSTTODEVICE        (0 << 7)
-
-                       /** Request data direction mask, indicating that the request data will flow from device to host.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_DIRECTION macro.
-                        */
-                       #define REQDIR_DEVICETOHOST        (1 << 7)
-                       //@}
-
-                       /** \name Control Request Type Masks */
-                       //@{
-                       /** Request type mask, indicating that the request is a standard request.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_TYPE macro.
-                        */
-                       #define REQTYPE_STANDARD           (0 << 5)
-
-                       /** Request type mask, indicating that the request is a class-specific request.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_TYPE macro.
-                        */
-                       #define REQTYPE_CLASS              (1 << 5)
-
-                       /** Request type mask, indicating that the request is a vendor specific request.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_TYPE macro.
-                        */
-                       #define REQTYPE_VENDOR             (2 << 5)
-                       //@}
-
-                       /** \name Control Request Recipient Masks */
-                       //@{
-                       /** Request recipient mask, indicating that the request is to be issued to the device as a whole.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
-                        */
-                       #define REQREC_DEVICE              (0 << 0)
-
-                       /** Request recipient mask, indicating that the request is to be issued to an interface in the
-                        *  currently selected configuration.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
-                        */
-                       #define REQREC_INTERFACE           (1 << 0)
-
-                       /** Request recipient mask, indicating that the request is to be issued to an endpoint in the
-                        *  currently selected configuration.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
-                        */
-                       #define REQREC_ENDPOINT            (2 << 0)
-
-                       /** Request recipient mask, indicating that the request is to be issued to an unspecified element
-                        *  in the currently selected configuration.
-                        *
-                        *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
-                        */
-                       #define REQREC_OTHER               (3 << 0)
-                       //@}
-
-               /* Type Defines: */
-                       /** \brief Standard USB Control Request
-                        *
-                        *  Type define for a standard USB control request.
-                        *
-                        *  \see The USB 2.0 specification for more information on standard control requests.
-                        */
-                       typedef struct
-                       {
-                               uint8_t  bmRequestType; /**< Type of the request. */
-                               uint8_t  bRequest; /**< Request command code. */
-                               uint16_t wValue; /**< wValue parameter of the request. */
-                               uint16_t wIndex; /**< wIndex parameter of the request. */
-                               uint16_t wLength; /**< Length of the data to transfer in bytes. */
-                       } USB_Request_Header_t;
-
-               /* Enums: */
-                       /** Enumeration for the various standard request commands. These commands are applicable when the
-                        *  request type is \ref REQTYPE_STANDARD (with the exception of \ref REQ_GetDescriptor, which is always
-                        *  handled regardless of the request type value).
-                        *
-                        *  \see Chapter 9 of the USB 2.0 Specification.
-                        */
-                       enum USB_Control_Request_t
-                       {
-                               REQ_GetStatus           = 0, /**< Implemented in the library for device, endpoint and interface
-                                                             *   recipients. Passed to the user application for other recipients
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_ClearFeature        = 1, /**< Implemented in the library for device, endpoint and interface
-                                                             *   recipients. Passed to the user application for other recipients
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_SetFeature          = 3, /**< Implemented in the library for device, endpoint and interface
-                                                             *   recipients. Passed to the user application for other recipients
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_SetAddress          = 5, /**< Implemented in the library for the device recipient. Passed
-                                                             *   to the user application for other recipients via the
-                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_GetDescriptor       = 6, /**< Implemented in the library for device and interface recipients. Passed to the
-                                                             *   user application for other recipients via the
-                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_SetDescriptor       = 7, /**< Not implemented in the library, passed to the user application
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_GetConfiguration    = 8, /**< Implemented in the library for the device recipient. Passed
-                                                             *   to the user application for other recipients via the
-                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_SetConfiguration    = 9, /**< Implemented in the library for the device recipient. Passed
-                                                             *   to the user application for other recipients via the
-                                                             *   \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_GetInterface        = 10, /**< Not implemented in the library, passed to the user application
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_SetInterface        = 11, /**< Not implemented in the library, passed to the user application
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                               REQ_SynchFrame          = 12, /**< Not implemented in the library, passed to the user application
-                                                             *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
-                                                             *   device mode. */
-                       };
-                       
-                       /** Feature Selector values for Set Feature and Clear Feature standard control requests directed to the device, interface
-                        *  and endpoint recipients.
-                        */
-                       enum USB_Feature_Selectors_t
-                       {
-                               FEATURE_SEL_EndpointHalt       = 0x00, /**< Feature selector for Clear Feature or Set Feature commands. When
-                                                                       *   used in a Set Feature or Clear Feature request this indicates that an
-                                                                       *   endpoint (whose address is given elsewhere in the request should have
-                                                                       *   its stall condition changed.
-                                                                       */
-                               FEATURE_SEL_DeviceRemoteWakeup = 0x01, /**< Feature selector for Device level Remote Wakeup enable set or clear.
-                                                                   *   This feature can be controlled by the host on devices which indicate
-                                                                   *   remote wakeup support in their descriptors to selectively disable or
-                                                                   *   enable remote wakeup.
-                                                                   */
-                               FEATURE_SEL_TestMode           = 0x02, /**< Feature selector for Test Mode features, used to test the USB controller
-                                                                   *   to check for incorrect operation.
-                                                                   */
-                       };
-
-       /* Private Interface - For use in library only: */
-               #if !defined(__DOXYGEN__)
-                       /* Macros: */
-                               #define FEATURE_SELFPOWERED_ENABLED     (1 << 0)
-                               #define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1)
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_Control_R.c
deleted file mode 100644 (file)
index e746b51..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-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
diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_Control_W.c
deleted file mode 100644 (file)
index bdbbcfc..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-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;
-
-       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_ControlEndpointSize))
-                       {
-                               TEMPLATE_TRANSFER_BYTE(DataStream);
-                               TEMPLATE_BUFFER_MOVE(DataStream, 1);
-                               Length--;
-                               BytesInEndpoint++;
-                       }
-
-                       LastPacketFull = (BytesInEndpoint == USB_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;
-       }
-
-       return ENDPOINT_RWCSTREAM_NoError;
-}
-
-#undef TEMPLATE_BUFFER_OFFSET
-#undef TEMPLATE_BUFFER_MOVE
-#undef TEMPLATE_FUNC_NAME
-#undef TEMPLATE_TRANSFER_BYTE
diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
deleted file mode 100644 (file)
index a46d751..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
-                            uint16_t Length,
-                            uint16_t* const BytesProcessed)
-{
-       uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
-       uint16_t BytesInTransfer = 0;
-       uint8_t  ErrorCode;
-
-       if ((ErrorCode = Endpoint_WaitUntilReady()))
-         return ErrorCode;
-
-       if (BytesProcessed != NULL)
-       {
-               Length -= *BytesProcessed;
-               TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
-       }
-
-       while (Length)
-       {
-               if (!(Endpoint_IsReadWriteAllowed()))
-               {
-                       TEMPLATE_CLEAR_ENDPOINT();
-
-                       if (BytesProcessed != NULL)
-                       {
-                               *BytesProcessed += BytesInTransfer;
-                               return ENDPOINT_RWSTREAM_IncompleteTransfer;
-                       }
-
-                       #if !defined(INTERRUPT_CONTROL_ENDPOINT)
-                       USB_USBTask();
-                       #endif
-
-                       if ((ErrorCode = Endpoint_WaitUntilReady()))
-                         return ErrorCode;
-               }
-               else
-               {
-                       TEMPLATE_TRANSFER_BYTE(DataStream);
-                       TEMPLATE_BUFFER_MOVE(DataStream, 1);
-                       Length--;
-                       BytesInTransfer++;
-               }
-       }
-
-       return ENDPOINT_RWSTREAM_NoError;
-}
-
-#undef TEMPLATE_FUNC_NAME
-#undef TEMPLATE_BUFFER_TYPE
-#undef TEMPLATE_TRANSFER_BYTE
-#undef TEMPLATE_CLEAR_ENDPOINT
-#undef TEMPLATE_BUFFER_OFFSET
-#undef TEMPLATE_BUFFER_MOVE
diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
deleted file mode 100644 (file)
index 147ce5a..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
-                            uint16_t Length,
-                            uint16_t* const BytesProcessed)
-{
-       uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
-       uint16_t BytesInTransfer = 0;
-       uint8_t  ErrorCode;
-
-       Pipe_SetPipeToken(TEMPLATE_TOKEN);
-
-       if ((ErrorCode = Pipe_WaitUntilReady()))
-         return ErrorCode;
-
-       if (BytesProcessed != NULL)
-       {
-               Length -= *BytesProcessed;
-               TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
-       }
-       
-       while (Length)
-       {
-               if (!(Pipe_IsReadWriteAllowed()))
-               {
-                       TEMPLATE_CLEAR_PIPE();
-
-                       if (BytesProcessed != NULL)
-                       {
-                               *BytesProcessed += BytesInTransfer;
-                               return PIPE_RWSTREAM_IncompleteTransfer;
-                       }
-
-                       if ((ErrorCode = Pipe_WaitUntilReady()))
-                         return ErrorCode;
-               }
-               else
-               {
-                       TEMPLATE_TRANSFER_BYTE(DataStream);
-                       TEMPLATE_BUFFER_MOVE(DataStream, 1);
-                       Length--;
-                       BytesInTransfer++;
-               }
-       }
-
-       return PIPE_RWSTREAM_NoError;
-}
-
-#undef TEMPLATE_FUNC_NAME
-#undef TEMPLATE_BUFFER_TYPE
-#undef TEMPLATE_TOKEN
-#undef TEMPLATE_TRANSFER_BYTE
-#undef TEMPLATE_CLEAR_PIPE
-#undef TEMPLATE_BUFFER_OFFSET
-#undef TEMPLATE_BUFFER_MOVE
diff --git a/LUFA/Drivers/USB/HighLevel/USBMode.h b/LUFA/Drivers/USB/HighLevel/USBMode.h
deleted file mode 100644 (file)
index 58f9927..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB mode and capability macros.
- *
- *  This file defines macros indicating the type of USB controller the library is being compiled for, and its
- *  capabilities. These macros may then be referenced in the user application to selectively enable or disable
- *  code sections depending on if they are defined or not.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_USBMode USB Mode Tokens
- *
- *  After the inclusion of the master USB driver header, one or more of the following
- *  tokens may be defined, to allow the user code to conditionally enable or disable
- *  code based on the USB controller family and allowable USB modes. These tokens may
- *  be tested against to eliminate code relating to a USB mode which is not enabled for
- *  the given compilation.
- *
- *  @{
- */
-
-#ifndef __USBMODE_H__
-#define __USBMODE_H__
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-       #if defined(__DOXYGEN__)
-               /** Indicates that the target AVR microcontroller belongs to the Series 2 USB controller
-                *  (i.e. AT90USBxxx2 or ATMEGAxxU2) when defined.
-                */
-               #define USB_SERIES_2_AVR
-
-               /** Indicates that the target AVR microcontroller belongs to the Series 4 USB controller
-                *  (i.e. ATMEGAxxU4) when defined.
-                */
-               #define USB_SERIES_4_AVR
-
-               /** Indicates that the target AVR microcontroller belongs to the Series 6 USB controller
-                *  (i.e. AT90USBxxx6) when defined.
-                */
-               #define USB_SERIES_6_AVR
-
-               /** Indicates that the target AVR microcontroller belongs to the Series 7 USB controller
-                *  (i.e. AT90USBxxx7) when defined.
-                */
-               #define USB_SERIES_7_AVR
-
-               /** Indicates that the target AVR microcontroller and compilation settings allow for the
-                *  target to be configured in USB Device mode when defined.
-                */
-               #define USB_CAN_BE_DEVICE
-
-               /** Indicates that the target AVR microcontroller and compilation settings allow for the
-                *  target to be configured in USB Host mode when defined.
-                */
-               #define USB_CAN_BE_HOST
-
-               /** Indicates that the target AVR microcontroller and compilation settings allow for the
-                *  target to be configured in either USB Device or Host mode when defined.
-                */
-               #define USB_CAN_BE_BOTH
-       #else
-               /* Macros: */
-                       #if (defined(__AVR_AT90USB162__) || defined(__AVR_AT90USB82__)  || \
-                            defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__))
-                               #define USB_SERIES_2_AVR
-                       #elif (defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__))
-                               #define USB_SERIES_4_AVR
-                       #elif (defined(__AVR_ATmega32U6__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
-                               #define USB_SERIES_6_AVR
-                       #elif (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__))
-                               #define USB_SERIES_7_AVR
-                       #endif
-
-                       #if !defined(USB_SERIES_7_AVR)
-                               #if defined(USB_HOST_ONLY)
-                                       #error USB_HOST_ONLY is not available for the currently selected USB AVR model.
-                               #endif
-
-                               #if !defined(USB_DEVICE_ONLY)
-                                       #define USB_DEVICE_ONLY
-                               #endif
-                       #endif
-
-                       #if (!defined(USB_DEVICE_ONLY) && !defined(USB_HOST_ONLY))
-                               #define USB_CAN_BE_BOTH
-                               #define USB_CAN_BE_HOST
-                               #define USB_CAN_BE_DEVICE
-                       #elif defined(USB_HOST_ONLY)
-                               #define USB_CAN_BE_HOST
-                       #elif defined(USB_DEVICE_ONLY)
-                               #define USB_CAN_BE_DEVICE
-                       #endif
-
-                       #if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY))
-                               #error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive.
-                       #endif
-       #endif
-
-#endif
-
-/** @} */
diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c
deleted file mode 100644 (file)
index c0cd711..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USBTASK_C
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "USBTask.h"
-
-volatile bool        USB_IsInitialized;
-USB_Request_Header_t USB_ControlRequest;
-
-#if defined(USB_CAN_BE_HOST) && !defined(HOST_STATE_AS_GPIOR)
-volatile uint8_t     USB_HostState;
-#endif
-
-#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR)
-volatile uint8_t     USB_DeviceState;
-#endif
-
-void USB_USBTask(void)
-{
-       #if defined(USB_HOST_ONLY)
-               USB_HostTask();
-       #elif defined(USB_DEVICE_ONLY)
-               USB_DeviceTask();
-       #else
-               if (USB_CurrentMode == USB_MODE_Device)
-                 USB_DeviceTask();
-               else if (USB_CurrentMode == USB_MODE_Host)
-                 USB_HostTask();
-       #endif
-}
-
-#if defined(USB_CAN_BE_DEVICE)
-static void USB_DeviceTask(void)
-{
-       if (USB_DeviceState != DEVICE_STATE_Unattached)
-       {
-               uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
-
-               Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-
-               if (Endpoint_IsSETUPReceived())
-                 USB_Device_ProcessControlRequest();
-
-               Endpoint_SelectEndpoint(PrevEndpoint);
-       }
-}
-#endif
-
-#if defined(USB_CAN_BE_HOST)
-static void USB_HostTask(void)
-{
-       uint8_t PrevPipe = Pipe_GetCurrentPipe();
-
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
-       USB_Host_ProcessNextHostState();
-
-       Pipe_SelectPipe(PrevPipe);
-}
-#endif
-
diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.h b/LUFA/Drivers/USB/HighLevel/USBTask.h
deleted file mode 100644 (file)
index 205fee6..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief Main USB service task management.
- *
- *  This file contains the function definitions required for the main USB service task, which must be called
- *  from the user application to ensure that the USB connection to or from a connected USB device is maintained.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-#ifndef __USBTASK_H__
-#define __USBTASK_H__
-
-       /* Includes: */
-               #include <avr/interrupt.h>
-               #include <stdint.h>
-               #include <stdbool.h>
-
-               #include "../LowLevel/USBController.h"
-               #include "Events.h"
-               #include "StdRequestType.h"
-               #include "StdDescriptors.h"
-               #include "USBMode.h"
-
-               #if defined(USB_CAN_BE_DEVICE)
-                       #include "DeviceStandardReq.h"
-               #endif
-
-               #if defined(USB_CAN_BE_HOST)
-                       #include "HostStandardReq.h"
-               #endif
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Global Variables: */
-                       /** Indicates if the USB interface is currently initialized but not necessarily connected to a host
-                        *  or device (i.e. if \ref USB_Init() has been run). If this is false, all other library globals related
-                        *  to the USB driver are invalid.
-                        *
-                        *  \note This variable should be treated as read-only in the user application, and never manually
-                        *        changed in value.
-                        *
-                        *  \ingroup Group_USBManagement
-                        */
-                       extern volatile bool USB_IsInitialized;
-
-                       /** Structure containing the last received Control request when in Device mode (for use in user-applications
-                        *  inside of the \ref EVENT_USB_Device_ControlRequest() event, or for filling up with a control request to 
-                        *  issue when in Host mode before calling \ref USB_Host_SendControlRequest().
-                        *
-                        *  \ingroup Group_USBManagement
-                        */
-                        extern USB_Request_Header_t USB_ControlRequest;
-
-                       #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
-                               #if !defined(HOST_STATE_AS_GPIOR) || defined(__DOXYGEN__)
-                                       /** Indicates the current host state machine state. When in host mode, this indicates the state
-                                        *  via one of the values of the \ref USB_Host_States_t enum values.
-                                        *
-                                        *  This value may be altered by the user application to implement the \ref HOST_STATE_Addressed,
-                                        *  \ref HOST_STATE_Configured and \ref HOST_STATE_Suspended states which are not implemented by
-                                        *  the library internally.
-                                        *
-                                        *  To reduce program size and speed up checks of this global, it can be placed into one of the AVR's
-                                        *  GPIOR hardware registers instead of RAM by defining the HOST_STATE_AS_GPIOR token to a value
-                                        *  between 0 and 2 in the project makefile and passing it to the compiler via the -D switch. When
-                                        *  defined, the corresponding GPIOR register should not be used in the user application except
-                                        *  implicitly via the library APIs.
-                                        *
-                                        *  \note This global is only present if the user application can be a USB host.
-                                        *
-                                        *  \see \ref USB_Host_States_t for a list of possible device states.
-                                        *
-                                        *  \ingroup Group_Host
-                                        */
-                                       extern volatile uint8_t USB_HostState;
-                               #else
-                                       #define _GET_HOST_GPIOR_NAME2(y) GPIOR ## y
-                                       #define _GET_HOST_GPIOR_NAME(x)  _GET_HOST_GPIOR_NAME2(x)
-                                       #define USB_HostState            _GET_HOST_GPIOR_NAME(HOST_STATE_AS_GPIOR)
-                               #endif
-                       #endif
-
-                       #if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
-                               #if !defined(DEVICE_STATE_AS_GPIOR) || defined(__DOXYGEN__)
-                                       /** Indicates the current device state machine state. When in device mode, this indicates the state
-                                        *  via one of the values of the \ref USB_Device_States_t enum values.
-                                        *
-                                        *  This value should not be altered by the user application as it is handled automatically by the
-                                        *  library. The only exception to this rule is if the NO_LIMITED_CONTROLLER_CONNECT token is used
-                                        *  (see \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events).
-                                        *
-                                        *  To reduce program size and speed up checks of this global, it can be placed into one of the AVR's
-                                        *  GPIOR hardware registers instead of RAM by defining the DEVICE_STATE_AS_GPIOR token to a value
-                                        *  between 0 and 2 in the project makefile and passing it to the compiler via the -D switch. When
-                                        *  defined, the corresponding GPIOR register should not be used in the user application except
-                                        *  implicitly via the library APIs.
-                                        *
-                                        *  \note This global is only present if the user application can be a USB device.
-                                        *        \n\n
-                                        *
-                                        *  \note This variable should be treated as read-only in the user application, and never manually
-                                        *        changed in value except in the circumstances outlined above.
-                                        *
-                                        *  \see \ref USB_Device_States_t for a list of possible device states.
-                                        *
-                                        *  \ingroup Group_Device
-                                        */
-                                       extern volatile uint8_t USB_DeviceState;
-                               #else
-                                       #define _GET_DEVICE_GPIOR_NAME2(y) GPIOR ## y
-                                       #define _GET_DEVICE_GPIOR_NAME(x)  _GET_DEVICE_GPIOR_NAME2(x)
-                                       #define USB_DeviceState            _GET_DEVICE_GPIOR_NAME(DEVICE_STATE_AS_GPIOR)
-                               #endif
-                       #endif
-
-               /* Function Prototypes: */
-                       /** This is the main USB management task. The USB driver requires this task to be executed
-                        *  continuously when the USB system is active (device attached in host mode, or attached to a host
-                        *  in device mode) in order to manage USB communications. This task may be executed inside an RTOS,
-                        *  fast timer ISR or the main user application loop.
-                        *
-                        *  The USB task must be serviced within 30ms while in device mode, or within 1ms while in host mode.
-                        *  The task may be serviced at all times, or (for minimum CPU consumption):
-                        *
-                        *    - In device mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Device_Connect()
-                        *      event and disabled again on the firing of the \ref EVENT_USB_Device_Disconnect() event.
-                        *
-                        *    - In host mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Host_DeviceAttached()
-                        *      event and disabled again on the firing of the \ref EVENT_USB_Host_DeviceEnumerationComplete() or
-                        *      \ref EVENT_USB_Host_DeviceEnumerationFailed() events.
-                        *
-                        *  If in device mode (only), the control endpoint can instead be managed via interrupts entirely by the library
-                        *  by defining the INTERRUPT_CONTROL_ENDPOINT token and passing it to the compiler via the -D switch.
-                        *
-                        *  \see \ref Group_Events for more information on the USB events.
-                        *
-                        *  \ingroup Group_USBManagement
-                        */
-                       void USB_USBTask(void);
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Function Prototypes: */
-                       #if defined(__INCLUDE_FROM_USBTASK_C)
-                               #if defined(USB_CAN_BE_HOST)
-                                       static void USB_HostTask(void);
-                               #endif
-
-                               #if defined(USB_CAN_BE_DEVICE)
-                                       static void USB_DeviceTask(void);
-                               #endif
-                       #endif
-
-               /* Macros: */
-                       #define HOST_TASK_NONBLOCK_WAIT(Duration, NextState) MACROS{ USB_HostState   = HOST_STATE_WaitForDevice; \
-                                                                                    WaitMSRemaining = (Duration);               \
-                                                                                    PostWaitState   = (NextState);        }MACROE
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/Device.c b/LUFA/Drivers/USB/LowLevel/Device.c
deleted file mode 100644 (file)
index 099c1c1..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "../HighLevel/USBMode.h"
-
-#if defined(USB_CAN_BE_DEVICE)
-
-#include "Device.h"
-
-void USB_Device_SendRemoteWakeup(void)
-{
-       if (!(USB_Options & USB_OPT_MANUAL_PLL))
-       {
-               USB_PLL_On();
-               while (!(USB_PLL_IsReady()));
-       }
-
-       USB_CLK_Unfreeze();
-
-       UDCON |= (1 << RMWKUP);
-       while (!(UDCON & (1 << RMWKUP)));
-}
-
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/Device.h b/LUFA/Drivers/USB/LowLevel/Device.h
deleted file mode 100644 (file)
index ae3df41..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB device mode definitions.
- *
- *  This file contains structures, function prototypes and macros related to USB device mode.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_Device Device Management
- *
- *  USB Device mode related macros and enums. This module contains macros and enums which are used when
- *  the USB controller is initialized in device mode.
- *
- *  @{
- */
-
-#ifndef __USBDEVICE_H__
-#define __USBDEVICE_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <avr/pgmspace.h>
-               #include <avr/eeprom.h>
-
-               #include "../../../Common/Common.h"
-               #include "../HighLevel/StdDescriptors.h"
-               #include "USBInterrupt.h"
-               #include "Endpoint.h"
-
-       /* Preprocessor Checks: */
-               #if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
-                       #error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
-               #endif
-
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** \name USB Device Mode Option Masks */
-                       //@{
-                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
-                               /** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
-                                *  USB interface should be initialized in low speed (1.5Mb/s) mode.
-                                *
-                                *  \note Low Speed mode is not available on all USB AVR models.
-                                *        \n
-                                *
-                                *  \note Restrictions apply on the number, size and type of endpoints which can be used
-                                *        when running in low speed mode - refer to the USB 2.0 specification.
-                                */
-                               #define USB_DEVICE_OPT_LOWSPEED            (1 << 0)
-                       #endif
-
-                       /** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
-                        *  USB interface should be initialized in full speed (12Mb/s) mode.
-                        */
-                       #define USB_DEVICE_OPT_FULLSPEED               (0 << 0)
-                       //@}
-                       
-               /* Function Prototypes: */
-                       /** Sends a Remote Wakeup request to the host. This signals to the host that the device should
-                        *  be taken out of suspended mode, and communications should resume.
-                        *
-                        *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
-                        *  host computer when the host has suspended all USB devices to enter a low power state.
-                        *
-                        *  \note This macro should only be used if the device has indicated to the host that it
-                        *        supports the Remote Wakeup feature in the device descriptors, and should only be
-                        *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
-                        *        the \ref USB_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP compile
-                        *        time option is used, this macro is unavailable.
-                        *        \n\n
-                        *
-                        *  \note The USB clock must be running for this function to operate. If the stack is initialized with
-                        *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running
-                        *        before attempting to call this function.
-                        *
-                        *  \see \ref Group_Descriptors for more information on the RMWAKEUP feature and device descriptors.
-                        */
-                       void USB_Device_SendRemoteWakeup(void);
-
-               /* Type Defines: */
-                       enum USB_Device_States_t
-                       {
-                               DEVICE_STATE_Unattached                   = 0, /**< Internally implemented by the library. This state indicates
-                                                                               *   that the device is not currently connected to a host.
-                                                                               */
-                               DEVICE_STATE_Powered                      = 1, /**< Internally implemented by the library. This state indicates
-                                                                               *   that the device is connected to a host, but enumeration has not
-                                                                               *   yet begun.
-                                                                               */
-                               DEVICE_STATE_Default                      = 2, /**< Internally implemented by the library. This state indicates
-                                                                               *   that the device's USB bus has been reset by the host and it is
-                                                                               *   now waiting for the host to begin the enumeration process.
-                                                                               */
-                               DEVICE_STATE_Addressed                    = 3, /**< Internally implemented by the library. This state indicates
-                                                                               *   that the device has been addressed by the USB Host, but is not
-                                                                               *   yet configured.
-                                                                               */
-                               DEVICE_STATE_Configured                   = 4, /**< May be implemented by the user project. This state indicates
-                                                                               *   that the device has been enumerated by the host and is ready
-                                                                               *   for USB communications to begin.
-                                                                               */
-                               DEVICE_STATE_Suspended                    = 5, /**< May be implemented by the user project. This state indicates
-                                                                               *   that the USB bus has been suspended by the host, and the device
-                                                                               *   should power down to a minimal power level until the bus is
-                                                                               *   resumed.
-                                                                               */
-                       };
-
-               /* Inline Functions: */
-                       /** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
-                        *  the frame number is incremented by one.
-                        */
-                       static inline uint16_t USB_Device_GetFrameNumber(void)
-                       {
-                               return UDFNUM;
-                       }
-
-                       #if !defined(NO_SOF_EVENTS)
-                               /** Enables the device mode Start Of Frame events. When enabled, this causes the
-                                *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
-                                *  at the start of each USB frame when enumerated in device mode.
-                                *
-                                *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
-                                */
-                               static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
-                               static inline void USB_Device_EnableSOFEvents(void)
-                               {
-                                       USB_INT_Enable(USB_INT_SOFI);
-                               }
-
-                               /** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
-                                *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
-                                *
-                                *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
-                                */
-                               static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
-                               static inline void USB_Device_DisableSOFEvents(void)
-                               {
-                                       USB_INT_Disable(USB_INT_SOFI);
-                               }
-                       #endif
-
-               /* Function Prototypes: */
-                       /** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,
-                        *  index and language ID. This function MUST be overridden in the user application (added with full, identical
-                        *  prototype and name so that the library can call it to retrieve descriptor data.
-                        *
-                        *  \param[in] wValue               The type of the descriptor to retrieve in the upper byte, and the index in the
-                        *                                  lower byte (when more than one descriptor of the given type exists, such as the
-                        *                                  case of string descriptors). The type may be one of the standard types defined
-                        *                                  in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
-                        *  \param[in] wIndex               The language ID of the string to return if the \c wValue type indicates
-                        *                                  \ref DTYPE_String, otherwise zero for standard descriptors, or as defined in a
-                        *                                  class-specific standards.
-                        *  \param[out] DescriptorAddress   Pointer to the descriptor in memory. This should be set by the routine to
-                        *                                  the address of the descriptor.
-                        *  \param[out] MemoryAddressSpace  A value from the \ref USB_DescriptorMemorySpaces_t enum to indicate the memory
-                        *                                  space in which the descriptor is stored. This parameter does not exist when one
-                        *                                  of the \c USE_*_DESCRIPTORS compile time options is used.
-                        *
-                        *  \note By default, the library expects all descriptors to be located in flash memory via the \c PROGMEM attribute.
-                        *        If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to
-                        *        allow the descriptors to be changed dynamically at runtime) either the \c USE_RAM_DESCRIPTORS or the
-                        *        \c USE_EEPROM_DESCRIPTORS tokens may be defined in the project makefile and passed to the compiler by the -D
-                        *        switch.
-                        *
-                        *  \return Size in bytes of the descriptor if it exists, zero or \ref NO_DESCRIPTOR otherwise.
-                        */
-                       uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
-                                                           const uint8_t wIndex,
-                                                           const void** const DescriptorAddress
-                       #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)
-                                                           , uint8_t* MemoryAddressSpace
-                       #endif
-                                                           ) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Inline Functions: */
-                       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
-                       static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Device_SetLowSpeed(void)
-                       {
-                               UDCON |=  (1 << LSM);
-                       }
-
-                       static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Device_SetFullSpeed(void)
-                       {
-                               UDCON &= ~(1 << LSM);
-                       }
-                       #endif
-
-                       static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
-                       {
-                               UDADDR  = ((UDADDR & (1 << ADDEN)) | (Address & 0x7F));
-                               UDADDR |= (1 << ADDEN);
-                       }
-
-                       static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE;
-                       static inline bool USB_Device_IsAddressSet(void)
-                       {
-                               return (UDADDR & (1 << ADDEN));
-                       }
-       #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c
deleted file mode 100644 (file)
index 33f5ec9..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "../HighLevel/USBMode.h"
-
-#if defined(USB_CAN_BE_DEVICE)
-
-#include "Endpoint.h"
-
-#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
-uint8_t USB_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
-#endif
-
-bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
-                                    const uint8_t UECFG0XData,
-                                    const uint8_t UECFG1XData)
-{
-#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
-       Endpoint_SelectEndpoint(Number);
-       Endpoint_EnableEndpoint();
-
-       UECFG1X = 0;
-       UECFG0X = UECFG0XData;
-       UECFG1X = UECFG1XData;
-
-       return Endpoint_IsConfigured();
-#else  
-       for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
-       {
-               uint8_t UECFG0XTemp;
-               uint8_t UECFG1XTemp;
-               uint8_t UEIENXTemp;
-
-               Endpoint_SelectEndpoint(EPNum);
-               
-               if (EPNum == Number)
-               {
-                       UECFG0XTemp = UECFG0XData;
-                       UECFG1XTemp = UECFG1XData;
-                       UEIENXTemp  = 0;
-               }
-               else
-               {
-                       UECFG0XTemp = UECFG0X;
-                       UECFG1XTemp = UECFG1X;
-                       UEIENXTemp  = UEIENX;
-               }
-
-               if (!(UECFG1XTemp & (1 << ALLOC)))
-                 continue;
-
-               Endpoint_DisableEndpoint();
-               UECFG1X &= (1 << ALLOC);
-
-               Endpoint_EnableEndpoint();
-               UECFG0X = UECFG0XTemp;
-               UECFG1X = UECFG1XTemp;
-               UEIENX  = UEIENXTemp;
-                       
-               if (!(Endpoint_IsConfigured()))
-                 return false;                 
-       }
-       
-       Endpoint_SelectEndpoint(Number);
-       return true;
-#endif
-}
-
-void Endpoint_ClearEndpoints(void)
-{
-       UEINT = 0;
-
-       for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
-       {
-               Endpoint_SelectEndpoint(EPNum);
-               UEIENX  = 0;
-               UEINTX  = 0;
-               UECFG1X = 0;
-               Endpoint_DisableEndpoint();
-       }
-}
-
-void Endpoint_ClearStatusStage(void)
-{
-       if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
-       {
-               while (!(Endpoint_IsOUTReceived()))
-               {
-                       if (USB_DeviceState == DEVICE_STATE_Unattached)
-                         return;
-               }
-
-               Endpoint_ClearOUT();
-       }
-       else
-       {
-               while (!(Endpoint_IsINReady()))
-               {
-                       if (USB_DeviceState == DEVICE_STATE_Unattached)
-                         return;
-               }
-
-               Endpoint_ClearIN();
-       }
-}
-
-#if !defined(CONTROL_ONLY_DEVICE)
-uint8_t Endpoint_WaitUntilReady(void)
-{
-       #if (USB_STREAM_TIMEOUT_MS < 0xFF)
-       uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
-       #else
-       uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
-       #endif
-
-       uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
-
-       for (;;)
-       {
-               if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
-               {
-                       if (Endpoint_IsINReady())
-                         return ENDPOINT_READYWAIT_NoError;
-               }
-               else
-               {
-                       if (Endpoint_IsOUTReceived())
-                         return ENDPOINT_READYWAIT_NoError;
-               }
-               
-               uint8_t USB_DeviceState_LCL = USB_DeviceState;
-
-               if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
-                 return ENDPOINT_READYWAIT_DeviceDisconnected;
-               else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
-                 return ENDPOINT_READYWAIT_BusSuspended;
-               else if (Endpoint_IsStalled())
-                 return ENDPOINT_READYWAIT_EndpointStalled;
-
-               uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
-
-               if (CurrentFrameNumber != PreviousFrameNumber)
-               {
-                       PreviousFrameNumber = CurrentFrameNumber;
-
-                       if (!(TimeoutMSRem--))
-                         return ENDPOINT_READYWAIT_Timeout;
-               }
-       }
-}
-#endif
-
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h
deleted file mode 100644 (file)
index 455577c..0000000
+++ /dev/null
@@ -1,900 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB device endpoint management definitions.
- *
- *  This file contains structures, function prototypes and macros related to the management of the device's
- *  data endpoints when the library is initialized in USB device mode.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_EndpointManagement
- *  \defgroup Group_EndpointRW Endpoint Data Reading and Writing
- *
- *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
- */
-
-/** \ingroup Group_EndpointRW
- *  \defgroup Group_EndpointPrimitiveRW Read/Write of Primitive Data Types
- *
- *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
- *  from and to endpoints.
- */
-
-/** \ingroup Group_EndpointManagement
- *  \defgroup Group_EndpointPacketManagement Endpoint Packet Management
- *
- *  Functions, macros, variables, enums and types related to packet management of endpoints.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_EndpointManagement Endpoint Management
- *
- *  Functions, macros and enums related to endpoint management when in USB Device mode. This
- *  module contains the endpoint management macros, as well as endpoint interrupt and data
- *  send/receive functions for various data types.
- *
- *  @{
- */
-
-#ifndef __ENDPOINT_H__
-#define __ENDPOINT_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <stdbool.h>
-
-               #include "../../../Common/Common.h"
-               #include "../HighLevel/USBTask.h"
-               #include "USBInterrupt.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Macros: */
-                       #define _ENDPOINT_GET_MAXSIZE(EPIndex)         _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## EPIndex)
-                       #define _ENDPOINT_GET_MAXSIZE2(EPDetails)      _ENDPOINT_GET_MAXSIZE3(EPDetails)
-                       #define _ENDPOINT_GET_MAXSIZE3(MaxSize, Banks) (MaxSize)
-
-                       #define _ENDPOINT_GET_BANKS(EPIndex)           _ENDPOINT_GET_BANKS2(ENDPOINT_DETAILS_EP ## EPIndex)
-                       #define _ENDPOINT_GET_BANKS2(EPDetails)        _ENDPOINT_GET_BANKS3(EPDetails)
-                       #define _ENDPOINT_GET_BANKS3(MaxSize, Banks)   (Banks)
-
-                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-                               #define ENDPOINT_DETAILS_MAXEP             7
-
-                               #define ENDPOINT_DETAILS_EP0               64,  2
-                               #define ENDPOINT_DETAILS_EP1               256, 2
-                               #define ENDPOINT_DETAILS_EP2               64,  2
-                               #define ENDPOINT_DETAILS_EP3               64,  2
-                               #define ENDPOINT_DETAILS_EP4               64,  2
-                               #define ENDPOINT_DETAILS_EP5               64,  2
-                               #define ENDPOINT_DETAILS_EP6               64,  2
-                       #else
-                               #define ENDPOINT_DETAILS_MAXEP             5
-
-                               #define ENDPOINT_DETAILS_EP0               64,  2
-                               #define ENDPOINT_DETAILS_EP1               64,  1
-                               #define ENDPOINT_DETAILS_EP2               64,  1
-                               #define ENDPOINT_DETAILS_EP3               64,  2
-                               #define ENDPOINT_DETAILS_EP4               64,  2
-                       #endif
-
-               /* Inline Functions: */
-                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
-                                                                                              ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
-                       {
-                               uint8_t  MaskVal    = 0;
-                               uint16_t CheckBytes = 8;
-
-                               while (CheckBytes < Bytes)
-                               {
-                                       MaskVal++;
-                                       CheckBytes <<= 1;
-                               }
-
-                               return (MaskVal << EPSIZE0);
-                       }
-
-               /* Function Prototypes: */
-                       void Endpoint_ClearEndpoints(void);
-                       bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
-                                                           const uint8_t UECFG0XData,
-                                                           const uint8_t UECFG1XData);
-
-       #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** \name Endpoint Direction Masks */
-                       //@{
-                       /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
-                        *  should be initialized in the OUT direction - i.e. data flows from host to device.
-                        */
-                       #define ENDPOINT_DIR_OUT                        (0 << EPDIR)
-
-                       /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
-                        *  should be initialized in the IN direction - i.e. data flows from device to host.
-                        */
-                       #define ENDPOINT_DIR_IN                         (1 << EPDIR)
-                       //@}
-                       
-                       /** \name Endpoint Bank Mode Masks */
-                       //@{
-                       /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
-                        *  that the endpoint should have one single bank, which requires less USB FIFO memory but results
-                        *  in slower transfers as only one USB device (the AVR or the host) can access the endpoint's
-                        *  bank at the one time.
-                        */
-                       #define ENDPOINT_BANK_SINGLE                    (0 << EPBK0)
-
-                       /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
-                        *  that the endpoint should have two banks, which requires more USB FIFO memory but results
-                        *  in faster transfers as one USB device (the AVR or the host) can access one bank while the other
-                        *  accesses the second bank.
-                        */
-                       #define ENDPOINT_BANK_DOUBLE                    (1 << EPBK0)
-                       //@}
-                       
-                       /** Endpoint address for the default control endpoint, which always resides in address 0. This is
-                        *  defined for convenience to give more readable code when used with the endpoint macros.
-                        */
-                       #define ENDPOINT_CONTROLEP                      0
-
-                       #if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
-                               /** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
-                                *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined.
-                                */
-                               #define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8
-                       #endif
-
-                       /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
-                        *  numerical address in the device.
-                        */
-                       #define ENDPOINT_EPNUM_MASK                     0x07
-
-                       /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
-                        *  direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
-                        */
-                       #define ENDPOINT_EPDIR_MASK                     0x80
-
-                       /** Endpoint bank size mask, for masking against endpoint addresses to retrieve the endpoint's
-                        *  bank size in the device.
-                        */
-                       #define ENDPOINT_EPSIZE_MASK                    0x7F
-
-                       /** Retrives the maximum bank size in bytes of a given endpoint.
-                        *
-                        *  \note This macro will only work correctly on endpoint indexes that are compile-time constants
-                        *        defined by the preprocessor.
-                        *
-                        *  \param[in] EPIndex  Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
-                        */
-                       #define ENDPOINT_MAX_SIZE(EPIndex)              _ENDPOINT_GET_MAXSIZE(EPIndex)
-
-                       /** Retrieves the total number of banks supported by the given endpoint.
-                        *
-                        *  \note This macro will only work correctly on endpoint indexes that are compile-time constants
-                        *        defined by the preprocessor.
-                        *
-                        *  \param[in] EPIndex  Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
-                        */
-                       #define ENDPOINT_BANKS_SUPPORTED(EPIndex)       _ENDPOINT_GET_BANKS(EPIndex)
-
-                       #if !defined(CONTROL_ONLY_DEVICE) || defined(__DOXYGEN__)
-                               /** Total number of endpoints (including the default control endpoint at address 0) which may
-                                *  be used in the device. Different USB AVR models support different amounts of endpoints,
-                                *  this value reflects the maximum number of endpoints for the currently selected AVR model.
-                                */
-                               #define ENDPOINT_TOTAL_ENDPOINTS            ENDPOINT_DETAILS_MAXEP
-                       #else
-                               #define ENDPOINT_TOTAL_ENDPOINTS            1
-                       #endif
-
-               /* Enums: */
-                       /** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
-                        *
-                        *  \ingroup Group_EndpointRW
-                        */
-                       enum Endpoint_WaitUntilReady_ErrorCodes_t
-                       {
-                               ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
-                               ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream
-                                                                                *   transfer by the host or device.
-                                                                                */
-                               ENDPOINT_READYWAIT_DeviceDisconnected      = 2, /**< Device was disconnected from the host while
-                                                                                *   waiting for the endpoint to become ready.
-                                                                                */
-                               ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and
-                                                                                *   no USB endpoint traffic can occur until the bus
-                                                                                *   has resumed.
-                                                                                */
-                               ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet
-                                                                                *   within the software timeout period set by the
-                                                                                *   \ref USB_STREAM_TIMEOUT_MS macro.
-                                                                                */
-                       };
-
-               /* Inline Functions: */
-                       /** Configures the specified endpoint number with the given endpoint type, direction, bank size
-                        *  and banking mode. Once configured, the endpoint may be read from or written to, depending
-                        *  on its direction.
-                        *
-                        *  \param[in] Number     Endpoint number to configure. This must be more than 0 and less than
-                        *                        \ref ENDPOINT_TOTAL_ENDPOINTS.
-                        *
-                        *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types
-                        *                        are available on Low Speed USB devices - refer to the USB 2.0 specification.
-                        *
-                        *  \param[in] Direction  Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
-                        *                        All endpoints (except Control type) are unidirectional - data may only be read
-                        *                        from or written to the endpoint bank based on its direction, not both.
-                        *
-                        *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted
-                        *                        to the USB host, or after they have been received from the USB host (depending on
-                        *                        the endpoint's data direction). The bank size must indicate the maximum packet size
-                        *                        that the endpoint can handle.
-                        *
-                        *  \param[in] Banks      Number of banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask.
-                        *                        More banks uses more USB DPRAM, but offers better performance. Isochronous type
-                        *                        endpoints <b>must</b> have at least two banks.
-                        *
-                        *  \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
-                        *        ascending order, or bank corruption will occur.
-                        *        \n\n
-                        *
-                        *  \note Certain models of USB AVR's endpoints may have different maximum packet sizes based on the endpoint's
-                        *        index - refer to the chosen USB AVR's datasheet to determine the maximum bank size for each endpoint.
-                        *        \n\n
-                        *
-                        *  \note The default control endpoint should not be manually configured by the user application, as
-                        *        it is automatically configured by the library internally.
-                        *        \n\n
-                        *
-                        *  \note This routine will automatically select the specified endpoint upon success. Upon failure, the endpoint
-                        *        which failed to reconfigure correctly will be selected.
-                        *
-                        *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
-                        */
-                       static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
-                                                                     const uint8_t Type,
-                                                                     const uint8_t Direction,
-                                                                     const uint16_t Size,
-                                                                     const uint8_t Banks) ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
-                                                                     const uint8_t Type,
-                                                                     const uint8_t Direction,
-                                                                     const uint16_t Size,
-                                                                     const uint8_t Banks)
-                       {
-                               return Endpoint_ConfigureEndpoint_Prv(Number, (((Type) << EPTYPE0) | (Direction)),
-                                                                     ((1 << ALLOC) | Banks | Endpoint_BytesToEPSizeMask(Size)));
-                       }
-
-                       /** Indicates the number of bytes currently stored in the current endpoint's selected bank.
-                        *
-                        *  \note The return width of this function may differ, depending on the maximum endpoint bank size
-                        *        of the selected AVR model.
-                        *
-                        *  \ingroup Group_EndpointRW
-                        *
-                        *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer.
-                        */
-                       static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint16_t Endpoint_BytesInEndpoint(void)
-                       {
-                               #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-                                       return UEBCX;
-                               #elif defined(USB_SERIES_4_AVR)
-                                       return (((uint16_t)UEBCHX << 8) | UEBCLX);
-                               #elif defined(USB_SERIES_2_AVR)
-                                       return UEBCLX;
-                               #endif
-                       }
-
-                       /** Get the endpoint address of the currently selected endpoint. This is typically used to save
-                        *  the currently selected endpoint number so that it can be restored after another endpoint has
-                        *  been manipulated.
-                        *
-                        *  \return Index of the currently selected endpoint.
-                        */
-                       static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Endpoint_GetCurrentEndpoint(void)
-                       {
-                               #if !defined(CONTROL_ONLY_DEVICE)
-                                       return (UENUM & ENDPOINT_EPNUM_MASK);
-                               #else
-                                       return ENDPOINT_CONTROLEP;
-                               #endif
-                       }
-
-                       /** Selects the given endpoint number. If the address from the device descriptors is used, the
-                        *  value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint
-                        *  number (and discarding the endpoint direction bit).
-                        *
-                        *  Any endpoint operations which do not require the endpoint number to be indicated will operate on
-                        *  the currently selected endpoint.
-                        *
-                        *  \param[in] EndpointNumber Endpoint number to select.
-                        */
-                       static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber)
-                       {
-                               #if !defined(CONTROL_ONLY_DEVICE)
-                                       UENUM = EndpointNumber;
-                               #endif
-                       }
-
-                       /** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
-                        *  data In and Out pointers to the bank's contents.
-                        *
-                        *  \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
-                        */
-                       static inline void Endpoint_ResetFIFO(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_ResetFIFO(const uint8_t EndpointNumber)
-                       {
-                               UERST = (1 << EndpointNumber);
-                               UERST = 0;
-                       }
-
-                       /** Enables the currently selected endpoint so that data can be sent and received through it to
-                        *  and from a host.
-                        *
-                        *  \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
-                        */
-                       static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_EnableEndpoint(void)
-                       {
-                               UECONX |= (1 << EPEN);
-                       }
-
-                       /** Disables the currently selected endpoint so that data cannot be sent and received through it
-                        *  to and from a host.
-                        */
-                       static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_DisableEndpoint(void)
-                       {
-                               UECONX &= ~(1 << EPEN);
-                       }
-
-                       /** Determines if the currently selected endpoint is enabled, but not necessarily configured.
-                        *
-                        * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
-                        */
-                       static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsEnabled(void)
-                       {
-                               return ((UECONX & (1 << EPEN)) ? true : false);
-                       }
-
-                       /** Aborts all pending IN transactions on the currently selected endpoint, once the bank
-                        *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
-                        *  will terminate all queued transactions, resetting the endpoint banks ready for a new
-                        *  packet.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        */
-                       static inline void Endpoint_AbortPendingIN(void)
-                       {
-                               while (UESTA0X & (0x03 << NBUSYBK0))
-                               {
-                                       UEINTX |= (1 << RXOUTI);
-                                       while (UEINTX & (1 << RXOUTI));
-                               }
-                       }
-                       
-                       /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
-                        *  transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
-                        *  \ref Endpoint_ClearOUT() command.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \return Total number of busy banks in the selected endpoint.
-                        */
-                       static inline uint8_t Endpoint_GetBusyBanks(void)
-                       {
-                               return (UESTA0X & (0x03 << NBUSYBK0));
-                       }
-
-                       /** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
-                        *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
-                        *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
-                        *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
-                        *  direction and the endpoint bank is full.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending
-                        *          on its direction.
-                        */
-                       static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsReadWriteAllowed(void)
-                       {
-                               return ((UEINTX & (1 << RWAL)) ? true : false);
-                       }
-
-                       /** Determines if the currently selected endpoint is configured.
-                        *
-                        *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
-                        */
-                       static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsConfigured(void)
-                       {
-                               return ((UESTA0X & (1 << CFGOK)) ? true : false);
-                       }
-
-                       /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
-                        *  interrupt duration has elapsed. Which endpoints have interrupted can be determined by
-                        *  masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
-                        *
-                        *  \return Mask whose bits indicate which endpoints have interrupted.
-                        */
-                       static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Endpoint_GetEndpointInterrupts(void)
-                       {
-                               return UEINT;
-                       }
-
-                       /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
-                        *  endpoints).
-                        *
-                        *  \param[in] EndpointNumber  Index of the endpoint whose interrupt flag should be tested.
-                        *
-                        *  \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
-                        */
-                       static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber)
-                       {
-                               return ((UEINT & (1 << EndpointNumber)) ? true : false);
-                       }
-
-                       /** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
-                        */
-                       static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsINReady(void)
-                       {
-                               return ((UEINTX & (1 << TXINI)) ? true : false);
-                       }
-
-                       /** Determines if the selected OUT endpoint has received new packet from the host.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
-                        */
-                       static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsOUTReceived(void)
-                       {
-                               return ((UEINTX & (1 << RXOUTI)) ? true : false);
-                       }
-
-                       /** Determines if the current CONTROL type endpoint has received a SETUP packet.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
-                        */
-                       static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsSETUPReceived(void)
-                       {
-                               return ((UEINTX & (1 << RXSTPI)) ? true : false);
-                       }
-
-                       /** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
-                        *  endpoint for the next packet.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \note This is not applicable for non CONTROL type endpoints.
-                        */
-                       static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_ClearSETUP(void)
-                       {
-                               UEINTX &= ~(1 << RXSTPI);
-                       }
-
-                       /** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the
-                        *  next packet and switching to the alternative endpoint bank if double banked.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        */
-                       static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_ClearIN(void)
-                       {
-                               #if !defined(CONTROL_ONLY_DEVICE)
-                                       UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
-                               #else
-                                       UEINTX &= ~(1 << TXINI);
-                               #endif
-                       }
-
-                       /** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint
-                        *  for the next packet and switching to the alternative endpoint bank if double banked.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        */
-                       static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_ClearOUT(void)
-                       {
-                               #if !defined(CONTROL_ONLY_DEVICE)
-                                       UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
-                               #else
-                                       UEINTX &= ~(1 << RXOUTI);
-                               #endif
-                       }
-
-                       /** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
-                        *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
-                        *  way for devices to indicate invalid commands to the host so that the current transfer can be
-                        *  aborted and the host can begin its own recovery sequence.
-                        *
-                        *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro
-                        *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
-                        *  endpoint.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        */
-                       static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_StallTransaction(void)
-                       {
-                               UECONX |= (1 << STALLRQ);
-                       }
-
-                       /** Clears the STALL condition on the currently selected endpoint.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        */
-                       static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_ClearStall(void)
-                       {
-                               UECONX |= (1 << STALLRQC);
-                       }
-
-                       /** Determines if the currently selected endpoint is stalled, false otherwise.
-                        *
-                        *  \ingroup Group_EndpointPacketManagement
-                        *
-                        *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
-                        */
-                       static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Endpoint_IsStalled(void)
-                       {
-                               return ((UECONX & (1 << STALLRQ)) ? true : false);
-                       }
-
-                       /** Resets the data toggle of the currently selected endpoint. */
-                       static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_ResetDataToggle(void)
-                       {
-                               UECONX |= (1 << RSTDT);
-                       }
-
-                       /** Determines the currently selected endpoint's direction.
-                        *
-                        *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
-                        */
-                       static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Endpoint_GetEndpointDirection(void)
-                       {
-                               return (UECFG0X & ENDPOINT_DIR_IN);
-                       }
-
-                       /** Sets the direction of the currently selected endpoint.
-                        *
-                        *  \param[in] DirectionMask  New endpoint direction, as a \c ENDPOINT_DIR_* mask.
-                        */
-                       static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask)
-                       {
-                               UECFG0X = ((UECFG0X & ~ENDPOINT_DIR_IN) | DirectionMask);
-                       }
-
-                       /** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \return Next byte in the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline uint8_t Endpoint_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Endpoint_Read_Byte(void)
-                       {
-                               return UEDATX;
-                       }
-
-                       /** Writes one byte from the currently selected endpoint's bank, for IN direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \param[in] Byte  Next byte to write into the the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline void Endpoint_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Write_Byte(const uint8_t Byte)
-                       {
-                               UEDATX = Byte;
-                       }
-
-                       /** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        */
-                       static inline void Endpoint_Discard_Byte(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Discard_Byte(void)
-                       {
-                               uint8_t Dummy;
-
-                               Dummy = UEDATX;
-                       }
-
-                       /** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \return Next word in the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline uint16_t Endpoint_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint16_t Endpoint_Read_Word_LE(void)
-                       {
-                               union
-                               {
-                                       uint16_t Word;
-                                       uint8_t  Bytes[2];
-                               } Data;
-
-                               Data.Bytes[0] = UEDATX;
-                               Data.Bytes[1] = UEDATX;
-
-                               return Data.Word;
-                       }
-
-                       /** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \return Next word in the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline uint16_t Endpoint_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint16_t Endpoint_Read_Word_BE(void)
-                       {
-                               union
-                               {
-                                       uint16_t Word;
-                                       uint8_t  Bytes[2];
-                               } Data;
-
-                               Data.Bytes[1] = UEDATX;
-                               Data.Bytes[0] = UEDATX;
-
-                               return Data.Word;
-                       }
-
-                       /** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \param[in] Word  Next word to write to the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Write_Word_LE(const uint16_t Word)
-                       {
-                               UEDATX = (Word & 0xFF);
-                               UEDATX = (Word >> 8);
-                       }
-
-                       /** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \param[in] Word  Next word to write to the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Write_Word_BE(const uint16_t Word)
-                       {
-                               UEDATX = (Word >> 8);
-                               UEDATX = (Word & 0xFF);
-                       }
-
-                       /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        */
-                       static inline void Endpoint_Discard_Word(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Discard_Word(void)
-                       {
-                               uint8_t Dummy;
-
-                               Dummy = UEDATX;
-                               Dummy = UEDATX;
-                       }
-
-                       /** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \return Next double word in the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline uint32_t Endpoint_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint32_t Endpoint_Read_DWord_LE(void)
-                       {
-                               union
-                               {
-                                       uint32_t DWord;
-                                       uint8_t  Bytes[4];
-                               } Data;
-
-                               Data.Bytes[0] = UEDATX;
-                               Data.Bytes[1] = UEDATX;
-                               Data.Bytes[2] = UEDATX;
-                               Data.Bytes[3] = UEDATX;
-
-                               return Data.DWord;
-                       }
-
-                       /** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \return Next double word in the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline uint32_t Endpoint_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint32_t Endpoint_Read_DWord_BE(void)
-                       {
-                               union
-                               {
-                                       uint32_t DWord;
-                                       uint8_t  Bytes[4];
-                               } Data;
-
-                               Data.Bytes[3] = UEDATX;
-                               Data.Bytes[2] = UEDATX;
-                               Data.Bytes[1] = UEDATX;
-                               Data.Bytes[0] = UEDATX;
-
-                               return Data.DWord;
-                       }
-
-                       /** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \param[in] DWord  Next double word to write to the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Write_DWord_LE(const uint32_t DWord)
-                       {
-                               UEDATX = (DWord &  0xFF);
-                               UEDATX = (DWord >> 8);
-                               UEDATX = (DWord >> 16);
-                               UEDATX = (DWord >> 24);
-                       }
-
-                       /** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
-                        *  direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        *
-                        *  \param[in] DWord  Next double word to write to the currently selected endpoint's FIFO buffer.
-                        */
-                       static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Write_DWord_BE(const uint32_t DWord)
-                       {
-                               UEDATX = (DWord >> 24);
-                               UEDATX = (DWord >> 16);
-                               UEDATX = (DWord >> 8);
-                               UEDATX = (DWord &  0xFF);
-                       }
-
-                       /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
-                        *
-                        *  \ingroup Group_EndpointPrimitiveRW
-                        */
-                       static inline void Endpoint_Discard_DWord(void) ATTR_ALWAYS_INLINE;
-                       static inline void Endpoint_Discard_DWord(void)
-                       {
-                               uint8_t Dummy;
-
-                               Dummy = UEDATX;
-                               Dummy = UEDATX;
-                               Dummy = UEDATX;
-                               Dummy = UEDATX;
-                       }
-
-               /* External Variables: */
-                       /** Global indicating the maximum packet size of the default control endpoint located at address
-                        *  0 in the device. This value is set to the value indicated in the device descriptor in the user
-                        *  project once the USB interface is initialized into device mode.
-                        *
-                        *  If space is an issue, it is possible to fix this to a static value by defining the control
-                        *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile
-                        *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically
-                        *  read from the descriptors at runtime and instead fixed to the given value. When used, it is
-                        *  important that the descriptor control endpoint size value matches the size given as the
-                        *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token
-                        *  be used in the device descriptors to ensure this.
-                        *
-                        *  \note This variable should be treated as read-only in the user application, and never manually
-                        *        changed in value.
-                        */
-                       #if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
-                               extern uint8_t USB_ControlEndpointSize;
-                       #else
-                               #define USB_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE
-                       #endif
-
-               /* Function Prototypes: */
-                       /** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
-                        *  with respect to the data direction. This is a convenience function which can be used to
-                        *  simplify user control request handling.
-                        */
-                       void Endpoint_ClearStatusStage(void);
-
-                       /** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
-                        *  to be read or written to it.
-                        *
-                        *  \note This routine should not be called on CONTROL type endpoints.
-                        *
-                        *  \ingroup Group_EndpointRW
-                        *
-                        *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
-                        */
-                       uint8_t Endpoint_WaitUntilReady(void);
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c
deleted file mode 100644 (file)
index e5dd4b0..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "../HighLevel/USBMode.h"
-
-#if defined(USB_CAN_BE_HOST)
-
-#define  __INCLUDE_FROM_HOST_C
-#include "Host.h"
-
-void USB_Host_ProcessNextHostState(void)
-{
-       uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
-       uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
-
-       static uint16_t WaitMSRemaining;
-       static uint8_t  PostWaitState;
-
-       switch (USB_HostState)
-       {
-               case HOST_STATE_WaitForDevice:
-                       if (WaitMSRemaining)
-                       {
-                               if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
-                               {
-                                       USB_HostState = PostWaitState;
-                                       ErrorCode     = HOST_ENUMERROR_WaitStage;
-                                       break;
-                               }
-
-                               if (!(--WaitMSRemaining))
-                                 USB_HostState = PostWaitState;
-                       }
-
-                       break;
-               case HOST_STATE_Powered:
-                       WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
-
-                       USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
-                       break;
-               case HOST_STATE_Powered_WaitForDeviceSettle:
-                       if (WaitMSRemaining--)
-                       {
-                               _delay_ms(1);
-                               break;
-                       }
-                       else
-                       {
-                               USB_Host_VBUS_Manual_Off();
-
-                               USB_OTGPAD_On();
-                               USB_Host_VBUS_Auto_Enable();
-                               USB_Host_VBUS_Auto_On();
-
-                               USB_HostState = HOST_STATE_Powered_WaitForConnect;
-                       }
-
-                       break;
-               case HOST_STATE_Powered_WaitForConnect:
-                       if (USB_INT_HasOccurred(USB_INT_DCONNI))
-                       {
-                               USB_INT_Clear(USB_INT_DCONNI);
-                               USB_INT_Clear(USB_INT_DDISCI);
-
-                               USB_INT_Clear(USB_INT_VBERRI);
-                               USB_INT_Enable(USB_INT_VBERRI);
-
-                               USB_Host_ResumeBus();
-                               Pipe_ClearPipes();
-
-                               HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
-                       }
-
-                       break;
-               case HOST_STATE_Powered_DoReset:
-                       USB_Host_ResetDevice();
-
-                       HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
-                       break;
-               case HOST_STATE_Powered_ConfigPipe:
-                       Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
-                                                          PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
-                                                          PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);
-
-                       if (!(Pipe_IsConfigured()))
-                       {
-                               ErrorCode    = HOST_ENUMERROR_PipeConfigError;
-                               SubErrorCode = 0;
-                               break;
-                       }
-
-                       USB_HostState = HOST_STATE_Default;
-                       break;
-               case HOST_STATE_Default:
-                       USB_ControlRequest = (USB_Request_Header_t)
-                               {
-                                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
-                                       .bRequest      = REQ_GetDescriptor,
-                                       .wValue        = (DTYPE_Device << 8),
-                                       .wIndex        = 0,
-                                       .wLength       = 8,
-                               };
-
-                       uint8_t DataBuffer[8];
-
-                       if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
-                       {
-                               ErrorCode = HOST_ENUMERROR_ControlError;
-                               break;
-                       }
-
-                       USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
-
-                       USB_Host_ResetDevice();
-
-                       HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
-                       break;
-               case HOST_STATE_Default_PostReset:
-                       Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
-                                          PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
-                                          USB_ControlPipeSize, PIPE_BANK_SINGLE);
-
-                       if (!(Pipe_IsConfigured()))
-                       {
-                               ErrorCode    = HOST_ENUMERROR_PipeConfigError;
-                               SubErrorCode = 0;
-                               break;
-                       }
-
-                       USB_ControlRequest = (USB_Request_Header_t)
-                               {
-                                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
-                                       .bRequest      = REQ_SetAddress,
-                                       .wValue        = USB_HOST_DEVICEADDRESS,
-                                       .wIndex        = 0,
-                                       .wLength       = 0,
-                               };
-
-                       if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
-                       {
-                               ErrorCode = HOST_ENUMERROR_ControlError;
-                               break;
-                       }
-
-                       HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
-                       break;
-               case HOST_STATE_Default_PostAddressSet:
-                       USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
-
-                       EVENT_USB_Host_DeviceEnumerationComplete();
-                       USB_HostState = HOST_STATE_Addressed;
-                       break;
-       }
-
-       if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
-       {
-               EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
-
-               USB_Host_VBUS_Auto_Off();
-
-               EVENT_USB_Host_DeviceUnattached();
-
-               USB_ResetInterface();
-       }
-}
-
-uint8_t USB_Host_WaitMS(uint8_t MS)
-{
-       bool    BusSuspended = USB_Host_IsBusSuspended();
-       uint8_t ErrorCode    = HOST_WAITERROR_Successful;
-       bool    HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
-
-       USB_INT_Disable(USB_INT_HSOFI);
-       USB_INT_Clear(USB_INT_HSOFI);
-
-       USB_Host_ResumeBus();
-
-       while (MS)
-       {
-               if (USB_INT_HasOccurred(USB_INT_HSOFI))
-               {
-                       USB_INT_Clear(USB_INT_HSOFI);
-                       MS--;
-               }
-
-               if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
-               {
-                       ErrorCode = HOST_WAITERROR_DeviceDisconnect;
-
-                       break;
-               }
-
-               if (Pipe_IsError() == true)
-               {
-                       Pipe_ClearError();
-                       ErrorCode = HOST_WAITERROR_PipeError;
-
-                       break;
-               }
-
-               if (Pipe_IsStalled() == true)
-               {
-                       Pipe_ClearStall();
-                       ErrorCode = HOST_WAITERROR_SetupStalled;
-
-                       break;
-               }
-       }
-
-       if (BusSuspended)
-         USB_Host_SuspendBus();
-
-       if (HSOFIEnabled)
-         USB_INT_Enable(USB_INT_HSOFI);
-
-       return ErrorCode;
-}
-
-static void USB_Host_ResetDevice(void)
-{
-       bool BusSuspended = USB_Host_IsBusSuspended();
-
-       USB_INT_Disable(USB_INT_DDISCI);
-
-       USB_Host_ResetBus();
-       while (!(USB_Host_IsBusResetComplete()));
-       USB_Host_ResumeBus();
-
-       bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
-
-       USB_INT_Disable(USB_INT_HSOFI);
-       USB_INT_Clear(USB_INT_HSOFI);
-
-       for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
-       {
-               /* Workaround for powerless-pull-up devices. After a USB bus reset,
-                  all disconnection interrupts are suppressed while a USB frame is
-                  looked for - if it is found within 10ms, the device is still
-                  present.                                                        */
-
-               if (USB_INT_HasOccurred(USB_INT_HSOFI))
-               {
-                       USB_INT_Clear(USB_INT_HSOFI);
-                       USB_INT_Clear(USB_INT_DDISCI);
-                       break;
-               }
-
-               _delay_ms(1);
-       }
-
-       if (HSOFIEnabled)
-         USB_INT_Enable(USB_INT_HSOFI);
-
-       if (BusSuspended)
-         USB_Host_SuspendBus();
-
-       USB_INT_Enable(USB_INT_DDISCI);
-}
-
-uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber)
-{
-       USB_ControlRequest = (USB_Request_Header_t)
-               {
-                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
-                       .bRequest      = REQ_SetConfiguration,
-                       .wValue        = ConfigNumber,
-                       .wIndex        = 0,
-                       .wLength       = 0,
-               };
-
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
-       return USB_Host_SendControlRequest(NULL);
-}
-
-uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr)
-{
-       USB_ControlRequest = (USB_Request_Header_t)
-               {
-                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
-                       .bRequest      = REQ_GetDescriptor,
-                       .wValue        = (DTYPE_Device << 8),
-                       .wIndex        = 0,
-                       .wLength       = sizeof(USB_Descriptor_Device_t),
-               };
-
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
-       return USB_Host_SendControlRequest(DeviceDescriptorPtr);
-}
-
-uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index,
-                                           void* const Buffer,
-                                           const uint8_t BufferLength)
-{
-       USB_ControlRequest = (USB_Request_Header_t)
-               {
-                       .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
-                       .bRequest      = REQ_GetDescriptor,
-                       .wValue        = (DTYPE_String << 8) | Index,
-                       .wIndex        = 0,
-                       .wLength       = BufferLength,
-               };
-
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
-       return USB_Host_SendControlRequest(Buffer);
-}
-
-uint8_t USB_Host_ClearPipeStall(const uint8_t EndpointNum)
-{
-       USB_ControlRequest = (USB_Request_Header_t)
-               {
-                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),
-                       .bRequest      = REQ_ClearFeature,
-                       .wValue        = FEATURE_SEL_EndpointHalt,
-                       .wIndex        = EndpointNum,
-                       .wLength       = 0,
-               };
-
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
-       return USB_Host_SendControlRequest(NULL);
-}
-
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h
deleted file mode 100644 (file)
index 651daf2..0000000
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB host mode definitions.
- *
- *  This file contains structures, function prototypes and macros related to USB host mode.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_Host Host Management
- *
- *  USB Host mode related macros and enums. This module contains macros and enums which are used when
- *  the USB controller is initialized in host mode.
- *
- *  @{
- */
-
-#ifndef __USBHOST_H__
-#define __USBHOST_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <stdbool.h>
-               #include <util/delay.h>
-
-               #include "../../../Common/Common.h"
-               #include "../HighLevel/StdDescriptors.h"
-               #include "Pipe.h"
-               #include "USBInterrupt.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** Indicates the fixed USB device address which any attached device is enumerated to when in
-                        *  host mode. As only one USB device may be attached to the AVR in host mode at any one time
-                        *  and that the address used is not important (other than the fact that it is non-zero), a
-                        *  fixed value is specified by the library.
-                        */
-                       #define USB_HOST_DEVICEADDRESS                 1
-
-                       #if !defined(USB_HOST_TIMEOUT_MS) || defined(__DOXYGEN__)
-                               /** Constant for the maximum software timeout period of sent USB control transactions to an attached
-                                *  device. If a device fails to respond to a sent control request within this period, the
-                                *  library will return a timeout error code.
-                                *
-                                *  This value may be overridden in the user project makefile as the value of the
-                                *  \ref USB_HOST_TIMEOUT_MS token, and passed to the compiler using the -D switch.
-                                */
-                               #define USB_HOST_TIMEOUT_MS                1000
-                       #endif
-
-                       #if !defined(HOST_DEVICE_SETTLE_DELAY_MS) || defined(__DOXYGEN__)
-                               /** Constant for the delay in milliseconds after a device is connected before the library
-                                *  will start the enumeration process. Some devices require a delay of up to 5 seconds
-                                *  after connection before the enumeration process can start or incorrect operation will
-                                *  occur.
-                                *
-                                *  The default delay value may be overridden in the user project makefile by defining the
-                                *  \c HOST_DEVICE_SETTLE_DELAY_MS token to the required delay in milliseconds, and passed to the
-                                *  compiler using the -D switch.
-                                */
-                               #define HOST_DEVICE_SETTLE_DELAY_MS        1000
-                       #endif
-
-               /* Enums: */
-                       /** Enum for the various states of the USB Host state machine. Only some states are
-                        *  implemented in the LUFA library - other states are left to the user to implement.
-                        *
-                        *  For information on each possible USB host state, refer to the USB 2.0 specification.
-                        *  Several of the USB host states are broken up further into multiple smaller sub-states,
-                        *  so that they can be internally implemented inside the library in an efficient manner.
-                        *
-                        *  \see \ref USB_HostState, which stores the current host state machine state.
-                        */
-                       enum USB_Host_States_t
-                       {
-                               HOST_STATE_WaitForDeviceRemoval         = 0,  /**< Internally implemented by the library. This state can be
-                                                                              *   used by the library to wait until the attached device is
-                                                                              *   removed by the user - useful for when an error occurs or
-                                                                              *   further communication with the device is not needed. This
-                                                                              *   allows for other code to run while the state machine is
-                                                                              *   effectively disabled.
-                                                                              */
-                               HOST_STATE_WaitForDevice                = 1,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that the stack is waiting for an interval to elapse before
-                                                                              *   continuing with the next step of the device enumeration
-                                                                              *   process.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Unattached                   = 2,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that the host state machine is waiting for a device to be
-                                                                              *   attached so that it can start the enumeration process.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Powered                      = 3,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that a device has been attached, and the library's internals
-                                                                              *   are being configured to begin the enumeration process.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Powered_WaitForDeviceSettle  = 4,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that the stack is waiting for the initial settling period to
-                                                                              *   elapse before beginning the enumeration process.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Powered_WaitForConnect       = 5,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that the stack is waiting for a connection event from the USB
-                                                                              *   controller to indicate a valid USB device has been attached to
-                                                                              *   the bus and is ready to be enumerated.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Powered_DoReset              = 6,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that a valid USB device has been attached, and that it is
-                                                                              *   will now be reset to ensure it is ready for enumeration.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Powered_ConfigPipe           = 7,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that the attached device is currently powered and reset, and
-                                                                              *   that the control pipe is now being configured by the stack.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Default                      = 8,  /**< Internally implemented by the library. This state indicates
-                                                                              *   that the stack is currently retrieving the control endpoint's
-                                                                              *   size from the device, so that the control pipe can be altered
-                                                                              *   to match.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Default_PostReset            = 9,  /**< Internally implemented by the library. This state indicates that
-                                                                              *   the control pipe is being reconfigured to match the retrieved
-                                                                              *   control endpoint size from the device, and the device's USB bus
-                                                                              *   address is being set.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Default_PostAddressSet       = 10, /**< Internally implemented by the library. This state indicates that
-                                                                              *   the device's address has now been set, and the stack is has now
-                                                                              *   completed the device enumeration process. This state causes the
-                                                                              *   stack to change the current USB device address to that set for
-                                                                              *   the connected device, before progressing to the user-implemented
-                                                                              *   \ref HOST_STATE_Addressed state for further communications.
-                                                                              *
-                                                                              *   \note Do not manually change to this state in the user code.
-                                                                              */
-                               HOST_STATE_Addressed                    = 11, /**< May be implemented by the user project. This state should
-                                                                              *   set the device configuration before progressing to the
-                                                                              *   \ref HOST_STATE_Configured state. Other processing (such as the
-                                                                              *   retrieval and processing of the device descriptor) should also
-                                                                              *   be placed in this state.
-                                                                              */
-                               HOST_STATE_Configured                   = 12, /**< May be implemented by the user project. This state should implement the
-                                                                              *   actual work performed on the attached device and changed to the
-                                                                              *   \ref HOST_STATE_Suspended or \ref HOST_STATE_WaitForDeviceRemoval states as needed.
-                                                                              */
-                               HOST_STATE_Suspended                    = 15, /**< May be implemented by the user project. This state should be maintained
-                                                                              *   while the bus is suspended, and changed to either the \ref HOST_STATE_Configured
-                                                                              *   (after resuming the bus with the USB_Host_ResumeBus() macro) or the
-                                                                              *   \ref HOST_STATE_WaitForDeviceRemoval states as needed.
-                                                                              */
-                       };
-
-                       /** Enum for the error codes for the \ref EVENT_USB_Host_HostError() event.
-                        *
-                        *  \see \ref Group_Events for more information on this event.
-                        */
-                       enum USB_Host_ErrorCodes_t
-                       {
-                               HOST_ERROR_VBusVoltageDip       = 0, /**< VBUS voltage dipped to an unacceptable level. This
-                                                                     *   error may be the result of an attached device drawing
-                                                                     *   too much current from the VBUS line, or due to the
-                                                                     *   AVR's power source being unable to supply sufficient
-                                                                     *   current.
-                                                                     */
-                       };
-
-                       /** Enum for the error codes for the \ref EVENT_USB_Host_DeviceEnumerationFailed() event.
-                        *
-                        *  \see \ref Group_Events for more information on this event.
-                        */
-                       enum USB_Host_EnumerationErrorCodes_t
-                       {
-                               HOST_ENUMERROR_NoError          = 0, /**< No error occurred. Used internally, this is not a valid
-                                                                     *   ErrorCode parameter value for the \ref EVENT_USB_Host_DeviceEnumerationFailed()
-                                                                     *   event.
-                                                                     */
-                               HOST_ENUMERROR_WaitStage        = 1, /**< One of the delays between enumeration steps failed
-                                                                     *   to complete successfully, due to a timeout or other
-                                                                     *   error.
-                                                                     */
-                               HOST_ENUMERROR_NoDeviceDetected = 2, /**< No device was detected, despite the USB data lines
-                                                                     *   indicating the attachment of a device.
-                                                                     */
-                               HOST_ENUMERROR_ControlError     = 3, /**< One of the enumeration control requests failed to
-                                                                     *   complete successfully.
-                                                                     */
-                               HOST_ENUMERROR_PipeConfigError  = 4, /**< The default control pipe (address 0) failed to
-                                                                     *   configure correctly.
-                                                                     */
-                       };
-
-               /* Inline Functions: */
-                       /** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
-                        *  the frame number is incremented by one.
-                        */
-                       static inline uint16_t USB_Host_GetFrameNumber(void)
-                       {
-                               return UHFNUM;
-                       }
-
-                       #if !defined(NO_SOF_EVENTS)
-                               /** Enables the host mode Start Of Frame events. When enabled, this causes the
-                                *  \ref EVENT_USB_Host_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
-                                *  at the start of each USB frame when a device is enumerated while in host mode.
-                                *
-                                *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
-                                */
-                               static inline void USB_Host_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
-                               static inline void USB_Host_EnableSOFEvents(void)
-                               {
-                                       USB_INT_Enable(USB_INT_HSOFI);
-                               }
-
-                               /** Disables the host mode Start Of Frame events. When disabled, this stops the firing of the
-                                *  \ref EVENT_USB_Host_StartOfFrame() event when enumerated in host mode.
-                                *
-                                *  \note Not available when the NO_SOF_EVENTS compile time token is defined.
-                                */
-                               static inline void USB_Host_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
-                               static inline void USB_Host_DisableSOFEvents(void)
-                               {
-                                       USB_INT_Disable(USB_INT_HSOFI);
-                               }
-                       #endif
-
-                       /** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
-                        *  USB bus resets leave the default control pipe configured (if already configured).
-                        *
-                        *  If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
-                        *  woken up automatically and the bus resumed after the reset has been correctly issued.
-                        */
-                       static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_ResetBus(void)
-                       {
-                               UHCON |=  (1 << RESET);
-                       }
-
-                       /** Determines if a previously issued bus reset (via the \ref USB_Host_ResetBus() macro) has
-                        *  completed.
-                        *
-                        *  \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
-                        */
-                       static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_Host_IsBusResetComplete(void)
-                       {
-                               return ((UHCON & (1 << RESET)) ? false : true);
-                       }
-
-                       /** Resumes USB communications with an attached and enumerated device, by resuming the transmission
-                        *  of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
-                        *  host and attached device may occur.
-                        */
-                       static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_ResumeBus(void)
-                       {
-                               UHCON |=  (1 << SOFEN);
-                       }
-
-                       /** Suspends the USB bus, preventing any communications from occurring between the host and attached
-                        *  device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
-                        *  messages to the device.
-                        */
-                       static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_SuspendBus(void)
-                       {
-                               UHCON &= ~(1 << SOFEN);
-                       }
-
-                       /** Determines if the USB bus has been suspended via the use of the \ref USB_Host_SuspendBus() macro,
-                        *  false otherwise. While suspended, no USB communications can occur until the bus is resumed,
-                        *  except for the Remote Wakeup event from the device if supported.
-                        *
-                        *  \return Boolean \c true if the bus is currently suspended, \c false otherwise.
-                        */
-                       static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_Host_IsBusSuspended(void)
-                       {
-                               return ((UHCON & (1 << SOFEN)) ? false : true);
-                       }
-
-                       /** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
-                        *  false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
-                        *
-                        *  \return Boolean \c true if the attached device is enumerated in Full Speed mode, \c false otherwise.
-                        */
-                       static inline bool USB_Host_IsDeviceFullSpeed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_Host_IsDeviceFullSpeed(void)
-                       {
-                               return ((USBSTA & (1 << SPEED)) ? true : false);
-                       }
-
-                       /** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
-                        *  that the host resume the USB bus and wake up the device, false otherwise.
-                        *
-                        *  \return Boolean \c true if the attached device has sent a Remote Wakeup request, \c false otherwise.
-                        */
-                       static inline bool USB_Host_IsRemoteWakeupSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_Host_IsRemoteWakeupSent(void)
-                       {
-                               return ((UHINT & (1 << RXRSMI)) ? true : false);
-                       }
-
-                       /** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
-                       static inline void USB_Host_ClearRemoteWakeupSent(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_ClearRemoteWakeupSent(void)
-                       {
-                               UHINT &= ~(1 << RXRSMI);
-                       }
-
-                       /** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
-                        *  a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
-                        *  be resumed.
-                        */
-                       static inline void USB_Host_ResumeFromWakeupRequest(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_ResumeFromWakeupRequest(void)
-                       {
-                               UHCON |=  (1 << RESUME);
-                       }
-
-                       /** Determines if a resume from Remote Wakeup request is currently being sent to an attached
-                        *  device.
-                        *
-                        *  \return Boolean \c true if no resume request is currently being sent, \c false otherwise.
-                        */
-                       static inline bool USB_Host_IsResumeFromWakeupRequestSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_Host_IsResumeFromWakeupRequestSent(void)
-                       {
-                               return ((UHCON & (1 << RESUME)) ? false : true);
-                       }
-
-               /* Function Prototypes: */
-                       /** Convenience function. This routine sends a SET CONFIGURATION standard request to the attached
-                        *  device, with the given configuration index. This can be used to easily set the device
-                        *  configuration without creating and sending the request manually.
-                        *
-                        *  \note After this routine returns, the control pipe will be selected.
-                        *
-                        *  \param[in] ConfigNumber  Configuration index to send to the device.
-                        *
-                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
-                        */
-                       uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber);
-
-                       /** Convenience function. This routine sends a GET DESCRIPTOR standard request to the attached
-                        *  device, requesting the device descriptor. This can be used to easily retrieve information
-                        *  about the device such as its VID, PID and power requirements.
-                        *
-                        *  \note After this routine returns, the control pipe will be selected.
-                        *
-                        *  \param[out] DeviceDescriptorPtr  Pointer to the destination device descriptor structure where
-                        *                                   the read data is to be stored.
-                        *
-                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
-                        */
-                       uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr);
-
-                       /** Convenience function. This routine sends a GET DESCRIPTOR standard request to the attached
-                        *  device, requesting the string descriptor of the specified index. This can be used to easily
-                        *  retrieve string descriptors from the device by index, after the index is obtained from the
-                        *  Device or Configuration descriptors.
-                        *
-                        *  \note After this routine returns, the control pipe will be selected.
-                        *
-                        *  \param[in]  Index        Index of the string index to retrieve.
-                        *  \param[out] Buffer       Pointer to the destination buffer where the retrieved string descriptor is
-                        *                           to be stored.
-                        *  \param[in] BufferLength  Maximum size of the string descriptor which can be stored into the buffer.
-                        *
-                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
-                        */
-                       uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index,
-                                                                  void* const Buffer,
-                                                                  const uint8_t BufferLength);
-
-                       /** Clears a stall condition on the given pipe, via a CLEAR FEATURE standard request to the attached device.
-                        *
-                        *  \note After this routine returns, the control pipe will be selected.
-                        *
-                        *  \param[in] EndpointIndex  Index of the endpoint to clear, including the endpoint's direction.
-                        *
-                        *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
-                        */
-                       uint8_t USB_Host_ClearPipeStall(const uint8_t EndpointIndex);
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Macros: */
-                       static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_HostMode_On(void)
-                       {
-                               USBCON |=  (1 << HOST);
-                       }
-
-                       static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_HostMode_Off(void)
-                       {
-                               USBCON &= ~(1 << HOST);
-                       }
-
-                       static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_VBUS_Auto_Enable(void)
-                       {
-                               OTGCON &= ~(1 << VBUSHWC);
-                               UHWCON |=  (1 << UVCONE);
-                       }
-
-                       static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_VBUS_Manual_Enable(void)
-                       {
-                               OTGCON |=  (1 << VBUSHWC);
-                               UHWCON &= ~(1 << UVCONE);
-
-                               DDRE   |=  (1 << 7);
-                       }
-
-                       static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_VBUS_Auto_On(void)
-                       {
-                               OTGCON |=  (1 << VBUSREQ);
-                       }
-
-                       static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_VBUS_Manual_On(void)
-                       {
-                               PORTE  |=  (1 << 7);
-                       }
-
-                       static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_VBUS_Auto_Off(void)
-                       {
-                               OTGCON |=  (1 << VBUSRQC);
-                       }
-
-                       static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_VBUS_Manual_Off(void)
-                       {
-                               PORTE  &= ~(1 << 7);
-                       }
-
-                       static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
-                       {
-                               UHADDR  =  (Address & 0x7F);
-                       }
-
-               /* Enums: */
-                       enum USB_Host_WaitMSErrorCodes_t
-                       {
-                               HOST_WAITERROR_Successful       = 0,
-                               HOST_WAITERROR_DeviceDisconnect = 1,
-                               HOST_WAITERROR_PipeError        = 2,
-                               HOST_WAITERROR_SetupStalled     = 3,
-                       };
-
-               /* Function Prototypes: */
-                       void    USB_Host_ProcessNextHostState(void);
-                       uint8_t USB_Host_WaitMS(uint8_t MS);
-
-                       #if defined(__INCLUDE_FROM_HOST_C)
-                               static void USB_Host_ResetDevice(void);
-                       #endif
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/LowLevel/OTG.h b/LUFA/Drivers/USB/LowLevel/OTG.h
deleted file mode 100644 (file)
index 2cb751d..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB OTG mode definitions.
- *
- *  This file contains structures, function prototypes and macros related to USB OTG mode, where two USB devices
- *  may be linked directly together and exchange host/device roles as needed.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_OTG USB On The Go (OTG) Management
- *
- *  This module contains macros for embedded USB hosts with dual role On The Go capabilities, for managing role
- *  exchange. OTG is a way for two USB dual role devices to talk to one another directly without fixed device/host
- *  roles.
- *
- *  @{
- */
-
-#ifndef __USBOTG_H__
-#define __USBOTG_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <stdbool.h>
-
-               #include "../../../Common/Common.h"
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** Mask for the VBUS pulsing method of SRP, supported by some OTG devices.
-                        *
-                        *  \see \ref USB_OTG_Device_InitiateSRP().
-                        */
-                       #define USB_OTG_SRP_VBUS                   (1 << SRPSEL)
-
-                       /** Mask for the Data + pulsing method of SRP, supported by some OTG devices.
-                        *
-                        *  \see \ref USB_OTG_Device_InitiateSRP().
-                        */
-                       #define USB_OTG_STP_DATA                   0
-
-               /* Inline Functions: */
-                       /** Initiate a Host Negotiation Protocol request. This indicates to the other connected device
-                        *  that the device wishes to change device/host roles.
-                        */
-                       static inline void USB_OTG_Device_RequestHNP(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTG_Device_RequestHNP(void)
-                       {
-                               OTGCON |=  (1 << HNPREQ);
-                       }
-
-                       /** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other
-                        *  connected device.
-                        */
-                       static inline void USB_OTG_Device_CancelHNPRequest(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTG_Device_CancelHNPRequest(void)
-                       {
-                               OTGCON &= ~(1 << HNPREQ);
-                       }
-
-                       /** Determines if the device is currently sending a HNP to an attached host.
-                        *
-                        *  \return Boolean \c true if currently sending a HNP to the other connected device, \c false otherwise
-                        */
-                       static inline bool USB_OTG_Device_IsSendingHNP(void) ATTR_ALWAYS_INLINE;
-                       static inline bool USB_OTG_Device_IsSendingHNP(void)
-                       {
-                               return ((OTGCON & (1 << HNPREQ)) ? true : false);
-                       }
-
-                       /** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB
-                        *  interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in
-                        *  host mode indicates that VBUS should be applied and a session started.
-                        *
-                        *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by
-                        *  pulsing the Data + line via the internal pull-up resistor.
-                        *
-                        *  \param[in] SRPTypeMask  Mask indicating the type of SRP to use, either \ref USB_OTG_SRP_VBUS or
-                        *                          \ref USB_OTG_STP_DATA.
-                        */
-                       static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask)
-                       {
-                               OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (SRPTypeMask | (1 << SRPREQ)));
-                       }
-
-                       /** Accepts a HNP from a connected device, indicating that both devices should exchange
-                        *  device/host roles.
-                        */
-                       static inline void USB_OTG_Host_AcceptHNP(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTG_Host_AcceptHNP(void)
-                       {
-                               OTGCON |=  (1 << HNPREQ);
-                       }
-
-                       /** Rejects a HNP from a connected device, indicating that both devices should remain in their
-                        *  current device/host roles.
-                        */
-                       static inline void USB_OTG_Host_RejectHNP(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTG_Host_RejectHNP(void)
-                       {
-                               OTGCON &= ~(1 << HNPREQ);
-                       }
-
-                       /** Indicates if the connected device is not currently sending a HNP request.
-                        *
-                        *  \return Boolean \c true if a HNP is currently being issued by the connected device, \c false otherwise.
-                        */
-                       static inline bool USB_OTG_Host_IsHNPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_OTG_Host_IsHNPReceived(void)
-                       {
-                               return ((OTGCON & (1 << HNPREQ)) ? true : false);
-                       }
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c
deleted file mode 100644 (file)
index 82a9c1a..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "../HighLevel/USBMode.h"
-
-#if defined(USB_CAN_BE_HOST)
-
-#include "Pipe.h"
-
-uint8_t USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
-
-bool Pipe_ConfigurePipe(const uint8_t Number,
-                        const uint8_t Type,
-                        const uint8_t Token,
-                        const uint8_t EndpointNumber,
-                        const uint16_t Size,
-                        const uint8_t Banks)
-{
-#if defined(ORDERED_EP_CONFIG)
-       Pipe_SelectPipe(Number);
-       Pipe_EnablePipe();
-
-       UPCFG1X = 0;
-
-       UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
-       UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
-
-       Pipe_SetInfiniteINRequests();
-
-       return Pipe_IsConfigured();
-#else  
-       for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
-       {
-               uint8_t UPCFG0XTemp;
-               uint8_t UPCFG1XTemp;
-               uint8_t UPCFG2XTemp;
-               uint8_t UPCONXTemp;
-               uint8_t UPINRQXTemp;
-               uint8_t UPIENXTemp;
-
-               Pipe_SelectPipe(PNum);
-               
-               if (PNum == Number)
-               {
-                       UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
-                       UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
-                       UPCFG2XTemp = 0;
-                       UPCONXTemp  = ((1 << PEN) | (1 << INMODE));
-                       UPINRQXTemp = 0;
-                       UPIENXTemp  = 0;
-               }
-               else
-               {
-                       UPCFG0XTemp = UPCFG0X;
-                       UPCFG1XTemp = UPCFG1X;
-                       UPCFG2XTemp = UPCFG2X;
-                       UPCONXTemp  = UPCONX;
-                       UPINRQXTemp = UPINRQX;
-                       UPIENXTemp  = UPIENX;
-               }
-
-               if (!(UPCFG1XTemp & (1 << ALLOC)))
-                 continue;
-                 
-               Pipe_DisablePipe();
-               UPCFG1X &= (1 << ALLOC);
-
-               Pipe_EnablePipe();
-               UPCFG0X = UPCFG0XTemp;
-               UPCFG1X = UPCFG1XTemp;
-               UPCFG2X = UPCFG2XTemp;
-               UPCONX  = UPCONXTemp;
-               UPINRQX = UPINRQXTemp;
-               UPIENX  = UPIENXTemp;
-
-               if (!(Pipe_IsConfigured()))
-                 return false;         
-       }
-               
-       Pipe_SelectPipe(Number);        
-       return true;
-#endif
-}
-
-void Pipe_ClearPipes(void)
-{
-       UPINT = 0;
-
-       for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
-       {
-               Pipe_SelectPipe(PNum);
-               UPIENX  = 0;
-               UPINTX  = 0;
-               UPCFG1X = 0;
-               Pipe_DisablePipe();
-       }
-}
-
-bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
-{
-       uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();
-
-       for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
-       {
-               Pipe_SelectPipe(PNum);
-
-               if (!(Pipe_IsConfigured()))
-                 continue;
-
-               uint8_t PipeToken        = Pipe_GetPipeToken();
-               bool    PipeTokenCorrect = true;
-
-               if (PipeToken != PIPE_TOKEN_SETUP)
-                 PipeTokenCorrect = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT));
-
-               if (PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)))
-                 return true;
-       }
-
-       Pipe_SelectPipe(PrevPipeNumber);
-       return false;
-}
-
-uint8_t Pipe_WaitUntilReady(void)
-{
-       #if (USB_STREAM_TIMEOUT_MS < 0xFF)
-       uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
-       #else
-       uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
-       #endif
-
-       uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
-
-       for (;;)
-       {
-               if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
-               {
-                       if (Pipe_IsINReceived())
-                         return PIPE_READYWAIT_NoError;
-               }
-               else
-               {
-                       if (Pipe_IsOUTReady())
-                         return PIPE_READYWAIT_NoError;
-               }
-
-               if (Pipe_IsStalled())
-                 return PIPE_READYWAIT_PipeStalled;
-               else if (USB_HostState == HOST_STATE_Unattached)
-                 return PIPE_READYWAIT_DeviceDisconnected;
-
-               uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
-
-               if (CurrentFrameNumber != PreviousFrameNumber)
-               {
-                       PreviousFrameNumber = CurrentFrameNumber;
-
-                       if (!(TimeoutMSRem--))
-                         return PIPE_READYWAIT_Timeout;
-               }
-       }
-}
-
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h
deleted file mode 100644 (file)
index 34a64a7..0000000
+++ /dev/null
@@ -1,943 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB host pipe management definitions.
- *
- *  This file contains structures, function prototypes and macros related to the management of the device's
- *  data pipes when the library is initialized in USB host mode.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_PipeManagement
- *  \defgroup Group_PipeRW Pipe Data Reading and Writing
- *
- *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
- */
-
-/** \ingroup Group_PipeRW
- *  \defgroup Group_PipePrimitiveRW Read/Write of Primitive Data Types
- *
- *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
- *  from and to pipes.
- */
-
-/** \ingroup Group_PipeManagement
- *  \defgroup Group_PipePacketManagement Pipe Packet Management
- *
- *  Functions, macros, variables, enums and types related to packet management of pipes.
- */
-
-/** \ingroup Group_PipeManagement
- *  \defgroup Group_PipeControlReq Pipe Control Request Management
- *
- *  Module for host mode request processing. This module allows for the transmission of standard, class and
- *  vendor control requests to the default control endpoint of an attached device while in host mode.
- *
- *  \see Chapter 9 of the USB 2.0 specification.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_PipeManagement Pipe Management
- *
- *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This
- *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
- *  for various data types.
- *
- *  @{
- */
-
-#ifndef __PIPE_H__
-#define __PIPE_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <stdbool.h>
-
-               #include "../../../Common/Common.h"
-               #include "../HighLevel/USBTask.h"
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** \name Pipe Error Flag Masks */
-                       //@{
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */
-                       #define PIPE_ERRORFLAG_OVERFLOW         (1 << 6)
-
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that an underflow error occurred in the pipe on the received data. */
-                       #define PIPE_ERRORFLAG_UNDERFLOW        (1 << 5)
-
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */
-                       #define PIPE_ERRORFLAG_CRC16            (1 << 4)
-
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */
-                       #define PIPE_ERRORFLAG_TIMEOUT          (1 << 3)
-
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */
-                       #define PIPE_ERRORFLAG_PID              (1 << 2)
-
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */
-                       #define PIPE_ERRORFLAG_DATAPID          (1 << 1)
-
-                       /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */
-                       #define PIPE_ERRORFLAG_DATATGL          (1 << 0)
-                       //@}
-
-                       /** \name Pipe Token Masks */
-                       //@{
-                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes),
-                        *  which will trigger a control request on the attached device when data is written to the pipe.
-                        */
-                       #define PIPE_TOKEN_SETUP                (0 << PTOKEN0)
-
-                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),
-                        *  indicating that the pipe data will flow from device to host.
-                        */
-                       #define PIPE_TOKEN_IN                   (1 << PTOKEN0)
-
-                       /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a OUT token (for non-CONTROL type pipes),
-                        *  indicating that the pipe data will flow from host to device.
-                        */
-                       #define PIPE_TOKEN_OUT                  (2 << PTOKEN0)
-                       //@}
-                       
-                       /** \name Pipe Bank Mode Masks */
-                       //@{
-                       /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
-                        *  should have one single bank, which requires less USB FIFO memory but results in slower transfers as
-                        *  only one USB device (the AVR or the attached device) can access the pipe's bank at the one time.
-                        */
-                       #define PIPE_BANK_SINGLE                (0 << EPBK0)
-
-                       /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
-                        *  should have two banks, which requires more USB FIFO memory but results in faster transfers as one
-                        *  USB device (the AVR or the attached device) can access one bank while the other accesses the second
-                        *  bank.
-                        */
-                       #define PIPE_BANK_DOUBLE                (1 << EPBK0)
-                       //@}
-                       
-                       /** Pipe address for the default control pipe, which always resides in address 0. This is
-                        *  defined for convenience to give more readable code when used with the pipe macros.
-                        */
-                       #define PIPE_CONTROLPIPE                0
-
-                       /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value
-                        *  in the device descriptor of the attached device.
-                        */
-                       #define PIPE_CONTROLPIPE_DEFAULT_SIZE   64
-
-                       /** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address
-                        *  in the device.
-                        */
-                       #define PIPE_PIPENUM_MASK               0x07
-
-                       /** Total number of pipes (including the default control pipe at address 0) which may be used in
-                        *  the device. Different USB AVR models support different amounts of pipes, this value reflects
-                        *  the maximum number of pipes for the currently selected AVR model.
-                        */
-                       #define PIPE_TOTAL_PIPES                7
-
-                       /** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR
-                        *  model supports the largest bank size possible on the device; different pipe numbers support
-                        *  different maximum bank sizes. This value reflects the largest possible bank of any pipe on the
-                        *  currently selected USB AVR model.
-                        */
-                       #define PIPE_MAX_SIZE                   256
-
-                       /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
-                        *  numerical address in the attached device.
-                        */
-                       #define PIPE_EPNUM_MASK                 0x0F
-
-                       /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
-                        *  direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
-                        */
-                       #define PIPE_EPDIR_MASK                 0x80
-
-               /* Enums: */
-                       /** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function.
-                        *
-                        *  \ingroup Group_PipeRW
-                        */
-                       enum Pipe_WaitUntilReady_ErrorCodes_t
-                       {
-                               PIPE_READYWAIT_NoError                 = 0, /**< Pipe ready for next packet, no error. */
-                               PIPE_READYWAIT_PipeStalled             = 1,     /**< The device stalled the pipe while waiting. */
-                               PIPE_READYWAIT_DeviceDisconnected      = 2,     /**< Device was disconnected from the host while waiting. */
-                               PIPE_READYWAIT_Timeout                 = 3, /**< The device failed to accept or send the next packet
-                                                                            *   within the software timeout period set by the
-                                                                            *   \ref USB_STREAM_TIMEOUT_MS macro.
-                                                                            */
-                       };
-
-               /* Inline Functions: */
-                       /** Indicates the number of bytes currently stored in the current pipes's selected bank.
-                        *
-                        *  \note The return width of this function may differ, depending on the maximum pipe bank size
-                        *        of the selected AVR model.
-                        *
-                        *  \ingroup Group_PipeRW
-                        *
-                        *  \return Total number of bytes in the currently selected pipe's FIFO buffer.
-                        */
-                       static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint16_t Pipe_BytesInPipe(void)
-                       {
-                               return UPBCX;
-                       }
-
-                       /** Returns the pipe address of the currently selected pipe. This is typically used to save the
-                        *  currently selected pipe number so that it can be restored after another pipe has been manipulated.
-                        *
-                        *  \return Index of the currently selected pipe.
-                        */
-                       static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_GetCurrentPipe(void)
-                       {
-                               return (UPNUM & PIPE_PIPENUM_MASK);
-                       }
-
-                       /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
-                        *  indicated will operate on the currently selected pipe.
-                        *
-                        *  \param[in] PipeNumber  Index of the pipe to select.
-                        */
-                       static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
-                       {
-                               UPNUM = PipeNumber;
-                       }
-
-                       /** Resets the desired pipe, including the pipe banks and flags.
-                        *
-                        *  \param[in] PipeNumber  Index of the pipe to reset.
-                        */
-                       static inline void Pipe_ResetPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ResetPipe(const uint8_t PipeNumber)
-                       {
-                               UPRST = (1 << PipeNumber);
-                               UPRST = 0;
-                       }
-
-                       /** Enables the currently selected pipe so that data can be sent and received through it to and from
-                        *  an attached device.
-                        *
-                        *  \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
-                        */
-                       static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_EnablePipe(void)
-                       {
-                               UPCONX |= (1 << PEN);
-                       }
-
-                       /** Disables the currently selected pipe so that data cannot be sent and received through it to and
-                        *  from an attached device.
-                        */
-                       static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_DisablePipe(void)
-                       {
-                               UPCONX &= ~(1 << PEN);
-                       }
-
-                       /** Determines if the currently selected pipe is enabled, but not necessarily configured.
-                        *
-                        * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsEnabled(void)
-                       {
-                               return ((UPCONX & (1 << PEN)) ? true : false);
-                       }
-
-                       /** Gets the current pipe token, indicating the pipe's data direction and type.
-                        *
-                        *  \return The current pipe token, as a \c PIPE_TOKEN_* mask.
-                        */
-                       static inline uint8_t Pipe_GetPipeToken(void) ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_GetPipeToken(void)
-                       {
-                               return (UPCFG0X & (0x03 << PTOKEN0));
-                       }
-
-                       /** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_*
-                        *  masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
-                        *  control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
-                        *  which have two endpoints of opposite direction sharing the same endpoint address within the device.
-                        *
-                        *  \param[in] Token  New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
-                        */
-                       static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_SetPipeToken(const uint8_t Token)
-                       {
-                               UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
-                       }
-
-                       /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
-                       static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_SetInfiniteINRequests(void)
-                       {
-                               UPCONX |= (1 << INMODE);
-                       }
-
-                       /** Configures the currently selected pipe to only allow the specified number of IN requests to be
-                        *  accepted by the pipe before it is automatically frozen.
-                        *
-                        *  \param[in] TotalINRequests  Total number of IN requests that the pipe may receive before freezing.
-                        */
-                       static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
-                       {
-                               UPCONX &= ~(1 << INMODE);
-                               UPINRQX = TotalINRequests;
-                       }
-
-                       /** Determines if the currently selected pipe is configured.
-                        *
-                        *  \return Boolean \c true if the selected pipe is configured, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsConfigured(void)
-                       {
-                               return ((UPSTAX & (1 << CFGOK)) ? true : false);
-                       }
-
-                       /** Retrieves the endpoint number of the endpoint within the attached device that the currently selected
-                        *  pipe is bound to.
-                        *
-                        *  \return Endpoint number the currently selected pipe is bound to.
-                        */
-                       static inline uint8_t Pipe_BoundEndpointNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_BoundEndpointNumber(void)
-                       {
-                               return ((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK);
-                       }
-
-                       /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
-                        *
-                        *  \param[in] Milliseconds  Number of milliseconds between each pipe poll.
-                        */
-                       static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
-                       {
-                               UPCFG2X = Milliseconds;
-                       }
-
-                       /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
-                        *  be serviced.
-                        *
-                        *  \return Mask whose bits indicate which pipes have interrupted.
-                        */
-                       static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_GetPipeInterrupts(void)
-                       {
-                               return UPINT;
-                       }
-
-                       /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type
-                        *  pipes).
-                        *
-                        *  \param[in] PipeNumber  Index of the pipe whose interrupt flag should be tested.
-                        *
-                        *  \return Boolean \c true if the specified pipe has interrupted, \c false otherwise.
-                        */
-                       static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber)
-                       {
-                               return ((UPINT & (1 << PipeNumber)) ? true : false);
-                       }
-
-                       /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
-                       static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Unfreeze(void)
-                       {
-                               UPCONX &= ~(1 << PFREEZE);
-                       }
-
-                       /** Freezes the selected pipe, preventing it from communicating with an attached device. */
-                       static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Freeze(void)
-                       {
-                               UPCONX |= (1 << PFREEZE);
-                       }
-
-                       /** Determines if the currently selected pipe is frozen, and not able to accept data.
-                        *
-                        *  \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsFrozen(void)
-                       {
-                               return ((UPCONX & (1 << PFREEZE)) ? true : false);
-                       }
-
-                       /** Clears the master pipe error flag. */
-                       static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearError(void)
-                       {
-                               UPINTX &= ~(1 << PERRI);
-                       }
-
-                       /** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
-                        *  some sort of hardware error has occurred on the pipe.
-                        *
-                        *  \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
-                        *
-                        *  \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsError(void)
-                       {
-                               return ((UPINTX & (1 << PERRI)) ? true : false);
-                       }
-
-                       /** Clears all the currently selected pipe's hardware error flags, but does not clear the master error
-                        *  flag for the pipe.
-                        */
-                       static inline void Pipe_ClearErrorFlags(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearErrorFlags(void)
-                       {
-                               UPERRX = 0;
-                       }
-
-                       /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
-                        *  value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred.
-                        *
-                        *  \return  Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe.
-                        */
-                       static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_GetErrorFlags(void)
-                       {
-                               return ((UPERRX & (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT |
-                                                  PIPE_ERRORFLAG_PID   | PIPE_ERRORFLAG_DATAPID |
-                                                  PIPE_ERRORFLAG_DATATGL)) |
-                                       (UPSTAX & (PIPE_ERRORFLAG_OVERFLOW | PIPE_ERRORFLAG_UNDERFLOW)));
-                       }
-                       
-                       /** Retrieves the number of busy banks in the currently selected pipe, which have been queued for
-                        *  transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the
-                        *  \ref Pipe_ClearIN() command.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Total number of busy banks in the selected pipe.
-                        */
-                       static inline uint8_t Pipe_GetBusyBanks(void)
-                       {
-                               return (UPSTAX & (0x03 << NBUSYBK0));
-                       }
-
-                       /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
-                        *  bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
-                        *  direction). This function will return false if an error has occurred in the pipe, or if the pipe
-                        *  is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
-                        *  direction and the pipe bank is full.
-                        *
-                        *  \note This function is not valid on CONTROL type pipes.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Boolean \c true if the currently selected pipe may be read from or written to, depending
-                        *          on its direction.
-                        */
-                       static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsReadWriteAllowed(void)
-                       {
-                               return ((UPINTX & (1 << RWAL)) ? true : false);
-                       }
-
-                       /** Determines if a packet has been received on the currently selected IN pipe from the attached device.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsINReceived(void)
-                       {
-                               return ((UPINTX & (1 << RXINI)) ? true : false);
-                       }
-
-                       /** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsOUTReady(void)
-                       {
-                               return ((UPINTX & (1 << TXOUTI)) ? true : false);
-                       }
-
-                       /** Determines if no SETUP request is currently being sent to the attached device on the selected
-                        *  CONTROL type pipe.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsSETUPSent(void)
-                       {
-                               return ((UPINTX & (1 << TXSTPI)) ? true : false);
-                       }
-
-                       /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        */
-                       static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearSETUP(void)
-                       {
-                               UPINTX &= ~((1 << TXSTPI) | (1 << FIFOCON));
-                       }
-
-                       /** Acknowledges the reception of a setup IN request from the attached device on the currently selected
-                        *  pipe, freeing the bank ready for the next packet.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        */
-                       static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearIN(void)
-                       {
-                               UPINTX &= ~((1 << RXINI) | (1 << FIFOCON));
-                       }
-
-                       /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
-                        *  the bank ready for the next packet.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        */
-                       static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearOUT(void)
-                       {
-                               UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON));
-                       }
-
-                       /** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
-                        *  the currently selected pipe. This occurs when the host sends a packet to the device, but the device
-                        *  is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
-                        *  received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet
-                        *  can be re-sent.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsNAKReceived(void)
-                       {
-                               return ((UPINTX & (1 << NAKEDI)) ? true : false);
-                       }
-
-                       /** Clears the NAK condition on the currently selected pipe.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \see \ref Pipe_IsNAKReceived() for more details.
-                        */
-                       static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearNAKReceived(void)
-                       {
-                               UPINTX &= ~(1 << NAKEDI);
-                       }
-
-                       /** Determines if the currently selected pipe has had the STALL condition set by the attached device.
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        *
-                        *  \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
-                        */
-                       static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool Pipe_IsStalled(void)
-                       {
-                               return ((UPINTX & (1 << RXSTALLI)) ? true : false);
-                       }
-
-                       /** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
-                        *  STALL condition itself (this must be done via a ClearFeature control request to the device).
-                        *
-                        *  \ingroup Group_PipePacketManagement
-                        */
-                       static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_ClearStall(void)
-                       {
-                               UPINTX &= ~(1 << RXSTALLI);
-                       }
-
-                       /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \return Next byte in the currently selected pipe's FIFO buffer.
-                        */
-                       static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_Read_Byte(void)
-                       {
-                               return UPDATX;
-                       }
-
-                       /** Writes one byte from the currently selected pipe's bank, for IN direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \param[in] Byte  Next byte to write into the the currently selected pipe's FIFO buffer.
-                        */
-                       static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Write_Byte(const uint8_t Byte)
-                       {
-                               UPDATX = Byte;
-                       }
-
-                       /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        */
-                       static inline void Pipe_Discard_Byte(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Discard_Byte(void)
-                       {
-                               uint8_t Dummy;
-
-                               Dummy = UPDATX;
-                       }
-
-                       /** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \return Next word in the currently selected pipe's FIFO buffer.
-                        */
-                       static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint16_t Pipe_Read_Word_LE(void)
-                       {
-                               union
-                               {
-                                       uint16_t Word;
-                                       uint8_t  Bytes[2];
-                               } Data;
-
-                               Data.Bytes[0] = UPDATX;
-                               Data.Bytes[1] = UPDATX;
-
-                               return Data.Word;
-                       }
-
-                       /** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \return Next word in the currently selected pipe's FIFO buffer.
-                        */
-                       static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint16_t Pipe_Read_Word_BE(void)
-                       {
-                               union
-                               {
-                                       uint16_t Word;
-                                       uint8_t  Bytes[2];
-                               } Data;
-
-                               Data.Bytes[1] = UPDATX;
-                               Data.Bytes[0] = UPDATX;
-
-                               return Data.Word;
-                       }
-
-                       /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \param[in] Word  Next word to write to the currently selected pipe's FIFO buffer.
-                        */
-                       static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Write_Word_LE(const uint16_t Word)
-                       {
-                               UPDATX = (Word & 0xFF);
-                               UPDATX = (Word >> 8);
-                       }
-
-                       /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \param[in] Word  Next word to write to the currently selected pipe's FIFO buffer.
-                        */
-                       static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Write_Word_BE(const uint16_t Word)
-                       {
-                               UPDATX = (Word >> 8);
-                               UPDATX = (Word & 0xFF);
-                       }
-
-                       /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        */
-                       static inline void Pipe_Discard_Word(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Discard_Word(void)
-                       {
-                               uint8_t Dummy;
-
-                               Dummy = UPDATX;
-                               Dummy = UPDATX;
-                       }
-
-                       /** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \return Next double word in the currently selected pipe's FIFO buffer.
-                        */
-                       static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint32_t Pipe_Read_DWord_LE(void)
-                       {
-                               union
-                               {
-                                       uint32_t DWord;
-                                       uint8_t  Bytes[4];
-                               } Data;
-
-                               Data.Bytes[0] = UPDATX;
-                               Data.Bytes[1] = UPDATX;
-                               Data.Bytes[2] = UPDATX;
-                               Data.Bytes[3] = UPDATX;
-
-                               return Data.DWord;
-                       }
-
-                       /** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \return Next double word in the currently selected pipe's FIFO buffer.
-                        */
-                       static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint32_t Pipe_Read_DWord_BE(void)
-                       {
-                               union
-                               {
-                                       uint32_t DWord;
-                                       uint8_t  Bytes[4];
-                               } Data;
-
-                               Data.Bytes[3] = UPDATX;
-                               Data.Bytes[2] = UPDATX;
-                               Data.Bytes[1] = UPDATX;
-                               Data.Bytes[0] = UPDATX;
-
-                               return Data.DWord;
-                       }
-
-                       /** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \param[in] DWord  Next double word to write to the currently selected pipe's FIFO buffer.
-                        */
-                       static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
-                       {
-                               UPDATX = (DWord &  0xFF);
-                               UPDATX = (DWord >> 8);
-                               UPDATX = (DWord >> 16);
-                               UPDATX = (DWord >> 24);
-                       }
-
-                       /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
-                        *  direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        *
-                        *  \param[in] DWord  Next double word to write to the currently selected pipe's FIFO buffer.
-                        */
-                       static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
-                       {
-                               UPDATX = (DWord >> 24);
-                               UPDATX = (DWord >> 16);
-                               UPDATX = (DWord >> 8);
-                               UPDATX = (DWord &  0xFF);
-                       }
-
-                       /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
-                        *
-                        *  \ingroup Group_PipePrimitiveRW
-                        */
-                       static inline void Pipe_Discard_DWord(void) ATTR_ALWAYS_INLINE;
-                       static inline void Pipe_Discard_DWord(void)
-                       {
-                               uint8_t Dummy;
-
-                               Dummy = UPDATX;
-                               Dummy = UPDATX;
-                               Dummy = UPDATX;
-                               Dummy = UPDATX;
-                       }
-
-               /* External Variables: */
-                       /** Global indicating the maximum packet size of the default control pipe located at address
-                        *  0 in the device. This value is set to the value indicated in the attached device's device
-                    *  descriptor once the USB interface is initialized into host mode and a device is attached
-                        *  to the USB bus.
-                        *
-                        *  \note This variable should be treated as read-only in the user application, and never manually
-                        *        changed in value.
-                        */
-                       extern uint8_t USB_ControlPipeSize;
-
-               /* Function Prototypes: */
-                       /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the
-                        *  attached device, bank size and banking mode.
-                        *
-                        *  A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze()
-                        *  before being used. Pipes should be kept frozen unless waiting for data from a device while in IN mode, or
-                        *  sending data to the device in OUT mode. IN type pipes are also automatically configured to accept infinite
-                        *  numbers of IN requests without automatic freezing - this can be overridden by a call to
-                        *  \ref Pipe_SetFiniteINRequests().
-                        *
-                        *  \param[in] Number          Pipe number to configure. This must be more than 0 and less than \ref PIPE_TOTAL_PIPES.
-                        *
-                        *  \param[in] Type            Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low
-                        *                             Speed USB devices - refer to the USB 2.0 specification.
-                        *
-                        *  \param[in] Token           Pipe data token, either \ref PIPE_TOKEN_SETUP, \ref PIPE_TOKEN_OUT or \ref PIPE_TOKEN_IN.
-                        *                             All pipes (except Control type) are unidirectional - data may only be read from or
-                        *                             written to the pipe bank based on its direction, not both.
-                        *
-                        *  \param[in] EndpointNumber  Endpoint index within the attached device that the pipe should interface to.
-                        *
-                        *  \param[in] Size            Size of the pipe's bank, where packets are stored before they are transmitted to
-                        *                             the USB device, or after they have been received from the USB device (depending on
-                        *                             the pipe's data direction). The bank size must indicate the maximum packet size that
-                        *                             the pipe can handle.
-                        *
-                        *  \param[in] Banks           Number of banks to use for the pipe being configured, a \c PIPE_BANK_* mask. More banks
-                        *                             uses more USB DPRAM, but offers better performance. Isochronous type pipes <b>must</b>
-                        *                             have at least two banks.
-                        *
-                        *  \note When the \c ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
-                        *        or bank corruption will occur.
-                        *        \n\n
-                        *
-                        *  \note Certain models of USB AVR's pipes may have different maximum packet sizes based on the pipe's
-                        *        index - refer to the chosen USB AVR's datasheet to determine the maximum bank size for each pipe.
-                        *        \n\n
-                        *
-                        *  \note The default control pipe should not be manually configured by the user application, as it is
-                        *        automatically configured by the library internally.
-                        *        \n\n
-                        *
-                        *  \note This routine will automatically select the specified pipe upon success. Upon failure, the pipe which
-                        *        failed to reconfigure correctly will be selected.
-                        *
-                        *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
-                        */
-                       bool Pipe_ConfigurePipe(const uint8_t Number,
-                                               const uint8_t Type,
-                                               const uint8_t Token,
-                                               const uint8_t EndpointNumber,
-                                               const uint16_t Size,
-                                               const uint8_t Banks);
-
-                       /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read
-                        *  or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).
-                        *
-                        *  \ingroup Group_PipeRW
-                        *
-                        *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
-                        */
-                       uint8_t Pipe_WaitUntilReady(void);
-
-                       /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
-                        *  endpoint is found, it is automatically selected.
-                        *
-                        *  \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check.
-                        *
-                        *  \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found,
-                        *          \c false otherwise.
-                        */
-                       bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Macros: */
-                       #if !defined(ENDPOINT_CONTROLEP)
-                               #define ENDPOINT_CONTROLEP          0
-                       #endif
-
-               /* Inline Functions: */
-                       static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
-                       static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
-                       {
-                               uint8_t  MaskVal    = 0;
-                               uint16_t CheckBytes = 8;
-
-                               while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
-                               {
-                                       MaskVal++;
-                                       CheckBytes <<= 1;
-                               }
-
-                               return (MaskVal << EPSIZE0);
-                       }
-
-               /* Function Prototypes: */
-                       void Pipe_ClearPipes(void);
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/LowLevel/USBController.c b/LUFA/Drivers/USB/LowLevel/USBController.c
deleted file mode 100644 (file)
index f41b5cc..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#define  __INCLUDE_FROM_USB_CONTROLLER_C
-#include "USBController.h"
-
-#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
-volatile uint8_t USB_CurrentMode = USB_MODE_None;
-#endif
-
-#if !defined(USE_STATIC_OPTIONS)
-volatile uint8_t USB_Options;
-#endif
-
-void USB_Init(
-               #if defined(USB_CAN_BE_BOTH)
-               const uint8_t Mode
-               #endif
-
-               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
-               ,
-               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
-               void
-               #endif
-
-               #if !defined(USE_STATIC_OPTIONS)
-               const uint8_t Options
-               #endif
-               )
-{
-       #if !defined(USE_STATIC_OPTIONS)
-       USB_Options = Options;
-       #endif
-
-       if (!(USB_Options & USB_OPT_REG_DISABLED))
-         USB_REG_On();
-       else
-         USB_REG_Off();
-
-       #if defined(USB_CAN_BE_BOTH)
-       if (Mode == USB_MODE_UID)
-       {
-               UHWCON |= (1 << UIDE);
-               USB_INT_Enable(USB_INT_IDTI);
-               USB_CurrentMode = USB_GetUSBModeFromUID();
-       }
-       else
-       {
-               USB_CurrentMode = Mode;
-       }
-       #endif
-
-       USB_IsInitialized = true;
-
-       USB_ResetInterface();
-}
-
-void USB_Disable(void)
-{
-       USB_INT_DisableAllInterrupts();
-       USB_INT_ClearAllInterrupts();
-
-       USB_Detach();
-       USB_Controller_Disable();
-
-       if (!(USB_Options & USB_OPT_MANUAL_PLL))
-         USB_PLL_Off();
-
-       USB_REG_Off();
-
-       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-       USB_OTGPAD_Off();
-       #endif
-
-       #if defined(USB_CAN_BE_BOTH)
-       USB_CurrentMode = USB_MODE_None;
-       #endif
-
-       USB_IsInitialized = false;
-}
-
-void USB_ResetInterface(void)
-{
-       #if defined(USB_CAN_BE_BOTH)
-       bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0);
-       #endif
-
-       USB_INT_DisableAllInterrupts();
-       USB_INT_ClearAllInterrupts();
-
-       USB_Controller_Reset();
-
-       if (!(USB_Options & USB_OPT_MANUAL_PLL))
-       {
-               #if defined(USB_SERIES_4_AVR)
-               PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1));
-               #endif
-
-               USB_PLL_On();
-               while (!(USB_PLL_IsReady()));
-       }
-
-       #if defined(USB_CAN_BE_BOTH)
-       if (UIDModeSelectEnabled)
-       {
-               UHWCON |= (1 << UIDE);
-               USB_INT_Enable(USB_INT_IDTI);
-       }
-       #endif
-
-       USB_CLK_Unfreeze();
-
-       if (USB_CurrentMode == USB_MODE_Device)
-       {
-               #if defined(USB_CAN_BE_DEVICE)
-               #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
-               UHWCON |=  (1 << UIMOD);
-               #endif
-
-               USB_Init_Device();
-               #endif
-       }
-       else if (USB_CurrentMode == USB_MODE_Host)
-       {
-               #if defined(USB_CAN_BE_HOST)
-               UHWCON &= ~(1 << UIMOD);
-
-               USB_Init_Host();
-               #endif
-       }
-
-       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
-       USB_OTGPAD_On();
-       #endif
-}
-
-#if defined(USB_CAN_BE_DEVICE)
-static void USB_Init_Device(void)
-{
-       USB_DeviceState          = DEVICE_STATE_Unattached;
-       USB_ConfigurationNumber  = 0;
-
-       #if !defined(NO_DEVICE_REMOTE_WAKEUP)
-       USB_RemoteWakeupEnabled  = false;
-       #endif
-
-       #if !defined(NO_DEVICE_SELF_POWER)
-       USB_CurrentlySelfPowered = false;
-       #endif
-
-       #if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
-       USB_Descriptor_Device_t* DeviceDescriptorPtr;
-
-       if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
-       {
-               #if defined(USE_RAM_DESCRIPTORS)
-               USB_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
-               #elif defined(USE_EEPROM_DESCRIPTORS)
-               USB_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
-               #else
-               USB_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
-               #endif
-       }
-       #endif
-
-       #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
-       if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
-         USB_Device_SetLowSpeed();
-       else
-         USB_Device_SetFullSpeed();
-
-       USB_INT_Enable(USB_INT_VBUS);
-       #endif
-
-       Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
-                                                          ENDPOINT_DIR_OUT, USB_ControlEndpointSize,
-                                                          ENDPOINT_BANK_SINGLE);
-
-       USB_INT_Clear(USB_INT_SUSPI);
-       USB_INT_Enable(USB_INT_SUSPI);
-       USB_INT_Enable(USB_INT_EORSTI);
-
-       USB_Attach();
-}
-#endif
-
-#if defined(USB_CAN_BE_HOST)
-static void USB_Init_Host(void)
-{
-       USB_HostState       = HOST_STATE_Unattached;
-       USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
-
-       USB_Host_HostMode_On();
-
-       USB_Host_VBUS_Auto_Off();
-       USB_Host_VBUS_Manual_Enable();
-       USB_Host_VBUS_Manual_On();
-
-       USB_INT_Enable(USB_INT_SRPI);
-       USB_INT_Enable(USB_INT_BCERRI);
-
-       USB_Attach();
-}
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/USBController.h b/LUFA/Drivers/USB/LowLevel/USBController.h
deleted file mode 100644 (file)
index b85539d..0000000
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB low level USB controller definitions.
- *
- *  This file contains structures, function prototypes and macros related to the low level configuration of the
- *  USB controller, to start, stop and reset the USB library core.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-/** \ingroup Group_USB
- *  \defgroup Group_USBManagement USB Interface Management
- *
- *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
- *
- *  @{
- */
-
-#ifndef __USBCONTROLLER_H__
-#define __USBCONTROLLER_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <avr/interrupt.h>
-               #include <stdbool.h>
-
-               #include "../HighLevel/USBMode.h"
-
-               #include "../../../Common/Common.h"
-               #include "../HighLevel/USBMode.h"
-               #include "../HighLevel/Events.h"
-               #include "../HighLevel/USBTask.h"
-               #include "USBInterrupt.h"
-
-               #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
-                       #include "Host.h"
-                       #include "OTG.h"
-                       #include "Pipe.h"
-                       #include "../HighLevel/HostStandardReq.h"
-                       #include "../HighLevel/PipeStream.h"
-               #endif
-
-               #if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
-                       #include "Device.h"
-                       #include "Endpoint.h"
-                       #include "../HighLevel/DeviceStandardReq.h"
-                       #include "../HighLevel/EndpointStream.h"
-               #endif
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks and Defines: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-               #if !defined(F_CLOCK)
-                       #error F_CLOCK is not defined. You must define F_CLOCK to the frequency of the unprescaled input clock in your project makefile.
-               #endif
-
-               #if (F_CLOCK == 8000000)
-                       #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
-                            defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \
-                            defined(__AVR_ATmega32U2__))
-                               #define USB_PLL_PSC                0
-                       #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
-                               #define USB_PLL_PSC                0
-                       #elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U6__))
-                               #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))
-                       #elif (defined(__AVR_AT90USB647__)  || defined(__AVR_AT90USB1287__))
-                               #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))
-                       #endif
-               #elif (F_CLOCK == 16000000)
-                       #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
-                            defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \
-                            defined(__AVR_ATmega32U2__))
-                               #define USB_PLL_PSC                (1 << PLLP0)
-                       #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
-                               #define USB_PLL_PSC                (1 << PINDIV)
-                       #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))
-                               #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1))
-                       #elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))
-                               #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP0))
-                       #endif
-               #endif
-
-               #if !defined(USB_PLL_PSC)
-                       #error No PLL prescale value available for chosen F_CLOCK value and AVR model.
-               #endif
-
-       /* Public Interface - May be used in end-application: */
-               /* Macros: */
-                       /** \name USB Controller Option Masks */
-                       //@{
-                       /** Regulator disable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad
-                        *  regulator should be enabled to regulate the data pin voltages to within the USB standard.
-                        *
-                        *  \note See USB AVR data sheet for more information on the internal pad regulator.
-                        */
-                       #define USB_OPT_REG_DISABLED               (1 << 1)
-
-                       /** Regulator enable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad
-                        *  regulator should be disabled and the AVR's VCC level used for the data pads.
-                        *
-                        *  \note See USB AVR data sheet for more information on the internal pad regulator.
-                        */
-                       #define USB_OPT_REG_ENABLED                (0 << 1)
-
-                       /** Manual PLL control option mask for \ref USB_Init(). This indicates to the library that the user application
-                        *  will take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock
-                        *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations.
-                        */
-                       #define USB_OPT_MANUAL_PLL                 (1 << 2)
-
-                       /** Automatic PLL control option mask for \ref USB_Init(). This indicates to the library that the library should
-                        *  take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock
-                        *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations.
-                        */
-                       #define USB_OPT_AUTO_PLL                   (0 << 2)
-                       //@}
-                       
-                       /** \name Endpoint/Pipe Type Masks */
-                       //@{
-                       /** Mask for a CONTROL type endpoint or pipe.
-                        *
-                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
-                        */
-                       #define EP_TYPE_CONTROL                    0x00
-
-                       /** Mask for an ISOCHRONOUS type endpoint or pipe.
-                        *
-                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
-                        */
-                       #define EP_TYPE_ISOCHRONOUS                0x01
-
-                       /** Mask for a BULK type endpoint or pipe.
-                        *
-                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
-                        */
-                       #define EP_TYPE_BULK                       0x02
-
-                       /** Mask for an INTERRUPT type endpoint or pipe.
-                        *
-                        *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
-                        */
-                       #define EP_TYPE_INTERRUPT                  0x03
-                       //@}
-
-                       #if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__)
-                               /** Constant for the maximum software timeout period of the USB data stream transfer functions
-                                *  (both control and standard) when in either device or host mode. If the next packet of a stream
-                                *  is not received or acknowledged within this time period, the stream function will fail.
-                                *
-                                *  This value may be overridden in the user project makefile as the value of the
-                                *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch.
-                                */
-                               #define USB_STREAM_TIMEOUT_MS       100
-                       #endif
-
-               /* Inline Functions: */
-                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
-                               /** Determines if the VBUS line is currently high (i.e. the USB host is supplying power).
-                                *
-                                *  \note This function is not available on some AVR models which do not support hardware VBUS monitoring.
-                                *
-                                *  \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise.
-                                */
-                               static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                               static inline bool USB_VBUS_GetStatus(void)
-                               {
-                                       return ((USBSTA & (1 << VBUS)) ? true : false);
-                               }
-                       #endif
-
-                       /** Detaches the device from the USB bus. This has the effect of removing the device from any
-                        *  attached host, ceasing USB communications. If no host is present, this prevents any host from
-                        *  enumerating the device once attached until \ref USB_Attach() is called.
-                        */
-                       static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Detach(void)
-                       {
-                               UDCON  |=  (1 << DETACH);
-                       }
-
-                       /** Attaches the device to the USB bus. This announces the device's presence to any attached
-                        *  USB host, starting the enumeration process. If no host is present, attaching the device
-                        *  will allow for enumeration once a host is connected to the device.
-                        *
-                        *  This is inexplicably also required for proper operation while in host mode, to enable the
-                        *  attachment of a device to the host. This is despite the bit being located in the device-mode
-                        *  register and despite the datasheet making no mention of its requirement in host mode.
-                        */
-                       static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Attach(void)
-                       {
-                               UDCON  &= ~(1 << DETACH);
-                       }
-
-               /* Function Prototypes: */
-                       /** Main function to initialize and start the USB interface. Once active, the USB interface will
-                        *  allow for device connection to a host when in device mode, or for device enumeration while in
-                        *  host mode.
-                        *
-                        *  As the USB library relies on interrupts for the device and host mode enumeration processes,
-                        *  the user must enable global interrupts before or shortly after this function is called. In
-                        *  device mode, interrupts must be enabled within 500ms of this function being called to ensure
-                        *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be
-                        *  enabled at the application's leisure however enumeration will not begin of an attached device
-                        *  until after this has occurred.
-                        *
-                        *  Calling this function when the USB interface is already initialized will cause a complete USB
-                        *  interface reset and re-enumeration.
-                        *
-                        *  \param[in] Mode     This is a mask indicating what mode the USB interface is to be initialized to, a value
-                        *                      from the \ref USB_Modes_t enum.
-                        *
-                        *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
-                        *                      interface to control the USB interface's behaviour. This should be comprised of
-                        *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the
-                        *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
-                        *                      mode speed.
-                        *
-                        *  \note To reduce the FLASH requirements of the library if only device or host mode is required,
-                        *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY
-                        *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler
-                        *        via the -D switch. If the mode is statically set, this parameter does not exist in the
-                        *        function prototype.
-                        *        \n\n
-                        *
-                        *  \note To reduce the FLASH requirements of the library if only fixed settings are are required,
-                        *        the options may be set statically in the same manner as the mode (see the Mode parameter of
-                        *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token,
-                        *        defined to the appropriate options masks. When the options are statically set, this
-                        *        parameter does not exist in the function prototype.
-                        *        \n\n
-                        *
-                        *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB
-                        *        AVR models which only implement the USB device mode in hardware.
-                        *
-                        *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks.
-                        */
-                       void USB_Init(
-                                      #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
-                                      const uint8_t Mode
-                                      #endif
-
-                                      #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__)
-                                      ,
-                                      #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
-                                      void
-                                      #endif
-
-                                      #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
-                                      const uint8_t Options
-                                      #endif
-                                      );
-
-                       /** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO
-                        *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface
-                        *  is restarted with the \ref USB_Init() function.
-                        */
-                       void USB_Disable(void);
-
-                       /** Resets the interface, when already initialized. This will re-enumerate the device if already connected
-                        *  to a host, or re-enumerate an already attached device when in host mode.
-                        */
-                       void USB_ResetInterface(void);
-
-               /* Global Variables: */
-                       #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
-                               /** Indicates the mode that the USB interface is currently initialized to, a value from the
-                                *  \ref USB_Modes_t enum.
-                                *
-                                *  \note This variable should be treated as read-only in the user application, and never manually
-                                *        changed in value.
-                                *        \n\n
-                                *
-                                *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the
-                                *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller
-                                *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time
-                                *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to
-                                *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the
-                                *        USB interface is not initialized.
-                                */
-                               extern volatile uint8_t USB_CurrentMode;
-                       #elif defined(USB_HOST_ONLY)
-                               #define USB_CurrentMode USB_MODE_Host
-                       #elif defined(USB_DEVICE_ONLY)
-                               #define USB_CurrentMode USB_MODE_Device
-                       #endif
-
-                       #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
-                               /** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init()
-                                *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module.
-                                *
-                                *  \note This variable should be treated as read-only in the user application, and never manually
-                                *        changed in value.
-                                */
-                               extern volatile uint8_t USB_Options;
-                       #elif defined(USE_STATIC_OPTIONS)
-                               #define USB_Options USE_STATIC_OPTIONS
-                       #endif
-
-               /* Enums: */
-                       /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
-                        *  user application via \ref USB_CurrentMode.
-                        */
-                       enum USB_Modes_t
-                       {
-                               USB_MODE_None   = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
-                               USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
-                               USB_MODE_Host   = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */
-                               USB_MODE_UID    = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the
-                                                     *   USB connector.
-                                                     */
-                       };
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Function Prototypes: */
-                       #if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
-                               #if defined(USB_CAN_BE_DEVICE)
-                               static void USB_Init_Device(void);
-                               #endif
-
-                               #if defined(USB_CAN_BE_HOST)
-                               static void USB_Init_Host(void);
-                               #endif
-                       #endif
-
-               /* Inline Functions: */
-                       static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_PLL_On(void)
-                       {
-                               PLLCSR  = USB_PLL_PSC;
-                               PLLCSR |= (1 << PLLE);
-                       }
-
-                       static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_PLL_Off(void)
-                       {
-                               PLLCSR  = 0;
-                       }
-
-                       static inline bool USB_PLL_IsReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline bool USB_PLL_IsReady(void)
-                       {
-                               return ((PLLCSR  &   (1 << PLOCK)) ? true : false);
-                       }
-
-                       static inline void USB_REG_On(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_REG_On(void)
-                       {
-                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-                               UHWCON  |=  (1 << UVREGE);
-                       #else
-                               REGCR   &= ~(1 << REGDIS);
-                       #endif
-                       }
-
-                       static inline void USB_REG_Off(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_REG_Off(void)
-                       {
-                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-                               UHWCON  &= ~(1 << UVREGE);
-                       #else
-                               REGCR   |=  (1 << REGDIS);
-                       #endif
-                       }
-
-                       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-                       static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTGPAD_On(void)
-                       {
-                               USBCON  |=  (1 << OTGPADE);
-                       }
-
-                       static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_OTGPAD_Off(void)
-                       {
-                               USBCON  &= ~(1 << OTGPADE);
-                       }
-                       #endif
-
-                       static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_CLK_Freeze(void)
-                       {
-                               USBCON  |=  (1 << FRZCLK);
-                       }
-
-                       static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_CLK_Unfreeze(void)
-                       {
-                               USBCON  &= ~(1 << FRZCLK);
-                       }
-
-                       static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Controller_Enable(void)
-                       {
-                               USBCON  |=  (1 << USBE);
-                       }
-
-                       static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Controller_Disable(void)
-                       {
-                               USBCON  &= ~(1 << USBE);
-                       }
-
-                       static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
-                       static inline void USB_Controller_Reset(void)
-                       {
-                               const uint8_t Temp = USBCON;
-
-                               USBCON = (Temp & ~(1 << USBE));
-                               USBCON = (Temp |  (1 << USBE));
-                       }
-
-                       #if defined(USB_CAN_BE_BOTH)
-                       static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
-                       static inline uint8_t USB_GetUSBModeFromUID(void)
-                       {
-                               if (USBSTA & (1 << ID))
-                                 return USB_MODE_Device;
-                               else
-                                 return USB_MODE_Host;
-                       }
-                       #endif
-
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
-/** @} */
-
diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
deleted file mode 100644 (file)
index 34234fe..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-#define  __INCLUDE_FROM_USB_DRIVER
-#include "USBInterrupt.h"
-
-void USB_INT_DisableAllInterrupts(void)
-{
-       #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-       USBCON &= ~((1 << VBUSTE) | (1 << IDTE));
-       #elif defined(USB_SERIES_4_AVR)
-       USBCON &= ~(1 << VBUSTE);
-       #endif
-
-       #if defined(USB_CAN_BE_BOTH)
-       OTGIEN  = 0;
-       #endif
-
-       #if defined(USB_CAN_BE_HOST)
-       UHIEN   = 0;
-       #endif
-
-       #if defined(USB_CAN_BE_DEVICE)
-       UDIEN   = 0;
-       #endif
-}
-
-void USB_INT_ClearAllInterrupts(void)
-{
-       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-       USBINT = 0;
-       #endif
-
-       #if defined(USB_CAN_BE_BOTH)
-       OTGINT = 0;
-       #endif
-
-       #if defined(USB_CAN_BE_HOST)
-       UHINT  = 0;
-       #endif
-
-       #if defined(USB_CAN_BE_DEVICE)
-       UDINT  = 0;
-       #endif
-}
-
-ISR(USB_GEN_vect, ISR_BLOCK)
-{
-       #if defined(USB_CAN_BE_DEVICE)
-       #if !defined(NO_SOF_EVENTS)
-       if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
-       {
-               USB_INT_Clear(USB_INT_SOFI);
-
-               EVENT_USB_Device_StartOfFrame();
-       }
-       #endif
-
-       #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-       if (USB_INT_HasOccurred(USB_INT_VBUS) && USB_INT_IsEnabled(USB_INT_VBUS))
-       {
-               USB_INT_Clear(USB_INT_VBUS);
-
-               if (USB_VBUS_GetStatus())
-               {
-                       USB_DeviceState = DEVICE_STATE_Powered;
-                       EVENT_USB_Device_Connect();
-               }
-               else
-               {
-                       USB_DeviceState = DEVICE_STATE_Unattached;
-                       EVENT_USB_Device_Disconnect();
-               }
-       }
-       #endif
-
-       if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
-       {
-               USB_INT_Clear(USB_INT_SUSPI);
-
-               USB_INT_Disable(USB_INT_SUSPI);
-               USB_INT_Enable(USB_INT_WAKEUPI);
-
-               USB_CLK_Freeze();
-
-               if (!(USB_Options & USB_OPT_MANUAL_PLL))
-                 USB_PLL_Off();
-
-               #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
-               USB_DeviceState = DEVICE_STATE_Unattached;
-               EVENT_USB_Device_Disconnect();
-               #else
-               USB_DeviceState = DEVICE_STATE_Suspended;
-               EVENT_USB_Device_Suspend();
-               #endif
-       }
-
-       if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
-       {
-               if (!(USB_Options & USB_OPT_MANUAL_PLL))
-               {
-                       USB_PLL_On();
-                       while (!(USB_PLL_IsReady()));
-               }
-
-               USB_CLK_Unfreeze();
-
-               USB_INT_Clear(USB_INT_WAKEUPI);
-
-               USB_INT_Disable(USB_INT_WAKEUPI);
-               USB_INT_Enable(USB_INT_SUSPI);
-
-               if (USB_ConfigurationNumber)
-                 USB_DeviceState = DEVICE_STATE_Configured;
-               else
-                 USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
-
-               #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
-               EVENT_USB_Device_Connect();
-               #else
-               EVENT_USB_Device_WakeUp();
-               #endif
-       }
-
-       if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
-       {
-               USB_INT_Clear(USB_INT_EORSTI);
-
-               USB_DeviceState         = DEVICE_STATE_Default;
-               USB_ConfigurationNumber = 0;
-
-               USB_INT_Clear(USB_INT_SUSPI);
-               USB_INT_Disable(USB_INT_SUSPI);
-               USB_INT_Enable(USB_INT_WAKEUPI);
-
-               Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
-                                          ENDPOINT_DIR_OUT, USB_ControlEndpointSize,
-                                          ENDPOINT_BANK_SINGLE);
-
-               #if defined(INTERRUPT_CONTROL_ENDPOINT)
-               USB_INT_Enable(USB_INT_RXSTPI);
-               #endif
-
-               EVENT_USB_Device_Reset();
-       }
-       #endif
-
-       #if defined(USB_CAN_BE_HOST)
-       #if !defined(NO_SOF_EVENTS)
-       if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
-       {
-               USB_INT_Clear(USB_INT_HSOFI);
-
-               EVENT_USB_Host_StartOfFrame();
-       }
-       #endif
-
-       if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
-       {
-               USB_INT_Clear(USB_INT_DDISCI);
-               USB_INT_Clear(USB_INT_DCONNI);
-               USB_INT_Disable(USB_INT_DDISCI);
-
-               EVENT_USB_Host_DeviceUnattached();
-
-               USB_ResetInterface();
-       }
-
-       if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
-       {
-               USB_INT_Clear(USB_INT_VBERRI);
-
-               USB_Host_VBUS_Manual_Off();
-               USB_Host_VBUS_Auto_Off();
-
-               EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
-               EVENT_USB_Host_DeviceUnattached();
-
-               USB_HostState = HOST_STATE_Unattached;
-       }
-
-       if (USB_INT_HasOccurred(USB_INT_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI))
-       {
-               USB_INT_Clear(USB_INT_SRPI);
-               USB_INT_Disable(USB_INT_SRPI);
-
-               EVENT_USB_Host_DeviceAttached();
-
-               USB_INT_Enable(USB_INT_DDISCI);
-
-               USB_HostState = HOST_STATE_Powered;
-       }
-
-       if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
-       {
-               USB_INT_Clear(USB_INT_BCERRI);
-
-               EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
-               EVENT_USB_Host_DeviceUnattached();
-
-               USB_ResetInterface();
-       }
-       #endif
-
-       #if defined(USB_CAN_BE_BOTH)
-       if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))
-       {
-               USB_INT_Clear(USB_INT_IDTI);
-
-               if (USB_DeviceState != DEVICE_STATE_Unattached)
-                 EVENT_USB_Device_Disconnect();
-
-               if (USB_HostState != HOST_STATE_Unattached)
-                 EVENT_USB_Host_DeviceUnattached();
-
-               USB_CurrentMode = USB_GetUSBModeFromUID();
-               USB_ResetInterface();
-
-               EVENT_USB_UIDChange();
-       }
-       #endif
-}
-
-#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)
-ISR(USB_COM_vect, ISR_BLOCK)
-{
-       uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
-
-       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-       USB_INT_Disable(USB_INT_RXSTPI);
-
-       NONATOMIC_BLOCK(NONATOMIC_FORCEOFF)
-       {
-               USB_Device_ProcessControlRequest();
-       }
-
-       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-       USB_INT_Enable(USB_INT_RXSTPI);
-       Endpoint_SelectEndpoint(PrevSelectedEndpoint);
-}
-#endif
-
diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.h b/LUFA/Drivers/USB/LowLevel/USBInterrupt.h
deleted file mode 100644 (file)
index 29ad933..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-             LUFA Library
-     Copyright (C) Dean Camera, 2011.
-
-  dean [at] fourwalledcubicle [dot] com
-           www.lufa-lib.org
-*/
-
-/*
-  Copyright 2011  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 disclaim 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.
-*/
-
-/** \file
- *  \brief USB controller interrupt service routine management.
- *
- *  This file contains definitions required for the correct handling of low level USB service routine interrupts
- *  from the USB controller.
- *
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver
- *        dispatch header located in LUFA/Drivers/USB/USB.h.
- */
-
-#ifndef __USBINTERRUPT_H__
-#define __USBINTERRUPT_H__
-
-       /* Includes: */
-               #include <avr/io.h>
-               #include <avr/interrupt.h>
-               #include <util/atomic.h>
-               #include <stdbool.h>
-
-       /* Enable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       extern "C" {
-               #endif
-
-       /* Preprocessor Checks: */
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
-               #endif
-
-       /* Private Interface - For use in library only: */
-       #if !defined(__DOXYGEN__)
-               /* Macros: */
-                       #define USB_INT_Enable(int)              MACROS{ USB_INT_GET_EN_REG(int)   |=   USB_INT_GET_EN_MASK(int);   }MACROE
-                       #define USB_INT_Disable(int)             MACROS{ USB_INT_GET_EN_REG(int)   &= ~(USB_INT_GET_EN_MASK(int));  }MACROE
-                       #define USB_INT_Clear(int)               MACROS{ USB_INT_GET_INT_REG(int)  &= ~(USB_INT_GET_INT_MASK(int)); }MACROE
-                       #define USB_INT_IsEnabled(int)                 ((USB_INT_GET_EN_REG(int)   &    USB_INT_GET_EN_MASK(int)) ? true : false)
-                       #define USB_INT_HasOccurred(int)               ((USB_INT_GET_INT_REG(int)  &    USB_INT_GET_INT_MASK(int)) ? true : false)
-
-                       #define USB_INT_GET_EN_REG(a, b, c, d)           a
-                       #define USB_INT_GET_EN_MASK(a, b, c, d)          b
-                       #define USB_INT_GET_INT_REG(a, b, c, d)          c
-                       #define USB_INT_GET_INT_MASK(a, b, c, d)         d
-
-                       #define USB_INT_VBUS                             USBCON, (1 << VBUSTE) , USBINT, (1 << VBUSTI)
-                       #define USB_INT_IDTI                             USBCON, (1 << IDTE)   , USBINT, (1 << IDTI)
-                       #define USB_INT_WAKEUPI                          UDIEN , (1 << WAKEUPE), UDINT , (1 << WAKEUPI)
-                       #define USB_INT_SUSPI                            UDIEN , (1 << SUSPE)  , UDINT , (1 << SUSPI)
-                       #define USB_INT_EORSTI                           UDIEN , (1 << EORSTE) , UDINT , (1 << EORSTI)
-                       #define USB_INT_DCONNI                           UHIEN , (1 << DCONNE) , UHINT , (1 << DCONNI)
-                       #define USB_INT_DDISCI                           UHIEN , (1 << DDISCE) , UHINT , (1 << DDISCI)
-                       #define USB_INT_BCERRI                           OTGIEN, (1 << BCERRE) , OTGINT, (1 << BCERRI)
-                       #define USB_INT_VBERRI                           OTGIEN, (1 << VBERRE) , OTGINT, (1 << VBERRI)
-                       #define USB_INT_SOFI                             UDIEN,  (1 << SOFE)   , UDINT , (1 << SOFI)
-                       #define USB_INT_HSOFI                            UHIEN,  (1 << HSOFE)  , UHINT , (1 << HSOFI)
-                       #define USB_INT_RSTI                             UHIEN , (1 << RSTE)   , UHINT , (1 << RSTI)
-                       #define USB_INT_SRPI                             OTGIEN, (1 << SRPE)   , OTGINT, (1 << SRPI)
-                       #define USB_INT_RXSTPI                           UEIENX, (1 << RXSTPE) , UEINTX, (1 << RXSTPI)
-
-               /* Includes: */
-                       #include "../../../Common/Common.h"
-                       #include "../HighLevel/USBMode.h"
-                       #include "../HighLevel/Events.h"
-                       #include "USBController.h"
-
-               /* Function Prototypes: */
-                       void USB_INT_ClearAllInterrupts(void);
-                       void USB_INT_DisableAllInterrupts(void);
-       #endif
-
-       /* Disable C linkage for C++ Compilers: */
-               #if defined(__cplusplus)
-                       }
-               #endif
-
-#endif
-
index 70dc97e..6dba17f 100644 (file)
  *  Master include file for the library USB functionality.
  *
  *  This file should be included in all user projects making use of the USB portions of the library, instead of
- *  including any headers in the USB/LowLevel/ or USB/HighLevel/ subdirectories.
+ *  the individual USB driver submodule headers.
  */
 
 /** \defgroup Group_USB USB Core - LUFA/Drivers/USB/USB.h
  *
  *  \section Sec_Dependencies Module Source Dependencies
  *  The following files must be built with any user project that uses this module:
- *    - LUFA/Drivers/USB/LowLevel/Device.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/LowLevel/Endpoint.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/LowLevel/Host.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/LowLevel/Pipe.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/LowLevel/USBController.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/LowLevel/USBInterrupt.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/DeviceStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/Events.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/EndpointStream.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/HostStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/PipeStream.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
- *    - LUFA/Drivers/USB/HighLevel/USBTask.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/ConfigDescriptor.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/DeviceStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/Events.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/EndpointStream.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/HostStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/PipeStream.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/USBTask.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Device.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Endpoint.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Host.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Pipe.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBController.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBInterrupt.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Class/Common/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *
  *  \section Sec_ModDescription Module Description
- *  Driver and framework for the USB controller hardware on the USB series of AVR microcontrollers. This module
+ *  Driver and framework for the USB controller of the selected architecture and microcontroller model. This module
  *  consists of many submodules, and is designed to provide an easy way to configure and control USB host, device
  *  or OTG mode USB applications.
  *
  *  The USB stack requires the sole control over the USB controller in the microcontroller only; i.e. it does not
- *  require any additional AVR timers, etc. to operate. This ensures that the USB stack requires as few resources
- *  as possible.
+ *  require any additional timers or other peripherals to operate. This ensures that the USB stack requires as few
+ *  resources as possible.
  *
  *  The USB stack can be used in Device Mode for connections to USB Hosts (see \ref Group_Device), in Host mode for
  *  hosting of other USB devices (see \ref Group_Host), or as a dual role device which can either act as a USB host
                #endif
 
        /* Includes: */
-               #include "HighLevel/USBMode.h"
+               #include "../../Common/Common.h"
+               #include "Core/USBMode.h"
 
        /* Preprocessor Checks: */
-               #if (!defined(USB_SERIES_2_AVR) && !defined(USB_SERIES_4_AVR) && \
-                    !defined(USB_SERIES_6_AVR) && !defined(USB_SERIES_7_AVR))
-                       #error The currently selected AVR model is not supported under the USB component of the LUFA library.
+               #if (!defined(USB_CAN_BE_DEVICE) && !defined(USB_CAN_BE_HOST))
+                       #error The currently selected architecture is not supported under the USB component of the library.
                #endif
 
        /* Includes: */
-               #include "HighLevel/USBTask.h"
-               #include "HighLevel/Events.h"
-               #include "HighLevel/StdDescriptors.h"
-               #include "HighLevel/ConfigDescriptor.h"
-
-               #include "LowLevel/USBController.h"
-               #include "LowLevel/USBInterrupt.h"
+               #include "Core/USBTask.h"
+               #include "Core/Events.h"
+               #include "Core/StdDescriptors.h"
+               #include "Core/ConfigDescriptor.h"
+               #include "Core/USBController.h"
+               #include "Core/USBInterrupt.h"
 
                #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
-                       #include "LowLevel/Host.h"
-                       #include "LowLevel/Pipe.h"
-                       #include "HighLevel/HostStandardReq.h"
-                       #include "HighLevel/PipeStream.h"
+                       #include "Core/Host.h"
+                       #include "Core/Pipe.h"
+                       #include "Core/HostStandardReq.h"
+                       #include "Core/PipeStream.h"
                #endif
 
                #if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
-                       #include "LowLevel/Device.h"
-                       #include "LowLevel/Endpoint.h"
-                       #include "HighLevel/DeviceStandardReq.h"
-                       #include "HighLevel/EndpointStream.h"
+                       #include "Core/Device.h"
+                       #include "Core/Endpoint.h"
+                       #include "Core/DeviceStandardReq.h"
+                       #include "Core/EndpointStream.h"
                #endif
 
                #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
-                       #include "LowLevel/OTG.h"
+                       #include "Core/OTG.h"
                #endif
                
                #include "Class/Audio.h"
index a02d407..504742b 100644 (file)
  *  \dir LUFA/Drivers
  *  \brief Library hardware and software drivers.
  *
- *  This folder contains all the library hardware and software drivers for each supported board and USB AVR
+ *  This folder contains all the library hardware and software drivers for each supported board, architecture and
  *  microcontroller model.
  *
  *  \dir LUFA/Drivers/Misc
  *  \brief Miscellaneous driver files.
  *
- *  This folder contains drivers for aspects other than the USB interface, board hardware or AVR peripherals.
+ *  This folder contains drivers for aspects other than the USB interface, board hardware or microcontroller peripherals.
  *
  *  \dir LUFA/Drivers/Peripheral
- *  \brief USB AVR peripheral driver files.
+ *  \brief Microcontroller peripheral driver files.
  *
- *  This folder contains drivers for several of the AVR internal peripherals such as the USART, compatible with
- *  all USB AVR models.
- *
- *  \dir LUFA/Drivers/Peripheral/AVR8
- *  \brief AVR8 AVR microcontroller model specific peripheral driver files.
- *
- *  This folder contains drivers for several of the AVR internal peripherals such as the USART, compatible only with
- *  the 8-bit AVR microcontroller models, such as the AT90USB1287. Its contents should <b>not</b> be included by the
- *  user application - the dispatch header file located in the parent directory should be used instead.
+ *  This folder contains drivers for various low level microcontroller peripherals, usually located on the microcontroller
+ *  die within the same physical chip.
  *
  *  \dir LUFA/Drivers/USB
  *  \brief USB controller peripheral driver files.
  *
- *  This folder contains the main header files required to implement the USB interface in the USB supporting AVR models.
- *  The header files contained directly in this folder should be included in the user application in order to gain USB
- *  functionality, and the appropriate C source files in the LowLevel and HighLevel driver folders added to the compile
- *  and link stages.
- *
- *  \dir LUFA/Drivers/USB/LowLevel
- *  \brief Low level USB driver files.
+ *  This folder contains the complete LUFA USB stack and controller files, including the core driver and stack, as well
+ *  as the USB class driver implementations.
  *
- *  This folder contains low level USB driver source files required to implement USB functionality on the USB AVR microcontrollers.
+ *  \dir LUFA/Drivers/USB/Core
+ *  \brief Core USB driver files.
  *
- *  \dir LUFA/Drivers/USB/HighLevel
- *  \brief High level USB driver files.
- *
- *  This folder contains high level USB driver source files required to implement USB functionality on the USB AVR microcontrollers.
+ *  This folder contains the core USB stack and controller driver files, to correctly implement USB functionality on the
+ *  target architecture and microcontroller model. This
  *
  *  \dir LUFA/Drivers/USB/Class
  *  \brief USB Class helper driver files.
  *  the Atmel corporation. Header files in this folder should be included in user applications requiring the functionality of
  *  hardware placed on supported boards.
  *
- *  \dir LUFA/Drivers/Board/USBKEY
- *  \brief USBKEY board hardware driver files.
- *
- *  This folder contains drivers for hardware on the Atmel USBKEY demonstration board. The header files in this folder should
- *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
- *  should be included instead.
- *
- *  \dir LUFA/Drivers/Board/STK526
- *  \brief STK526 board hardware driver files.
- *
- *  This folder contains drivers for hardware on the Atmel STK526 development board. The header files in this folder should
- *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
- *  should be included instead.
- *
- *  \dir LUFA/Drivers/Board/STK525
- *  \brief STK525 board hardware driver files.
- *
- *  This folder contains drivers for hardware on the Atmel STK525 development board. The header files in this folder should
- *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
- *  should be included instead.
- *
- *  \dir LUFA/Drivers/Board/RZUSBSTICK
- *  \brief RZUSBSTICK board hardware driver files.
- *
- *  This folder contains drivers for hardware on the Atmel RZUSBSTICK board, as used in the Atmel "Raven" wireless kits. The header
- *  files in this folder should not be included directly in user applications; the similarly named dispatch header files located in
- *  the parent Board directory should be included instead.
+ *  \dir LUFA/Drivers/Board/ADAFRUITU4
+ *  \brief ADAFRUITU4 board hardware driver files.
  *
+ *  This folder contains drivers for hardware on the Adafruit U4 breakout board (http://ladyada.net/products/atmega32u4breakout).
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
  *  \dir LUFA/Drivers/Board/ATAVRUSBRF01
  *  \brief ATAVRUSBRF01 board hardware driver files.
  *
  *  files in this folder should not be included directly in user applications; the similarly named dispatch header files located in
  *  the parent Board directory should be included instead.
  *
+ *  \dir LUFA/Drivers/Board/BENITO
+ *  \brief BENITO board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Benito boards (http://dorkbotpdx.org/wiki/benito). The header files in this
+ *  folder should not be included directly in user applications; the similarly named dispatch header files located in the parent
+ *  Board directory should be included instead.
+ *
  *  \dir LUFA/Drivers/Board/BUMBLEB
  *  \brief BUMBLEB board hardware driver files.
  *
  *  files in this folder should not be included directly in user applications; the similarly named dispatch header files located in
  *  the parent Board directory should be included instead.
  *
- *  \dir LUFA/Drivers/Board/XPLAIN
- *  \brief XPLAIN board hardware driver files.
+ *  \dir LUFA/Drivers/Board/BUI
+ *  \brief BUI board hardware driver files.
  *
- *  This folder contains drivers for hardware on the Atmel XPLAIN board (all hardware revisions). The header files in this folder
- *  should not be included directly in user applications; the similarly named dispatch header files located in the parent Board
- *  directory should be included instead.
+ *  This folder contains drivers for hardware on the Busware BUI (http://www.busware.de/tiki-index.php?page=BUI).
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead. 
+ *
+ *  \dir LUFA/Drivers/Board/BLACKCAT
+ *  \brief BLACKCAT board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the TCNISO Blackcat USB JTAG (http://www.embeddedcomputers.net/products/BlackcatUSB/.
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/CULV3
+ *  \brief CULV3 board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL).
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
  *
  *  \dir LUFA/Drivers/Board/EVK527
  *  \brief XPLAIN board hardware driver files.
  *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
  *  should be included instead.
  *
- *  \dir LUFA/Drivers/Board/TEENSY
- *  \brief TEENSY board hardware driver files.
+ *  \dir LUFA/Drivers/Board/JMDBU2
+ *  \brief JM-DB-U2 board hardware driver files.
  *
- *  This folder contains drivers for hardware on all revisions of the PJRC Teensy boards (http://www.pjrc.com/teensy/). The header
- *  files in this folder should not be included directly in user applications; the similarly named dispatch header files located
- *  in the parent Board directory should be included instead.
+ *  This folder contains drivers for hardware on the JM-DB-U2 boards (http://u2.mattair.net/). The header files in this folder
+ *  should not be included directly in user applications; the similarly named dispatch header files located in the parent Board
+ *  directory should be included instead.
  *
- *  \dir LUFA/Drivers/Board/USBTINYMKII
- *  \brief USBTINY-MKII board hardware driver files.
+ *  \dir LUFA/Drivers/Board/MAXIMUS
+ *  \brief MAXIMUS board hardware driver files.
  *
- *  This folder contains drivers for hardware on all revisions of the USBTINY-MKII boards (http://tom-itx.dyndns.org:81/~webpage/).
- *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
- *  located in the parent Board directory should be included instead.
+ *  This folder contains drivers for hardware on the Maximus boards (http://www.avrusb.com/). The header files in this folder
+ *  should not be included directly in user applications; the similarly named dispatch header files located in the parent Board
+ *  directory should be included instead.
  *
- *  \dir LUFA/Drivers/Board/BENITO
- *  \brief BENITO board hardware driver files.
+ *  \dir LUFA/Drivers/Board/MICROSIN162
+ *  \brief MICROSIN162 board hardware driver files.
  *
- *  This folder contains drivers for hardware on the Benito boards (http://dorkbotpdx.org/wiki/benito). The header files in this
- *  folder should not be included directly in user applications; the similarly named dispatch header files located in the parent
- *  Board directory should be included instead.
+ *  This folder contains drivers for hardware on the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/). The
+ *  header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
  *
- *  \dir LUFA/Drivers/Board/JMDBU2
- *  \brief JM-DB-U2 board hardware driver files.
+ *  \dir LUFA/Drivers/Board/MINIMUS
+ *  \brief MINIMUS board hardware driver files.
  *
- *  This folder contains drivers for hardware on the JM-DB-U2 boards (http://u2.mattair.net/). The header files in this folder
+ *  This folder contains drivers for hardware on the Minimus boards (http://www.minimususb.com/). The header files in this folder
  *  should not be included directly in user applications; the similarly named dispatch header files located in the parent Board
  *  directory should be included instead.
  *
  *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
  *  located in the parent Board directory should be included instead.
  *
+ *  \dir LUFA/Drivers/Board/RZUSBSTICK
+ *  \brief RZUSBSTICK board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Atmel RZUSBSTICK board, as used in the Atmel "Raven" wireless kits. The header
+ *  files in this folder should not be included directly in user applications; the similarly named dispatch header files located in
+ *  the parent Board directory should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/SPARKFUN8U2
+ *  \brief SPARKFUN8U2 board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Sparkfun ATMEGA8U2 breakout board (http://www.sparkfun.com/products/10277). The
+ *  header files in this folder should not be included directly in user applications; the similarly named dispatch header files located
+ *  in the parent Board directory should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/STK525
+ *  \brief STK525 board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Atmel STK525 development board. The header files in this folder should
+ *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
+ *  should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/STK526
+ *  \brief STK526 board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Atmel STK526 development board. The header files in this folder should
+ *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
+ *  should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/TEENSY
+ *  \brief TEENSY board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on all revisions of the PJRC Teensy boards (http://www.pjrc.com/teensy/). The header
+ *  files in this folder should not be included directly in user applications; the similarly named dispatch header files located
+ *  in the parent Board directory should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/UDIP
+ *  \brief UDIP board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Linnix UDIP boards (http://linnix.com/udip/).
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/UNO
+ *  \brief UNO board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Arduino Uno boards (http://www.arduino.cc).
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
+ *
  *  \dir LUFA/Drivers/Board/USBFOO
  *  \brief USBFOO board hardware driver files.
  *
  *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
  *  located in the parent Board directory should be included instead.
  *
+ *  \dir LUFA/Drivers/Board/USBKEY
+ *  \brief USBKEY board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Atmel USBKEY demonstration board. The header files in this folder should
+ *  not be included directly in user applications; the similarly named dispatch header files located in the parent Board directory
+ *  should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/USBTINYMKII
+ *  \brief USBTINY-MKII board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on all revisions of the USBTINY-MKII boards (http://tom-itx.dyndns.org:81/~webpage/).
+ *  The header files in this folder should not be included directly in user applications; the similarly named dispatch header files
+ *  located in the parent Board directory should be included instead.
+ *
+ *  \dir LUFA/Drivers/Board/XPLAIN
+ *  \brief XPLAIN board hardware driver files.
+ *
+ *  This folder contains drivers for hardware on the Atmel XPLAIN board (all hardware revisions). The header files in this folder
+ *  should not be included directly in user applications; the similarly named dispatch header files located in the parent Board
+ *  directory should be included instead.
+ *
  *  \dir LUFA/CodeTemplates
  *  \brief Code templates for use in LUFA powered applications.
  *
index ccc2afd..44808b9 100644 (file)
@@ -22,19 +22,19 @@ ifeq ($(origin ARCH), undefined)
 endif
 
 # Define module source file lists
-LUFA_SRC_USB          = $(LUFA_ROOT_PATH)/Drivers/USB/LowLevel/Device.c             \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/LowLevel/Endpoint.c           \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/LowLevel/Host.c               \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/LowLevel/Pipe.c               \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/LowLevel/USBController.c      \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/LowLevel/USBInterrupt.c       \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/ConfigDescriptor.c  \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/DeviceStandardReq.c \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/Events.c            \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/EndpointStream.c    \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/HostStandardReq.c   \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/PipeStream.c        \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/HighLevel/USBTask.c           \
+LUFA_SRC_USB          = $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device.c         \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint.c       \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host.c           \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe.c           \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController.c  \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt.c   \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/ConfigDescriptor.c       \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/DeviceStandardReq.c      \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/Events.c                 \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/EndpointStream.c         \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/HostStandardReq.c        \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/PipeStream.c             \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/USBTask.c                \
                         $(LUFA_ROOT_PATH)/Drivers/USB/Class/Common/HIDParser.c
 LUFA_SRC_USBCLASS     = $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/Audio.c          \
                         $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDC.c            \