RK3288 Android11 适配红外遥控功能(超详细)

一、rk3288平台红外遥控介绍

在这里插入图片描述
  这个文档路径在a\RKDocs\common\PWM\Rockchip_Developer_Guide_PWM_IR_CN.pdf

二、原理图分析

在这里插入图片描述

三、配置设备树并使能红外遥控功能

  据上面原理图分析可知,IR_INT红外接口使用的是PWM2,因此设备树配置对应的PWM2,如下:
在这里插入图片描述
  然后开相关的宏,开启红外遥控功能:

CONFIG_ROCKCHIP_REMOTECTL=y
CONFIG_ROCKCHIP_REMOTECTL_PWM=y

  而相关的驱动文件路径在kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c

四、打开红外打印功能,查看红外遥控的用户码和键值

  查看红外接收的红外遥控用户码和键值,需要先内核中的红外接收打印功能,如下:
echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
  那么如何查看打印信息呢?查看内核打印信息有两种方法,分别是在adb中使用cat proc/kmsg命令查看内核打印信息和直接通过串口查看内核打印信息,现象如下:
在这里插入图片描述

五、将查看到的红外遥控用户码和键值添加到设备树和.kl文件

  那么需要先知道使用的是哪个.kl文件,首先通过getevent查看输入设备名称,然后通过dumpsys input命令查看输入设备管理器中的事件中心状态对应的输入设备信息查看到使用的输入设备布局文件,如下:
在这里插入图片描述
在这里插入图片描述
  通过以上可知,输入设备名称为“ff680020.pwm”。
在这里插入图片描述
  上图解释:如果没有指定的KeyLayoutFile,就会使用默认的Generic.kl文件的,如果需要添加自定义的键值,那么相应地也要在使用的.kl文件中添加该键值。

六、Android红外遥控.kl文件映射知识和使用添加新的.kl文件

感谢这位哥的博客,该博客参考链接请点击


  关于.kl文件的解释,如下图:
在这里插入图片描述

出现过的问题:

  我在“rk_key: rockchip-key”设备树节点新添加了一个与遥控器的OK按键相同功能的物理按键,通过getevent -l可以考到,按下物理按键,上报的键值也是“KEY_ENTER”,但是上层应用APP调用API获取的确是“0”,明明和红外遥控的OK键是上报同一个事件,上层获取的红外遥控键值是有效正确的,而我添加的物理按键却无效为“0”,这其实就是因为红外遥控和“ rockchip-key”这两个是使用的不同的/dev/input/eventx,因此他们不是共用一个.kl文件的,因此导致我这个问题的原因是我使用的物理按键的/dev/input/eventx调用的.kl文件并没有添加“KEY_ENTER”这个键值的映射规则。

七、Android红外遥控添加自定义按键,该按键用于截屏功能(基于全志a40i)

  添加自定义按键基本所有硬件平台都大同小异的。
补丁如下:

diff --git a/android/device/softwinner/a40-p1/configs/sunxi_ir_recv.kl b/android/device/softwinner/a40-p1/configs/sunxi_ir_recv.kl
index 113e0e7cba..65499dd4ea 100644
--- a/android/device/softwinner/a40-p1/configs/sunxi_ir_recv.kl
+++ b/android/device/softwinner/a40-p1/configs/sunxi_ir_recv.kl
@@ -32,6 +32,7 @@ key 172   HOME
 
 key 140  CALCULATOR
 key 250  CONTACTS
+key 255  SCREENSHOT
 key 213  MUSIC
 key 249  HELP
 key 226  GUIDE
diff --git a/android/frameworks/base/core/java/android/view/KeyEvent.java b/android/frameworks/base/core/java/android/view/KeyEvent.java
index 9a308d522d..5e90407813 100644
--- a/android/frameworks/base/core/java/android/view/KeyEvent.java
+++ b/android/frameworks/base/core/java/android/view/KeyEvent.java
@@ -804,6 +804,8 @@ public class KeyEvent extends InputEvent implements Parcelable {
     public static final int KEYCODE_SYSTEM_NAVIGATION_LEFT = 282;
     /** Key code constant: Consumed by the system for navigation right */
     public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283;
+    /* Key code constant: 屏幕截图 */
+    public static final int KEYCODE_SCREENSHOT = 300;
 
     /** [huidu] add: Key code constant: pmic power key. */
     public static final int KEYCODE_KEY_POWER2 = 289;
diff --git a/android/frameworks/base/core/res/res/values/attrs.xml b/android/frameworks/base/core/res/res/values/attrs.xml
index 30a1a28617..38c6d8f13a 100644
--- a/android/frameworks/base/core/res/res/values/attrs.xml
+++ b/android/frameworks/base/core/res/res/values/attrs.xml
@@ -1839,6 +1839,8 @@ i
         <enum name="KEYCODE_SYSTEM_NAVIGATION_DOWN" value="281" />
         <enum name="KEYCODE_SYSTEM_NAVIGATION_LEFT" value="282" />
         <enum name="KEYCODE_SYSTEM_NAVIGATION_RIGHT" value="283" />
+        <!-- 屏幕截图 -->>
+        <enum name="KEYCODE_SCREENSHOT" value="300" />
     </attr>
 
     <!-- ***************************************************************** -->
diff --git a/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
index c433b9b25c..f3d3f82cdb 100644
--- a/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -6003,6 +6003,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
 				}					
 			    break;
 		    }
+            /* 截图操作 */
+            case KeyEvent.KEYCODE_SCREENSHOT:{
+                if(down){
+                    Log.d(TAG, "down KEYCODE_SCREENSHOT getAction==  " + event.getAction());
+                } else {
+                    Log.d(TAG, "up KEYCODE_SCREENSHOT getAction==  " + event.getAction());
+                    mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);
+                    mHandler.post(mScreenshotRunnable);
+                }
+                break;
+            }
             case KeyEvent.KEYCODE_VOLUME_DOWN:
             case KeyEvent.KEYCODE_VOLUME_UP:
             case KeyEvent.KEYCODE_VOLUME_MUTE: {
diff --git a/android/frameworks/native/include/android/keycodes.h b/android/frameworks/native/include/android/keycodes.h
index 0982c43a22..f07738992d 100644
--- a/android/frameworks/native/include/android/keycodes.h
+++ b/android/frameworks/native/include/android/keycodes.h
@@ -768,6 +768,8 @@ enum {
     AKEYCODE_SYSTEM_NAVIGATION_RIGHT = 283,
     /** [huidu] add: fingerprint pmic power key */
     AKEYCODE_KEY_POWER2 = 289,
+    /* 屏幕截图 */
+    AKEYCODE_SCREENSHOT = 300,
     /** [huidu] end */
     AKEYCODE_MOUSE           = 10009,
 
diff --git a/android/frameworks/native/include/input/InputEventLabels.h b/android/frameworks/native/include/input/InputEventLabels.h
index f65537bcba..91ea14aaa6 100644
--- a/android/frameworks/native/include/input/InputEventLabels.h
+++ b/android/frameworks/native/include/input/InputEventLabels.h
@@ -247,6 +247,8 @@ static const InputEventLabel KEYCODES[] = {
     DEFINE_KEYCODE(MANNER_MODE),
     DEFINE_KEYCODE(3D_MODE),
     DEFINE_KEYCODE(CONTACTS),
+    /* 屏幕截图 */
+    DEFINE_KEYCODE(SCREENSHOT),
     DEFINE_KEYCODE(CALENDAR),
     DEFINE_KEYCODE(MUSIC),
     DEFINE_KEYCODE(CALCULATOR),
diff --git a/android/system/core/libcutils/android_reboot.c b/android/system/core/libcutils/android_reboot.c
index e12cb4564e..9a36cc0455 100755
--- a/android/system/core/libcutils/android_reboot.c
+++ b/android/system/core/libcutils/android_reboot.c
@@ -228,7 +228,7 @@ int android_reboot_with_callback(
         case ANDROID_RB_POWEROFF:
             //pid_t status;
             KLOG_WARNING(TAG, "the system get command: shutdown, write mcu reg[0x07]=value[0x01] and reboot to poweroff!\n" );
-            status = system("i2cset -y 3 0x2d 0x07 0x01");
+            status = system("i2cset -y 3 0x2d 0x07 0x01 && i2cset -y 3 0x2d 0x51 0x00 && i2cset -y 3 0x2d 0x52 0xff && i2cset -y 3 0x2d 0x53 0x00");
             if (status == -1)
             {
                 KLOG_WARNING(TAG,"system command error!");
diff --git a/lichee/linux-3.10/drivers/media/rc/rc-sunxi-keymaps.c b/lichee/linux-3.10/drivers/media/rc/rc-sunxi-keymaps.c
index 5be0dd5920..1d73e1c25d 100755
--- a/lichee/linux-3.10/drivers/media/rc/rc-sunxi-keymaps.c
+++ b/lichee/linux-3.10/drivers/media/rc/rc-sunxi-keymaps.c
@@ -33,45 +33,40 @@ static struct rc_map_table sunxi_nec_scan[] = {
 	{0x2051, KEY_VOLUMEUP},
 	{0x2056, KEY_VOLUMEDOWN},*/
 	
-	{0xdf2050, KEY_HOME},
-	{0xdf2042, KEY_UP},
-	{0xdf2043, KEY_DOWN},
-	{0xdf201a, KEY_LEFT},
-	{0xdf204f, KEY_RIGHT},
-	{0xdf201b, KEY_ENTER},
-	{0xdf2014, KEY_MENU},
-	{0xdf204d, KEY_BACK},
-	{0xdf2041, KEY_POWER},
-	{0xdf205a, KEY_MUTE},
-	{0xdf2056, KEY_VOLUMEDOWN},
-	{0xdf2051, KEY_VOLUMEUP},
-	
-	{0xdf2031, KEY_1},
-	{0xdf2032, KEY_2},
-	{0xdf2033, KEY_3},
-	{0xdf2034, KEY_4},
-	{0xdf2035, KEY_5},
-	{0xdf2036, KEY_6},
-	{0xdf2037, KEY_7},
-	{0xdf2038, KEY_8},
-	{0xdf2039, KEY_9},
-	{0xdf2030, KEY_0},
-	{0xdf202e, KEY_DOT},
-	{0xdf2009, KEY_BACKSPACE},	
-	{0xdf2008, KEY_TAB},
-	
-	{0xdf2013, KEY_HOMEPAGE},
-	{0xdf2012, KEY_CONTACTS},
-	
-	{0xdf2015, KEY_MOUSE},	
-	{0xdf2016, KEY_CALC},
-	{0xdf2017, KEY_SOUND},
+	{0xff0000, KEY_POWER},
+	{0xff0002, KEY_MUTE},
+	{0xff0015, KEY_ENTER},
+	{0xff0032, KEY_ENTER},
+	{0xff0018, KEY_LEFT},
+	{0xff001a, KEY_RIGHT},
+	{0xff0012, KEY_CONTACTS},       /* 设置 */
+	{0xff0008, KEY_SCREENSHOT},     /* 截图 */
+	{0xff000c, KEY_VOLUMEDOWN},
+	{0xff000e, KEY_VOLUMEUP},
+	{0xff0030, KEY_HOME},
+	{0xff0031, KEY_HOMEPAGE},
 
-	{0xdf2021, KEY_PAGEUP},
-	{0xdf2022, KEY_PAGEDOWN},
-	{0xdf2011, KEY_MAIL},
-	{0xdf2018, KEY_MEDIA},	
-	
+	{0xff0009, KEY_UP},
+	{0xff0004, KEY_LEFT},
+	{0xff0005, KEY_ENTER},
+	{0xff0006, KEY_RIGHT},
+	{0xff0011, KEY_DOWN},
+
+	{0xff0019, KEY_BACK},
+	{0xff0010, KEY_MOUSE},
+
+	{0xff0021, KEY_1},
+	{0xff0022, KEY_2},
+	{0xff0023, KEY_3},
+	{0xff0024, KEY_4},
+	{0xff0025, KEY_5},
+	{0xff0026, KEY_6},
+	{0xff0027, KEY_7},
+	{0xff0028, KEY_8},
+	{0xff0029, KEY_9},
+	{0xff002a, KEY_DOT},
+	{0xff0020, KEY_0},
+	{0xff000d, KEY_BACKSPACE},
 };
 
 static u32 sunxi_key_mapping(u32 code)
diff --git a/lichee/linux-3.10/include/uapi/linux/input.h b/lichee/linux-3.10/include/uapi/linux/input.h
index 95d0ff069c..0212d4e129 100644
--- a/lichee/linux-3.10/include/uapi/linux/input.h
+++ b/lichee/linux-3.10/include/uapi/linux/input.h
@@ -475,6 +475,7 @@ struct input_keymap_entry {
 
 #define KEY_MOUSE	    249	/* 20220718,sxx,for remote mouse*/
 #define KEY_CONTACTS	250	/* 20220718,sxx,for settigns*/
+#define KEY_SCREENSHOT 	255 /* 截图 */
 
 /* Code 255 is reserved for special needs of AT keyboard driver */

参考博客链接

八、补充(设备树中interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;属性解释)

  GIC_SPI :表示共享外设中断。
  78:中断号。
  IRQ_TYPE_LEVEL_HIGH:中断触发类型为高电平触发。

  在Rockchip_RK3288_TRM_V1.2_Part1-20170321.pdf文档有对中断号的描述,如下图所示:
在这里插入图片描述
  这里我解释一下,RK3288拥有32个私有中断,而其中有3个私有中断是外设中断,其余的112个都是共享外设中断。而本次使用的PWM中断属于共享外设中断,如下图所示:
在这里插入图片描述
  红外遥控使用的是PWM通用的共享外设中断,也就是RK_PWM,中断号110,很疑问的是:为什么设备树上写的终端号是78呢?其实设备树上写的是共享外设中断的索引,也就是说78的由来是110-32而得来的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

邓家文007

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值