0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HID协议是什么意思

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:韦东山老师驱动大 2023-07-17 17:41 次阅读

对于 USB 接口的 HID 设备,有一套协议。

1.1 描述符

HID 设备有如下描述符:

图片

  • HID
    设备的"设备描述符"并无实际意义,没有使用"设备描述符"来表示自己是 HID 设备。
  • HID
    设备只有一个配置,所以只有一个配置描述符
  • 接口描述符
    • bInterfaceClass
      为 3,表示它是 HID 设备
    • bInterfaceSubClass
      是 0 或 1,1 表示它支持"Boot Interface"(表示 PC 的 BIOS 能识别、使用它),0
      表示必须等操作系统启动后通过驱动程序来使用它。
    • bInterfaceProtocol:0-None,
      1-键盘, 2-鼠标
  • 端点描述符:HID
    设备有一个控制端点、一个中断端点

图片

对于鼠标,HOST 可以通过中断端点读到数据。

1.2 数据格式

1.2.1 键盘

通过中断传输可以读到键盘数据,它是 8 字节的数据,格式如下:

偏移大小描述
01字节"Modifier
keys status",就是ctrl、alt、shift等按键的状态
11字节保留
21字节第1个按键的键值
31字节第2个按键的键值
41字节第3个按键的键值
51字节第4个按键的键值
61字节第5个按键的键值
71字节第6个按键的键值

第 0 个字节中每一位都表示一个按键的状态,某位等于 1
时,表示对应的按键被按下,格式如下:

长度描述
01Left
Ctrl
11Left
Shift
21Left
Alt
31Left
GUI(Windows/Super key)
41Right
Ctrl
51Right
Shift
61Right
Alt
71Right
GUI(Windows/Super key)

读到的键盘数据里有 6 个按键值,每个按键值都是 8 位的数据。如果某个按键值不等于
0,就表示某个按键被按下了。按键值跟按键的对应关系,请看后面的《1.2.4 扫描码》。

示例:按键"A"、"B"、"C"、"X"的按键值分别是 4、5、6、0x1B。

按下了"A",USB 键盘上报的数据为:

00 00 04 00 00 00 00 00

松开"A",USB 键盘上报的数据为:

00 00 00 00 00 00 00 00

按下"A"、"B",USB 键盘上报的数据为:

00 00 04 05 00 00 00 00

保持"A"、"B"不松开,继续按下"C",USB 键盘上报的数据为:

00 00 04 05 06 00 00 00

松开"A",但是保持"B"、"C"不松开,USB 键盘上报的数据为:

00 00 05 06 00 00 00 00

USB
键盘上报的数据里,哪个按键先被按下,就先记录它的按键值。在上面的例子里,"A"松开后只有"B"、"C"这两个按键,"B"、"C"的按键值挪到了前面。

按下"Left shift"、并且按下"X",USB 键盘上报的数据为:

02 00 1B 00 00 00 00 00

USB
键盘只能上报 6 个按键值,如果有超过 6 个按键被按下,那么它将上报"phantom condition"(6 个按键值都是
1),但是"Modifier keys status"还是有效的。比如"Right Shift"被按下,另外超过 6 个的按键也被按下时,USB
键盘上报的数据为:

20 00 01 01 01 01 01 01

1.2.2 LED

我们还可控制键盘的 LED,需要发出一个控制传输请求:SetReport ,使用这个请求发送一个字节的数据。

这个字节的数据格式如下,某位为 1 时,会点亮相应的 LED:

长度描述
01Num
Lock
11Caps
Lock
21Scroll
Lock
31Compose
41Kana
51保留,写为0

发出的 SetReport,是一个控制传输的"setup packet",格式如下:

图片

以 libusb 的函数描述它的参数,如下:

int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle,
 uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,
 unsigned char *data, uint16_t wLength, unsigned int timeout);

/* 示例代码 */
unsigned char data = (1< < 1); /* 点亮Caps Lock */
uint16_t wValue = (0x02< < 8)|0; // 0x02: 发给设备, 0: report ID
uint16_t wIndex = 0; // 一般是0, the interface number of the USB keyboard
libusb_control_transfer(dev_handle, 0x21, 0x09, wValue, wIndex, &data, 1, timeout);

1.2.3

鼠标

通过中断传输可以读到鼠标数据,它是
8 字节的数据,格式如下:

偏移大小描述
01字节
11字节按键状态
22字节X
位移
42字节Y
位移
61字节或2字节滚轮

按键状态里,每一位对应鼠标的一个按键,等
1 时表示对应按键被点击了,格式如下:

长度描述
01鼠标的左键
11鼠标的右键
21鼠标的中间键
35保留,设备自己定义bit3:
鼠标的侧边按键bit4:

X
位移、Y 位移都是 8 位的有符号数。对于 X 位移,负数表示鼠标向左移动,正数表示鼠标向右移动,移动的幅度就使用这个 8 位数据表示。对于 Y
位移,负数表示鼠标向上移动,正数表示鼠标向下移动,移动的幅度就使用这个 8 位数据表示。

1.2.4 扫描码

USB 规范里为每个按键定义了 16 位的按键值,注意:它是 16 位的,但是 USB 键盘只使用 8
位表示按键值。所以有些按键需要通过"Modifier keys status"来确定。比如"Left Ctrl"的按键值是 224,这无法通过 8
位数据来表示,在 USB 键盘上报的数据里,使用第 0 字节的 bit4 来表示。

图片

libusb
有同步接口和异步接口,异步接口可以同时支持多个鼠标使用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148495
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258173
  • HID
    HID
    +关注

    关注

    2

    文章

    123

    浏览量

    46289
收藏 人收藏

    评论

    相关推荐

    基于HID协议的USB人机交互设备的接口设计

      目前市场上USB设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机
    发表于 09-12 10:09 2390次阅读
    基于<b class='flag-5'>HID</b><b class='flag-5'>协议</b>的USB人机交互设备的接口设计

    请问检测模拟量后如何用HID协议传给上位机?

    检测模拟量后如何用HID协议传给上位机?
    发表于 03-26 06:54

    STM32F107移植了USB-HID实现键盘功能,BIOS下不识别怎么解决?

    STM32F107移植了官方的USB-HID协议,实现键盘功能,BIOS下不识别,有什么可以解决的办法吗?
    发表于 04-15 07:14

    基于 I2C 的人机接口设备 (HID) 协议键盘实现,适用于 Windows 8

    `描述该参考设计是经过验证的键盘扫描仪或控制器。这个 128 键位扫描器件专门针对操作系统为 Windows 8 的终端设备。该器件完全符合 Microsoft 规定的 HID Over I2C
    发表于 04-15 10:43

    想做CC2640控制蓝牙外设,求资源

    打算用CC2640做一个 主HID 来控制蓝牙外设,同时也要做为从HID与手机连接。想咨询一下CC2640的资源,如Flash够不够用啊?听说HID协议栈不小的,有七八十K。另外,C
    发表于 03-25 14:26

    采用HID协议实现工控自定义键盘接口设计

    USB连接、断开操作)、u***_istr.c(直接处理USB中断)、u***_prop.c(用于上层协议处理,比如HID协议,大容量存储设备协议)、u***_desc.c(具体设备的
    发表于 06-20 05:00

    是否可以在用户PC应用程序中使用PIKIT 3作为SPI主端口或UART?

    PICkit串行分析器,但我想实现后者的一些功能。也许有一些关于PICkit 3 HID协议的信息?我可以自己编写电脑应用程序。
    发表于 10-15 15:57

    请问单片机只有串口怎么才能使用HID协议

    单片机只有串口,希望使用HID协议使用鼠标做到绝对坐标定位.求详细一点的解答~~感激不尽啊
    发表于 03-13 09:00

    基于润和Neptune开发板的键盘蓝牙模块DIY指南资料

    项目简介这个项目适合:有线u***键盘升级蓝牙键盘,改造后键盘有线/蓝牙模式只能二选一。支持BLE 4.2协议,可向下兼容旧BLE版本,如: BLE 4.0。支持HID协议(Human Interface Device),理论上
    发表于 04-30 17:02

    怎么改多媒体键盘的键值和按键排布顺序?

    \EVT\EXAM\BLE\HID_Keyboard\Project怎么改多媒体键盘的键值和按键排布顺序有没有什么软件可以生成HID的描述符抠蓝牙HID协议真的是很费劲
    发表于 09-05 07:57

    新唐的BSP包是用来干什么用的?

    新唐的BSP包是用来干什么用的?小白一个。。。毕设要做NANO120的HID协议
    发表于 08-25 07:02

    Universal Serial Bus (USB)HID

    Universal Serial Bus (USB)HID协议手册 THIS SPECIFICATION IS PROVIDED
    发表于 03-12 09:27 154次下载

    USB HID协议学习入门

    USB HID 类是比较大的一个类,HID 类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB 鼠标,USB 键盘,USB 游戏操纵杆,USB 触摸板,USB 轨迹球、电话拨号设备、VCR 遥
    发表于 11-15 14:39 313次下载

    基于HID协议的工控自定义键盘接口设计

    发表于 08-24 18:36 15次下载

    基于 I2C 的人机接口设备 (HID协议键盘实现

    发表于 09-22 19:30 37次下载