Copy out the EndpointStream and PipeStream functions to each architecture, so that...
authorDean Camera <dean@fourwalledcubicle.com>
Thu, 26 May 2011 11:27:21 +0000 (11:27 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Thu, 26 May 2011 11:27:21 +0000 (11:27 +0000)
26 files changed:
LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/EndpointStream.c [deleted file]
LUFA/Drivers/USB/Core/EndpointStream.h
LUFA/Drivers/USB/Core/PipeStream.c [deleted file]
LUFA/Drivers/USB/Core/PipeStream.h
LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_R.c [deleted file]
LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_W.c [deleted file]
LUFA/Drivers/USB/Core/Template/Template_Endpoint_RW.c [deleted file]
LUFA/Drivers/USB/Core/Template/Template_Pipe_RW.c [deleted file]
LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c [new file with mode: 0644]
LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c [new file with mode: 0644]
LUFA/Drivers/USB/USB.h
LUFA/makefile

diff --git a/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c
new file mode 100644 (file)
index 0000000..6682dc0
--- /dev/null
@@ -0,0 +1,267 @@
+/*\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_AVR8.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_8();\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_8(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_8(*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_8(*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_8()\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_8()\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)\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_8(pgm_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_8(pgm_read_byte(BufferPtr))\r
+       #include "Template/Template_Endpoint_RW.c"\r
+#endif\r
+\r
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)\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_8(eeprom_read_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_8(eeprom_read_byte(BufferPtr))\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_8())\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_8())\r
+       #include "Template/Template_Endpoint_RW.c"\r
+#endif\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_8(*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_8(*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_8()\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_8()\r
+#include "Template/Template_Endpoint_Control_R.c"\r
+\r
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)\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_8(pgm_read_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_8(pgm_read_byte(BufferPtr))\r
+       #include "Template/Template_Endpoint_Control_W.c"\r
+#endif\r
+\r
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)\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_8(eeprom_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_8(eeprom_read_byte(BufferPtr))\r
+       #include "Template/Template_Endpoint_Control_W.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_8())\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_8())\r
+       #include "Template/Template_Endpoint_Control_R.c"\r
+#endif\r
+\r
+#endif
diff --git a/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h
new file mode 100644 (file)
index 0000000..433311d
--- /dev/null
@@ -0,0 +1,648 @@
+/*\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 Endpoint data stream transmission and reception management for the AVR8 microcontrollers.\r
+ *  \copydetails Group_EndpointStreamRW_AVR8\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_EndpointStreamRW\r
+ *  \defgroup Group_EndpointStreamRW_AVR8 Read/Write of Multi-Byte Streams (AVR8)\r
+ *  \brief Endpoint data stream transmission and reception management for the Atmel AVR8 architecture.\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_AVR8_H__\r
+#define __ENDPOINT_STREAM_AVR8_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../../Common/Common.h"\r
+               #include "../USBMode.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
+               /* Function Prototypes: */\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
+                        *        \n\n\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
+                        *        \n\n\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
+                        *        \n\n\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
+                        *        \n\n\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
+                        *        \n\n\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
+                        *        \n\n\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/AVR8/PipeStream_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c
new file mode 100644 (file)
index 0000000..b3d263c
--- /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_AVR8.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_8();\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_8(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_8(*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_8(*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_8()\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_8()\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_8(pgm_read_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_8(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_8(eeprom_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_8(eeprom_read_byte(BufferPtr))\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_8())\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_8())\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#endif\r
+
diff --git a/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h
new file mode 100644 (file)
index 0000000..ec1ed82
--- /dev/null
@@ -0,0 +1,442 @@
+/*\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 Pipe data stream transmission and reception management for the AVR8 microcontrollers\r
+ *  \copydetails Group_PipeStreamRW_AVR8\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_PipeStreamRW\r
+ *  \defgroup Group_PipeStreamRW_AVR8 Read/Write of Multi-Byte Streams (AVR8)\r
+ *  \brief Pipe data stream transmission and reception management for the Atmel AVR8 architecture.\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_AVR8_H__\r
+#define __PIPE_STREAM_AVR8_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../../Common/Common.h"\r
+               #include "../USBMode.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
+               /* Function Prototypes: */\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/AVR8/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/Core/AVR8/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/AVR8/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/Core/AVR8/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/AVR8/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/Core/AVR8/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/AVR8/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/Core/AVR8/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/EndpointStream.c b/LUFA/Drivers/USB/Core/EndpointStream.c
deleted file mode 100644 (file)
index 0deb284..0000000
+++ /dev/null
@@ -1,267 +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_8();\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_8(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_8(*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_8(*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_8()\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_8()\r
-#include "Template/Template_Endpoint_RW.c"\r
-\r
-#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)\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_8(pgm_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_8(pgm_read_byte(BufferPtr))\r
-       #include "Template/Template_Endpoint_RW.c"\r
-#endif\r
-\r
-#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)\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_8(eeprom_read_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_8(eeprom_read_byte(BufferPtr))\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_8())\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_8())\r
-       #include "Template/Template_Endpoint_RW.c"\r
-#endif\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_8(*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_8(*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_8()\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_8()\r
-#include "Template/Template_Endpoint_Control_R.c"\r
-\r
-#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)\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_8(pgm_read_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_8(pgm_read_byte(BufferPtr))\r
-       #include "Template/Template_Endpoint_Control_W.c"\r
-#endif\r
-\r
-#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)\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_8(eeprom_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_8(eeprom_read_byte(BufferPtr))\r
-       #include "Template/Template_Endpoint_Control_W.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_8())\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_8())\r
-       #include "Template/Template_Endpoint_Control_R.c"\r
-#endif\r
-\r
-#endif
index b4454a3..54f2d83 100644 (file)
 \r
        /* Includes: */\r
                #include "../../../Common/Common.h"\r
 \r
        /* Includes: */\r
                #include "../../../Common/Common.h"\r
-               #include "USBMode.h"            \r
-               #include "USBTask.h"\r
-               \r
-       /* Enable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       extern "C" {\r
-               #endif\r
+               #include "USBMode.h"\r
 \r
        /* Preprocessor Checks: */\r
                #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
 \r
        /* Preprocessor Checks: */\r
                #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
                                                                            */\r
                        };\r
 \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
-                       #if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) || defined(__DOXYGEN__)\r
-                       /** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                        *        \n\n\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                        *        \n\n\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                        *        \n\n\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                        *        \n\n\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                       #endif\r
-                       //@}\r
-\r
-                       /** \name Stream functions for PROGMEM source/destination data */\r
-                       //@{\r
-\r
-                       #if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) || defined(__DOXYGEN__)\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
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                        *        \n\n\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                        *        \n\n\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                       #endif\r
-                       //@}\r
-\r
-       /* Disable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       }\r
+       /* Architecture Includes: */\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/EndpointStream_AVR8.h"\r
+               #elif (ARCH == ARCH_UC3)\r
+                       #include "UC3/EndpointStream_UC3.h"\r
                #endif\r
                \r
 #endif\r
 \r
 /** @} */\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
deleted file mode 100644 (file)
index 6b896ba..0000000
+++ /dev/null
@@ -1,220 +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_8();\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_8(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_8(*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_8(*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_8()\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_8()\r
-#include "Template/Template_Pipe_RW.c"\r
-\r
-#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)\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_8(pgm_read_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_8(pgm_read_byte(BufferPtr))\r
-       #include "Template/Template_Pipe_RW.c"\r
-#endif\r
-\r
-#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)\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_8(eeprom_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_8(eeprom_read_byte(BufferPtr))\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_8())\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_8())\r
-       #include "Template/Template_Pipe_RW.c"\r
-#endif\r
-\r
-#endif\r
-
index c914fc1..91f4652 100644 (file)
@@ -51,8 +51,7 @@
 \r
        /* Includes: */\r
                #include "../../../Common/Common.h"\r
 \r
        /* Includes: */\r
                #include "../../../Common/Common.h"\r
-               #include "USBMode.h"            \r
-               #include "USBTask.h"\r
+               #include "USBMode.h"\r
                \r
        /* Enable C linkage for C++ Compilers: */\r
                #if defined(__cplusplus)\r
                \r
        /* Enable C linkage for C++ Compilers: */\r
                #if defined(__cplusplus)\r
                                                                       */\r
                        };\r
 \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
-                       #if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) || defined(__DOXYGEN__)\r
-                       /** EEPROM buffer source version of \ref Pipe_Write_Stream_LE().\r
-                        *\r
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                       #endif\r
-                       //@}\r
-\r
-                       /** \name Stream functions for PROGMEM source/destination data */\r
-                       //@{\r
-                       \r
-                       #if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) || defined(__DOXYGEN__)\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
-                        *  \note This function is not available on all architectures.\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
-                        *  \note This function is not available on all architectures.\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
-                       #endif\r
-                       //@}\r
-\r
-       /* Disable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       }\r
+       /* Architecture Includes: */\r
+               #if (ARCH == ARCH_AVR8)\r
+                       #include "AVR8/PipeStream_AVR8.h"\r
+               #elif (ARCH == ARCH_UC3)\r
+                       #include "UC3/PipeStream_UC3.h"\r
                #endif\r
        \r
 #endif\r
 \r
 /** @} */\r
                #endif\r
        \r
 #endif\r
 \r
 /** @} */\r
-
+\r
diff --git a/LUFA/Drivers/USB/Core/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/Core/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/Core/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/Core/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/Core/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/Core/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/Core/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/Core/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/Core/UC3/EndpointStream_UC3.c b/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c
new file mode 100644 (file)
index 0000000..98d3ac0
--- /dev/null
@@ -0,0 +1,227 @@
+/*\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_UC3.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_8();\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_8(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_8(*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_8(*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_8()\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_8()\r
+#include "Template/Template_Endpoint_RW.c"\r
+\r
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)\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_8(pgm_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_8(pgm_read_byte(BufferPtr))\r
+       #include "Template/Template_Endpoint_RW.c"\r
+#endif\r
+\r
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)\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_8(eeprom_read_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_8(eeprom_read_byte(BufferPtr))\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_8())\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_8())\r
+       #include "Template/Template_Endpoint_RW.c"\r
+#endif\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_8(*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_8(*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_8()\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_8()\r
+#include "Template/Template_Endpoint_Control_R.c"\r
+\r
+#endif
diff --git a/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h b/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h
new file mode 100644 (file)
index 0000000..731f281
--- /dev/null
@@ -0,0 +1,433 @@
+/*\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 Endpoint data stream transmission and reception management for the AVR32 UC3 microcontrollers.\r
+ *  \copydetails Group_EndpointStreamRW_UC3\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_EndpointStreamRW\r
+ *  \defgroup Group_EndpointStreamRW_UC3 Read/Write of Multi-Byte Streams (UC3)\r
+ *  \brief Endpoint data stream transmission and reception management for the Atmel AVR32 UC3 architecture.\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 "../USBMode.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
+               /* Function Prototypes: */\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
+       /* 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/UC3/PipeStream_UC3.c b/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c
new file mode 100644 (file)
index 0000000..3aa815c
--- /dev/null
@@ -0,0 +1,162 @@
+/*\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_UC3.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_8();\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_8(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_8(*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_8(*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_8()\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_8()\r
+#include "Template/Template_Pipe_RW.c"\r
+\r
+#endif\r
+
diff --git a/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h b/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h
new file mode 100644 (file)
index 0000000..d27f011
--- /dev/null
@@ -0,0 +1,351 @@
+/*\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 Pipe data stream transmission and reception management for the AVR32 UC3 microcontrollers.\r
+ *  \copydetails Group_PipeStreamRW_UC3\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_PipeStreamRW\r
+ *  \defgroup Group_PipeStreamRW_UC3 Read/Write of Multi-Byte Streams (UC3)\r
+ *  \brief Pipe data stream transmission and reception management for the Atmel AVR32 UC3 architecture.\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_UC3_H__\r
+#define __PIPE_STREAM_UC3_H__\r
+\r
+       /* Includes: */\r
+               #include "../../../../Common/Common.h"\r
+               #include "../USBMode.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
+               /* Function Prototypes: */\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
+       /* 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/UC3/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/Core/UC3/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/UC3/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/Core/UC3/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/UC3/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/Core/UC3/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/UC3/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/Core/UC3/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
index 3ba6f38..9c72e38 100644 (file)
  *    - 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/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/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_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Endpoint_<i>ARCH</i>.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_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Endpoint_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/EndpointStream_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Host_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Pipe_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Host_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Pipe_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/PipeStream_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBController_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBInterrupt_<i>ARCH</i>.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>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBController_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
  *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBInterrupt_<i>ARCH</i>.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>
index 46dcc08..bf85a2c 100644 (file)
@@ -23,19 +23,19 @@ ifeq ($(origin ARCH), undefined)
 endif
 
 # Define module source file lists
 endif
 
 # Define module source file lists
-LUFA_SRC_USB          = $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c        \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c      \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c          \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c          \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c \
-                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).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_SRC_USB          = $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c         \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c       \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c           \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c           \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c  \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).c   \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/EndpointStream_$(ARCH).c \
+                        $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/PipeStream_$(ARCH).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/HostStandardReq.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                   \
                         $(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                   \