1、第一步是在 dts 中对应的IR节点增加按键键值,注意文件中要#include对应的 input.h 头文件。
--- a/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
+++ b/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
@@ -43,6 +43,7 @@
/dts-v1/;
#include "rk3288-evb.dtsi"
#include "rk3288-android.dtsi"
+#include <dt-bindings/input/input.h> //添加加载头文件
/ {
compatible = "rockchip,rk3288-evb-android-rk808-hdmi", "rockchip,rk3288";
@@ -435,3 +436,71 @@
pinctrl-0 = <&pwm1_pin_pull_down>;
};
//add by czd for support IR-Remote on start
&pwm2 {
status = "okay";
compatible = "rockchip,remotectl-pwm";
pinctrl-names = "default";
pinctrl-0 = <&pwm2_pin>;
remote_pwm_id = <2>;
handle_cpu_id = <1>;
interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
remote_support_psci = <1>;
ir_key1{
rockchip,usercode = <0xbd02>;
rockchip,key_table =
<0x2f KEY_BACK>,
<0x35 KEY_UP>,
<0x2d KEY_DOWN>,
+ <0x1c KEY_PAD>,
<0x66 KEY_LEFT>,
2、在内核头文件 input.h 中增加按键定义,注意不能跟原有的按键键值重复,input.h 路径要与 dts 文件中头文件的一致。
--- a/kernel/include/dt-bindings/input/input.h
+++ b/kernel/include/dt-bindings/input/input.h
@@ -619,6 +619,8 @@
#define BTN_TRIGGER_HAPPY39 0x2e6
#define BTN_TRIGGER_HAPPY40 0x2e7
+ #define KEY_PAD 0x2e8
3、在键值映射文件增加键值与上层对应的关系,一般是一个*.kl文件,可以通过dumpsys input来确认当前遥控使用的是哪个kl文件。
130|rk3288:/ $ dumpsys input
2: ff680020.pwm
Classes: 0x00000401
Path: /dev/input/event0
Descriptor: d2c52ff0f656fac4cd7b7a118d575e0109a9fe1c
Location: gpio-keys/remotectl
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100
KeyLayoutFile: /system/usr/keylayout/ff680020_pwm.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false
--- a/device/rockchip/common/ff680020_pwm.kl
+++ b/device/rockchip/common/ff680020_pwm.kl
@@ -35,6 +35,8 @@
key 119 MEDIA_PAUSE
key 207 MEDIA_PLAY
+key 744 PAD
#key 400 TV_MEDIA_MULT_BACKWARD
#key 401 TV_MEDIA_MULT_FORWARD
说明:
key – 是关键字。这个是固定值,不需要改变。
744 – 该按键在linux驱动中对应的键值,具体对应的是那个可以查看input.h查看。
PAD – 744按键映射到Android中的按键,它对应是“KeycodeLabels.h”文件中的KEYCODES表格元素的“literal”值。
4、在 KeyEvent.java 中定义按键Android上层的键值,定义按键值后面有提示,新按键需要更新哪些地方。
文件路径:frameworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_PAD = 278;
private static final int LAST_KEYCODE = KEYCODE_PAD;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
// isWakeKey()
// frameworks/native/include/android/keycodes.h
// frameworks/native/include/input/InputEventLabels.h
// frameworks/base/core/res/res/values/attrs.xml
// emulator?
// LAST_KEYCODE
在当前文件中定义键值,修改最后面的键值、isSystem 和 isWakeKey 两个方法。
diff --git a/frameworks/base/core/java/android/view/KeyEvent.java b/frameworks/base/core/java/android/view/KeyEvent.java
index bcf9a46..45f6ffb 100755
--- a/frameworks/base/core/java/android/view/KeyEvent.java
+++ b/frameworks/base/core/java/android/view/KeyEvent.java
@@ -773,7 +773,9 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static final int KEYCODE_TV_MEDIA_PAUSE = 274;
//$_rbox_$_modify_$ end
- private static final int LAST_KEYCODE = KEYCODE_TV_MEDIA_PAUSE;
+ public static final int KEYCODE_PAD = 278;
+
+ private static final int LAST_KEYCODE = KEYCODE_PAD;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
@@ -1818,6 +1820,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
case KeyEvent.KEYCODE_BRIGHTNESS_DOWN:
case KeyEvent.KEYCODE_BRIGHTNESS_UP:
case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
+ case KeyEvent.KEYCODE_PAD:
return true;
}
@@ -1833,6 +1836,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
case KeyEvent.KEYCODE_WAKEUP:
case KeyEvent.KEYCODE_PAIRING:
case KeyEvent.KEYCODE_NOTIFICATION:
+ case KeyEvent.KEYCODE_PAD:
return true;
}
5、在 keycodes.h 文件中定义键值
diff --git a/frameworks/native/include/android/keycodes.h b/frameworks/native/include/android/keycodes.h
index ff998df..212fef6 100755
--- a/frameworks/native/include/android/keycodes.h
+++ b/frameworks/native/include/android/keycodes.h
@@ -307,6 +307,7 @@ enum {
AKEYCODE_TV_KEYMOUSE_UP = 262,
AKEYCODE_TV_KEYMOUSE_DOWN = 263,
AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = 264,
+AKEYCODE_PAD = 278,
AKEYCODE_HELP = 259
// NOTE: If you add a new keycode here you must also add it to several other files.
6、在 InputEventLabels.h 中添加按键标签
diff --git a/frameworks/native/include/input/InputEventLabels.h b/frameworks/native/include/input/InputEventLabels.h
index d7a06dd..4359e3f 100755
--- a/frameworks/native/include/input/InputEventLabels.h
+++ b/frameworks/native/include/input/InputEventLabels.h
@@ -304,6 +304,7 @@ static const InputEventLabel KEYCODES[] = {
DEFINE_KEYCODE(TV_KEYMOUSE_DOWN),
DEFINE_KEYCODE(TV_KEYMOUSE_MODE_SWITCH),
DEFINE_KEYCODE(HELP),
+DEFINE_KEYCODE(PAD),
{ NULL, 0 }
};
7、在 attrs.xml 中增加按键
diff --git a/frameworks/base/core/res/res/values/attrs.xml b/frameworks/base/core/res/res/values/attrs.xml
index 75157be..e591fce 100755
--- a/frameworks/base/core/res/res/values/attrs.xml
+++ b/frameworks/base/core/res/res/values/attrs.xml
@@ -1791,6 +1791,7 @@
<enum name="KEYCODE_TV_MEDIA_MULT_BACKWARD" value="272" />
<enum name="KEYCODE_TV_MEDIA_PLAY" value="273" />
<enum name="KEYCODE_TV_MEDIA_PAUSE" value="274" />
+ <enum name="KEYCODE_PAD" value="278" />
<!--$_rbox_$_modify_$_end-->
</attr>
经过如上的步骤就将"744"按键和Android系统中的KEYCODE_PAD就对应起来了,注意这里的"744“键值并不是真正意义上的744键值,他只是linux驱动向上层抛出的键值。
8、在Android的framework层的键值处理函数中,捕获按键,并进行相应处理。
在framework层的input系统中,加入对按键的捕获。
添加的文件是: frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
添加的具体方法:在PhoneWindowManager.java的interceptKeyBeforeQueueing()函数中,捕获该键值。
这样新增加一个按键定义的流程就OK了,编译需要先使用命令make update-api,不然会编译出错。