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
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
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
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