CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
123
返回列表 发新帖
楼主: unprince

来吐槽android下的红外遥控配置

[复制链接]
 楼主| 发表于 2014-11-24 20:34:02 | 显示全部楼层
本帖最后由 unprince 于 2014-11-24 20:40 编辑

全志的源代码几乎是个半成品,关于这点,我们在用全志的方案开发产品时,有一部分时间都是在全志的"坑"里,例如现在讨论的红外遥控,最终的问题出现在./lichee/linux-3.0/drivers/input/keyboard/sun4i-ir.c文件中的ir_code_valid函数中(用于判断编码是否有效).由于高16位的遥控识别码是用宏定义给出的,因此在运行时是不可配置的.这表明仅当遥控的识别码与IR_ADDR_CODE(这里是0x9f00)一致时才可以使用.而问题的关键是我没有看到关于这个特定识别码的任何说明,假如你还困在这个红外遥控不能获得键值的问题中,那么一定是因为你的红外遥控识别码不是0x9f00.那么修改这个值就可以了


注意: 全志的全系列 sun5i-ir.c,sun7i-ir.c也存在同样的问题
相关的头文件
  1. // vim ./lichee/linux-3.0/drivers/input/keyboard/ir-keymap.h +13
  2. #define IR_ADDR_CODE            (0x9f00)
复制代码
相关源代码
  1. // vim ./lichee/linux-3.0/drivers/input/keyboard/sun4i-ir.c +440
  2. static int ir_code_valid(unsigned long code)
  3. {
  4.     unsigned long tmp1, tmp2;

  5. #ifdef IR_CHECK_ADDR_CODE
  6.     /*Check Address Value*/
  7.     if((code&0xffff) != (IR_ADDR_CODE&0xffff))
  8.         return 0; /*Address Error*/
  9.    
  10.     tmp1 = code & 0x00ff0000;
  11.     tmp2 = (code & 0xff000000)>>8;
  12.    
  13.     return ((tmp1^tmp2)==0x00ff0000);  /*Check User Code*/
  14. #else   
  15.     /*Do Not Check Address Value*/
  16.     tmp1 = code & 0x00ff00ff;
  17.     tmp2 = (code & 0xff00ff00)>>8;
  18.    
  19.     //return ((tmp1^tmp2)==0x00ff00ff);
  20.     return (((tmp1^tmp2) & 0x00ff0000)==0x00ff0000 );
  21. #endif /*#ifdef IR_CHECK_ADDR_CODE*/
  22. }
复制代码
最终的补丁方案(注意:是在A20的源码中修改的,实际是一样的)
  1. diff --git a/drivers/input/keyboard/sun7i-ir.c b/drivers/input/keyboard/sun7i-ir.c
  2. index d4371aa..fb79734 100755
  3. --- a/drivers/input/keyboard/sun7i-ir.c
  4. +++ b/drivers/input/keyboard/sun7i-ir.c
  5. @@ -496,27 +496,39 @@ static unsigned long ir_packet_handler(unsigned char *buf, unsigned long dcnt)
  6.         return code;
  7. }

  8. +static ushort ir_addr_code = 0;
  9. +module_param(ir_addr_code,ushort, 0644);
  10. +MODULE_PARM_DESC(ir_addr_code, "Valid IR addr code");
  11. +
  12. +static ushort cur_ir_addr_code = 0;
  13. +module_param(cur_ir_addr_code, ushort, 0644);
  14. +MODULE_PARM_DESC(cur_ir_addr_code, "Current IR addr code");
  15. +
  16. static int ir_code_valid(unsigned long code)
  17. {
  18.         unsigned long tmp1, tmp2;

  19. -#ifdef IR_CHECK_ADDR_CODE
  20. -       /* Check Address Value */
  21. -       if ((code&0xffff) != (IR_ADDR_CODE&0xffff))
  22. -               return 0; /* Address Error */
  23. +//#ifdef IR_CHECK_ADDR_CODE
  24. +    cur_ir_addr_code = (code & 0xffff);
  25. +
  26. +    if(ir_addr_code != 0){
  27. +           /* Check Address Value */
  28. +           if ((code&0xffff) != (ir_addr_code &0xffff))
  29. +                   return 0; /* Address Error */

  30. -       tmp1 = code & 0x00ff0000;
  31. -       tmp2 = (code & 0xff000000)>>8;
  32. +           tmp1 = code & 0x00ff0000;
  33. +           tmp2 = (code & 0xff000000)>>8;

  34. -       return ((tmp1^tmp2)==0x00ff0000);  /* Check User Code */
  35. -#else  
  36. +           return ((tmp1^tmp2)==0x00ff0000);  /* Check User Code */
  37. +    }
  38. +//#else
  39.         /* Do Not Check Address Value */
  40.         tmp1 = code & 0x00ff00ff;
  41.         tmp2 = (code & 0xff00ff00)>>8;

  42.         //return ((tmp1^tmp2)==0x00ff00ff);
  43.         return (((tmp1^tmp2) & 0x00ff0000)==0x00ff0000 );
  44. -#endif /* #ifdef IR_CHECK_ADDR_CODE */
  45. +//#endif /* #ifdef IR_CHECK_ADDR_CODE */
  46. }

  47. static irqreturn_t ir_irq_service(int irqno, void *dev_id)
复制代码
说明:我们增加了两个变量(ir_addr_code和cur_ir_addr_code),并且导出到用户空间
通过下面的路径可以访问
/sys/module/sun7i_ir/parameters/ir_addr_code
/sys/module/sun7i_ir/parameters/cur_ir_addr_code
其中可以通过查看cur_ir_addr_code获得当前遥控识别码
通过向ir_addr_code写入新的遥控识别码过滤其他识别码的遥控,写0时不过滤任何识别码






回复 支持 反对

使用道具 举报

发表于 2015-5-4 10:27:41 | 显示全部楼层
大神 我的也是sun4i-ir  需要你的这份sun4ir ko文件能发给我一份吗
回复 支持 反对

使用道具 举报

发表于 2015-6-5 13:02:36 | 显示全部楼层
红外支持的很渣 好像只有NEC
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-11-23 04:58 , Processed in 0.020278 second(s), 12 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部