定位到Linux内核中usb键盘的驱动程序是drivers/hid/usbhid/usbkbd.c,然后上来就搜索[44],结果真就出来了一张"表",且经过分析后29恰恰是44所在位置的坐标。
问题进一步清晰了,那么接下来想要明白的是 29 在哪个表中,那个表应该也是一个标准的协议规范,代码中也没有关于这个的注释,我应该怎么办?在我准备给代码的作者发邮件时,键盘厂商发来了一个对这个问题的说明。并附上了一个《USB HID to PS/2 Scan Code Translation Table》的表,而29(0x1d)正是在上表中。了解过这个情况后,以后在定制键盘时,告知给键盘设计厂商的应该是HID原始键值码。
日期:20150402
第一行中的getevent是截取键盘输入的命令,该命令运行后先首先将所以的输入设备列出来,比如图上就有键鼠,物理按键,耳机hook,红外遥控按键等几种类型的输入设备,这里只讨论标准键盘输入。
列出输入设备以下的内容就是按键后截取的信息,它们分别是TYPE CODEVALUE,其中TYPE常见的类型有:更多解释见《Linux inputevent-codes》
* EV_SYN:
-Used as markers to separate events. Events may be separated in time or in
space, such as with the multitouch protocol.
* EV_KEY:
-Used to describe state changes of keyboards, buttons, or other key-like
Devices.
* EV_MSC:
-Used to describe miscellaneous input data that do not fit into other types.。
对于EV_SYN其中CODE是不同的键值。
图中是输入了一个Z键,一秒后抬起的总输出信息,它们的意思分别是:
TYPE |
CODE |
VALUE |
备注 |
EV_SYN |
SYN_REPORT |
0 |
上报 |
1 |
Auto-repeat |
||
EV_KEY |
KEY_NAME |
DOWN |
按下 |
UP |
抬起 |
||
REPEAT |
Kernel soft-repeat |
||
EV_MSC |
MSC_SCAN |
0007001D |
键盘HID码《》 |
对于Auto-repeat的实现,内核中有自行实现,但是在上层系统中真正使用的不多,比如x11,Android。像Android是这样说的:来源《keyboard-devices》
Android performsits own keyboard repeating. Auto-repeat functionality should be disabled in thedriver.
如果需要禁用kernel中的auto-repeat以减小上层系统的无用处理,可以使用以下方法:
#include
#include
#include
#include
#include
#ifndef EVIOCSREP
#define EVIOCSREP _IOW('E', 0x03, int[2])
#endif
int main(int argc, char** argv) {
int fd = 0;
int rep[2] = {0};
if ((fd = open("/dev/input/event4",
O_RDWR))< 0) {
perror("unableto access /dev/input/event2, exiting");
exit(1);
}
// get current auto-repeat args.
if (ioctl(fd,EVIOCGREP, rep)) {
perror("unableto set delay and repeat rate for input devices");
exit(1);
}
rep[1] =0; // set auto-repeat rate as 0.
if (ioctl(fd,EVIOCSREP, rep)) {
perror("unableto set delay and repeat rate for input devices");
exit(1);
}
printf("rep[0]:%d;rep[1]:%d\n", rep[0], rep[1]);
close(fd);
}
《完》