linuxsc 发表于 2014-8-23 20:07:05

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

本帖最后由 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 pangziprint 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
                adbpushboot.img   /mnt/sdcard/
                adbshellsync
                adbshellddif=/mnt/sdcard/boot.img of=/dev/block/nandc
                adbshellsync
                adbshellreboot
如果linux内核没有集成 sun7i-ir.ko,而是以模块方式加载,那只需要编译sun7i-ir.ko上传到板子,重新加载sun7i-ir.ko模块即可进行下一步操作。


CT启动完毕后,usb调试线接好,再把串口线连接好,并用软件打开CT终端等待核心输出遥控器的地址码。
                adbshell 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文件,并且结合 adbshellgetevent 获取到的具体按键代码设置具体对应关系,然后上传到板子,即可实现遥控功能。
其间需要注意:
        1、getevent 获取到的按键编码是16进制数,需要转换后再写入sun7i-ir.kl文件;
        2、sun7i-ir.kl文件中的按键码对应关系不能出现冲突,否则遥控器失效;






lin 发表于 2014-8-26 12:53:46

好东西,大哥研究源码多久了。

linuxsc 发表于 2014-8-26 22:53:04




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

cool-fire 发表于 2014-9-6 10:02:37




支不支持新版的安卓啊!!

翼京/ka 发表于 2014-9-10 10:40:58

赞一个:lol:lol:lol:lol

songwei2088 发表于 2014-11-17 21:10:40

谢谢,学习了

unprince 发表于 2014-11-26 00:08:43

本帖最后由 unprince 于 2014-11-26 00:14 编辑

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


页: [1]
查看完整版本: CT 遥控器完美配置方案(android)