一. 让CT可以接收任意遥控器的键值
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 */
-
}
这个地址码是: #define IR_ADDR_CODE (0x9f00)
所以只要不是0x9f00的地址码都直接返回了,也就不再上报了.
2. 去掉检查
为了让所有的遥控器都能使用,需要将这个IR_CHECK_ADDR_CODE宏注掉即可
在./lichee/linux-3.3/drivers/input/keyboard/ir-keymap.h中
-
//#define IR_CHECK_ADDR_CODE
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的处理的两个函数,改为空.
-
#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)
-
{
-
}
这样就实现在power键开机(唤醒).
3.继续修改/system/usr/keylayout/sun7i-ir.kl就可以实现更多的功能了.
阅读(1185) | 评论(0) | 转发(0) |