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类规范,能够即插即用,一般无需额外的驱动即可与主机通信。‌


相关推荐
小白同学_C1 小时前
Lab1-Xv6 and Unix utilities 配置环境的搭建以及前言 && MIT6.1810操作系统工程【持续更新】
linux·c/c++·操作系统os
haluhalu.1 小时前
深入理解Linux线程机制:线程概念,内存管理
java·linux·运维
乙酸氧铍1 小时前
【imx6ul 学习笔记】Docker 运行百问网 imx6ul_qemu
linux·docker·arm·qemu·imx6ul
不会C++的雾1 小时前
Linux操作系统(2)
linux·数据库·mysql
Code-world-12 小时前
NVIDIA Isaac Sim 安装教程
linux·人工智能·ubuntu·强化学习·isaac sim
cui__OaO2 小时前
Linux驱动--驱动编译
linux·运维·服务器
SunnyRivers2 小时前
深入理解Linux后台命令
linux·后台运行·重定向·nohub
刘叨叨趣味运维2 小时前
快速掌握Linux启动过程:像看接力赛一样简单
linux
Q16849645152 小时前
红帽Linux-进程、ssh、网络、软件包、文件系统
linux·运维·网络
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [drivers][base]cpu
linux·笔记·学习