[RK3288][android11] 适配红外遥控器

生活中充满了各种波长的电磁波,所谓的可见(色)光就是人眼可见的电磁波谱,其波长为 380~770nm,为了避免遥控器发射的光造成人眼不适及减少一般人造光源干扰,故选用人眼不可见的红外线(Infrared)波长,目前业界遥控器发射头几乎都选用 940nm 波长。
在这里插入图片描述
红外线遥控器的应用也是一种无线讯号传输,跟大部分的无线传输技术一样,为了避免环境中同波长电磁波的干扰,故会在其传输讯号上加上如下图所示的载波(carrier frequency),在遥控应用的载波范围为 30~60kHz,而 38kHz 为最常见的载波频率。
在这里插入图片描述
目前红外遥控协议有RC5、 SIRCS、 Sy、 RECS80、Denon、NEC、Motorola、Japanese、SAMSWNG 和 Daewoo 等。Rockchip平台只支持 NEC 编码,国内电器大多使用该编码协议。


RK平台PWM 有三种工作模式, reference mode, one-shot mode 和 continuousmode. 红外遥控器就采用 reference mode,这种模式下 PWM 可以捕获输入高低电平的宽度,并产生中断,CPU接收到中断后去相应的寄存器读取。

1. 参照原理图添加内核IR的配置

在这里插入图片描述

1.1 向正在使用的设备树添加如下配置:

&pwm3 {
    
    
    status = "okay";

    compatible = "rockchip,remotectl-pwm";
    remote_pwm_id = <3>;
    handle_cpu_id = <1>;
    remote_support_psci = <0>;
    pinctrl-names = "default";
    pinctrl-0 = <&pwm3_pins>;

    ir_key1 {
    
    
        rockchip,usercode = <0x4040>;
        rockchip,key_table =
            <0xf2    KEY_REPLY>,
            <0xba    KEY_BACK>,
            <0xf4    KEY_UP>,
            <0xf1    KEY_DOWN>,
            <0xef    KEY_LEFT>,
            <0xee    KEY_RIGHT>,
            <0xbd    KEY_HOME>,
            <0xea    KEY_VOLUMEUP>,
            <0xe3    KEY_VOLUMEDOWN>,
            <0xe2    KEY_SEARCH>,
            <0xb2    KEY_POWER>,
            <0xbc    KEY_MUTE>,
            <0xec    KEY_MENU>,
            <0xbf    0x190>,
            <0xe0    0x191>,
            <0xe1    0x192>,
            <0xe9    183>,
            <0xe6    248>,
            <0xe8    185>,
            <0xe7    186>,
            <0xf0    388>,
            <0xbe    0x175>;
    };
......
};

1.2 查看输入设备,找到刚添加的pwm红外设备。驱动加正常加载,接下来就是对照键值添加遥控器。

\> adb shell
rk3568_r:/ # getevent
add device 1: /dev/input/event3
  name:     "Logitech USB Optical Mouse"
add device 2: /dev/input/event2
  name:     "WDR USB Camera: WDR USB Camera"
add device 3: /dev/input/event0
  name:     "fdd70030.pwm"
add device 4: /dev/input/event1
  name:     "rk805 pwrkey"
add device 5: /dev/input/event4
  name:     "adc-keys"
add device 6: /dev/input/event5
  name:     "rk-headset"

2. 添加红外按键上报键值(rk平台单独定义)

rk平台可直接查看红外接收,打开键值命令如下:

echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print

内核日志太多,可使用adb 命令(或者串口打印)过滤直接得到键值,USERCODE 添加遥控dts 对应的 rockchip,usercode,RMC_GETDATA 对应键值可通过rockchip,key_table 转换为rk-input键值。

adb root;adb shell
# cat /dev/kmsg | grep USERCODE -A 2
6,1136,469064745,-;USERCODE=0x4040
6,1137,469091760,-;RMC_GETDATA=b2
6,1138,482889791,-;USERCODE=0x4040
6,1139,482916765,-;RMC_GETDATA=b4

字母和符号键都是 linux 的标准键值,可以在 kernel/include/dt-bindings/input/linux-event-codes.h文件查看。


3. 添加键值转换

Linux标准键值与Android的标准键值并不相同,需要转换文件匹配对应关系。中间转换配置文件会根据红外遥控使用PWM匹配对应PWM标号所属名的配置文件。此次调试使用PWM3对应的编号pwm3: pwm@fdd70030 {,键值转换配置文件名为fdd70030_pwm.kl,设备描述文件则为fdd70030_pwm.idc。

Android 键值有不懂可以查看 frameworks/base/core/java/android/view/KeyEvent.java文件;
临时调试可手动拷贝到 /vendor/usr/keylayout,重启生效。

fdd70030_pwm.idc

device.internal = 1 #是否为内部设备
audio.mic = 0 #是否带mic

dd70030_pwm.kl

key 116   POWER
key 102   HOME
key 139   MENU
key 113   VOLUME_MUTE

key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 158   BACK

key 232   DPAD_CENTER
key 103   DPAD_UP
key 108   DPAD_DOWN
key 105   DPAD_LEFT
key 106   DPAD_RIGHT
key 240   PROFILE_SWITCH

key 15    TAB
key 104   PAGE_UP
key 109   PAGE_DOWN

key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 52    PERIOD
key 111   DEL

key 119   MEDIA_PAUSE
key 207   MEDIA_PLAY

key 418   F3
key 419   F4

4. 自动编译构建

需要将 fdd70030_pwm.kl 和fdd70030_pwm.idc 拷贝到 device/rockchip/common目录下。并在device.mk添加拷贝规则,编译时会自动拷贝到指定目录。

PRODUCT_COPY_FILES += \
    device/rockchip/common/fdd70030_pwm.kl:system/usr/keylayout/fdd70030_pwm.kl \

调试过程中power按键没有作用问题:
理论上添加完 usercode以及keycode 后,系统需要重新启动一次后power键才会起作用。(此时reboot后看串口打印keycode值,跟一下u-boot阶段代码直接替换之前的powerkey_keycode值),可实现第一次烧录开机power键可用的效果。
在这里插入图片描述

注:
a) "确定"键,是 KEY_REPLY。
b) /vendor/usr/keylayout 与/system/usr/keylayout 作用相同。
c) 红外注册失败,可查看PWM GPIO复用(iomux)。

猜你喜欢

转载自blog.csdn.net/weixin_45639314/article/details/131127607