目录
一、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而得来的。