@ -52,6 +52,13 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint
return CDC_ENUMERROR_NoCDCInterfaceFound ;
}
CDCInterfaceInfo - > State . ControlInterfaceNumber =
# if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
DESCRIPTOR_CAST ( ConfigDescriptorData , USB_Descriptor_Interface_t ) . InterfaceNumber ;
# else
DESCRIPTOR_CAST ( ConfigDescriptorData , USB_Descriptor_Interface_t ) . bInterfaceNumber ;
# endif
while ( FoundEndpoints ! = ( CDC_FOUND_DATAPIPE_IN | CDC_FOUND_DATAPIPE_OUT | CDC_FOUND_DATAPIPE_NOTIFICATION ) )
{
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
@ -126,6 +133,7 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint
}
}
CDCInterfaceInfo - > State . Active = true ;
return CDC_ENUMERROR_NoError ;
}
@ -189,6 +197,111 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
}
void CDC_Host_USBTask ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo )
{
EVENT_CDC_Host_ControLineStateChanged ( CDCInterfaceInfo ) ;
}
uint8_t CDC_Host_SetLineEncoding ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo )
{
USB_ControlRequest = ( USB_Request_Header_t )
{
. bmRequestType = ( REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE ) ,
. bRequest = REQ_SetControlLineState ,
. wValue = 0 ,
. wIndex = CDCInterfaceInfo - > State . ControlInterfaceNumber ,
. wLength = sizeof ( CDCInterfaceInfo - > State . LineEncoding ) ,
} ;
Pipe_SelectPipe ( PIPE_CONTROLPIPE ) ;
return USB_Host_SendControlRequest ( & CDCInterfaceInfo - > State . LineEncoding ) ;
}
uint8_t CDC_Host_SendControlLineStateChange ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo )
{
USB_ControlRequest = ( USB_Request_Header_t )
{
. bmRequestType = ( REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE ) ,
. bRequest = REQ_SetControlLineState ,
. wValue = CDCInterfaceInfo - > State . ControlLineStates . HostToDevice ,
. wIndex = CDCInterfaceInfo - > State . ControlInterfaceNumber ,
. wLength = 0 ,
} ;
Pipe_SelectPipe ( PIPE_CONTROLPIPE ) ;
return USB_Host_SendControlRequest ( NULL ) ;
}
void CDC_Host_SendString ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo , char * Data , uint16_t Length )
{
if ( ( USB_HostState ! = HOST_STATE_Configured ) | | ! ( CDCInterfaceInfo - > State . Active ) )
return ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . DataOUTPipeNumber ) ;
Pipe_Unfreeze ( ) ;
Pipe_Write_Stream_LE ( Data , Length , NO_STREAM_CALLBACK ) ;
Pipe_Freeze ( ) ;
}
void CDC_Host_SendByte ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo , uint8_t Data )
{
if ( ( USB_HostState ! = HOST_STATE_Configured ) | | ! ( CDCInterfaceInfo - > State . Active ) )
return ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . DataOUTPipeNumber ) ;
Pipe_Unfreeze ( ) ;
if ( ! ( Pipe_IsReadWriteAllowed ( ) ) )
{
Pipe_ClearOUT ( ) ;
Pipe_WaitUntilReady ( ) ;
}
Pipe_Write_Byte ( Data ) ;
Pipe_Freeze ( ) ;
}
uint16_t CDC_Host_BytesReceived ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo )
{
uint16_t BytesInPipe = 0 ;
if ( ( USB_HostState ! = HOST_STATE_Configured ) | | ! ( CDCInterfaceInfo - > State . Active ) )
return BytesInPipe ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . DataINPipeNumber ) ;
Pipe_Unfreeze ( ) ;
if ( Pipe_IsINReceived ( ) & & ! ( Pipe_BytesInPipe ( ) ) )
Pipe_ClearIN ( ) ;
BytesInPipe = Pipe_BytesInPipe ( ) ;
Pipe_Freeze ( ) ;
return BytesInPipe ;
}
uint8_t CDC_Host_ReceiveByte ( USB_ClassInfo_CDC_Host_t * CDCInterfaceInfo )
{
uint8_t ReceivedByte = 0 ;
if ( ( USB_HostState ! = HOST_STATE_Configured ) | | ! ( CDCInterfaceInfo - > State . Active ) )
return ReceivedByte ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . DataINPipeNumber ) ;
Pipe_Unfreeze ( ) ;
ReceivedByte = Pipe_Read_Byte ( ) ;
if ( ! ( Pipe_BytesInPipe ( ) ) )
Pipe_ClearIN ( ) ;
Pipe_Freeze ( ) ;
return ReceivedByte ;
}
void CDC_Host_Event_Stub ( void )
{
}