New HID report item macros (with HID_RI_ prefix) to allow for easy creation and editi...
[pub/USBasp.git] / LUFA / Drivers / USB / HighLevel / EndpointStream.c
index 794c917..974af68 100644 (file)
@@ -1,13 +1,13 @@
 /*\r
              LUFA Library\r
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2010.\r
+     Copyright (C) Dean Camera, 2011.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
+           www.lufa-lib.org\r
 */\r
 \r
 /*\r
 */\r
 \r
 /*\r
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\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
 \r
   Permission to use, copy, modify, distribute, and sell this \r
   software and its documentation for any purpose is hereby granted\r
 #include "EndpointStream.h"\r
 \r
 #if !defined(CONTROL_ONLY_DEVICE)\r
 #include "EndpointStream.h"\r
 \r
 #if !defined(CONTROL_ONLY_DEVICE)\r
-uint8_t Endpoint_Discard_Stream(uint16_t Length\r
-                                __CALLBACK_PARAM)\r
+uint8_t Endpoint_Discard_Stream(uint16_t Length,\r
+                                uint16_t* const BytesProcessed)\r
 {\r
 {\r
-       uint8_t ErrorCode;\r
+       uint8_t  ErrorCode;\r
+       uint16_t BytesInTransfer = 0;\r
        \r
        if ((ErrorCode = Endpoint_WaitUntilReady()))\r
          return ErrorCode;\r
        \r
        if ((ErrorCode = Endpoint_WaitUntilReady()))\r
          return ErrorCode;\r
+         \r
+       if (BytesProcessed != NULL)\r
+         Length -= *BytesProcessed;\r
 \r
 \r
-       #if defined(FAST_STREAM_TRANSFERS)\r
-       uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);\r
-\r
-       if (Length >= 8)\r
+       while (Length)\r
        {\r
        {\r
-               Length -= BytesRemToAlignment;\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
 \r
-               switch (BytesRemToAlignment)\r
+                       if ((ErrorCode = Endpoint_WaitUntilReady()))\r
+                         return ErrorCode;\r
+               }\r
+               else\r
                {\r
                {\r
-                       default:\r
-                               do\r
-                               {\r
-                                       if (!(Endpoint_IsReadWriteAllowed()))\r
-                                       {\r
-                                               Endpoint_ClearOUT();\r
-\r
-                                               #if !defined(NO_STREAM_CALLBACKS)\r
-                                               if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))\r
-                                                 return ENDPOINT_RWSTREAM_CallbackAborted;\r
-                                               #endif\r
-\r
-                                               if ((ErrorCode = Endpoint_WaitUntilReady()))\r
-                                                 return ErrorCode;\r
-                                       }\r
-\r
-                                       Length -= 8;\r
-                                       \r
-                                       Endpoint_Discard_Byte();\r
-                       case 7: Endpoint_Discard_Byte();\r
-                       case 6: Endpoint_Discard_Byte();\r
-                       case 5: Endpoint_Discard_Byte();\r
-                       case 4: Endpoint_Discard_Byte();\r
-                       case 3: Endpoint_Discard_Byte();\r
-                       case 2: Endpoint_Discard_Byte();\r
-                       case 1: Endpoint_Discard_Byte();\r
-                               } while (Length >= 8);  \r
+                       Endpoint_Discard_Byte();\r
+\r
+                       Length--;\r
+                       BytesInTransfer++;\r
                }\r
        }\r
                }\r
        }\r
-       #endif\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
 \r
        while (Length)\r
        {\r
                if (!(Endpoint_IsReadWriteAllowed()))\r
                {\r
-                       Endpoint_ClearOUT();\r
+                       Endpoint_ClearIN();\r
 \r
 \r
-                       #if !defined(NO_STREAM_CALLBACKS)\r
-                       if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))\r
-                         return ENDPOINT_RWSTREAM_CallbackAborted;\r
-                       #endif\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
 \r
                        if ((ErrorCode = Endpoint_WaitUntilReady()))\r
                          return ErrorCode;\r
                }\r
                else\r
                {\r
-                       Endpoint_Discard_Byte();\r
+                       Endpoint_Write_Byte(0);\r
+\r
                        Length--;\r
                        Length--;\r
+                       BytesInTransfer++;\r
                }\r
        }\r
        \r
                }\r
        }\r
        \r
@@ -112,122 +118,142 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE\r
 #define  TEMPLATE_BUFFER_TYPE                      const void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE\r
 #define  TEMPLATE_BUFFER_TYPE                      void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #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_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr++) = Endpoint_Read_Byte()\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE\r
 #define  TEMPLATE_BUFFER_TYPE                      void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #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_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr++, Endpoint_Read_Byte())\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE\r
 #define  TEMPLATE_BUFFER_TYPE                      void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr--) = Endpoint_Read_Byte()\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE\r
 #define  TEMPLATE_BUFFER_TYPE                      void*\r
 #define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr--, Endpoint_Read_Byte())\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #endif\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #include "Template/Template_Endpoint_RW.c"\r
 \r
 #endif\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(*BufferPtr)\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(pgm_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_Byte(eeprom_read_byte(BufferPtr))\r
 #include "Template/Template_Endpoint_Control_W.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #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_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr++) = Endpoint_Read_Byte()\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
 #include "Template/Template_Endpoint_Control_R.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #include "Template/Template_Endpoint_Control_R.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr++, Endpoint_Read_Byte())\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
 #include "Template/Template_Endpoint_Control_R.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr--) = Endpoint_Read_Byte()\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_Byte()\r
 #include "Template/Template_Endpoint_Control_R.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\r
 #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_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr--, Endpoint_Read_Byte())\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_Byte())\r
 #include "Template/Template_Endpoint_Control_R.c"\r
 \r
 #endif
 #include "Template/Template_Endpoint_Control_R.c"\r
 \r
 #endif