Added new RNDISHost Host LowLevel demo. Fixed misnamed Pipe_SetPipeToken() macro...
[pub/lufa.git] / LUFA / Drivers / USB / Class / Host / CDC.c
index 2d42be6..e284492 100644 (file)
@@ -95,7 +95,7 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
                if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)\r
                {\r
                        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
-                       {                                                          \r
+                       {\r
                                Pipe_ConfigurePipe(CDCInterfaceInfo->Config.NotificationPipeNumber, EP_TYPE_INTERRUPT, PIPE_TOKEN_IN,\r
                                                                   EndpointData->EndpointAddress, EndpointData->EndpointSize,\r
                                                                   CDCInterfaceInfo->Config.NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
@@ -110,18 +110,32 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
                {\r
                        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
                        {\r
+                               if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))\r
+                               {\r
+                                       BidirectionalDataEndpoints = true;\r
+                                       Pipe_DisablePipe();\r
+                               }\r
+\r
                                Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,\r
-                                                                  EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
-                                                                  CDCInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
+                                                  EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
+                                                  CDCInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
                                CDCInterfaceInfo->State.DataINPipeSize = EndpointData->EndpointSize;\r
 \r
                                FoundEndpoints |= CDC_FOUND_DATAPIPE_IN;\r
                        }\r
                        else\r
                        {\r
-                               Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,\r
-                                                                  EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
-                                                                  CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
+                               if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))\r
+                               {\r
+                                       BidirectionalDataEndpoints = true;\r
+                               }\r
+                               else\r
+                               {\r
+                                       Pipe_ConfigurePipe(CDCInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,\r
+                                                          EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
+                                                          CDCInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
+                               }\r
+                               \r
                                CDCInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;\r
                                \r
                                FoundEndpoints |= CDC_FOUND_DATAPIPE_OUT;\r
@@ -180,8 +194,7 @@ static uint8_t DComp_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescri
        \r
                uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);\r
        \r
-               if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&\r
-                   !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))\r
+               if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT))\r
                {\r
                        return DESCRIPTOR_SEARCH_Found;\r
                }\r
@@ -199,7 +212,8 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
        if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
          return;\r
        \r
-       Pipe_SelectPipe(CDCInterfaceInfo->Config.NotificationPipeNumber);       \r
+       Pipe_SelectPipe(CDCInterfaceInfo->Config.NotificationPipeNumber);\r
+       Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
        Pipe_Unfreeze();\r
 \r
        if (Pipe_IsINReceived())\r
@@ -263,10 +277,22 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, ch
 \r
        uint8_t ErrorCode;\r
 \r
-       Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);    \r
+       if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
+       {\r
+               Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
+               Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+       }\r
+       else\r
+       {\r
+               Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);    \r
+       }\r
+\r
        Pipe_Unfreeze();\r
        ErrorCode = Pipe_Write_Stream_LE(Data, Length, NO_STREAM_CALLBACK);\r
        Pipe_Freeze();\r
+\r
+       if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
+         Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
        \r
        return ErrorCode;\r
 }\r
@@ -278,7 +304,16 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
          \r
        uint8_t ErrorCode;\r
 \r
-       Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);    \r
+       if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
+       {\r
+               Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
+               Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+       }\r
+       else\r
+       {\r
+               Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipeNumber);    \r
+       }\r
+       \r
        Pipe_Unfreeze();\r
        \r
        if (!(Pipe_IsReadWriteAllowed()))\r
@@ -291,6 +326,9 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
 \r
        Pipe_Write_Byte(Data);  \r
        Pipe_Freeze();\r
+\r
+       if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
+         Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
        \r
        return PIPE_READYWAIT_NoError;\r
 }\r
@@ -302,7 +340,8 @@ uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
        if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
          return BytesInPipe;\r
        \r
-       Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);     \r
+       Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
+       Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
        Pipe_Unfreeze();\r
 \r
        if (Pipe_IsINReceived() && !(Pipe_BytesInPipe()))\r
@@ -321,7 +360,8 @@ uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
        if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))\r
          return ReceivedByte;\r
          \r
-       Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);     \r
+       Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
+       Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
        Pipe_Unfreeze();\r
 \r
        ReceivedByte = Pipe_Read_Byte();\r