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回调的地方

相关推荐
alexhilton20 分钟前
深入理解Jetpack Compose中的函数的执行顺序
android·kotlin·android jetpack
李新_1 小时前
Android 画中画避坑指北
android
一一Null2 小时前
Android studio—socketIO库return与emit的使用
android·java·网络·ide·websocket·网络协议·android studio
ansondroider3 小时前
Android RK356X TVSettings USB调试开关
android·adb·usb·otg·rk356x
全栈极简3 小时前
Android串口通信
android
jiaxingcode3 小时前
MAC系统下完全卸载Android Studio
android·macos·android studio
张力尹3 小时前
「架构篇 1」认识 MVC / MVP / MVVM / MVI
android·面试·架构
张力尹3 小时前
「架构篇 2」认识 MVC / MVP / MVVM / MVI
android·面试·架构
不穿铠甲的穿山甲3 小时前
Android-KeyStore安全的存储系统
android·安全