欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mstar 光机遥控器适配

程序员文章站 2022-07-04 12:23:01
...

以XXXX光机上,以上下左右4个键为例:
Mstar 光机遥控器适配

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

对应文件关系
Mstar 光机遥控器适配

其中,
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

相关标签: mstar 遥控适配