目录
[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
验证测试的参考
- 烧录固件后,接入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
...
- 列出USB设备列表,查看USB键盘的USB设备信息是否存在。例如:
bash
# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 413c:2113(这里USB键盘的VID是413c,PID是2113。)
- 查看内核中已经注册的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
...
- 查看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(同步类)事件)
...
- 拔掉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
...
- 列出USB设备列表,查看USB鼠标的USB设备信息是否存在。例如:
bash
# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 046d:c077(这里USB鼠标的VID是046d,PID是c077。)
- 查看内核中已经注册的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
...
- 查看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类规范,能够即插即用,一般无需额外的驱动即可与主机通信。