保姆级教程:在RK3128 Android 7.1上搞定红外遥控(从DTS到.kl文件全流程)
RK3128 Android 7.1红外遥控全流程实战指南
在嵌入式开发领域,红外遥控功能看似基础,实则暗藏玄机。本文将带您深入RK3128平台,从硬件确认到系统配置,手把手完成红外遥控功能的完整实现。无论您是初次接触RK3128的开发者,还是需要快速复现红外功能的技术人员,这份保姆级教程都将成为您的实用参考。
1. 硬件准备与环境搭建
在开始软件配置前,必须确保硬件环境正确无误。RK3128开发板通常配备PWM接口用于红外接收,首先需要确认以下几点:
- 红外接收头连接:检查开发板原理图,确认红外接收器正确连接到PWM接口(常见为PWM3)
- 供电检查:使用万用表测量红外接收头供电电压(通常为3.3V)
- 信号测试:用逻辑分析仪或示波器观察遥控器按键时的信号波形
提示:若缺乏专业仪器,可通过ADB命令初步验证红外接收是否工作:
adb shell cat /proc/interrupts | grep pwm
开发环境准备:
# 安装必要的开发工具 sudo apt-get install android-tools-adb git-core gnupg flex bison gperf build-essential # 配置ADB连接 adb kill-server adb start-server adb devices2. DTS配置详解
设备树(DTS)是Linux内核识别硬件的关键配置。对于RK3128红外功能,需要重点关注remotectl节点配置。
2.1 基础DTS配置
以下是一个完整的PWM红外配置示例:
&pwm3 { status = "okay"; interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; compatible = "rockchip,remotectl-pwm"; remote_pwm_id = <3>; handle_cpu_id = <1>; remote_support_psci = <1>; ir_key1 { rockchip,usercode = <0xff00>; rockchip,key_table = <0xeb KEY_POWER>, /* 电源键 */ <0xec KEY_MENU>, /* 菜单键 */ <0xfe KEY_BACK>, /* 返回键 */ <0xb7 KEY_HOME>, /* 主页键 */ <0xa3 KEY_VOLUMEUP>, <0xf4 KEY_VOLUMEDOWN>; }; };关键参数说明:
| 参数 | 说明 | 典型值 |
|---|---|---|
| remote_pwm_id | 使用的PWM通道 | 3 |
| rockchip,usercode | 遥控器厂商代码 | 需实际测试 |
| rockchip,key_table | 键值映射表 | 自定义 |
2.2 键码获取实战
获取真实键值的两种方法:
方法一:通过串口调试
echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print cat /proc/kmsg方法二:ADB调试(无串口时)
adb root adb shell echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print cat /proc/kmsg典型输出示例:
[ 123.456789] remotectl: scancode = 0xaa [ 123.456790] remotectl: keycode = 0xaa3. 键值映射与.kl文件配置
3.1 内核键值映射
内核键值定义位于:
sdk/kernel/include/uapi/linux/input.h常见键值宏定义:
#define KEY_POWER 116 #define KEY_HOME 102 #define KEY_BACK 158 #define KEY_MENU 1393.2 KL文件配置实战
- 确定输入设备名称:
getevent -l- 查看当前使用的KL文件:
cat /proc/bus/input/devices- 创建或修改KL文件(示例):
key 116 POWER key 102 HOME key 158 BACK key 139 MENU key 115 VOLUME_UP key 114 VOLUME_DOWN常见问题排查:
- 键值无响应:检查KL文件权限是否为644
- 键值错误:确认内核键值与Android键值映射一致
- 设备不识别:检查KL文件名是否与输入设备匹配
4. 电源管理与唤醒设置
4.1 低功耗唤醒配置
在DTS中添加唤醒支持:
&rockchip_suspend { status = "okay"; rockchip,wakeup-config = < (RKPM_GPIO_WKUP_EN | RKPM_PWM_WKUP_EN) >; rockchip,pwm-regulator-config = <PWM3_REGULATOR_EN>; };4.2 U-Boot开机支持
修改U-Boot源码实现红外开机:
// 路径:u-boot/board/rockchip/common/rkloader/pwm_remotectl.c static struct rkxx_remote_key_table remote_key_table[] = { {0xeb, KEY_POWER}, // 与DTS中定义的电源键值一致 }; static struct rkxx_remotectl_button remotectl_button[] = { { .usercode = 0xff00, .nbuttons = 1, .key_table = &remote_key_table[0], }, };编译并烧写U-Boot:
make rk3128_defconfig make -j4 ./tools/rkdeveloptool wl 0x0 u-boot.bin5. 高级调试与问题排查
5.1 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 部分按键无响应 | 键值映射错误 | 重新获取键值并更新DTS |
| 遥控距离短 | 接收头灵敏度不足 | 调整接收头偏置电压 |
| 唤醒不稳定 | 电源管理配置不当 | 检查rockchip_suspend节点 |
| U-Boot无法开机 | 键值不匹配 | 确保U-Boot与内核键值一致 |
5.2 性能优化建议
- 调整红外接收灵敏度:
&pwm3 { rockchip,remote_sensitivity = <0x7d0>; // 默认2000,可适当减小 };- 增加去抖时间(单位ms):
rockchip,remote_debounce = <100>;- 多遥控器支持配置:
ir_key1 { rockchip,usercode = <0xff00>; // ...键值表 }; ir_key2 { rockchip,usercode = <0xfe01>; // ...不同遥控器的键值表 };在实际项目中,我发现最易出错的是DTS键值与U-Boot键值的不一致问题。建议建立一个键值映射表文档,同步更新所有相关配置。调试时,可先用getevent工具验证各层键值传递是否正确,再逐步排查问题环节。
