RK3229 Android9自定义一个按键实现长按短按
一、kernel修改
--- a/arch/arm/boot/dts/rk3229-evb-android.dtsi
+++ b/arch/arm/boot/dts/rk3229-evb-android.dtsi
@@ -18,26 +18,25 @@};gpio_keys {
+ status = "okay";compatible = "gpio-keys";#address-cells = <1>;#size-cells = <0>;autorepeat;pinctrl-names = "default";
- pinctrl-0 = <&pwr_key>;
- pinctrl-1 = <&vol_up_key>;
-
- power_key: power-key {
- label = "GPIO Key Power";
- gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
- linux,code = <KEY_POWER>;
+ pinctrl-0 = <&rst_key>;
+ userf1 {
+ label = "GPIO user key";
+ linux,code = <KEY_USERKEY>;
+ gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;debounce-interval = <100>;
- wakeup-source;};
- volume_up: volume-up-key {
- label = "GPIO Key Volume up";
- gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
- linux,code = <KEY_VOLUMEUP>;
+ userf1_lp {
+ label = "GPIO user key lp";
+ linux,code = <KEY_USERKEY_LP>;
+ gpios = <&gpio0 RK_PA1 GPIO_ACTIVE_LOW>;
+ debounce-interval = <100>;};};@@ -295,7 +294,7 @@};&i2c0 {
- status = "okay";
+ status = "disabled";hym8563: hym8563@51 {compatible = "haoyu,hym8563";
@@ -344,6 +343,9 @@vol_up_key: vol-up-key {rockchip,pins = <3 25 RK_FUNC_GPIO &pcfg_pull_up>;};
+ rst_key: rst-key {
+ rockchip,pins = <0 0 RK_FUNC_GPIO &pcfg_pull_none>;
+ };};sdmmc {
diff --git a/arch/arm/boot/dts/rk3229-evb.dts b/arch/arm/boot/dts/rk3229-evb.dts
old mode 100644
new mode 100755
index fc4f19fb2563..27109f421c8a
--- a/arch/arm/boot/dts/rk3229-evb.dts
+++ b/arch/arm/boot/dts/rk3229-evb.dts
@@ -268,7 +268,7 @@};&i2c0 {
- status = "okay";
+ status = "disabled";hym8563: hym8563@51 {compatible = "haoyu,hym8563";
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
old mode 100644
new mode 100755
index bef317ff7352..380deaf8277c
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -32,6 +32,10 @@#include <linux/of_irq.h>#include <linux/spinlock.h>+#include <linux/reboot.h>
+
+static unsigned long start_time = 0;
+struct gpio_button_data {const struct gpio_keys_button *button;struct input_dev *input;
@@ -341,6 +345,7 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)const struct gpio_keys_button *button = bdata->button;struct input_dev *input = bdata->input;unsigned int type = button->type ?: EV_KEY;
+ unsigned long press_time = 0;int state = gpio_get_value_cansleep(button->gpio);if (state < 0) {
@@ -353,7 +358,27 @@ static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)if (state)input_event(input, type, button->code, button->value);} else {
- input_event(input, type, button->code, !!state);
+ if (button->code == 744) {
+ press_time = jiffies_to_msecs(jiffies - start_time);
+ printk(KERN_INFO "Button pressed for %lu milliseconds,start_time=%lu,jiffies=%lu\n", press_time,start_time,jiffies);
+ if (start_time && press_time >= 5000) {
+ printk("factoryreset \n");
+ input_event(input, type, 745, 1);
+ input_sync(input);
+ input_event(input, type, 745, state);
+ } else if (!state && start_time && press_time >= 100) {
+ input_event(input, type, 744, 1);
+ input_sync(input);
+ input_event(input, type, 744, state);
+ printk("reboot \n");
+ kernel_restart(NULL); // ִ<D0>и<B4>λ<B2><D9><D7><F7>
+ }
+ start_time = jiffies;
+ } else {
+ start_time = 0;
+ input_event(input, type, button->code, state);
+ }
+ printk("gpio_keys_gpio_report_event input_event *bdata->code=%d,state = %d\n",button->code, state);}input_sync(input);}
diff --git a/include/dt-bindings/input/rk-input.h b/include/dt-bindings/input/rk-input.h
old mode 100644
new mode 100755
index 00b412927890..1bf6e0abb2bc
--- a/include/dt-bindings/input/rk-input.h
+++ b/include/dt-bindings/input/rk-input.h
@@ -578,6 +578,9 @@#define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */#define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */+#define KEY_USERKEY 0x2e8
+#define KEY_USERKEY_LP 0x2e9
+#define BTN_TRIGGER_HAPPY 0x2c0#define BTN_TRIGGER_HAPPY1 0x2c0#define BTN_TRIGGER_HAPPY2 0x2c1
diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
old mode 100644
new mode 100755
index 9e07bf4259e1..ab66f6e2d3c7
--- a/include/uapi/linux/input-event-codes.h
+++ b/include/uapi/linux/input-event-codes.h
@@ -653,6 +653,9 @@#define BTN_TRIGGER_HAPPY39 0x2e6#define BTN_TRIGGER_HAPPY40 0x2e7+#define KEY_USERKEY 0x2e8
+#define KEY_USERKEY_LP 0x2e9
+/* We avoid low common keys in module aliases so they don't get huge. */#define KEY_MIN_INTERESTING KEY_MUTE#define KEY_MAX 0x2ff
二、framework修改
frameworks/base$ git diff
diff --git a/api/current.txt b/api/current.txt
old mode 100644
new mode 100755
index 38afeedc201..1094e2158df
--- a/api/current.txt
+++ b/api/current.txt
@@ -46649,6 +46649,8 @@ package android.view {field public static final int KEYCODE_TV_ZOOM_MODE = 255; // 0xfffield public static final int KEYCODE_U = 49; // 0x31field public static final int KEYCODE_UNKNOWN = 0; // 0x0
+ field public static final int KEYCODE_USERKEY = 305; // 0x131
+ field public static final int KEYCODE_USERKEY_LP = 306; // 0x132field public static final int KEYCODE_V = 50; // 0x32field public static final int KEYCODE_VOICE_ASSIST = 231; // 0xe7field public static final int KEYCODE_VOLUME_DOWN = 25; // 0x19
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
old mode 100644
new mode 100755
index f9d19dca872..bbf4ff81a9e
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -819,6 +819,8 @@ public class KeyEvent extends InputEvent implements Parcelable {public static final int KEYCODE_TV_KEYMOUSE_DOWN = 289;/** Key code constant: Tv controlloer switch mouse key*/public static final int KEYCODE_TV_KEYMOUSE_MODE_SWITCH = 290;
+ public static final int KEYCODE_USERKEY = 305;
+ public static final int KEYCODE_USERKEY_LP = 306;private static final int LAST_KEYCODE = KEYCODE_TV_KEYMOUSE_MODE_SWITCH;// NOTE: If you add a new keycode here you must also add it to:
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
old mode 100644
new mode 100755
index f4ae5585661..4b8b302ac73
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1909,6 +1909,8 @@<enum name="KEYCODE_TV_KEYMOUSE_UP" value="288" /><enum name="KEYCODE_TV_KEYMOUSE_DOWN" value="289" /><enum name="KEYCODE_TV_KEYMOUSE_MODE_SWITCH" value="290" />
+ <enum name="KEYCODE_USERKEY" value="305" />
+ <enum name="KEYCODE_USERKEY_LP" value="306" /></attr><!-- ***************************************************************** -->
diff --git a/data/keyboards/Generic.kl b/data/keyboards/Generic.kl
old mode 100644
new mode 100755
index 8699cb491df..a548bb01757
--- a/data/keyboards/Generic.kl
+++ b/data/keyboards/Generic.kl
@@ -409,6 +409,9 @@ key 523 POUNDkey 580 APP_SWITCHkey 582 VOICE_ASSIST+key 744 USERKEY
+key 745 USERKEY_LP
+# Keys defined by HID usageskey usage 0x0c006F BRIGHTNESS_UPkey usage 0x0c0070 BRIGHTNESS_DOWN
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
old mode 100644
new mode 100755
index a33ca98aa59..ef02c1598cc
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -262,6 +262,8 @@ import android.view.animation.AnimationSet;import android.view.animation.AnimationUtils;import android.view.autofill.AutofillManagerInternal;import android.view.inputmethod.InputMethodManagerInternal;
+import android.os.UserManager;
+import android.os.RecoverySystem;import com.android.internal.R;import com.android.internal.accessibility.AccessibilityShortcutController;
@@ -3904,6 +3906,23 @@ public class PhoneWindowManager implements WindowManagerPolicy {} else if (keyCode == KeyEvent.KEYCODE_VOICE_ASSIST) {Slog.wtf(TAG, "KEYCODE_VOICE_ASSIST should be handled in interceptKeyBeforeQueueing");return -1;
+ } else if (keyCode == KeyEvent.KEYCODE_USERKEY) {
+ //do nothing
+ //PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ //pm.reboot(null);
+ Slog.wtf(TAG, "KeyEvent.KEYCODE_USERKEY in interceptKeyBeforeQueueing");
+ return -1;
+ } else if (keyCode == KeyEvent.KEYCODE_USERKEY_LP) {
+ UserManager um = mContext.getSystemService(UserManager.class);
+ if (um.hasUserRestriction(UserManager.DISALLOW_FACTORY_RESET)) {
+ throw new SecurityException("Factory reset is not allowed for this user.");
+ }
+ try {
+ RecoverySystem.rebootWipeUserData(mContext);
+ } catch (IOException e) {
+ }
+ Slog.wtf(TAG, "KeyEvent.KEYCODE_USERKEY_LP in interceptKeyBeforeQueueing");
+ return -1;} else if (keyCode == KeyEvent.KEYCODE_SYSRQ) {if (down && repeatCount == 0) {mScreenshotRunnable.setScreenshotType(TAKE_SCREENSHOT_FULLSCREEN);wzh@lenkeng-HP-Pro-Tower-ZHAN-99-G9-Desktop-PC:/media/extern_sdb/wzh/rk3229_9.0/frameworks/native$ git diff
diff --git a/include/android/keycodes.h b/include/android/keycodes.h
old mode 100644
new mode 100755
index 1b5908631..6bf9c98a1
--- a/include/android/keycodes.h
+++ b/include/android/keycodes.h
@@ -776,7 +776,9 @@ enum {AKEYCODE_TV_KEYMOUSE_RIGHT = 287,AKEYCODE_TV_KEYMOUSE_UP = 288,AKEYCODE_TV_KEYMOUSE_DOWN = 289,
- AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = 290
+ AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = 290,
+ AKEYCODE_USERKEY = 305,
+ AKEYCODE_USERKEY_LP = 306,// NOTE: If you add a new keycode here you must also add it to several other files.// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
diff --git a/include/input/InputEventLabels.h b/include/input/InputEventLabels.h
old mode 100644
new mode 100755
index 3fd33a7fe..7d1223907
--- a/include/input/InputEventLabels.h
+++ b/include/input/InputEventLabels.h
@@ -330,6 +330,8 @@ static const InputEventLabel KEYCODES[] = {DEFINE_KEYCODE(SYSTEM_NAVIGATION_RIGHT),DEFINE_KEYCODE(ALL_APPS),DEFINE_KEYCODE(REFRESH),
+ DEFINE_KEYCODE(USERKEY),
+ DEFINE_KEYCODE(USERKEY_LP),{ NULL, 0 }};
相关文章:

RK3229 Android9自定义一个按键实现长按短按
一、kernel修改 --- a/arch/arm/boot/dts/rk3229-evb-android.dtsib/arch/arm/boot/dts/rk3229-evb-android.dtsi-18,26 18,25 };gpio_keys {status "okay";compatible "gpio-keys";#address-cells <1>;#size-cells <0>;autorepeat;pinct…...

A*算法求第k短路
话不多说先上例题。。 acwing:178. 第K短路 给定一张 NN 个点(编号 1,2…N1,2…N),MM 条边的有向图,求从起点 SS 到终点 TT 的第 KK 短路的长度,路径允许重复经过点或边。 注意: 每条最短路中至…...

CVPR’25截稿在即:今年的重大新规,你知道吗?
介绍会议: CVPR 2025全称是 IEEE/CVF Conference on Computer Vision and Pattern Recognition,即IEEE/CVF国际计算机视觉与模式识别会议。将于2025年6月11日至15日在美国田纳西州纳什维尔召开,CVPR是计算机视觉和模式识别领域的顶级会议。与…...

一文详解销售管理系统的功能、作用、选型
在当今竞争激烈的商业环境中,企业需要高效的工具来管理销售流程、提升客户关系和优化业务决策。销售管理系统(Sales Management System)正是这样一种工具,它通过整合客户信息、自动化销售流程和提供数据分析,帮助企业实…...

MySQL上RDS MySQL
初步想法是通过主从复制的方式进行,即ECS上的数据库设为主,RDS为从,等同步完成后,切换为RDS节点。创建实例后发现,RDS实例不支持server-id的自定义配置,这个想法就被否决了。但是aliyun和huaweiyun 都提供了…...

单体架构的 IM 系统设计
先直接抛出业务背景! 有一款游戏,日活跃量(DAU)在两千左右,虽然 DAU 不高,但这两千用户的忠诚度非常高,而且会持续为游戏充值;为了进一步提高用户体验,继续增强用户的忠…...

kafka消费端常见故障及处理方法
文章目录 前言一、消费端某个进程已经crash1. 主要心跳相关配置2. 完整的消费者配置示例3. 调整参数的建议 二、客户端没有crash,但是消费阻塞1. 工作机制2. 示例配置3.运用在代码里3. 配置建议 前言 kafka消费端经常会出现一些故障,一起来分析一下故障…...

【linux 多进程并发】0302 Linux下多进程模型的网络服务器架构设计,实时响应多客户端请求
0302 多进程网络服务器架构 专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 一、概…...

LTE及EPC技术原理(笔记)
无线网络发展历史 20世纪80年代:模拟技术和FDMA 20世纪90年代:数字技术和TDMA 21世纪初:数字技术和CDMA LTE进步 下行100Mbps,上行50Mbps 用户面时延10-20ms,控制面时延小于100ms 带宽从1.4MHz~20MHz࿰…...

穿越数据迷宫
第一章 在未来的世界里,人类的生活已经被高度数字化。互联网不再是简单的信息交换平台,而是成为了一个庞大的虚拟世界——“数据迷宫”。在这个世界里,每个人都有一个独特的数字身份,他们的生活、工作、娱乐都离不开这个虚拟空间…...

FBX福币交易所国际油价突然大涨!美伊针锋相对
11月4日早上,国际原油大幅高开。WTI原油一度涨超2%。 消息面上,主要产油国宣布延长自愿减产措施至12月底 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 石油输出国组织(欧佩克)发表声明说,8个欧佩克和非欧佩克产油国决…...

Java项目管理与SSM框架介绍
Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程,管理jar包,编译代码,完成测试,项目打包等等。Maven工具是基于POM(Project Object Model,项目对象模型)实现的。在Maven的管理下每…...

WorkFlow源码剖析——Communicator之TCPServer(中)
WorkFlow源码剖析——Communicator之TCPServer(中) 前言 上节博客已经详细介绍了workflow的poller的实现,这节我们来看看Communicator是如何利用poller的,对连接对象生命周期的管理。(PS:与其说Communica…...

在做题中学习(73):删除字符串中所有相邻重复项
解法:用栈来模拟 思路:不用真的定义一个栈,用字符串string来模拟栈的行为 入栈:push_back(s[i]) 出栈:s[i] s.back()的时候,并且s.size() > 0,循环结束得到结果 注意:如果真的用stack<char>来…...

springboot 单元测试-各个模块举例
controller单测 import com.fasterxml.jackson.databind.ObjectMapper; import lombok.SneakyThrows; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Moc…...

MS01SF1 精准测距UWB模组助力露天采矿中的人车定位安全和作业效率提升
在当今矿业行业,随着全球对资源需求的不断增加和开采难度的逐步提升,传统的作业方式面临着越来越多的挑战。露天矿山开采,因其大规模的作业环境和复杂的地形特点,面临着作业人员的安全风险、设备调度的高难度以及资源利用率低下等…...

Android亮屏Job的功耗优化方案
摘要: Job运行时会带来持锁的现象,目前灭屏放电Job的锁托管已经有doze和绿盟标准监管,但是亮屏时仍旧存在过长的持锁现象,故为了优化功耗和不影响用户体验下,新增亮屏放电下如果满足冻结和已运行过一次Job,则进行job限制,当非冻结时恢复的策略 1.现象: (gms_schedu…...

React05 样式控制 classnames工具优化类名控制
样式控制 & classnames工具优化类名控制 样式控制1. 行内样式控制2. 外部样式控制 classnames工具优化类名控制 样式控制 1. 行内样式控制 //定义样式 const style {color: red,fontSize: 30px }function App() {return (<div className"App">{/* 行内样…...

OJ-5G网络建设
示例1 输入: 3 3 1 2 3 0 1 3 1 0 2 3 5 0 输出: 4示例2 输入: 3 1 1 2 5 0 输出: -1 示例3 输入: 3 3 1 2 3 0 1 3 1 0 2 3 5 1 输出: 1 分析:压缩路径 顺序:1 2;…...

Linux简介
1.Linux定义 Linux 是免费使用和自由传播的类 Unix 操作系统,是基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思…...

android——渐变色
1、xml的方式实现渐变色 效果图: xml的代码: <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…...

MySQL约束管理
介绍 MySQL约束管理是指在MySQL数据库中定义和管理数据约束的过程。数据约束用于维护数据的完整性和一致性,确保数据在表中的存储符合特定的规则。通过约束,可以防止不符合要求的数据被插入或更新,从而保护数据库的质量。 约束管理的主要内…...

拯救者y7000p 打开XMP
拯救者y7000p 打开XMP 拯救者bios隐藏功能 第一步、开机按F2进入bios 第二步、点击more settings 第三步、依次按Fnrn再按F12保存重启 第四步、再进bios,点击more settings则显示更多可调制选项,可找到内存超频功能,进行xmp超频 如果第三步失…...

2024 Rust现代实用教程Iterator迭代器
文章目录 一、迭代与循环1.循环2.迭代iteration3.区别 二、Intoiterator、Iterator和Iter之间的关系1.Intolterator2.Iterator Trait3. 源码中经常出现的iter 三、获取迭代器的三种方法iter(),iter_mut()和into_iter()1.iter()方法2.iter_mut()方法3.into_iter()方法---尽量写 …...

基于SpringBoot司机信用评价的货运管理系统【附源码】
基于SpringBoot司机信用评价的货运管理系统 效果如下: 系统主页面 系统注册页面 司机注册页面 管理员主页面 订单评价页面 货物信息页面 个人信息页面 研究背景 随着我国物流行业的迅猛发展,货运管理系统的效率与安全性日益受到重视。在货运过程中&am…...

使用PostgreSQL进行高效数据管理
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…...

数据库条件查询排查——引号故障
一、错误代码 $where_查询职汇总员[$value头[EmpCode]]$value职员[EmpCode]; 二、正常写法 $where_查询职汇总员[EmpCode]$value职员[EmpCode]; 三、原因 前一个是变量嵌套,这里不需要嵌套...

Python爬虫:揭开淘宝商品描述的神秘面纱
在这个信息爆炸的时代,我们每天都在和时间赛跑。作为一名Python开发者,你是否曾梦想拥有超能力,能够瞬间揭开淘宝商品描述的神秘面纱?今天,就让我们一起化身为代码界的“福尔摩斯”,使用Python爬虫技术&…...

动态规划— 一和零
class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp new int[m1][n1];//dp[i][j]表示i个0和j个1时的最大子集int oneNum 0, zeroNum 0;for(String str : strs){oneNum 0;zeroNum 0;for(char c : str.toCharArray()){if(c 0){zeroNum;}els…...

【Android】SharedPreferences存储中没有 Double 类型数据存储的解决方式
项目需求 存储定位数据,需要保存到小数点后10位数据。 需求分析 项目需求看起来很简单,其实实现起来也不难,我们直接使用SharedPreferences 存储一下就好了,反正也没其他要求。 好了,直接使用SharedPreferences 存…...