forked from mfulz_github/qmk_firmware
Complete RNDIS Host Class driver code - add SendPacket function.
Correct CDC Host Class driver token handling for sending data on bidirectional data endpoints.
This commit is contained in:
parent
9ba8da7412
commit
5e46801096
|
@ -280,7 +280,7 @@ uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, ch
|
||||||
if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
|
if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
|
||||||
{
|
{
|
||||||
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
|
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
|
||||||
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -307,7 +307,7 @@ uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, cons
|
||||||
if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
|
if (CDCInterfaceInfo->State.BidirectionalDataEndpoints)
|
||||||
{
|
{
|
||||||
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
|
Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipeNumber);
|
||||||
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -443,4 +443,47 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
|
||||||
return PIPE_RWSTREAM_NoError;
|
return PIPE_RWSTREAM_NoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t PacketLength)
|
||||||
|
{
|
||||||
|
uint8_t ErrorCode;
|
||||||
|
|
||||||
|
if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))
|
||||||
|
return PIPE_READYWAIT_DeviceDisconnected;
|
||||||
|
|
||||||
|
if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)
|
||||||
|
{
|
||||||
|
Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipeNumber);
|
||||||
|
Pipe_SetPipeToken(PIPE_TOKEN_OUT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
Pipe_Unfreeze();
|
||||||
|
|
||||||
|
RNDIS_Packet_Message_t DeviceMessage;
|
||||||
|
|
||||||
|
DeviceMessage.MessageType = REMOTE_NDIS_PACKET_MSG;
|
||||||
|
DeviceMessage.MessageLength = (sizeof(RNDIS_Packet_Message_t) + PacketLength);
|
||||||
|
DeviceMessage.DataOffset = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
|
||||||
|
DeviceMessage.DataLength = PacketLength;
|
||||||
|
|
||||||
|
if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
|
||||||
|
NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
|
||||||
|
{
|
||||||
|
return ErrorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pipe_Write_Stream_LE(Buffer, PacketLength, NO_STREAM_CALLBACK);
|
||||||
|
Pipe_ClearOUT();
|
||||||
|
|
||||||
|
Pipe_Freeze();
|
||||||
|
|
||||||
|
if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)
|
||||||
|
Pipe_SetPipeToken(PIPE_TOKEN_IN);
|
||||||
|
|
||||||
|
return PIPE_RWSTREAM_NoError;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -209,6 +209,17 @@
|
||||||
uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t* PacketLength)
|
uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t* PacketLength)
|
||||||
ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
|
||||||
|
|
||||||
|
/** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header.
|
||||||
|
*
|
||||||
|
* \param[in,out] RNDISInterfaceInfo Pointer to a structure containing an RNDIS Class host configuration and state
|
||||||
|
* \param[in] Buffer Pointer to a buffer where the packer data is to be read from
|
||||||
|
* \param[in] PacketLength Length in bytes of the packet to send
|
||||||
|
*
|
||||||
|
* \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
|
||||||
|
*/
|
||||||
|
uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, void* Buffer, uint16_t PacketLength)
|
||||||
|
ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
|
||||||
|
|
||||||
/* Private Interface - For use in library only: */
|
/* Private Interface - For use in library only: */
|
||||||
#if !defined(__DOXYGEN__)
|
#if !defined(__DOXYGEN__)
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
|
|
Loading…
Reference in New Issue