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/event3
  name:     "gpio_keys"
add device 2: /dev/input/event1
  name:     "rk805 pwrkey"
add device 3: /dev/input/event2
  name:     "adc-keys"
add device 4: /dev/input/event0
  name:     "fdd70030.pwm"
add device 5: /dev/input/event4
  name:     "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 rotation
            keyCode = mKeyDowns[keyDownIndex].keyCode;
            mKeyDowns.erase(mKeyDowns.begin() + (size_t)keyDownIndex);
        } else if (scanCode == 132) {
            //特殊处理
        } else {
            // key was not actually down
            ALOGI("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回调的地方

相关推荐
Libraeking1 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位1 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen1233 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs4 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob4 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔4 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9964 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly6 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首7 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19439 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed