一. 让CT可以接收任意遥控器的键值
1. CubieTruck带了一个红外接收器,但是随便拿一个遥控器来用完全没有反应的.
这是因为在驱动中有对地址码的检查:
在lichee/linux-3.3/drivers/input/keyboard/sun7i-ir.c中(红外接收器的驱动)
这个地址码是: #define IR_ADDR_CODE (0x9f00)
所以只要不是0x9f00的地址码都直接返回了,也就不再上报了.
2. 去掉检查
为了让所有的遥控器都能使用,需要将这个IR_CHECK_ADDR_CODE宏注掉即可
在./lichee/linux-3.3/drivers/input/keyboard/ir-keymap.h中
3. 重新烧写boot.img就可以在getevent中接收到键值了.
二. 让遥控器好用
2.1 power关机
修改 /system/usr/keylayout/sun7i-ir.kl
注: 这儿的255是从getevent中读取出来的,我的遥控器power键会发送键值255
改完就实现了关机.
2.2 power开机
a. power键只关机而不能开机,(其实:当按下power实际上是进入了休眠状态而不是关机状态)
不能开机的真正原因是:
内核中的sun7i-ir.c中对休眠进行了处理,把红外的时钟关闭了.
即在休眠状态下,红外不接收任何信号,所以也就不能唤醒了.
b. 解决方法:
把sun-7i-ir.c修改成如下形式: 即将suspend的处理的两个函数,改为空.
这样就实现在power键开机(唤醒).
3.继续修改/system/usr/keylayout/sun7i-ir.kl就可以实现更多的功能了.
1. CubieTruck带了一个红外接收器,但是随便拿一个遥控器来用完全没有反应的.
这是因为在驱动中有对地址码的检查:
在lichee/linux-3.3/drivers/input/keyboard/sun7i-ir.c中(红外接收器的驱动)
- static int ir_code_valid(unsigned long code)
- {
- unsigned long tmp1, tmp2;
- #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 */
- }
所以只要不是0x9f00的地址码都直接返回了,也就不再上报了.
2. 去掉检查
为了让所有的遥控器都能使用,需要将这个IR_CHECK_ADDR_CODE宏注掉即可
在./lichee/linux-3.3/drivers/input/keyboard/ir-keymap.h中
- //#define IR_CHECK_ADDR_CODE
二. 让遥控器好用
2.1 power关机
修改 /system/usr/keylayout/sun7i-ir.kl
- key 255 POWER WAKE
改完就实现了关机.
2.2 power开机
a. power键只关机而不能开机,(其实:当按下power实际上是进入了休眠状态而不是关机状态)
不能开机的真正原因是:
内核中的sun7i-ir.c中对休眠进行了处理,把红外的时钟关闭了.
即在休眠状态下,红外不接收任何信号,所以也就不能唤醒了.
b. 解决方法:
把sun-7i-ir.c修改成如下形式: 即将suspend的处理的两个函数,改为空.
- #if 0 //add by cong start
- #ifdef CONFIG_HAS_EARLYSUSPEND
- static void sun7i_ir_suspend(struct early_suspend *h)
- {
- /* unsigned long tmp = 0;
- int ret;
- struct sun7i_ir_data *ts = container_of(h, struct sun7i_ir_data, early_suspend);
-
- tmp = readl(IR_BASE+IR_CTRL_REG);
- tmp &= 0xfffffffc;
- writel(tmp, IR_BASE+IR_CTRL_REG);
- */
- dbmsg("EARLYSUSPEND:enter earlysuspend: sun7i_ir_suspend. \n");
- if(NULL == ir_clk || IS_ERR(ir_clk)) {
- printk("ir_clk handle is invalid, just return!\n");
- return;
- } else {
- clk_disable(ir_clk);
- }
-
- if(NULL == apb_ir_clk || IS_ERR(ir_clk)) {
- printk("ir_clk handle is invalid, just return!\n");
- return;
- } else {
- clk_disable(apb_ir_clk);
- }
-
- }
- static void sun7i_ir_resume(struct early_suspend *h)
- {
-
- dbmsg("EARLYSUSPEND:enter laterresume: sun7i_ir_resume. \n");
-
- ir_code = 0;
- timer_used = 0;
- ir_reset_rawbuffer();
- ir_clk_cfg();
- ir_reg_cfg();
- }
- #endif
- #endif //add by cong end
-
- static void sun7i_ir_suspend(struct early_suspend *h)
- {
- }
-
- static void sun7i_ir_resume(struct early_suspend *h)
- {
- }
3.继续修改/system/usr/keylayout/sun7i-ir.kl就可以实现更多的功能了.