我花了大约一周时间尝试在 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}
};