当前网上讲android 按键流程的文章,要么专注在android收到事件后的处理流程。
要么只讲解底层红外硬件解码原理,没有能将android层和linux层面联合讲解的透彻而简单易懂的。
对android的 Generic.kl和底层红外解码到内核驱动的转换对应关系部分含糊不清,使人看来一头雾水
对那些想要弄清楚整系统完整流程全貌的人来说,不禁要问这写的什么玩意。
本文目的:
通过适配一款红外遥控器,完全讲清楚 按键事件从硬件--》驱动-》Android的转换流程,
祭奠这苦逼的爆肝12个小时。
在Android系统中,按键事件的转换对齐主要有两次,
第1次,在驱动底层的 通过dts ,红外解码到 linux 按键的对应:
rk 平台获取解码红外按键后的值的方法是:
echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
按遥控器向右按键:
读取到 RMC_GETDATA=3e ,3e 修改到上面的 dts中。
经过这个对齐,在红外控制驱动中,解码到红外按键值为3e 的时候,调用内标准接口
input_event、input_sync。
input_event(ddata->input, EV_KEY, ddata->keycode, 1);
input_sync(ddata->input);
向设备节
点/dev/input/event0 写入dts中对齐好的KEY_RIGHT事件,从底层驱动的角度,可以理解为是向上层上报事件。
第2次 是Android上层的input 应用程序服务 通过遍历监听/dev/input/ 下的文件,获取到驱动底层上报的按键事件后,通过二次对齐文件 Generic.kl ,
find frameworks/ -name Generic.kl
frameworks/base/data/keyboards/Generic.kl
格式:key <SCAN_CODE> <ANDROID_KEYCODE> [FLAGS]
将linux 标准定义的事件
转换为按Android标准定义的按键事件:
然后分发给Android系统进行处理。
至于纯Android 层面的按键分发处理流程也比较绕,
但不是本文描述的目的了
2025年3月18日01:45:18
在此吐槽下某思的Android红外按键流程,还引入了一个用户态的ir_user 应用程序,码红外文章后,
再通过应用程序中转然后再次通过vinput 注入内核态,然后再上报给Android,真的非常低效而无用又过度设计
上效果视频:
AOSP 13 rk3568红外操作效果视频