zoukankan      html  css  js  c++  java
  • 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 ) ); }

  • 相关阅读:
    Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能
    linux irq 自动探测
    gpio子系统和pinctrl子系统(下)
    gpio子系统和pinctrl子系统(中)
    gpio子系统和pinctrl子系统(上)
    linux驱动基础系列--linux spi驱动框架分析
    linux驱动基础系列--linux rtc子系统
    linux驱动基础系列--Linux I2c驱动分析
    camera驱动框架分析(上)
    camera驱动框架分析(中)
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2705019.html
Copyright © 2011-2022 走看看