New HID report item macros (with HID_RI_ prefix) to allow for easy creation and editi...
[pub/USBasp.git] / LUFA / Drivers / USB / HighLevel / PipeStream.c
index 72a7e64..4465471 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
 \r
 #include "PipeStream.h"\r
 \r
 \r
 #include "PipeStream.h"\r
 \r
-uint8_t Pipe_Discard_Stream(uint16_t Length\r
-                            __CALLBACK_PARAM)\r
+uint8_t Pipe_Discard_Stream(uint16_t Length,\r
+                            uint16_t* const BytesProcessed)\r
 {\r
        uint8_t  ErrorCode;\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
        \r
        Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
 \r
        if ((ErrorCode = Pipe_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
-       #if defined(FAST_STREAM_TRANSFERS)\r
-       uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);\r
+       if (BytesProcessed != NULL)\r
+         Length -= *BytesProcessed;\r
 \r
 \r
-       if (Length >= 8)\r
+       while (Length)\r
        {\r
        {\r
-               Length -= BytesRemToAlignment;\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
 \r
-               switch (BytesRemToAlignment)\r
+                       if ((ErrorCode = Pipe_WaitUntilReady()))\r
+                         return ErrorCode;\r
+               }\r
+               else\r
                {\r
                {\r
-                       default:\r
-                               do\r
-                               {\r
-                                       if (!(Pipe_IsReadWriteAllowed()))\r
-                                       {\r
-                                               Pipe_ClearIN();\r
-                                                       \r
-                                               #if !defined(NO_STREAM_CALLBACKS)\r
-                                               if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))\r
-                                                 return PIPE_RWSTREAM_CallbackAborted;\r
-                                               #endif\r
-\r
-                                               if ((ErrorCode = Pipe_WaitUntilReady()))\r
-                                                 return ErrorCode;\r
-                                       }\r
-\r
-                                       Length -= 8;\r
-                                       \r
-                                       Pipe_Discard_Byte();\r
-                       case 7: Pipe_Discard_Byte();\r
-                       case 6: Pipe_Discard_Byte();\r
-                       case 5: Pipe_Discard_Byte();\r
-                       case 4: Pipe_Discard_Byte();\r
-                       case 3: Pipe_Discard_Byte();\r
-                       case 2: Pipe_Discard_Byte();\r
-                       case 1: Pipe_Discard_Byte();\r
-                               } while (Length >= 8);  \r
+                       Pipe_Discard_Byte();\r
+                       \r
+                       Length--;\r
+                       BytesInTransfer++;\r
                }\r
        }\r
                }\r
        }\r
-       #endif\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
 \r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
                {\r
-                       Pipe_ClearIN();\r
+                       Pipe_ClearOUT();\r
                                \r
                                \r
-                       #if !defined(NO_STREAM_CALLBACKS)\r
-                       if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))\r
-                         return PIPE_RWSTREAM_CallbackAborted;\r
-                       #endif\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
 \r
                        if ((ErrorCode = Pipe_WaitUntilReady()))\r
                          return ErrorCode;\r
                }\r
                else\r
                {\r
-                       Pipe_Discard_Byte();\r
+                       Pipe_Write_Byte(0);\r
+                       \r
                        Length--;\r
                        Length--;\r
+                       BytesInTransfer++;\r
                }\r
        }\r
 \r
                }\r
        }\r
 \r
@@ -117,7 +127,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*BufferPtr)\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_LE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_LE\r
@@ -125,7 +136,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte(BufferPtr))\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_LE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_LE\r
@@ -133,7 +145,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr++))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte(BufferPtr))\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE\r
@@ -141,7 +154,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\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_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(*BufferPtr)\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_BE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_BE\r
@@ -149,7 +163,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\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_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(pgm_read_byte(BufferPtr))\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_BE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_BE\r
@@ -157,7 +172,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\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_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte((uint8_t*)BufferPtr--))\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_Byte(eeprom_read_byte(BufferPtr))\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE\r
@@ -165,7 +181,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr++) = Pipe_Read_Byte()\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_Byte()\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_LE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_LE\r
@@ -173,7 +190,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            0\r
-#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr++, Pipe_Read_Byte())\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_Byte())\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE\r
@@ -181,7 +199,8 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\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_TRANSFER_BYTE(BufferPtr)         *((uint8_t*)BufferPtr--) = Pipe_Read_Byte()\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_Byte()\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_BE\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_BE\r
@@ -189,7 +208,9 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 #define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN\r
 #define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()\r
 #define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)\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_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte((uint8_t*)BufferPtr--, Pipe_Read_Byte())\r
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount\r
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_Byte())\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #endif\r
 #include "Template/Template_Pipe_RW.c"\r
 \r
 #endif\r
+