【Linux IR 适配红外遥控器】

Linux IR 适配红外遥控器

HX1838-IR-DIY-HX1838-DIY.jpg_6

硬件连接:略。
内核配置

Device Drivers --> Remote Controller support --> …

CONFIG_RC_CORE=y
CONFIG_LIRC=y
CONFIG_RC_MAP=y
CONFIG_RC_DECODERS=y
CONFIG_IR_IMON_DECODER=y
CONFIG_IR_JVC_DECODER=y
CONFIG_IR_MCE_KBD_DECODER=y
CONFIG_IR_NEC_DECODER=y
CONFIG_IR_RC5_DECODER=y
CONFIG_IR_RC6_DECODER=y
CONFIG_IR_RCMM_DECODER=y
CONFIG_IR_SANYO_DECODER=y
CONFIG_IR_SHARP_DECODER=y
CONFIG_IR_SONY_DECODER=y
CONFIG_IR_XMP_DECODER=y
CONFIG_RC_DEVICES=y

尽量选中 Remote controller decoders中的所有项,方面后面适配不同协议的遥控器。

测试程序

交叉编译v4l-utils tools,lirc-tools(可选),可以使用buildroot/busybox来集成。

获取遥控器键值
  1. cat /sys/class/rc/rc0/protocols
rc-5 nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon rc-mm [lirc]

中括号包含的才是当前使能的协议,可以使用echo ""+nec" > /sys/class/rc/rc0/protocols使能。

使能NEC协议,根据遥控器类型配置,如果不清楚,可以使能全部(参考:2. Remote Controller’s sysfs nodes — The Linux Kernel documentation

echo nec > /sys/class/rc/rc0/protocols
  1. 确定键值 hexdump /dev/input/event0,仅供参考。

    [root@buildroot:/root #]hexdump /dev/input/event0
    0000000 5253 0001 0000 0000 416e 0000 0000 0000
    0000010 0004 0004 0045 0000 5253 0001 0000 0000
    0000020 416e 0000 0000 0000 0000 0000 0000 0000
    0000030 5253 0001 0000 0000 0ba7 0001 0000 0000
    0000040 0004 0004 0045 0000 5253 0001 0000 0000
    0000050 0ba7 0001 0000 0000 0000 0000 0000 0000
    0000060 5253 0001 0000 0000 b1d3 0002 0000 0000
    0000070 0004 0004 0045 0000 5253 0001 0000 0000
    0000080 b1d3 0002 0000 0000 0000 0000 0000 0000
    

    整理如下:

    5253 0001 0000 0000 416e 0000 0000 0000 0004 0004 0045 0000 
    5253 0001 0000 0000 416e 0000 0000 0000 0000 0000 0000 0000
    5253 0001 0000 0000 0ba7 0001 0000 0000 0004 0004 0045 0000 
    5253 0001 0000 0000 0ba7 0001 0000 0000 0000 0000 0000 0000
    5253 0001 0000 0000 b1d3 0002 0000 0000 0004 0004 0045 0000 
    5253 0001 0000 0000 b1d3 0002 0000 0000 0000 0000 0000 0000
    

    第一行/第三行/第五行的倒数第二个数据为当前按键的键值:0x45;数据是有规律,多观察就可以发现有用的信息。

  2. 内核代码:添加键值映射文件

    源码目录:drivers/media/rc/keymaps/

    主要操作,

    • 复制rc-wetek-play2.c为rc-xxx.c;

    • 修改include/media/rc-map.h,添加当前遥控器的字符串名称

    • 修改rc-xxx.c中的static struct rc_map_table xxx结构体,把键值和按键宏定义一一对应;

    • 修改static struct rc_map_list xxx中的name = RC_MAP_XXX,当前遥控器的字符串名称

    • 修改static struct rc_map_list xxx中的.rc_proto = RC_PROTO_NEC,当前遥控器支持的协议

    • 修改注释/函数名称/模块信息(可选);

    • 修改设备树中ir节点,添加linux,rc-map-name = "rc-xxx";字符串=当前遥控器的字符串名称

  3. 更换内核/设备树,重新启动,设备上电后使用命令irw测试:

    [root@buildroot:/root #]irw
    0000000080010201 00 KEY_NUMERIC_1 devinput-32
    0000000080010201 00 KEY_NUMERIC_1 devinput-32
    0000000080010200 00 KEY_NUMERIC_0 devinput-32
    0000000080010160 00 KEY_OK devinput-32
    0000000080010209 00 KEY_NUMERIC_9 devinput-32
    

ir-keytable获取ir信息

正常工作的:

[root@buildroot:/root #]ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-taobao
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc nec
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms
[root@buildroot:/root #]ir-keytable -t
Testing events. Please, press CTRL-C to abort.
246.661852: lirc protocol(nec): scancode = 0x19
246.661884: event type EV_MSC(0x04): scancode = 0x19
246.661884: event type EV_KEY(0x01) key_down: KEY_NUMERIC_0(0x0200)
246.661884: event type EV_SYN(0x00).
246.713570: lirc protocol(nec): scancode = 0x19 repeat
246.713581: event type EV_MSC(0x04): scancode = 0x19
246.713581: event type EV_SYN(0x00).
246.848031: event type EV_KEY(0x01) key_up: KEY_NUMERIC_0(0x0200)
246.848031: event type EV_SYN(0x00).
252.053993: lirc protocol(nec): scancode = 0x15
252.054010: event type EV_MSC(0x04): scancode = 0x15
252.054010: event type EV_KEY(0x01) key_down: KEY_NUMERIC_8(0x0208)
252.054010: event type EV_SYN(0x00).
252.105833: lirc protocol(nec): scancode = 0x15 repeat
252.105843: event type EV_MSC(0x04): scancode = 0x15
252.105843: event type EV_SYN(0x00).
252.213907: lirc protocol(nec): scancode = 0x15 repeat
252.213919: event type EV_MSC(0x04): scancode = 0x15
252.213919: event type EV_SYN(0x00).
252.348029: event type EV_KEY(0x01) key_up: KEY_NUMERIC_8(0x0208)
252.348029: event type EV_SYN(0x00).

未适配的

[root@buildroot:/root #]ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-empty
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms
辅助测试命令总结

mode2 -d /dev/lircX

正常会打印:code: xxxxx , Partial read XX bytes on /dev/lircX;硬件连接正常、内核配置正常。

如果没有输出,请检查配置或者硬件连接;提示:遥控器可以通过手机拍照,手动按下键后,看是否有红色的光闪烁。

mode2 -d /dev/input/eventX

有输出,则当前内核支持测试的遥控器。

示例:

code: 0xcc6d01000000000036190900000000000400040045000000
code: 0xcc6d01000000000036190900000000000100010201000000
code: 0xcc6d01000000000036190900000000000000000000000000
code: 0xcc6d0100000000000be30900000000000400040045000000
code: 0xcc6d0100000000000be30900000000000000000000000000
code: 0xcc6d01000000000050e80b00000000000100010200000000
code: 0xcc6d01000000000050e80b00000000000000000000000000

ir-keytable

[root@buildroot:/root #]ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-taobao
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc nec
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms

最后,冲浪还发现树莓派都是用lirc_dev这个软件包来适配,但是我没有搞定,所以还是用这种代码的方式来开发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值