You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

evdev中MSC_SCAN的value来源、编码逻辑及Unicode页面识别问题

问题解析:evdev扫描码编码逻辑与Unicode HID页面识别问题

一、背景信息

执行以下命令测试键盘输入事件:

sudo evtest /dev/input/event7

其中event7对应键盘设备,按下a键时的事件报告:

Event: time 1725511187.487035, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1725511187.487035, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1725511187.487035, -------------- SYN_REPORT ------------

释放a键时的事件报告:

Event: time 1725511187.543033, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1725511187.543033, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1725511187.543033, -------------- SYN_REPORT ------------

观察到MSC_SCAN对应的value值(evdev扫描码)遵循以下编码规律:

  • 键盘/小键盘页面(USB HID Page 0x07)的键码x:0x70000 | x(比如a键USB HID码0x04,对应扫描码0x70004)
  • 系统控制页面(USB HID Page 0x01)的键码x:0x10000 | x
  • 消费者控制页面(USB HID Page 0x0c)的键码x:0xc0000 | x

另外,Ubuntu 20中KEY_A对应的十进制值30来自头文件/usr/include/linux/input-event-codes.h的#define KEY_A 30定义。


二、问题解答

1. MSC_SCAN扫描码的基值与编码逻辑来源

这些基值和编码规则是Linux内核evdev子系统定义的私有扫描码格式,核心目的是在单一数值中同时携带USB HID的页面(Usage Page)和用法(Usage)信息,避免不同页面的键码冲突。

具体逻辑可在Linux内核源码drivers/hid/hid-input.c中找到:

  • 通用规则是将HID Usage Page的高8位左移16位,与Usage值组合成32位扫描码:(usage_page << 16) | usage
  • 部分页面有特殊兼容处理:
    • 键盘页面(0x07):使用0x70000 | usage而非0x070000 | usage,是为了兼容早期PS/2扫描码格式
    • 系统控制页面(0x01):对应内核HID_UP_GENDESK页面的处理逻辑,使用0x10000 | usage
    • 消费者页面(0x0c):直接遵循通用规则,即0xc0000 | usage

这种编码是Linux内核对HID扫描码的标准化转换,确保不同类型HID输入设备的扫描码不重叠,同时保留原始HID页面和用法信息。

2. Unicode HID页面(0x10)无法被evdev识别的原因

evdev子系统原生不支持USB HID Unicode页面(0x10),核心原因:

  • Linux输入子系统围绕EV_KEY、EV_REL等硬件事件类型设计,Unicode页面属于字符级输入,不符合evdev的事件模型(evdev聚焦硬件按键扫描码,而非直接输出Unicode字符)
  • 内核HID驱动(hid-input.c)中没有针对Unicode页面的处理逻辑,不会将该页面的用法转换为evdev事件
  • 标准USB键盘通过键盘页面(0x07)传输扫描码,再由用户空间输入法/Xorg等组件转换为Unicode字符,而非直接在HID层面传输Unicode

可行解决方向

  • 模拟标准键盘+组合键:使用键盘页面(0x07)的按键配合Shift/Ctrl等修饰键,让系统识别为对应Unicode字符(适合常见字符场景)
  • Raw HID模式:设备以Raw HID模式工作,用户空间程序直接读取HID报告中的Unicode数据并自行处理
  • UInput模拟输入:通过固件模拟标准键盘事件,或通过USB串口发送字符,再由用户空间程序用uinput模块将字符注入输入子系统

内容的提问来源于stack exchange,提问作者étale-cohomology

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:51:08