@ -40,7 +40,9 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
uint16_t ConfigDescriptorSize ,
uint16_t ConfigDescriptorSize ,
void * ConfigDescriptorData )
void * ConfigDescriptorData )
{
{
uint8_t FoundEndpoints = 0 ;
USB_Descriptor_Endpoint_t * DataINEndpoint = NULL ;
USB_Descriptor_Endpoint_t * DataOUTEndpoint = NULL ;
USB_Descriptor_Endpoint_t * NotificationEndpoint = NULL ;
memset ( & CDCInterfaceInfo - > State , 0x00 , sizeof ( CDCInterfaceInfo - > State ) ) ;
memset ( & CDCInterfaceInfo - > State , 0x00 , sizeof ( CDCInterfaceInfo - > State ) ) ;
@ -50,93 +52,93 @@ uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
DCOMP_CDC_Host_NextCDCControlInterface ) ! = DESCRIPTOR_SEARCH_COMP_Found )
DCOMP_CDC_Host_NextCDCControlInterface ) ! = DESCRIPTOR_SEARCH_COMP_Found )
{
{
return CDC_ENUMERROR_NoC DC InterfaceFound;
return CDC_ENUMERROR_NoC ompatible InterfaceFound;
}
}
CDCInterfaceInfo - > State . ControlInterfaceNumber = DESCRIPTOR_CAST ( ConfigDescriptorData , USB_Descriptor_Interface_t ) . InterfaceNumber ;
CDCInterfaceInfo - > State . ControlInterfaceNumber = DESCRIPTOR_PCAST ( ConfigDescriptorData ,
USB_Descriptor_Interface_t ) - > InterfaceNumber ;
while ( FoundEndpoints ! = ( CDC_FOUND_NOTIFICATION_IN | CDC_FOUND_DATAPIPE_IN | CDC_FOUND_DATAPIPE_OUT ) )
while ( ! ( DataINEndpoint ) | | ! ( DataOUTEndpoint ) | | ! ( NotificationEndpoint ) )
{
{
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
DCOMP_CDC_Host_NextCDCInterfaceEndpoint ) ! = DESCRIPTOR_SEARCH_COMP_Found )
DCOMP_CDC_Host_NextCDCInterfaceEndpoint ) ! = DESCRIPTOR_SEARCH_COMP_Found )
{
{
if ( FoundEndpoints & CDC_FOUND_NOTIFICATION_IN )
if ( NotificationEndpoint )
{
{
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
DCOMP_CDC_Host_NextCDCDataInterface ) ! = DESCRIPTOR_SEARCH_COMP_Found )
DCOMP_CDC_Host_NextCDCDataInterface ) ! = DESCRIPTOR_SEARCH_COMP_Found )
{
{
return CDC_ENUMERROR_NoC DC InterfaceFound;
return CDC_ENUMERROR_NoC ompatible InterfaceFound;
}
}
DataINEndpoint = NULL ;
DataOUTEndpoint = NULL ;
}
}
else
else
{
{
FoundEndpoints = 0 ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . DataINPipeNumber ) ;
Pipe_DisablePipe ( ) ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . DataOUTPipeNumber ) ;
Pipe_DisablePipe ( ) ;
Pipe_SelectPipe ( CDCInterfaceInfo - > Config . NotificationPipeNumber ) ;
Pipe_DisablePipe ( ) ;
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
DCOMP_CDC_Host_NextCDCControlInterface ) ! = DESCRIPTOR_SEARCH_COMP_Found )
DCOMP_CDC_Host_NextCDCControlInterface ) ! = DESCRIPTOR_SEARCH_COMP_Found )
{
{
return CDC_ENUMERROR_NoC DC InterfaceFound;
return CDC_ENUMERROR_NoCompatibleInterfaceFound ;
}
}
}
if ( USB_GetNextDescriptorComp ( & ConfigDescriptorSize , & ConfigDescriptorData ,
CDCInterfaceInfo - > State . ControlInterfaceNumber = DESCRIPTOR_PCAST ( ConfigDescriptorData ,
DCOMP_CDC_Host_NextCDCInterfaceEndpoint ) ! = DESCRIPTOR_SEARCH_COMP_Found )
USB_Descriptor_Interface_t ) - > InterfaceNumber ;
{
return CDC_ENUMERROR_EndpointsNotFound ;
NotificationEndpoint = NULL ;
}
}
continue ;
}
}
USB_Descriptor_Endpoint_t * EndpointData = DESCRIPTOR_PCAST ( ConfigDescriptorData , USB_Descriptor_Endpoint_t ) ;
USB_Descriptor_Endpoint_t * EndpointData = DESCRIPTOR_PCAST ( ConfigDescriptorData , USB_Descriptor_Endpoint_t ) ;
if ( ( EndpointData - > Attributes & EP_TYPE_MASK ) = = EP_TYPE_INTERRUPT )
if ( EndpointData - > EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN )
{
{
if ( EndpointData - > EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN )
if ( ( EndpointData - > Attributes & EP_TYPE_MASK ) = = EP_TYPE_INTERRUPT )
{
NotificationEndpoint = EndpointData ;
Pipe_ConfigurePipe ( CDCInterfaceInfo - > Config . NotificationPipeNumber , EP_TYPE_INTERRUPT , PIPE_TOKEN_IN ,
else
EndpointData - > EndpointAddress , EndpointData - > EndpointSize ,
DataINEndpoint = EndpointData ;
CDCInterfaceInfo - > Config . NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE ) ;
CDCInterfaceInfo - > State . NotificationPipeSize = EndpointData - > EndpointSize ;
Pipe_SetInterruptPeriod ( EndpointData - > PollingIntervalMS ) ;
FoundEndpoints | = CDC_FOUND_NOTIFICATION_IN ;
}
}
}
else
else
{
{
if ( EndpointData - > EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN )
DataOUTEndpoint = EndpointData ;
{
}
Pipe_ConfigurePipe ( CDCInterfaceInfo - > Config . DataINPipeNumber , EP_TYPE_BULK , PIPE_TOKEN_IN ,
}
EndpointData - > EndpointAddress , EndpointData - > EndpointSize ,
CDCInterfaceInfo - > Config . DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE ) ;
CDCInterfaceInfo - > State . DataINPipeSize = EndpointData - > EndpointSize ;
for ( uint8_t PipeNum = 1 ; PipeNum < PIPE_TOTAL_PIPES ; PipeNum + + )
{
if ( PipeNum = = CDCInterfaceInfo - > Config . DataINPipeNumber )
{
Pipe_ConfigurePipe ( PipeNum , EP_TYPE_BULK , PIPE_TOKEN_IN ,
DataINEndpoint - > EndpointAddress , DataINEndpoint - > EndpointSize ,
CDCInterfaceInfo - > Config . DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE ) ;
FoundEndpoints | = CDC_FOUND_DATAPIPE_IN ;
CDCInterfaceInfo - > State . DataINPipeSize = DataINEndpoint - > EndpointSize ;
}
}
else
else if ( PipeNum = = CDCInterfaceInfo - > Config . DataOUTPipeNumber )
{
{
Pipe_ConfigurePipe ( CDCInterfaceInfo - > Config . DataOUTPipeNumber , EP_TYPE_BULK , PIPE_TOKEN_OUT ,
Pipe_ConfigurePipe ( PipeNum, EP_TYPE_BULK , PIPE_TOKEN_OUT ,
EndpointData - > EndpointAddress , EndpointData - > EndpointSize ,
DataOUTEndpoint - > EndpointAddress , DataOUT Endpoint- > EndpointSize ,
CDCInterfaceInfo - > Config . DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE ) ;
CDCInterfaceInfo - > Config . DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE ) ;
CDCInterfaceInfo - > State . DataOUTPipeSize = EndpointData - > EndpointSize ;
CDCInterfaceInfo - > State . DataOUTPipeSize = DataOUTEndpoint - > EndpointSize ;
}
else if ( PipeNum = = CDCInterfaceInfo - > Config . NotificationPipeNumber )
{
Pipe_ConfigurePipe ( PipeNum , EP_TYPE_INTERRUPT , PIPE_TOKEN_IN ,
NotificationEndpoint - > EndpointAddress , NotificationEndpoint - > EndpointSize ,
CDCInterfaceInfo - > Config . NotificationPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE ) ;
Pipe_SetInterruptPeriod ( NotificationEndpoint - > PollingIntervalMS ) ;
FoundEndpoints | = CDC_FOUND_DATAPIPE_OUT ;
CDCInterfaceInfo - > State . NotificationPipeSize = NotificationEndpoint - > EndpointSize ;
}
}
}
}
}
CDCInterfaceInfo - > State . ControlLineStates . HostToDevice = ( CDC_CONTROL_LINE_OUT_RTS | CDC_CONTROL_LINE_OUT_DTR ) ;
CDCInterfaceInfo - > State . ControlLineStates . HostToDevice = ( CDC_CONTROL_LINE_OUT_RTS | CDC_CONTROL_LINE_OUT_DTR ) ;
CDCInterfaceInfo - > State . ControlLineStates . DeviceToHost = ( CDC_CONTROL_LINE_IN_DCD | CDC_CONTROL_LINE_IN_DSR ) ;
CDCInterfaceInfo - > State . ControlLineStates . DeviceToHost = ( CDC_CONTROL_LINE_IN_DCD | CDC_CONTROL_LINE_IN_DSR ) ;
CDCInterfaceInfo - > State . IsActive = true ;
CDCInterfaceInfo - > State . IsActive = true ;
return CDC_ENUMERROR_NoError ;
return CDC_ENUMERROR_NoError ;
}
}