以XXXX光机上,以上下左右4个键为例:
1.创建头文件
在kernel/mstart/mstar/ir/目录下面新建一个IR_LEADER.h,直接复制IR_MSTAR_DTV.h里面的内容
a. 修改头码
其中头码是指的客户码807F
b.修改key code
IRKEY_UP = 0x52
IRKEY_DOWN = 0x13
IRKEY_LEFT = 0x06
IRKEY_RIGHT = 0x1A
//将源文件里面的几个码值修改为客户提供的
IRKEY_UP = 0x05
IRKEY_DOWN = 0x1B
IRKEY_LEFT = 0x07
IRKEY_RIGHT = 0x09
修改的时候,可能会遇到0x05这个键值被其它键给占用了,有2种解决方法:
i)将占用0x05的键给屏蔽
ii)将占用0x05的键和IRKEY_UP对换
IRKEY_PAGE_DOWN = 0x05
IRKEY_UP = 0x52
//对换2个键的key code
IRKEY_PAGE_DOWN = 0x52
IRKEY_UP = 0x05
方法ii比较麻烦,但是比较稳妥,保证了定义的所有键都在,虽然很多键都没有用上
2.修改key映射
在kernel/3.1.10/drivers/media/rc/keymaps/目录下面新建一个rc-leader-tv.c,直接复制rc-mstar-tv.c里面的内容。然后修改文件
{ 0x0013, KEY_DOWN },
{ 0x0006, KEY_LEFT },
{ 0x001A, KEY_RIGHT },
{ 0x000F, KEY_ENTER },
修改为
{ 0x0005, KEY_UP },
{ 0x001B, KEY_DOWN },
{ 0x0007, KEY_LEFT },
{ 0x0009, KEY_RIGHT },
这一步和修改IR_LEADER.h一样,会遇到键值被其它按键占用的情况,对换键值修改
注意:
rc-mstar-tv.c和IR_MSTAR_DTV.h里面的keycode是一样对应的,里面可能有些键的名称不一样,修改的时候可能会遇到这种问题,记住相同的keycode就是同一个键。
//在rc-mstar-tv.c文件里面
{ 0x0004, KEY_KP1 }, // TV_INPUT
//在IR_MSTAR.h文件里面
IRKEY_INPUT_SOURCE = 0x04
这2个按键keycode是一样的,即这2个名称不一样的键是同一个按键
3.添加新加的遥控器定义
i)在kernel/mstar/arm-boards/madison/board/Board.h文件里面添加定义
# define IR_TYPE_LEADER 29
说明:
在这个文件前面可以看到
#define IR_TYPE_TOSHIBA 25
#define IR_TYPE_CHANGHONG 26
类似的定义,直接在后面添加类似的定义即可
ii)在kernel/mstar/arm-boards/madison/board/BD_GENERIC.h修改
#define IR_TYPE_SEL IR_TYPE_LEADER
IR_TYPE_SEL这个值的定义涉及到编译的时候会引用哪些头文件
4.将定义的文件添加到编译中去
i)在kernel/3.1.10/drivers/media/rc/keymaps/Makefile里面添加编译生成的文件
obj-$(CONFIG_RC_MAP) += rc-mstar-tv.o \
rc-changhong-tv.o \
rc-haier-tv.o \
rc-hisense-tv.o \
rc-konka-tv.o \
rc-skyworth-tv.o \
rc-tcl-tv.o \
rc-leader-tv.o
注意:rc-leader-tv.o文件名与之前定义rc-leader-tv.c是一致的
ii)在kernel/mstar/mstar/ir/mdrv_ir.c文件修改
可以看到类似的定义
#elif (IR_TYPE_SEL == IR_TYPE_KONKA)
#include "IR_KONKA.h"
#elif (defined(IR_TYPE_SKYWORTH) && IR_TYPE_SEL == IR_TYPE_SKYWORTH)
#include "IR_SKYWORTH.h"
将下面这一段代码放在后面就可以了
#elif (defined(IR_TYPE_LEADER) && IR_TYPE_SEL == IR_TYPE_LEADER)
#include "IR_LEADER.h"
//添加如下代码,因为在BD_GENERIC.h里面定义了IR_TYPE_SEL,所以在编译的时候会把IR_LEADER.h给编译进去
在这个文件里面,还有6处需要修改,类似
IR_TYPE_SEL == IR_TYPE_HISENSE || IR_TYPE_SEL == IR_TYPE_MSTAR_DTV || IR_TYPE_SEL == IR_TYPE_CHANGHONG
都在最后加上|| IR_TYPE_SEL == IR_TYPE_LEADER
5)编译kernel,替换ko
a.编译生成需要用到的ko文件是mdrv-ir.ko和rc-leader-tv.ko,将rc-leader-tv.ko修改为rc-keymap-tv.ko
b.替换system/lib/modules/里面对应文件
在串口下面执行
su
getevent
看到输出的值和给出的定义是否是一样,如果是一样的,则kernel里面配置的按键是正确的。如果Android层响应有问题,则是Vendor_3697_Product_001.kl里面配置有问题,没有把Android和Kernel对应上
4.kernel里面定义按键与KeyEvent里面定义的keycode对应关系
相关文件有:
kernel/3.1.10/drivers/media/rc/keymaps/rc-mstar-tv.c
kernel/3.1.10/include/linux/input.h
kitkat/frameworks/native/include/input/KeycodeLabels.h
kitkat/device/mstar/mango/preinstall/keylayout/Vendor_3697_Product_001.kl
对应文件关系
其中,
1)input.h里面定义的key和rc-mstart-tv.c是相对应的,如KEY_UP对KEY_UP
2)KeycodeLabels.h 里面定义的keycode和KeyEvent.java里面定义的是一致的
3)Vendor_3697_Product_0001.kl将kernel里面定义的按键和Android层定义相关联起来
以KEY_UP为例说明,可能有偏差,大概就这个意思,按上键
rc-mstart-tv.c —> input.h —>Vendor_3697_Product_0001.kl—>KeycodeLabels.h —>KeyEvent.java