android 7.1 rk3399 适配 IR 遥控器
先看效果:
DIY 外壳:
开发板买来,一直是用来学习安卓的,以前有一块 4412 android 4.4 ,实测性能的确太差,看电影都卡。先是花200买了个 rk3288 效果也不错,但是 IR 电路少元件,又花了300买了一个二手的 rk3399 ,只有裸板,这次正好 用 一个装手机贴膜的盒子 DIY 一个,直接拿裸板的确是太扎手了,手上还有静电也对板不好。
以前,一直是插鼠标,当 TV 盒子用的,也不是太方便,直到前年的时候,有个同事离职的时候,丢了几个板子和一些小配件给我,里面就有一个 红外遥控器,的确是安卓用的,按键也挺全。
最近也在搞安卓相关的开发,正好把这个也搞搞。
其实,这个难度不大,仅需要修改 设备树 就可以了。
虽然板子不是 这家的,但是也能做为参考
https://wiki.t-firefly.com/zh_CN/Firefly-RK3399/driver_ir.html
打开遥控器键码打印
echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
全部的键,分别按一次
dmesg 查看内核打印
[ 414.035531] init: Untracked pid 2503 exited with status 0 [ 541.694656] USERCODE=0xff00 [ 541.721567] RMC_GETDATA=eb 电源 [ 561.002406] USERCODE=0xff00 [ 561.029277] RMC_GETDATA=fd 上 [ 562.223270] USERCODE=0xff00 [ 562.250182] RMC_GETDATA=fc 下 [ 562.972342] USERCODE=0xff00 [ 562.999333] RMC_GETDATA=fb 左 [ 563.659345] USERCODE=0xff00 [ 563.686279] RMC_GETDATA=fa 右 [ 579.286773] USERCODE=0xff00 [ 579.313627] RMC_GETDATA=fe 确定 [ 587.453435] USERCODE=0xff00 [ 587.480369] RMC_GETDATA=ff 主页 [ 593.331801] USERCODE=0xff00 [ 593.358781] RMC_GETDATA=e9 返回 [ 599.380030] USERCODE=0xff00 [ 599.406982] RMC_GETDATA=e8 菜单 [ 605.250435] USERCODE=0xff00 [ 605.277300] RMC_GETDATA=ef 音量+ [ 615.850009] USERCODE=0xff00 [ 615.876964] RMC_GETDATA=f6 音量-
将按键值和用户码,写到设备树里面,重新生成 resource.img 烧到板子上就行了,这个不同的平台不一样,有的android 是要刷 dtb.img 有的是 boot.img 不一样,要看平台,如果想省事,就刷一个整体大包。
编译安卓7.1.2 遇到2个错误:
[ 59% 30431/51334] Building with Jack: out/ta...ramework_intermediates/with-local/classes.de FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)). GC overhead limit exceeded. Try increasing heap size with java option '-Xmx<size>'. Warning: This may have produced partial or corrupted output. [ 59% 30431/51334] target C++: libart <= art...untime/interpreter/interpreter_switch_impl.c ninja: build stopped: subcommand failed. build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed make: *** [ninja_wrapper] Error 1
内存给的太少了,直接给 虚拟机 15G 内存,宿主机仅有 16G 内存,主机卡的不行。
SSL error when connecting to the Jack server Try jack-diagnose
ps aux|grep jack 4885 162 24.4 11048556 3666956 ? Sl 12:43 84:25 java -XX:MaxJa vaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredComp ilation -cp /.jack-server/launcher.jar com.android.jack.launcher.Server Launcher 114597 0.0 0.0 21312 964 pts/20 S+ 13:35 0:00 grep --color=a uto jack
解决 手动停止下 jack 然后在正常编译安卓就正常了:
prebuilts/sdk/tools$ ./jack-admin kill-server
Killing background server
安卓 system 挂载为 可读写的方法:(低版本 adb 没有 disable-verity 命令,请使用最新版本 adb)
adb disable-verity
adb root
adb remount
安卓中使用 红外 遥控器的事件处理比 linux 多了 kl 如 :/system/usr/keylayout/ff420030_pwm.kl
一个键值,可以设置映射到另一个键值上。
红外信号,通过38M 一体化接收头接收到,然后使用 PWM进行捕获,在通过比较设备树中配置的用户码和键码,上报 input event 到内核 , 在交给安卓 输入子系统进行处理。