关于USB HID的一些粗浅见解和备忘

近期因为在尝试用STM32的USB功能,实现一个手柄。初步了解了一些USB HID协议的内容,发现其主要内涵在于设备的报告描述符,对于标签网上盛传的一个表格如下

主标签项目全域标签项目区域标签项目
标签代码标签代码标签代码
Input(向主机输入)0x8?Usage Page(用例页定义)Usage(用例定义)0x0?
Output(从主机输出)0x9?Logical Minimum(逻辑最小)Usage Minimum(用例下限)0x1?
Logical Maxium(逻辑最大)Usage Maximum(用例上限)0x2?
Feature(功能信息)0x0b?Physical Minimum(物理最小)Designator Index(指示器索引)0x3?
Physical Maximum(物理最大) Designator Minimum(指示器下限)0x4?
Unit Exponent()Designator Maximum(指示器上限)0x5?
Unit() String()0x7?
Report Size()Sreing Minimum()0x8?
Report ID()String Maximum()0x9?
Report Coumt()Delimiter()0xa?
Collection(集合开始)0xa1Push()
EndCollection(集合结束)0xc0Pop()
这些定义要怎么使用呢?这里介绍个工具HID Descriptor Tool 可以快速生成一个描述文档(自行百度搜索 ) 在我的应用里,计划实现的是三个矢量轴,和10个按钮

首先定义一个用例页:USAGE_PAGE:generic Desktop 表明设备是通用型设备
然后将用途选择为GamePad(另一个选择为JoyStick,实现起来貌似也没有什么问题)
接着创建一个集合,类型定义为Application表明这是一系列子集合构成的控制集合,
注意:集合是一个有头有尾类似括号的东西,结尾可能会忘记的话,就现在把End Collection准备出来

#目前的伪代码:
USAGE_PAGE(Generic Desktop)
USAGE(Game Pad)
Collection(Application)
...
End Collection

现在我们由易到难,由于摇杆部分是一个控制量输出的设备,感官上配置起来会比较复杂一些,因此先从按钮开始
首先是一个Usage,Application下可以使用的混合型用例比较多,按钮的话,我这里选择用BUTTON类来实现,由于我准备定义10个按钮,因此定义的内容

USAGE_PAGE(Button)
USAGE_MINIMUM(1)
USAGE_MAXIUM(10)

如此一来应该就正常了。由于后续开发较多,这个帖子就暂时写到这里。其实总结起来的话,找一份前辈的描述符数组自己稍加分析就可以理解了。

STM32F103C8 Serial(UART) to USB HID Keyboard Mouse Joystick 串口 转 USB键盘;鼠标;手柄 (1) 使用Composite Device 组合(复合)设备 (1.1) 1个Device -> 1个 Configuation -> 3个Interfance (Keyboard & Mouse & Joystick) (1.2) 支持BIOS模式中的操作(使用HID boot模式) 以便兼容在计算器中设定BIOS : (1.2.1) Keyboard Interfance -> HID (boot mode) -> 2个Endpoint(IN_0x81 & OUT_0x01) -> KeyboardReportDescriptor(不使用Report ID) (1.2.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x82) -> MouseReportDescriptor(不使用Report ID) (1.3) 支持Windows模式中的操作(使用Report ID) : (1.3.1) Multimedia Keyboard Interfance -> HID -> 1个Endpoint(IN_0x85) -> KeyboardReportDescriptor(使用Report ID) (1.3.1.1) Report ID (1) : HID Usage Page 0x0C, MediaKey (1.3.1.2) Report ID (2) : HID Usage Page 0x01, PowerControl (1.3.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x84) -> MouseReportDescriptor(使用Report ID) (1.3.2.1) Report ID (1) : 相对坐标 (-32768 ~ 32767) (1.3.2.2) Report ID (2) : 绝对坐标 (0 ~ 2048) (1.4) 支持反馈Keyboard_LED灯号: All Off; Num Lock; Caps Lock; Scroll Lock; Compose; Kana (1.5) Joystick Interfance -> HID -> 1个Endpoint(IN_0x83) -> JoyStickReportDescriptor (1.7) 支持GPIO命令, 可控制 12个GPIO 0/1 (hi/low)输出 (1.8) 支持Hardware或Software 插拔(Connect/Disconnect)命令 (1.9) 支持Software Reset命令 (2) 串口接收 命令 (2.1) UART协议: 115200, n, 8, 1 (2.2) 1帧发送字符串格式, 以 '{'开始, '}'结束 ','分隔 共10个10进制数字 例如: {1,2,3,4,5,6,7,8,9,10} (2.3) 第1位 区分 Keyboard(128) 或是 Mouse(64) 或是 Joystick(32) 或是 Control(32) 命令 Control_cmd = 0x10, Joystick_cmd = 0x20, Mouse_cmd = 0x40, MouseHold_cmd = 0x41, AbsMouse_cmd = 0x42, AbsMouseHold_cmd= 0x43, Keyboard_cmd = 0x80, KeyboardHold_cmd= 0x81, MediaKey_cmd = 0x82, MediaKeyHold_cmd= 0x83, Switch_cmd = 0xC0, SwitchHold_cmd = 0xC1 例如: {16, 0,0,0,0,0,0,0,0} --- 发送Control命令 {32, 0,0,0,0,0,0,0,0} --- 发送Joystick命令 {64, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标) {65, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标)(按住不放) {66, 0,0,0,0,0,0,0,0} --- 发送WinMouse命令(相对坐标/绝对坐标) {67, 0,0,0,0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值