目录
1. 查询IR信息
1.1.1 sunxi-ir-uinput
1.1.2 sunxi-ir
2. 调试键值
3. 匹配遥控器
4. Power键的特殊处理
5. 验证
ir的接口在13pin接口上,需要使用到扩展板。
1. 查询IR信息
在shell的界面输入命令:
dumpsys input
分析返回信息,可以看到有3个输入事件设备,其中有一个是虚拟设备,另外2个分别是:sunxi-ir-uinput和sunxi-ir。
1.1.1 sunxi-ir-uinput
该设备的类型是键盘、字母键、光标控制键和方向键。键盘布局文件是/system/usr/keylayout/sunxi-ir-uinput.kl,键盘字符映射文件是/system/usr/keychars/Generic.kcm
1.1.2 sunxi-ir
该设备的类型是键盘,键盘布局文件是/system/usr/keylayout/sunxi-ir.kl。
2. 调试键值
在/device/softwinner/apollo/common/system/ueventd.sun50iw9p1.rc里面添加权限
/dev/input/event0 0777 system system
/dev/input/event1 0777 system system
烧录编译后,shell中运行:getevent -l
找一个遥控器按键测试(注意不是所有遥控器都支持,应该是只勾选了NEC和RC-5的协议)
console:/ $ getevent -l
add device 1: /dev/input/event1
name: "sunxi-ir-uinput"
add device 2: /dev/input/event0
name: "sunxi-ir"
/dev/input/event0: EV_REP REP_DELAY 00000000
/dev/input/event0: EV_REP REP_PERIOD 00000000
/dev/input/event0: EV_MSC MSC_SCAN 012c401c
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event0: EV_MSC MSC_SCAN 002c401c
/dev/input/event0: EV_SYN SYN_REPORT 00000000
在/system/core/toolbox/getevent.c里面找到这个打印信息的源代码
static void print_event(int type, int code, int value, int print_flags)
以“EV_MSC MSC_SCAN 012c401c”为例,第一个值表示type,第二个值表示code,第三个则为value,这里因为没有匹配遥控器,所以信息只是简单的值。
3. 匹配遥控器
示例中中0x2c40是遥控器的用户码(头码),在/vendor/aw/homlet/hardware/input/multi_ir/keylayout/里面添加一个新文件customer_ir_2c40.kl(默认是NEC协议,如果是其他,则需要在文件名上指定协议,例如rc5协议,那么文件名可能是customer_rc5_ir_04.kl)。
而value中的低字节是键值,示例中的按键是ENTER键,对应键值为0x1c(十进制28),所以在customer_ir_2c40.kl添加键值:
key 28 ENTER
power键需要特殊处理,这里也添加这个键。
key 3 ENTER
其他按键可以采用相同的方式添加。
在文件/vendor/aw/homlet/hardware/input/multi_ir/multiir.mk中添加这个文件
BASE_KL_COPY_LIST += customer_ir_9f00.kl \
customer_ir_dd22.kl \
customer_ir_fb04.kl \
customer_ir_ff00.kl \
customer_ir_4cb3.kl \
customer_ir_bc00.kl \
customer_ir_fc00.kl \
customer_ir_2992.kl \
customer_ir_4040.kl \
customer_ir_7f00.kl \
customer_ir_bf00.kl \
customer_ir_2c40.kl \
4. Power键的特殊处理
Power是特殊的,因为需要待机时能响应,需要修改到2个文件
/longan/device/config/chips/h618/configs/p2/linux-5.4/board.dts
&s_cir0 {
s_cir0_used = <1>;
pinctrl-names = "default", "sleep";
pinctrl-0 = <&s_cir0_pins_a>;
pinctrl-1 = <&s_cir0_pins_b>;
...
ir_power_key_code9 = <0x03>;
ir_addr_code9 = <0x2c40>;
wakeup-source;
status = "okay";
};
添加第10个power键,同理/longan/device/config/chips/h618/configs/p2/uboot-board.dts
&s_cir0 {
pinctrl-names = "default","sleep";
pinctrl-0 = <&s_cir0_pins_a>;
pinctrl-1 = <&s_cir0_pins_b>;
s_cir0_used = <1>;
...
ir_power_key_code9 = <0x03>;
ir_addr_code9 = <0x2c40>;
wakeup-source;
status = "okay";
};
5. 验证
如果配置成功后,通过getevent -l可以看到不同的打印结果
console:/ $ getevent -l
add device 1: /dev/input/event1
name: "sunxi-ir-uinput"
add device 2: /dev/input/event0
name: "sunxi-ir"
/dev/input/event0: EV_REP REP_DELAY 00000000
/dev/input/event1: EV_REP REP_DELAY 00000000
/dev/input/event0: EV_REP REP_PERIOD 00000000
/dev/input/event1: EV_REP REP_PERIOD 00000000
/dev/input/event0: EV_MSC MSC_SCAN 012c401c
/dev/input/event1: EV_KEY KEY_F8 DOWN
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event1: EV_SYN SYN_REPORT 00000000
/dev/input/event0: EV_MSC MSC_SCAN 002c401c
/dev/input/event1: EV_KEY KEY_F8 UP
/dev/input/event0: EV_SYN SYN_REPORT 00000000
/dev/input/event1: EV_SYN SYN_REPORT 00000000