T527 IR-RX 调试
文章目录
- 1、环境介绍
- 2、T527 CIR Receiver
- 3、原理图查看
- 4、设备树配置
- 5、内核配置
- 6、验证
- 7、添加新遥控器
- 7.1、添加 keymap 文件
- 7.2、修改设备树
- 7.3、驱动注册流程
- 8、测试
- 9、总结
1、环境介绍
硬件:t527板卡
软件:原厂t527-tina5.0-aiot-v1.4 sdk(buildroot,Linux 5.15)
2、T527 CIR Receiver
t527 有两个独立的 CIR_RX 接口,64×8 位数据缓冲 FIFO,最高支持 1MHz 采样频率,支持 NEC 协议格式的红外数据传输。
3、原理图查看
t527 板卡板载一个 IRM-V838M3-C 红外遥控接收头:
4、设备树配置
&s_irrx {pinctrl-names = "default", "sleep";pinctrl-0 = <&s_irrx_pins_default>;pinctrl-1 = <&s_irrx_pins_sleep>;status = "okay";
};&r_pio {s_irrx_pins_default: s_irrx@0 {pins = "PM5";function = "s_cir";};s_irrx_pins_sleep: s_irrx@1 {pins = "PM5";function = "gpio_in";};
};
5、内核配置
CONFIG_AW_IR_RX=y
6、验证
root@t527:~ # cat /proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi_ir_recv"
P: Phys=sunxi_ir_recv/input0
S: Sysfs=/devices/platform/soc@3000000/7040000.s_irrx/rc/rc0/s_cir_rx
U: Uniq=
H: Handlers=kbd event0
B: PROP=20
B: EV=100017
B: KEY=20000000000000 0 0 0 0 0 18000 40000800 1c004000000000 4ffc
B: REL=3
B: MSC=10
7、添加新遥控器
如下是要使用的遥控器,现在为其添加 keymap:
7.1、添加 keymap 文件
进入路径<sdk>/kernel/linux-5.15/drivers/media/rc/keymaps
:
touch rc-myremote.c
// SPDX-License-Identifier: GPL-2.0+
// myremote.h - Keytable for myremote Remote Controller
//
// Keytable for your custom remote#include <media/rc-map.h>
#include <linux/module.h>static struct rc_map_table myremote[] = {/* 这些数值是按键的扫描码,以 KEY_POWER 为例,在开发板执行evtest命令,用红外遥控按下POWER按键,查看扫描码为45:Event: time 59120.395400, type 4 (EV_MSC), code 4 (MSC_SCAN), value 45每一个按键都是如此操作,自行添加映射关系。*/{ 0x45, KEY_POWER },{ 0x47, KEY_MENU },{ 0x15, KEY_PLAY },{ 0x40, KEY_VOLUMEUP },{ 0x19, KEY_VOLUMEDOWN },{ 0x09, KEY_FASTFORWARD },{ 0x07, KEY_FASTREVERSE },{ 0x0d, KEY_BACKSPACE },{ 0x43, KEY_BACK },{ 0x44, KEY_HOME },{ 0x16, KEY_0 },{ 0x0c, KEY_1 },{ 0x18, KEY_2 },{ 0x5e, KEY_3 },{ 0x08, KEY_4 },{ 0x1c, KEY_5 },{ 0x5a, KEY_6 },{ 0x42, KEY_7 },{ 0x52, KEY_8 },{ 0x4a, KEY_9 },
};static struct rc_map_list myremote_map = {.map = {.scan = myremote,.size = ARRAY_SIZE(myremote),.rc_proto = RC_PROTO_NEC, .name = "rc-myremote",}
};static int __init init_rc_map_myremote(void)
{return rc_map_register(&myremote_map);
}static void __exit exit_rc_map_myremote(void)
{rc_map_unregister(&myremote_map);
}module_init(init_rc_map_myremote);
module_exit(exit_rc_map_myremote);MODULE_LICENSE("GPL");
MODULE_AUTHOR("Cohen0415");
修改 <sdk>/kernel/linux-5.15/drivers/media/rc/keymaps/Makefile
:
修改<sdk>/kernel/linux-5.15/include/media/rc-map.h
:
7.2、修改设备树
在设备树中指定要使用的 keymap:
&s_irrx {pinctrl-names = "default", "sleep";pinctrl-0 = <&s_irrx_pins_default>;pinctrl-1 = <&s_irrx_pins_sleep>;linux,rc-map-name = "rc-myremote"; // 指定 keymap,这里的名字要和rc_map_list结构体中的name一样status = "okay";
};
7.3、驱动注册流程
rc-myremote.c (keymap模块)││ module_init(rc_myremote_init)▼
rc_map_register(&rc_myremote_map)││ 注册 keymap -> 放入全局 rc_map_list 链表▼
ir 驱动 (sunxi-ir-rx.c: sunxi_irrx_probe)││ 解析设备树 linux,rc-map-name = "rc-myremote"▼
rc_dev->map_name = "rc-myremote"││ 注册 rc_dev▼
内核遥控子系统根据 map_name 从链表查找并绑定 keymap││ 接收到红外扫描码时,查表转换为 input 事件▼
input 子系统上报 KEY_XXX
8、测试
9、总结
参考文章:
《D1_Tina_Linux_红外_开发指南.pdf》
《Linux_IR_RX_开发指南.pdf》