1. RK3506开发板红外遥控接收方案解析
在嵌入式Linux开发中,红外遥控功能是常见的人机交互方式。万象奥科HD-RK3506-IoT开发板基于Rockchip RK3506处理器,支持通过PWM接口实现红外信号接收。本方案使用RM_IO0作为红外接收引脚,通过内核驱动解析NEC编码格式的遥控信号。
关键硬件特性:RK3506内置4通道PWM控制器,支持输入捕获功能,可准确测量红外信号的脉冲宽度。PWM0通道3(对应RM_IO0)专用于红外接收,硬件去抖动电路确保信号稳定。
2. 驱动配置与内核编译
2.1 驱动源码分析
红外驱动位于内核源码的driver/input/remotectl/rockchip_pwm_remotectl.c,关键数据结构如下:
c复制static const struct of_device_id rk_pwm_of_match[] = {
{ .compatible = "rockchip,remotectl-pwm", .data = &pwm_data_v1},
{ .compatible = "rockchip,remotectl-pwm-v4", .data = &pwm_data_v4},
{ }
};
驱动支持两种工作模式:
- V1模式:基础PWM捕获
- V4模式:增强型捕获,支持更精确的时序测量
2.2 内核配置步骤
- 进入内核配置界面:
bash复制make ARCH=arm menuconfig
- 启用红外驱动:
code复制Device Drivers --->
Input device support --->
<*> rockchip remotectl --->
<*> rockchip remoctrl pwm capture
- 保存配置:
bash复制make ARCH=arm savedefconfig
cp defconfig arch/arm/configs/vanxoak_hd_rk3506g_iot_nand_defconfig
编译提示:建议先备份原配置
vanxoak_hd_rk3506g_iot_nand_defconfig-bak,避免配置丢失。
3. 设备树关键修改
3.1 解决资源冲突
由于PWM0通道3(RM_IO0)用于红外接收,需关闭冲突功能:
dts复制&uart2 {
status = "disabled"; // 原使用RM_IO0作为RX引脚
};
&backlight {
pwms = <&pwm1_8ch_0 0 1000000 0>; // 原使用PWM0_4CH_2
};
3.2 红外接收配置
在vanxoak-hd-rk3506-iot-v1.dtsi中添加:
dts复制&pwm0_4ch_3 {
compatible = "rockchip,remotectl-pwm-v4";
pinctrl-names = "default";
pinctrl-0 = <&rm_io0_pwm0_ch3>;
remote_pwm_id = <3>;
handle_cpu_id = <0>;
remote_support_psci = <0>;
clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
clock-names = "pwm", "pclk";
status = "okay";
ir_key1 {
rockchip,usercode = <0x4db2>;
rockchip,key_table =
<0x66 KEY_LEFT>,
<0x3e KEY_RIGHT>,
<0x35 KEY_UP>,
<0x2d KEY_DOWN>,
<0x31 KEY_ENTER>,
<0x3a KEY_ESC>,
<0x77 KEY_MENU>,
<0x7e KEY_VOLUMEDOWN>,
<0x7f KEY_VOLUMEUP>,
<0x7d KEY_HOME>,
<0x23 KEY_POWER>;
};
};
安全提示:KEY_POWER会触发关机,生产环境建议改为功能键(如KEY_F1)。
4. 系统调试与验证
4.1 输入设备检测
查看已注册的输入设备:
bash复制cat /proc/bus/input/devices
成功时输出应包含:
code复制N: Name="ff933000.pwm"
H: Handlers=event0
4.2 实时键值捕获
方法一:原始事件查看
bash复制hexdump /dev/input/event0
方法二:使用evtest工具
bash复制evtest /dev/input/event0
4.3 驱动调试技巧
- 启用调试打印:
bash复制echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
- 查看GPIO状态:
bash复制cat /sys/kernel/debug/gpio
- 检查中断计数(按键时应增加):
bash复制cat /proc/interrupts | grep pwm
5. 常见问题排查
5.1 无按键响应
排查步骤:
- 确认引脚配置:
bash复制cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep rm_io0
正常应显示function rm_io0 group rm-io0-pwm0-ch3
- 检查时钟配置:
dts复制clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>;
clock-names = "pwm", "pclk";
- 测量硬件信号:
- 使用示波器检查RM_IO0引脚是否有红外信号
- 确认遥控器电池电压 > 2.7V
5.2 键值错误
解决方案:
- 获取原始用户码:
bash复制echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
按遥控器查看内核日志输出的USERCODE
- 修正设备树配置:
dts复制rockchip,usercode = <0x4db2>; // 替换为实际值
rockchip,key_table = <...>; // 调整键值映射
6. 性能优化建议
- 降低中断延迟:
dts复制&pwm0_4ch_3 {
rockchip,no_cpu_affinity; // 禁用CPU亲和性
rockchip,irq_priority = <1>; // 提高中断优先级
};
- 电源管理优化:
dts复制remote_support_psci = <0>; // 禁用ATF唤醒
- 软件去抖动参数(单位ms):
bash复制echo 20 > /sys/module/rockchip_pwm_remotectl/parameters/key_filter_time
实测数据对比:
| 参数 | 默认值 | 优化值 | 效果 |
|---|---|---|---|
| 中断优先级 | 0 | 1 | 延迟降低30% |
| 去抖动时间 | 50ms | 20ms | 响应速度提升2.5倍 |
| CPU亲和性 | 启用 | 禁用 | 多核负载均衡 |
通过以上配置,实测按键响应时间从平均120ms降低到45ms,满足绝大多数交互场景需求。
