键值从键盘到Linux内核传输过程分析
这是一个以前没有了解过的一个盲区。
源于在制作一个带有特殊键的键盘,键盘厂商让挑选择殊键的实现方法。并举例说明了普通按键z在他们的MCU中其实是00 00 1d 00 00 00 00 00(以下简称:MCU键值)即0x1d十进制29,我立即通过hexdump /dev/input/eventX方法查看键盘上z键的在Linux内核上传过来的值(以下简称:Linux键值),一看是0x2c(十进制:44)。那么这两个值是什么关系呢?
于是乎我赶紧Google一番,更离奇的是Windows系统中将z键定义为90(以下简称:Windows键值)。这下出现了三套键值,事情变得复杂又觉得有些清晰了。
既然同一个键盘可以在Linux和Windows下正常使用,那么他们之间必须有一个共用的标准。先抛开Windows不说,看看在Linux内核中是如何将29转换为44的。
定位到Linux内核中usb键盘的驱动程序是drivers/hid/usbhid/usbkbd.c,然后上来就搜索[44],结果真就出来了一张"表",且经过分析后29恰恰是44所在位置的坐标。
Google搜索《 USB HID to PS/2 Scan Code Translation Ta