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