Added new HOST_STATE_WaitForDeviceRemoval host state machine state for non-blocking...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Pipe.c
index 720da17..ab09279 100644 (file)
@@ -45,9 +45,11 @@ bool Pipe_ConfigurePipe(const uint8_t Number, const uint8_t Type, const uint8_t
 \r
        UPCFG1X = 0;\r
        \r
-       UPCFG0X = ((Type << EPTYPE0) | Token | (EndpointNumber << PEPNUM0));\r
+       UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));\r
        UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));\r
 \r
+       Pipe_SetInfiniteINRequests();\r
+\r
        return Pipe_IsConfigured();\r
 }\r
 \r
@@ -94,9 +96,9 @@ uint8_t Pipe_WaitUntilReady(void)
                else if (!(USB_IsConnected))\r
                  return PIPE_READYWAIT_DeviceDisconnected;\r
                          \r
-               if (FrameElapsed)\r
+               if (USB_INT_HasOccurred(USB_INT_HSOFI))\r
                {\r
-                       FrameElapsed = false;\r
+                       USB_INT_Clear(USB_INT_HSOFI);\r
 \r
                        if (!(TimeoutMSRem--))\r
                          return PIPE_READYWAIT_Timeout;\r
@@ -113,9 +115,51 @@ uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length
        uint8_t* DataStream = (uint8_t*)Data;\r
        uint8_t  ErrorCode;\r
        \r
+       Pipe_SetToken(PIPE_TOKEN_OUT);\r
+\r
        if ((ErrorCode = Pipe_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
+       #if defined(FAST_STREAM_TRANSFERS)\r
+       uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);\r
+\r
+       if (Length >= 8)\r
+       {\r
+               Length -= BytesRemToAlignment;\r
+\r
+               switch (BytesRemToAlignment)\r
+               {\r
+                       default:\r
+                               do\r
+                               {\r
+                                       if (!(Pipe_IsReadWriteAllowed()))\r
+                                       {\r
+                                               Pipe_ClearOUT();\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_Write_Byte(*(DataStream++));\r
+                       case 7: Pipe_Write_Byte(*(DataStream++));\r
+                       case 6: Pipe_Write_Byte(*(DataStream++));\r
+                       case 5: Pipe_Write_Byte(*(DataStream++));\r
+                       case 4: Pipe_Write_Byte(*(DataStream++));\r
+                       case 3: Pipe_Write_Byte(*(DataStream++));\r
+                       case 2: Pipe_Write_Byte(*(DataStream++));\r
+                       case 1: Pipe_Write_Byte(*(DataStream++));\r
+                               } while (Length >= 8);  \r
+               }\r
+       }\r
+       #endif\r
+       \r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
@@ -149,9 +193,51 @@ uint8_t Pipe_Write_Stream_BE(const void* Data, uint16_t Length
        uint8_t* DataStream = (uint8_t*)(Data + Length - 1);\r
        uint8_t  ErrorCode;\r
        \r
+       Pipe_SetToken(PIPE_TOKEN_OUT);\r
+\r
        if ((ErrorCode = Pipe_WaitUntilReady()))\r
          return ErrorCode;\r
 \r
+       #if defined(FAST_STREAM_TRANSFERS)\r
+       uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);\r
+\r
+       if (Length >= 8)\r
+       {\r
+               Length -= BytesRemToAlignment;\r
+\r
+               switch (BytesRemToAlignment)\r
+               {\r
+                       default:\r
+                               do\r
+                               {\r
+                                       if (!(Pipe_IsReadWriteAllowed()))\r
+                                       {\r
+                                               Pipe_ClearOUT();\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_Write_Byte(*(DataStream--));\r
+                       case 7: Pipe_Write_Byte(*(DataStream--));\r
+                       case 6: Pipe_Write_Byte(*(DataStream--));\r
+                       case 5: Pipe_Write_Byte(*(DataStream--));\r
+                       case 4: Pipe_Write_Byte(*(DataStream--));\r
+                       case 3: Pipe_Write_Byte(*(DataStream--));\r
+                       case 2: Pipe_Write_Byte(*(DataStream--));\r
+                       case 1: Pipe_Write_Byte(*(DataStream--));\r
+                               } while (Length >= 8);  \r
+               }\r
+       }\r
+       #endif\r
+\r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
@@ -184,9 +270,51 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 {\r
        uint8_t  ErrorCode;\r
        \r
+       Pipe_SetToken(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
+\r
+       if (Length >= 8)\r
+       {\r
+               Length -= BytesRemToAlignment;\r
+\r
+               switch (BytesRemToAlignment)\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
+               }\r
+       }\r
+       #endif\r
+\r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
@@ -220,9 +348,51 @@ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length
        uint8_t* DataStream = (uint8_t*)Buffer;\r
        uint8_t  ErrorCode;\r
        \r
+       Pipe_SetToken(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
+\r
+       if (Length >= 8)\r
+       {\r
+               Length -= BytesRemToAlignment;\r
+\r
+               switch (BytesRemToAlignment)\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
+                                       *(DataStream++) = Pipe_Read_Byte();\r
+                       case 7: *(DataStream++) = Pipe_Read_Byte();\r
+                       case 6: *(DataStream++) = Pipe_Read_Byte();\r
+                       case 5: *(DataStream++) = Pipe_Read_Byte();\r
+                       case 4: *(DataStream++) = Pipe_Read_Byte();\r
+                       case 3: *(DataStream++) = Pipe_Read_Byte();\r
+                       case 2: *(DataStream++) = Pipe_Read_Byte();\r
+                       case 1: *(DataStream++) = Pipe_Read_Byte();\r
+                               } while (Length >= 8);  \r
+               }\r
+       }\r
+       #endif\r
+\r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r
@@ -256,9 +426,51 @@ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length
        uint8_t* DataStream = (uint8_t*)(Buffer + Length - 1);\r
        uint8_t  ErrorCode;\r
        \r
+       Pipe_SetToken(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
+\r
+       if (Length >= 8)\r
+       {\r
+               Length -= BytesRemToAlignment;\r
+\r
+               switch (BytesRemToAlignment)\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
+                                       *(DataStream--) = Pipe_Read_Byte();\r
+                       case 7: *(DataStream--) = Pipe_Read_Byte();\r
+                       case 6: *(DataStream--) = Pipe_Read_Byte();\r
+                       case 5: *(DataStream--) = Pipe_Read_Byte();\r
+                       case 4: *(DataStream--) = Pipe_Read_Byte();\r
+                       case 3: *(DataStream--) = Pipe_Read_Byte();\r
+                       case 2: *(DataStream--) = Pipe_Read_Byte();\r
+                       case 1: *(DataStream--) = Pipe_Read_Byte();\r
+                               } while (Length >= 8);  \r
+               }\r
+       }\r
+       #endif\r
+\r
        while (Length)\r
        {\r
                if (!(Pipe_IsReadWriteAllowed()))\r