当前位置: 首页 > news >正文

android 发送onkey广播,Android 添加键值并上报从驱动到上层

kernel部分添加键值:

1.在dts中(kernel/arch/arm64/boot/dts/rockchip/px30-hyperlcd-core.dtsi)添加键值属性,可以仿照power按键配置

gpio_keys: gpio-keys {status = "okay";compatible = "gpio-keys";autorepeat;pinctrl-names = "default";pinctrl-0 = <&leds_keys_gpio>;key_sw1 {debounce-interval = <100>;gpios = <&gpio1 19 GPIO_ACTIVE_LOW>;label = "GPIO Key sw1";linux,code = <KEY_FRONT>;// wakeup-source;gpio-key,wakeup;};};&pinctrl {gpio-keys {leds_keys_gpio: leds_keys-gpio {rockchip,pins = <1 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none>;};};	
};

因我们使用的键值操作是通过gpio触发的,则配置成gpio-key。

kernel/drivers/input/keyboard/gpio_keys.c

kernel/include/dt-bindings/input/rk-input.h

关于linux,code = <KEY_FRONT>;里的KEY_FRONT,可以在rk-input.h查看

这里KEY_FRONT为132,后面的onkeydown onkeyup中的返回事件中ScanCode,也是132

测试验证

通过调试串口或者ADB进入系统,执行getevent -l命令测试GPIO按键,命令如下:

130|console:/ # getevent -l
add device 1: /dev/input/event3name:     "gpio_keys"
add device 2: /dev/input/event1name:     "rk805 pwrkey"
add device 3: /dev/input/event2name:     "adc-keys"
add device 4: /dev/input/event0name:     "fdd70030.pwm"
add device 5: /dev/input/event4name:     "rk-headset"


执行后,将GPIO4_A4对应的引脚短接到GND即可触发,如下所示:

当成功返回键值即可测试成功。

配置onkeydown onkeyUP

1.由于按键是先down后up,这个流程逻辑在frameworks/native/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp里可以配置

void KeyboardInputMapper::processKey(nsecs_t when, bool down, int32_t scanCode, } else {// Remove key down.ssize_t keyDownIndex = findKeyDown(scanCode);if (keyDownIndex >= 0) {// key up, be sure to use same keycode as before in case of rotationkeyCode = mKeyDowns[keyDownIndex].keyCode;mKeyDowns.erase(mKeyDowns.begin() + (size_t)keyDownIndex);} else if (scanCode == 132) {//特殊处理} else {// key was not actually downALOGI("Dropping key up from device %s because the key was not down.  ""keyCode=%d, scanCode=%d",getDeviceName().c_str(), keyCode, scanCode);return;}}

从这里可以看到,当先收到某个scanCode的keyup,但是在表里没找到对应的keydown数据,就会直接return,不会再走下面的onkeyup方法,提示如下

Dropping key up from device %s because the key was not down.  ""keyCode=%d, scanCode=%d"

这里要注意下配置的这个gpio默认状态是不是就已经是down状态了(比如gpio默认就是低电平,默认已经按下了,就是down操作),这个时候拉高gpio电位,从framework认为是up操作,但由于framework没收到过down,所以系统会直接return掉,这个地方记得改下就可以了

2.可通过调用frameworks/base/core/java/android/view/KeyEvent.java中的接口去拦截键值

public final boolean dispatch(Callback receiver, DispatcherState state,Object target) {

这里是我添加的,是针对某个特殊功能,让这个gpio在按下和抬起时,都发送onekydown指令所以改动的,如果有其它onkeydown onkeyup事件拦截 也应该在这里

3.frameworks/base/core/java/android/view/View.java

这里是下发onkeydown onkeyup回调的地方

相关文章:

  • PerfettoSQL
  • 【RAG】一篇文章介绍多模态RAG(MRAG)
  • 电商虚拟户分账系统:破解电商资金管理难题的密钥
  • 蓝牙耳机开发--提示音制作生成的方法
  • 深入探索RAG:用LlamaIndex为大语言模型扩展知识,实现智能检索增强生成
  • Win10 关闭自动更新、关闭自动更新并重启
  • Jetson Orin NX 16G 配置GO1强化学习运行环境
  • 深度学习中的“重参数化”总结
  • 互联网大厂Java面试:软件架构与大型网站架构设计的较量
  • 操作系统-用户级-内核级线程
  • IOT项目——物联网 GPS
  • 25.4.22华为--算法真题整理(2025年4月22日)
  • 全本地化智能数字人
  • 一个 HTTP 请求进入 Spring MVC 应用后,大致经历了哪些主要步骤?
  • 电商平台数据采集与 QPS 计算全流程解析
  • 逻辑思维与软件开发:从选定方向到风险管理的全流程
  • Linux DRM显示驱动框架技术总结
  • 进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程
  • 今日CSS笔记
  • SAS宏调试:高效定位与解决典型问题
  • 上海市进一步支持汽车置换更新!一图读懂补贴政策实施细则
  • 五一节,和人民照相馆一起找回“拍照”的仪式感
  • 外贸50城,谁在“扛大旗”?
  • 上海银行换帅:顾建忠出任党委书记,金煜辞任董事长
  • 大连万达商业管理集团提前兑付“22大连万达MTN001” ,本息2.64亿元
  • 王忠诚出任四川遂宁代市长,此前为成都市政府秘书长