USB_COMMON_DESCRIPTOR *
USBH_X_GetNextDescriptor(
USB_COMMON_DESCRIPTOR *
pbCommDescriptor,
U32 *
wNextDescriptorOffset )
{
USB_COMMON_DESCRIPTOR *
pNextCommDescriptor;
U8 bLength = pbCommDescriptor->
bLength;
*wNextDescriptorOffset +=
bLength;
pNextCommDescriptor = (USB_COMMON_DESCRIPTOR *) ( ( (U8 *
) pbCommDescriptor ) +
bLength );
return pNextCommDescriptor;
}
void USBH_X_SetEpDescriptor(
TUSBH_X_DEVICE *
pDevice,
U8 bIfNumber,
U8 bEpNumber,
USB_ENDPOINT_DESCRIPTOR *
pEpDescriptor )
{
pDevice->pEndpointDescriptorArray[ bIfNumber ][ bEpNumber ] =
pEpDescriptor;
}
void USBH_X_SetIfDescriptor(
TUSBH_X_DEVICE *
pDevice,
U8 bIfNumber,
USB_INTERFACE_DESCRIPTOR *
pIfDescriptor )
{
pDevice->pInterfaceDescriptorArray[ bIfNumber ] =
pIfDescriptor;
}
void USBH_X_SetCfgDescriptor(
TUSBH_X_DEVICE *
pDevice )
{
U32 interfaceIndex =
0;
U32 endpointIndex =
0;
// Points to the current configuration descriptor
USB_COMMON_DESCRIPTOR *
pNextDescriptor;
USB_CONFIGURATION_DESCRIPTOR *
pCfgDescriptor;
USB_INTERFACE_DESCRIPTOR *
pIfDescriptor;
USB_ENDPOINT_DESCRIPTOR *
pEpDescriptor;
pCfgDescriptor = (USB_CONFIGURATION_DESCRIPTOR*) ( ( pDevice->
pUsbDevice->
pConfigDescriptor ) );
pNextDescriptor = (USB_COMMON_DESCRIPTOR*
) ( pCfgDescriptor );
U32 wTotalLength = pCfgDescriptor->
wTotalLength;
U32 wNextDescriptorOffset =
USB_CONFIGURATION_DESCRIPTOR_LENGTH;
pDevice->pCurrentConfigurationDescriptor =
pCfgDescriptor;
interfaceIndex =
0;
while ( wNextDescriptorOffset <
wTotalLength )
{
pNextDescriptor =
USBH_X_GetNextDescriptor( pNextDescriptor, &
wNextDescriptorOffset );
if ( pNextDescriptor->bDescriptorType ==
USB_DESC_TYPE_INTERFACE )
{
pIfDescriptor = (USB_INTERFACE_DESCRIPTOR*
) pNextDescriptor;
if ( pIfDescriptor->bAlternateSetting ==
0 )
{
USBH_X_SetIfDescriptor( pDevice, interfaceIndex, pIfDescriptor );
// Parse Ep descriptors relative to the current interface
endpointIndex =
0;
while ( endpointIndex < pIfDescriptor->
bNumEndpoints )
{
pNextDescriptor =
USBH_X_GetNextDescriptor( pNextDescriptor, &
wNextDescriptorOffset );
if ( pNextDescriptor->bDescriptorType ==
USB_DESC_TYPE_ENDPOINT )
{
pEpDescriptor = (USB_ENDPOINT_DESCRIPTOR *
) pNextDescriptor;
USBH_X_SetEpDescriptor( pDevice, interfaceIndex, endpointIndex, pEpDescriptor );
endpointIndex++
;
if ( ( endpointIndex == USBH_X_DEV_MAX_ENDPOINT )||
( endpointIndex == pIfDescriptor->bNumEndpoints) )
break;
}
}
interfaceIndex++
;
if ( ( interfaceIndex == USBH_X_DEV_MAX_IF )||
( interfaceIndex == pDevice->pUsbDevice->InterfaceCount) )
return;
}
}
}
}
void USBH_X_SetDevDescriptor(
TUSBH_X_DEVICE *
pDevice )
{
pDevice->pDeviceDescriptor = (USBH_DEVICE_DESCRIPTOR*) ( &
( pDevice->pUsbDevice->
DeviceDescriptor ) );
}
转载于:https://www.cnblogs.com/shangdawei/archive/2012/09/27/2705019.html