RK3288_Android7.1增加自定义的红外遥控按键流程记录

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,不然会编译出错。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在 Android 7.1 的源码中,您可以通过修改 fstab 文件或 init.rc 文件来添加一个可被电脑识别的分区。具体来说,您可以按照以下步骤进行操作: 1. 确定您要挂载的分区的设备节点名称,例如 `/dev/sdb1`。 2. 打开设备的 fstab 文件,例如 `/vendor/etc/fstab.rk3288`,在其中添加一行类似于以下内容的条目: `/dev/block/sdb1 /mnt/usb_storage vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro 0 0` 这个条目的意思是将 `/dev/block/sdb1` 这个设备节点挂载到 `/mnt/usb_storage` 这个挂载点,使用 vfat 文件系统,具有一系列选项,例如读写权限、字符集等。 3. 如果您想要在设备启动时自动挂载该分区,可以修改设备的 init.rc 文件。具体来说,您可以在文件中添加以下内容: ``` mount /dev/block/sdb1 /mnt/usb_storage vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0002,dmask=0002,allow_utime=0020,codepage=936,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro ``` 这个命令的意思是在设备启动时将 `/dev/block/sdb1` 挂载到 `/mnt/usb_storage`,使用 vfat 文件系统,具有一系列选项。 请注意,上述操作可能需要 root 权限才能执行,同时修改系统文件可能会导致系统不稳定或无法正常启动,请谨慎操作,并备份好您的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零意@

您的打赏将是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值