Linux USB HOST HID

目录

目录

前言

DTS配置的参考

内核配置的参考

USB相关内核配置

[USB Subsystem内核配置](#USB Subsystem内核配置)

[USB Phy内核配置](#USB Phy内核配置)

[USB Host Core驱动内核配置](#USB Host Core驱动内核配置)

[USB EHCI驱动内核配置](#USB EHCI驱动内核配置)

[芯片平台USB Host Controller驱动内核配置](#芯片平台USB Host Controller驱动内核配置)

[USB HID驱动内核配置](#USB HID驱动内核配置)

验证测试的参考

总结


前言

USB接口的键盘和鼠标属于 USB HID(Human Interface Device 的缩写),它是常见的人机交互设备。在Linux内核中,USB接口的键盘和鼠标通常由HID协议处理,内核自带驱动程序负责设备识别和事件传递。‌

  • 设备识别与驱动匹配

USB键盘和鼠标作为HID类设备,内核通过USB子系统匹配驱动。驱动使用结构定义设备匹配规则,例如类值0x03(HID类)、子类0x01(启动设备)和协议值0x01(键盘)或0x02(鼠标),当设备插入时,内核根据这些值绑定到usbhid驱动。‌‌

  • 输入事件处理流程

设备接入后,内核通过input子系统统一管理输入事件。以鼠标为例,驱动分配URB(USB Request Block)并设置中断端点管道接收数据,数据解析后通过input_report_key和input_report_rel等函数上报按键或移动事件到input core,最终传递给事件处理层(如evdev),用户空间程序可通过读取/dev/input/eventX访问数据。‌‌

  • 驱动开发关键点

自定义驱动需实现usb_driver结构体的USB driver probe function和USB driver disconnect function函数,初始化USB传输资源(如缓冲区和URB)并注册input device,例如鼠标驱动需设置支持BTN_LEFT、BTN_RIGHT等事件并通过:usb_submit_urb提交URB开始数据传输,中断函数处理数据并重新提交URB。‌‌

  • 内核配置与模块管理

USB HID支持通常编译为模块(如usbhid.ko),可通过modprobe动态加载,设备信息可在/sys/class/input目录查看,调试时使用dmesg检查设备识别和驱动绑定日志。‌‌


DTS配置的参考

bash 复制代码
   /* usb20 host controller */
   usb_1: usb1@YYYYYYYY {
        compatible = "xxx,xxx-usb";
        reg = <0xYYYYYYYY 0xYYY>;
        interrupts = <GIC_SPI INT_USB20_HOST IRQ_TYPE_LEVEL_HIGH>;

        clocks = <&ahbX_gate 9>, <&ahbX_reset 9>;
        clock-names = "usb_gate", "usb_reset";

        xxx,usbphy = <&usbphy_1>;

        dr_mode = "host"; /* 配置成了USB host模式 */
   ...

内核配置的参考

USB Subsystem内核配置

bash 复制代码
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y

USB Phy内核配置

bash 复制代码
CONFIG_USB_PHY=y
CONFIG_USB_NX_PHY=y

USB Host Core驱动内核配置

bash 复制代码
CONFIG_USB_COMMON=y
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEFAULT_PERSIST=y

USB EHCI驱动内核配置

bash 复制代码
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_HCD_PLATFORM=y

芯片平台USB Host Controller驱动内核配置

bash 复制代码
CONFIG_USB_XXX=y
CONFIG_USB_XXX_HOST=y
CONFIG_USB_XXX_DEBUG=y

USB HID驱动内核配置

bash 复制代码
CONFIG_USB_HID=y

验证测试的参考

  1. 烧录固件后,接入USB有线或无线键盘,正常开机,命令行终端可以输入:dmesg | grep "usb",探测到该USB键盘的打印如下:
bash 复制代码
# dmesg | grep "usb"
   ...
   [0.443356] usb 1-1: new low-speed USB device number 2 using xxx_hdc
   [0.653942] usb 1-1: New USB device found, idVendor=413c, idProduct=2113, bcdDevice= 1.10
   [0.653951] usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
   [0.653956] usb 1-1: Product: Dell KB216 Wired Keyboard
   [0.834420] input: Dell KB216 Wired Keyboard as /devices/platform/xxxxxxxx.usb0/xxx_hdc.0/usb1/1-1/1-1:1.0/0003:413C:2113.0001/input/input2
   [0.903982] hid-generic 0003:413C:2113.0001: input: USB HID v1.11 Keyboard [Dell KB216 Wired Keyboard] on usb-xxx_hdc.0-1/input0
   [0.910253] input: Dell KB216 Wired Keyboard Consumer Control as /devices/platform/xxxxxxxx.usb0/xxx_hdc.0/usb1/1-1/1-1:1.1/0003:413C:2113.0002/input/input3
   [0.910421] input: Dell KB216 Wired Keyboard System Control as /devices/platform/xxxxxxxx.usb0/xxx_hdc.0/usb1/1-1/1-1:1.1/0003:413C:2113.0002/input/input4
   [0.910490] hid-generic 0003:413C:2113.0002: input: USB HID v1.11 Device [Dell KB216 Wired Keyboard] on usb-xxx_hdc.0-1/input1
   [0.910589] usbcore: registered new interface driver usbhid
   [0.910592] usbhid: USB HID core driver
   ...
  1. 列出USB设备列表,查看USB键盘的USB设备信息是否存在。例如:
bash 复制代码
# lsusb
   Bus 001 Device 001: ID 1d6b:0002
   Bus 001 Device 002: ID 413c:2113(这里USB键盘的VID是413c,PID是2113。)
  1. 查看内核中已经注册的INPUT设备。例如:
bash 复制代码
# cat /proc/bus/input/devices
   ...
   I: Bus=0003 Vendor=413c Product=2113 Version=0111
   N: Name="Dell KB216 Wired Keyboard"
   P: Phys=usb-xxx_hdc.0-1/input0
   S: Sysfs=/devices/platform/xxxxxxxx.usb0/xxx_hdc.0/usb1/1-1/1-1:1.0/0003:413C:2113.0001/input/input2
   U: Uniq=
   H: Handlers=leds event2
   B: PROP=0
   B: EV=120013
   B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
   B: MSC=10
   B: LED=1f
   ...
  1. 查看USB键盘的input设备节点的事件上报情况。例如:
bash 复制代码
# hexdump -x /dev/input/event2
   0000000    02fb    0000    3e75    000e    0004    0004    0052    0007 (其中第六列的0004表示EV_MSC(其它杂类)事件)
   0000010    02fb    0000    3e75    000e    0001    0067    0001    0000 (其中第六列的0001表示EV_KEY(按键类)事件,第七列的0067表示KEY_UP(键盘向上键)键值,第八列的0001表示按键按下)
   0000020    02fb    0000    3e75    000e    0000    0000    0000    0000 (其中第六列的0000表示EV_SYN(同步类)事件)
   0000030    02fc    0000    34b8    0000    0004    0004    0052    0007 (其中第六列的0004表示EV_MSC(其它杂类)事件)
   0000040    02fc    0000    34b8    0000    0001    0067    0000    0000 (其中第六列的0001表示EV_KEY(按键类)事件,第七列的0067表示KEY_UP(键盘向上键)键值,第八列的0000表示按键松开)
   0000050    02fc    0000    34b8    0000    0000    0000    0000    0000 (其中第六列的0000表示EV_SYN(同步类)事件)
   ...
  1. 拔掉USB键盘后,接入USB有线或无线鼠标,重新正常开机,命令行终端可以输入:dmesg | grep "usb",探测到该USB鼠标的打印如下:
bash 复制代码
# dmesg | grep "usb"
   ...
   [   31.563346] usb 1-1: new low-speed USB device number 2 using lb_hdc
   [   31.770370] usb 1-1: New USB device found, idVendor=046d, idProduct=c077, bcdDevice=72.00
   [   31.770379] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
   [   31.770385] usb 1-1: Product: USB Optical Mouse
   [   31.770390] usb 1-1: Manufacturer: Logitech
   [   31.775574] input: Logitech USB Optical Mouse as /devices/platform/xxxxxxxx.usb0/xxx_hdc.0/usb1/1-1/1-1:1.0/0003:046D:C077.0001/input/input4
   [   31.775670] hid-generic 0003:046D:C077.0001: input: USB HID v1.11 Mouse [Logitech USB Optical Mouse] on usb-lb_hdc.0-1/input0
   ...
  1. 列出USB设备列表,查看USB鼠标的USB设备信息是否存在。例如:
bash 复制代码
# lsusb
   Bus 001 Device 001: ID 1d6b:0002
   Bus 001 Device 002: ID 046d:c077(这里USB鼠标的VID是046d,PID是c077。)
  1. 查看内核中已经注册的INPUT设备。例如:
bash 复制代码
# cat /proc/bus/input/devices
   ...
   I: Bus=0003 Vendor=046d Product=c077 Version=0111
   N: Name="Logitech USB Optical Mouse"
   P: Phys=usb-lb_hdc.0-1/input0
   S: Sysfs=/devices/platform/xxxxxxxx.usb0/xxx_hdc.0/usb1/1-1/1-1:1.0/0003:046D:C077.0001/input/input2
   U: Uniq=
   H: Handlers=event2
   B: PROP=0
   B: EV=17
   B: KEY=70000 0 0 0 0 0 0 0 0
   B: REL=103
   B: MSC=10
   ...
  1. 查看USB鼠标的input设备节点的事件上报情况。例如:
bash 复制代码
# hexdump -d /dev/input/event2
   ...
   00035a0   00753   00000   65462   00013   00002   00001   65535   65535 (其中第六列的00002表示EV_REL(相对位移类)事件)
   00035b0   00753   00000   65462   00013   00000   00000   00000   00000 (其中第六列的00000表示EV_SYN(同步类)事件)
   ...
   00075c0   01216   00000   25479   00013   00004   00004   00001   00009 (其中第六列的00004表示EV_MSC(其它杂类)事件)
   00075d0   01216   00000   25479   00013   00001   00272   00001   00000 (其中第六列的00001表示EV_KEY(按键类)事件,第七列的00272表示BTN_LEFT(鼠标左键)键值)
   00075e0   01216   00000   25479   00013   00000   00000   00000   00000 (其中第六列的00000表示EV_SYN(同步类)事件)
   ...

总结

在Linux系统中,USB HID(Human Interface Device,人机接口设备)设备是指通过USB接口连接、用于人机交互的设备,如键盘、鼠标、游戏手柄等。这些设备遵循USB HID类规范,能够即插即用,一般无需额外的驱动即可与主机通信。‌


相关推荐
驱动开发0072 小时前
Windows_Hello_Configuration_Analysis Windows Hello 配置过程分析 setup包分析
windows·驱动开发·云计算·计算机外设·usb重定向
食咗未2 小时前
Linux USB HOST EXTERNAL STORAGE
linux·驱动开发
Xの哲學2 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
齐鲁大虾3 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
虾..4 小时前
Linux 简单日志程序
linux·运维·算法
huoxingwen5 小时前
Ubuntu 22.04 上 VMware Workstation 点击虚拟机窗口就消失的解决历程
linux·运维·ubuntu
姚青&5 小时前
Linux 常用命令之基本命令
linux·运维·服务器
一路往蓝-Anbo5 小时前
【第05期】数据的微观世界 (五) —— 浮点数 vs 定点数:MCU的数学课
linux·stm32·单片机·嵌入式硬件·物联网
G_H_S_3_5 小时前
【网络运维】企业级监控平台Zabbix:部署与实践指南
linux·运维·网络·zabbix