键值从键盘到Linux内核传输过程分析

客户要定制一款usb无线遥控器(其实走的键盘流程),要添加一个特殊键,遥控器厂商让我们确定键值。

getevent指令用于获取 input 输入事件,比如获取按键上报信息、获取触摸屏上报信息等。

通过getevent -l查看分别按红外遥控器和无线遥控器的方向上键的事件信息如下:

1547807882728

event0是红外遥控器,红外遥控器的键值可以通过android_ir_user查看

1547809081778

event3是usb无线遥控器,可以看到都发送了KEY_UP的事件,通过getevent可以查看KEY_UP的具体键值:

1547807593171

到这里,我们知道了不管红外遥控器上键(红外键值0x35ca4cb3)还是无线遥控器按上键(HID码0x00070052)都是转换成了Linux键值(0x67)。接下来看看在Linux内核中是如何将遥控器键值转换为Linux通用键值的。

红外遥控器

  1. 定义原始硬件码值和对应linux层通用键名:

/device/hisilicon/bigfish/system/ir_user/key_pars/key.xml

1
2
3
4
5
<key value="0x35ca4cb3" name="KEY_UP"         />      <!--key up-->
<key value="0x2dd24cb3" name="KEY_DOWN" /> <!--key down-->
<key value="0x3ec14cb3" name="KEY_RIGHT" /> <!--key right-->
<key value="0x66994cb3" name="KEY_LEFT" /> <!--key left -->
<key value="0x31ce4cb3" name="KEY_ENTER" /> <!--key ok -->
  1. 定义linux层通用键名和linux层键值的对应关系:

/device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h

1
2
3
4
5
6
7
const linux_keycode_ary Linux_KeyCode_Ary[512]=
{
{"KEY_RESERVED",0},
{"KEY_ESC", 1},
...
{"KEY_UP", 103},//前面Linux键值0x67就是103
}

无线遥控器(外接键盘)

  1. Linux内核中usb键盘的驱动程序是

./device/hisilicon/bigfish/sdk/source/kernel/linux-3.18.y/drivers/hid/hid-input.c

1547810431779

找到数组的第82(0x52)个元素,就是键值103。

了解过这个情况后,以后在定制键盘时,告知给键盘设计厂商的应该是HID原始键值码。

HID原始键值码是由《USB HID to PS/2 Scan Code Translation Table》HID协议中规定的。