This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Tivaware 2.1.4.178 USBLIB 描述符问题

Guru**** 2484615 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/731006/tivaware-2-1-4-178-usblib-descriptor-problem

我花了大约一周时间尝试在 TM4C129X 开发板上注册和正确枚举 USB HID 器件、但需要使用各种测试工具

在 Windows 主机上、只需扼流圈并报告无效的描述符。 如果有人仔细查看我的描述、看看他们是否注意到任何内容、我会非常感激。

我已经尝试过许多 ReportDescriptor 变体、并配置了我的头部旋转。

我使用的是 TivaWare C 2.1.4.178版本

谢谢。


/* USB 语言描述符*/
静态常量 uint8_t mLangDescriptor[]=

   4、
   USB_DTYPE_string、
   USBShort (USB_LANG_EN_UK)
};

/* USB 制造商字符串*/
静态 const uint8_t mManufacturerString[]=

   (27 + 1)* 2、
   USB_DTYPE_string、
   'm'、0、'a'、0、'n'、 0、'u'、0、'f'、0、 'a'、0、'c'、0、't'、 0、'u'、0、
   'R'、0、'e'、0、'r'、 0、'、0、'P'、0、 'l'、0、'a'、0、'c'、 0、'e'、0、
   'h'、0、'o'、0、'l'、 0、'd'、0、'e'、0、 'R'、0、'、0、'X'、 0、'.'、0
};

//设备产品字符串
静态常量 uint8_t mProductString[]=

   (16 + 1)* 2、
   USB_DTYPE_string、
   'p'、0、'r'、0、'o'、 0、'd'、0、'u'、0、 'c'、0、't'、0、'、 0、
   'g'、0、'o'、0、'e'、 0、"S"、0、"h"、0、 'e'、0、'r'、0、'e'、 0
};

//器件序列号。
静态 uint8_t mSerialNumberString[]=

   (8 + 1)* 2、
   USB_DTYPE_string、
   "1"、0、"2"、0、"3"、 0、"4"、0、"5"、0、 '6'、0、'7'、0、'8'、 0
};

/*设备接口名称。 这将接口类指定为 HID
*
静态常量 uint8_t mHIDInterfaceString[]=

   (7 + 1)* 2、
   USB_DTYPE_string、
   'U'、0、'S'、0、'B'、 0、'、0、'H'、0、 'I'、0、'D'、0
};

//设备配置字符串。 这只是配置描述符的名称
静态常量 uint8_t mConfigString[]=

   (20 + 1)* 2、
   USB_DTYPE_string、
   "T"、0、"e"、0、"S"、 0、"t"、0、"e"、0、 'R'、0、'、0、'C'、 0、'o'、0、'n'、0、
   'F'、0、'I'、0、'g'、 0、'u'、0、'r'、0、 'a'、0、't'、0、'i'、 0、'o'、0、'n'、0
};

/* USB 描述符字符串表*/
静态常量 uint8_t *常量 mStringDescriptors []=

   mLangDescriptor、           //语言描述符、
   mManufacturerString、       //制造商名称字符串(语言1)、
   mProductString、            //产品名称字符串(语言1)、
   mSerialNumberString、       //序列号字符串(语言1)、
   mHIDInterfaceString、       // HID 接口描述字符串(语言1)、
   mConfigString              //配置说明字符串(语言1),
};

#define NUM_STRING_descriptors (sizeof (mStringDescriptors)/ sizeof (uint8_t *))





/*
 *这说明了提供的器件输入、输出和功能报告
 *每种类型的使用信息以及数据本身的大小
 *

静态常量 uint8_t mReportDescriptor[]=

   UsagePage( USB_HID_general_Desktop ),
   usage( USB_HID_USAGE_SYSTEM_CONTROL ),
   集合(USB_HID_application)、
       UsagePage( USB_HID_general_Desktop ),
       usage( USB_HID_USAGE_SYSTEM_CONTROL ),
       逻辑最小值(0)、
       逻辑最大值(255)、
       UsageMinimum (0)、
       UsageMaximum( packet_size ),

   //输入报告-用于将消息从设备发送到主机
       ReportID(1)、
       ReportSize (8)、
       ReportCount (PAYLOAD_Bytes)、
       INPUT (USB_HID_INPUT_DATA | USB_HID_INPUT_variable | USB_HID_INPUT_ABS)、

   //输出报告-用于将消息从主机接收到设备
       ReportID(2)、
       ReportSize (8)、
       ReportCount (PAYLOAD_Bytes)、
       Output (USB_HID_OUTPUT_DATA | USB_HID_INPUT 变量| USB_HID_INPUT_ABS),

   EndCollection、
};












/* USB 输入报告轮询率,每个输入报告一个条目。 通常、对于 MPS9001、我们根本不希望进行轮询
 *因此、时间设置为0。
 *
静态 tHIDReportIdle mReportIdle[1]=

   {0、1、0、0}    //报告1未轮询(0mS 超时)
};


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





//配置描述符
静态常量 uint8_t mConfigDescriptor[]=

   9、                             /*配置描述符的大小。       *
   USB_DTYPE_CONFIGURATION、       /*此描述符的类型。                    *
   USBShort (9)、                   /*此完整结构的总大小(通过库修补) */
   1、                             /*此配置中的接口数 */
   1、                             /*此配置的唯一值/ID。    *
   5、                             /*描述此配置的字符串标识符。    *
   USB_CONF_ATTR_SELF、        /*总线供电、自供电、远程唤醒。  *
   power_consumpte_ma  //以2mA 为增量的最大功率。        *
};


//接口描述符
静态常量 uint8_t mInterfaceDescriptor[]=

   9、                         /*接口描述符的大小。           *
   USB_DTYPE_interface、       /*此描述符的类型。                    *
   0、                         /*此接口的索引。               *
   0、                         /*此接口的备用设置。   *
   1、                         /*端点数量                    */
   USB_class_HID、             /*接口类                        */
   USB_HID_SCLASS_NONE、       /*接口子类。                    *
   USB_HID_PROTOCOL_NONE、     //子类的接口协议   */
   4、                         /*此接口的字符串索引。       *
};


// HID 描述符本身
静态常量 tHIDDescriptor mHIDDescriptor[]=

   9、                                                 /* bLength                        */
   USB_HID_DTYPE_HID、                                 /* bDescriptionorType                *
   0x0111、                                            /* bcdHID (符合版本1.11)*/
   0、                                                 /* bCountryCode (未本地化)   */
   1、                                                 /*#需要遵循的 HID 类描述符                */
   {
        {
             USB_HID_DTYPE_REPORT、                    /*报告描述符              */
             sizeof (mReportDescriptor)              /*报告描述符的大小      */
        }
   }
};


//端点描述符中的中断
静态常量 uint8_t mInEndpointDescriptor[]=

   7、                                              /*端点描述符的大小。       *
   USB_DTYPE_EndPoint、                             /*描述符类型是一个端点。            *
   USB_EP_DESC_IN | USBEPToIndex (USB_EP_1)、        /*                                           *
   USB_EP_ATTR_INT、                                /*端点是中断端点。         *
   USBShort (USBFIFOSizeToBytes (USB_FIFO_SZ_64))、   /*最大数据包大小。                   *
   16、                                             /*此端点的轮询间隔。    *
};



静态常量 tConfigSection mHIDSection =

   sizeof( mHIDDescriptor ),
   (const uint8_t *)&mHIDDescriptor
};

静态常量 tConfigSection mInEndpointSection =

   sizeof( mInEndpointDescriptor ),
   mInEndpointDescriptor
};

静态常量 tConfigSection mConfigSection =

   sizeof( mConfigDescriptor ),
   mConfigDescriptor
};

静态常量 tConfigSection mInterfaceSection =

   sizeof( mInterfaceDescriptor ),
   m 接口描述符
};




静态常量 uint8_t *常量 mClassDescriptors []=

   mReportDescriptor
};



/*配置段的整理*/
静态常量 tConfigSection *mHIDSections[]=

   mConfigSection (&M)、
   &mInterfaceSection,
   mHIDSection (&M)、
   mInEndpointSection (&M)、
};

#define NUM_HID_SECTIONS (sizeof (mHIDSections)/sizeof (tConfigSection*))



//指向所有描述符段
静态常量 tConfigHeader mHIDConfigHeader =

   num_HID_SECTIONS、
   mHIDSections
};

//将数据结构根连接到我们的所有描述符
静态 tConfigHeader const * const mHIDConfigDescriptors []=

   mHIDConfigHeader (&M)
};








/* USB HID 类设备的完整规范
此变量定义将上述定义中的所有内容整理到中
一个单一结构、用于嵌入德州仪器
USB 库、用于将 USB 芯片配置为 HID 类器件模式。
*
静态 tUSBDHIDDevice mHIDDeviceSpecification =

   //! 此器件在器件描述符中显示的供应商 ID。
   //
   USB_VID_VENDOORY_ID、

   //! 此器件在器件描述符中显示的产品 ID。
   //
   USB_PID_PRODUCT_ID、

   //! 器件的最大功耗、以毫安为单位。
   //
   Power_Consumpte_MA、

   //! 指示器件是自供电还是总线供电、以及是否供电
   //! 它支持远程唤醒。  有效值为 USB_CONF_ATTR_SELF 或
   //! USB_CONF_ATTR_BUS_PWR、可选与 USB_CONF_ATTR_RWAKE 进行或操作。
   //
   USB_CONF_ATTR_SELF、

   //! 要发布到此 HID 设备的服务器的接口子类。
   //
   USB_HID_SCLASS_NONE、

   //! 要发布到此 HID 设备的服务器的接口协议。
   //
   USB_HID_PROTOCOL_NONE、

   //! 报告此设备支持的>input<数。  此字段
   //! 必须等于 HID 类描述符中发布的报告数
   //! 以及阵列中第一个条目的数量
   //! 下面的字段 pi16ReportIdle 指向元素。
   //
   1、

   //
   //! 指向用于跟踪的结构数组中第一个元素的指针
   //! 每个输入报告的空闲时间。  当调用 USBDHIDInit 时
   //! 每个阵列成员的 ui8Duration4mS 和 ui8ReportID 字段
   //! 应进行初始化、以指示每种模式的默认空闲超时
   //! 输入报告。  由于 HID 器件类、该阵列必须位于 RAM 中
   //! 驱动程序将根据主机的请求更新其中的值
   //! 并跟踪经过的时间。  数组中必须包含的元素数量
   //! 与上面的 ui8NumInputReports 字段中提供的号码匹配。
   //
   mReportIdle、

   //! 指向将被调用以通知的回调函数的指针
   //! 一般事件、与报告转移相关的事件的应用
   //! 端点0以及与输出和功能接收相关的事件
   //! 通过(可选)中断输出端点报告。
   //
   mUSBReceiveCallbackHandler、

   //! 客户端提供的指针、将作为第一个指针发送
   //! 调用接收通道回调的所有调用中的参数、
   //! pfnRxCallback。
   //
   0、

   //! 指向将被调用以通知的回调函数的指针
   //! 与传输输入报告相关的事件的应用
   //! 输入端点的中断。
   //
   mUSBTransmitCallbackHandler、

   //! 客户端提供的指针、将作为第一个指针发送
   //! 发送通道回调的所有调用中的参数、
   //! pfnTxCallback。
   //
   0、

   //! 如果设置为 true、则该字段指示器件应使用
   //! 用于接收主机报告的专用中断输出端点。  在中
   //! 在这种情况下、来自主机的报告通过传递给应用程序
   //! 使用 USB_EVENT_RX_Available 事件接收回调。  如果为 false、
   //! 来自主机的报告通过端点0接收并传递给
   //! 通过 USBD_HID_EVENT_REPORT_SENT 事件发送的应用。
   //
   错误、

   //! 器件要发布的 HID 描述符(遵循
   //! 标准接口描述符以及的端点描述符之前的描述符
   //! 接口)。
   //
   mHIDDescriptor、

   //! 器件提供的 HID 类描述符在中定义
   //! 字节指针数组、该字段指向该数组。  。
   //! 数组中元素的顺序和数量必须与关联的匹配
   //! 在 HID 描述符中提供的信息
   //! pi16HIDDescriptor。
   //
   mClassDescriptionors、

   //! 指向该器件的字符串描述符数组的指针。  该数组
   //! 必须按以下顺序包含以下字符串描述符指针:
   //! 语言描述符、制造商字符串、产品字符串、序列号
   //! 字符串、HID 接口说明字符串、配置字符串和
   //! (可选)第一个 HID 器件专用字符串。 然后(可选)
   //! 第二个 HID 器件专用字符串
   //!
   //! 如果支持多种语言、描述符块(除了
   //! 必须为中定义的每个语言重复字符串描述符0)
   //! 语言描述符。
   //!
   //! HID 器件专用字符串的数量取决于内容
   //! 报告描述符的描述符、因此、
   //! 应用程序控制。
   //
   MStringDescriptionors、

   //! ppStringDescriptors 中提供的描述符的数量
   //! 数组。  这必须为1 +((5 +(num HID 字符串))*(num 语言))。
   //
   num_string_descriptors、
   
   //! 此 HID 器件的配置描述符。
   //
   mHIDConfigDescriptors、
   
   //默认将私有/保留存储器初始化为零
   {0}
};


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Tony、

    让我们简单回顾一下、您是否能够让 TivaWare 示例正确枚举?

    如果是、您将从 TivaWare 示例中修改什么?

    您尝试设置哪种类型的 HID 设备?

    最后、您使用的是什么版本的 Windows?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Tony、

    仍在等待我以前的问题的反馈、以便我可以尝试帮助您解决此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉 Ralph。 上周我离开办公室了两天。

    我正在处理的项目环境似乎已配置 CCS 7.x、虽然也安装了 TivaWare 2.1.4.178、但 CCS 项目正在从 TivaWare 2.0.1.11577安装中挑选 driverlib 和 usblib。 因此、开发环境基本上是一个混乱的问题。 星期五和今天、我一直在清理所有内容并更新已安装的软件包。 希望我明天能提供更多信息。 如果您可以让此主题保持打开几天、以便我可以报告、我将不胜感激。

    此致、
    Tony。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Tony、

    当然、没问题!