|
本帖最后由 linuxsc 于 2014-8-25 10:12 编辑
红外遥控器配置方法:
接收红外信号的源代码文件:
linux-3.4/drivers/input/keyboard/sun7i-ir.c
修改如下代码:
static unsigned long ir_addr_code = 0;
设置为你所使用的遥控器地址码,比如:
static unsigned long ir_addr_code = 0xa34d; #其中0xa34d就是遥控器独有的编码
修改如下代码:
static int __init ir_init(void)
{
...省略...
if(SCIRPT_ITEM_VALUE_TYPE_INT != script_get_item("ir_para", "ir_addr_code", &ir_addr_code)){
pr_err("%s: ir_addr_code script_get_item error. \n",__func__ );
ir_addr_code = 0xa34d; #此处改为你自己遥控器的地址码
}
...省略...
}
修改文件:linux-3.4/drivers/input/keyboard/ir-keymap.h
/*IR Key Match Config*/
#define IR_CHECK_ADDR_CODE
#define IR_ADDR_CODE 0xa34d #此处改为你自己遥控器的地址码
//#define INPUT_VALUE_MAPPING
为了能够获取到遥控器的地址码,可以拆开遥控器使用专业电路获取。当然我们一般没有这样的设备,那就采用另外一个方法获取。为什么要获取遥控器的地址码,主要是防止其它遥控器串控。
具体方法:通过修改linux-3.4/drivers/input/keyboard/sun7i-ir.c和linux-3.4/drivers/input/keyboard/ir-keymap.h文件
sun7i-ir.c:
修改以下函数,添加一条内核输出语句。
static int ir_code_valid(unsigned long code)
{
unsigned long tmp1, tmp2;
// Add by pangzi print IR_ADDR_CODE on serial
printk("<0>""\nIR_ADDR_CODE:%x\n",code); #通过内核输出遥控地址码
// Add end
#ifdef IR_CHECK_ADDR_CODE
/* Check Address Value */
if ((code&0xffff) != (ir_addr_code&0xffff))
return 0; /* Address Error */
tmp1 = code & 0x00ff0000;
tmp2 = (code & 0xff000000)>>8;
return ((tmp1^tmp2)==0x00ff0000); /* Check User Code */
#else
/* Do Not Check Address Value */
tmp1 = code & 0x00ff00ff;
tmp2 = (code & 0xff00ff00)>>8;
//return ((tmp1^tmp2)==0x00ff00ff);
return (((tmp1^tmp2) & 0x00ff0000)==0x00ff0000 );
#endif /* #ifdef IR_CHECK_ADDR_CODE */
}
ir-keymap.h:
将检查遥控器编码宏定义注释掉,目的是让让CT红外接收器能够接收任何遥控器的红外信号,这里的任何并不是所有遥控器,而是大多数遥控器,至少一般的机顶盒、网络盒子等遥控器都能使用。
具体方法是将如下代码:
/*IR Key Match Config*/
#define IR_CHECK_ADDR_CODE
#define IR_ADDR_CODE 0xa34d
//#define INPUT_VALUE_MAPPING
修改为:
/*IR Key Match Config*/
//#define IR_CHECK_ADDR_CODE
#define IR_ADDR_CODE 0xa34d
//#define INPUT_VALUE_MAPPING
接下来就是编译内核(如果linux内核集成sun7i-ir.ko,而不是以模块方式加载)
linux代码目录下
./build.sh -p sun7i_android -m kernel #编译新内核
android代码目录下
extract.bsp
make bootimage #单独编译生成新的boot.img
然后用新的boot.img烧录板子,需要使用usb调试线将CT和电脑连接,并且保证usb驱动安装完好。
Win+R cmd
adb push boot.img /mnt/sdcard/
adb shell sync
adb shell dd if=/mnt/sdcard/boot.img of=/dev/block/nandc
adb shell sync
adb shell reboot
如果linux内核没有集成 sun7i-ir.ko,而是以模块方式加载,那只需要编译sun7i-ir.ko上传到板子,重新加载sun7i-ir.ko模块即可进行下一步操作。
CT启动完毕后,usb调试线接好,再把串口线连接好,并用软件打开CT终端等待核心输出遥控器的地址码。
adb shell getevent
此时就可以按遥控器上面的按键,此时在adb窗口中应该有遥控器的按键编码输出,这个编码用于接下来编辑遥控器和系统内部编码对应关系(CT板子上面的文件:/system/usr/keylayout/sun7i-ir.kl就是遥控按键匹配对应关系文件)
同时在串口的窗口中也会有输出:
IR_ADDR_CODE:0x123acb04
输出内容的0x123a4fa8编码的后面4位就是遥控器的地址码,而前面的4位是遥控器按键的编码,获得遥控器的唯一地址码后,即可按前面方法修改sun7i-ir.c和ir-keymap.h相关内容,重新编译内核和烧录。
最后就是修改sun7i-ir.kl文件,并且结合 adb shell getevent 获取到的具体按键代码设置具体对应关系,然后上传到板子,即可实现遥控功能。
其间需要注意:
1、getevent 获取到的按键编码是16进制数,需要转换后再写入sun7i-ir.kl文件;
2、sun7i-ir.kl文件中的按键码对应关系不能出现冲突,否则遥控器失效;
|
|