如果你运行类似的东西
sudo evtest /dev/input/event7
其中
event7
对应于(比如说)键盘,并且您按下一个键,您会得到如下报告:
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 ------------
用于
a
按键释放。
我对
value
的 MSC_SCAN
感兴趣(大概是 evdev 扫描码),其中这些(十六进制)值类似于 70004
、70005
、70006
、10086
、 c0224
,等等
这些值似乎与 USB HID 键码直接相关,其中:
x
中的值
Keyboard/Keypad Page (0x07)
为0x70000 | x
(例如,a
的USB HID键码为0x04
,0x70000 | 0x04
为0x70004
)x
为 0x10000 | x
x
中的值
Consumer Page (0x0c)
为 0xc0000 | x
所以我的问题是:“基值”
0x70000
、0x10000
和0xc0000
从哪里来,0x70000 | x
逻辑从哪里来?
例如。 (在 Ubuntu 20 上)
value
的 KEY_A
是 30
(十进制),30
来自 /usr/include/linux/input-event-codes.h
,其中有一个 #define KEY_A 30
。
(我正在为 USB HID 设备编写固件,并且正在编写 USB HID 报告描述符,到目前为止,我可以添加键盘/小键盘键(USB HID 页 0x07)、系统控制键(USB HID 页 0x01),消费者控制键(USB HID 页面 0x0c)和鼠标,我也尝试添加 Unicode 页面(USB HID 页面 0x10),但由于某种原因
evdev
无法识别它。)
我认为它们正是 HID 使用页面,其中 4 个最不重要的半字节是 HID 键码,之后是 HID 使用页面(因此,像往常一样,您可以从右读取数字-左)。
例如:
0x70000
来自使用页面0x7
:键盘/小键盘页面0x10000
来自使用页面0x1
:通用桌面页面,特别是系统控制)0xc0000
来自使用页面0xc
:消费者页面因此,Linux 基本上是将整个 HID 信息或运算为单个键码,并将其称为扫描码。