Complete RNDIS Host Class driver code - add SendPacket function.
authorDean Camera <dean@fourwalledcubicle.com>
Thu, 26 Nov 2009 11:40:15 +0000 (11:40 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Thu, 26 Nov 2009 11:40:15 +0000 (11:40 +0000)
Correct CDC Host Class driver token handling for sending data on bidirectional data endpoints.

LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/Class/Host/RNDIS.c
LUFA/Drivers/USB/Class/Host/RNDIS.h

index d1e63b5..20fa659 100644 (file)
@@ -280,7 +280,7 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, ch
        if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
        {\r
                Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
-               Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+               Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
        }\r
        else\r
        {\r
@@ -307,7 +307,7 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
        if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)\r
        {\r
                Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);\r
-               Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+               Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
        }\r
        else\r
        {\r
index e44d05f..b226748 100644 (file)
@@ -443,4 +443,47 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
        return PIPE_RWSTREAM_NoError;\r
 }\r
 \r
+uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t PacketLength)\r
+{\r
+       uint8_t ErrorCode;\r
+\r
+       if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))\r
+         return PIPE_READYWAIT_DeviceDisconnected;\r
+\r
+       if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)\r
+       {\r
+               Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipeNumber);\r
+               Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
+       }\r
+       else\r
+       {\r
+               Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);  \r
+       }\r
+\r
+       Pipe_Unfreeze();\r
+\r
+       RNDIS_Packet_Message_t DeviceMessage;\r
+       \r
+       DeviceMessage.MessageType = REMOTE_NDIS_PACKET_MSG;\r
+       DeviceMessage.MessageLength = (sizeof(RNDIS_Packet_Message_t) + PacketLength);\r
+       DeviceMessage.DataOffset = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));\r
+       DeviceMessage.DataLength = PacketLength;\r
+       \r
+       if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),\r
+                                             NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)\r
+       {\r
+               return ErrorCode;\r
+       }\r
+       \r
+       Pipe_Write_Stream_LE(Buffer, PacketLength, NO_STREAM_CALLBACK);\r
+       Pipe_ClearOUT();\r
+\r
+       Pipe_Freeze();\r
+       \r
+       if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)\r
+         Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+       \r
+       return PIPE_RWSTREAM_NoError;\r
+}\r
+\r
 #endif\r
index 9b14055..b20e989 100644 (file)
                        uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t* PacketLength)\r
                                                      ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);\r
 \r
+                       /** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header.\r
+                        *\r
+                        *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state\r
+                        *  \param[in] Buffer  Pointer to a buffer where the packer data is to be read from\r
+                        *  \param[in] PacketLength  Length in bytes of the packet to send\r
+                        *\r
+                        *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum\r
+                        */\r
+                       uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t PacketLength)\r
+                                                     ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);\r
+\r
        /* Private Interface - For use in library only: */\r
        #if !defined(__DOXYGEN__)\r
                /* Macros: */\r