CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 14434|回复: 7

CT 遥控器完美配置方案(android)

[复制链接]
发表于 2014-8-23 20:07:05 | 显示全部楼层 |阅读模式
本帖最后由 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文件中的按键码对应关系不能出现冲突,否则遥控器失效;






回复

使用道具 举报

发表于 2014-8-26 12:53:46 | 显示全部楼层
好东西,大哥研究源码多久了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-26 22:53:04 | 显示全部楼层



几年前经常搞linux平台而已,前段时间买了CT,现在工作之余玩玩而已!

回复 支持 反对

使用道具 举报

发表于 2014-9-6 10:02:37 | 显示全部楼层



支不支持新版的安卓啊!!
回复 支持 反对

使用道具 举报

发表于 2014-9-10 10:40:58 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

发表于 2014-11-17 21:10:40 | 显示全部楼层
谢谢,学习了
回复 支持 反对

使用道具 举报

发表于 2014-11-26 00:08:43 | 显示全部楼层
本帖最后由 unprince 于 2014-11-26 00:14 编辑

将其中的两个变量导出到用户空间的方法更方便,既可以方便查看当前的遥控识别码,又可以动态设置遥控识别码,不需要重复编译内核,应用到实际产品中时,仅仅需要在启动脚本中增加一条写遥控识别码的命令即可
具体的补丁代码见
来吐槽android下的红外遥控配置
http://forum.cubietech.com/forum ... =24959&fromuid=1333



回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 17:18 , Processed in 0.024491 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部