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 ) ); }

  • 相关阅读:
    php 信号量
    .net 反射初体验
    IEnumerable,IQueryable之前世今生
    [SQL]511+512+534+550+569
    [SQL]183+184+185+196+197
    [SQL]3.26--175+176+177+178+180+181+182
    [剑指offer]10.斐波那契数列+青蛙跳台阶问题
    [剑指offer]14-1.剪绳子
    [剑指offer]62.圆圈中最后剩下的数字
    [剑指offer]52.两个链表的第一个公共节点
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2705019.html
Copyright © 2011-2022 走看看