USB Config Descriptor > Interface/Endpoint Descriptor

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/p/2705019.html