一、长按电源键

在产品设计中,为防备系统跑挂了,需要设计通过长按电源键实现硬关机和重启。这里简单介绍RK809实现长按电源键关机和重启功能。

通过查阅RK809手册PMIC_PWEON_KEY寄存器,可以设置长按电源键PMIC的响应事件有两种:关机和重启。响应时间有6s、8s、10s、12s。

分析驱动代码rk8xx.c可以发现代码中配好了设备树接口,只需要在设备树中添加相应的属性即可设置长按电源键PMIC的响应时间和响应事件。

//  u-boot/drivers/power/pmic/rk8xx.c
static int rk8xx_ofdata_to_platdata(struct udevice *dev)
{struct rk8xx_priv *rk8xx = dev_get_priv(dev);u32 interrupt, phandle, val;int ret;phandle = dev_read_u32_default(dev, "interrupt-parent", -ENODATA);if (phandle == -ENODATA) {printf("Read 'interrupt-parent' failed, ret=%d\n", phandle);return phandle;}ret = dev_read_u32_array(dev, "interrupts", &interrupt, 1);if (ret) {printf("Read 'interrupts' failed, ret=%d\n", ret);return ret;}rk8xx->irq = phandle_gpio_to_irq(phandle, interrupt);if (rk8xx->irq < 0) {printf("Failed to request rk8xx irq, ret=%d\n", rk8xx->irq);return rk8xx->irq;}val = dev_read_u32_default(dev, "long-press-off-time-sec", 0);   //解析long-press-off-time-sec属性if (val <= 6)rk8xx->lp_off_time = RK8XX_LP_TIME_6S;else if (val <= 8)rk8xx->lp_off_time = RK8XX_LP_TIME_8S;else if (val <= 10)rk8xx->lp_off_time = RK8XX_LP_TIME_10S;elserk8xx->lp_off_time = RK8XX_LP_TIME_12S;val = dev_read_u32_default(dev, "long-press-restart", 0);   //解析long-press-restart属性if (val)rk8xx->lp_action = RK8XX_LP_RESTART;elserk8xx->lp_action = RK8XX_LP_OFF;val = dev_read_u32_default(dev, "not-save-power-en", 0);rk8xx->not_save_power_en = val;return 0;
}

根据驱动,只需要在dts文件中的rk809节点中添加long-press-off-time-sec和long-press-restart属性。

rk809: pmic@20 {compatible = "rockchip,rk809";reg = <0x20>;...long-press-off-time-sec = <6>;  //长按电源键PMIC响应时间,可以设置6s,8s,10s,12slong-press-restart = <1>;      //长按电源键PMIC响应事件,0:关机  1:重启...pwrkey {status = "okay";};

二、短按开机电源键响应时间

同样通过RK809手册发现短按电源键开机的响应时间可以设置500ms和100ms。驱动中每发现有设置该功能的接口,可以仿照长按电源键的响应时间来实现短按电源键开机的响应时间。

1)头文件添加寄存器地址

diff --git a/u-boot/include/power/rk8xx_pmic.h b/u-boot/include/power/rk8xx_pmic.h
index aa51e887e4..7274a7dc46 100644
--- a/u-boot/include/power/rk8xx_pmic.h
+++ b/u-boot/include/power/rk8xx_pmic.h
@@ -219,6 +219,9 @@ enum {#define RK8XX_DEVCTRL_REG      0x4b#define RK817_PWRON_KEY                0xf7
+#define RK8XX_ON_TIME       BIT(7)
+#define RK8XX_ON_TIME_500MS (0 << 7)
+#define RK8XX_ON_TIME_100MS (1 << 7)#define RK8XX_LP_ACTION_MSK    BIT(6)#define RK8XX_LP_OFF           (0 << 6)#define RK8XX_LP_RESTART       (1 << 6)
@@ -282,6 +285,7 @@ struct rk8xx_priv {struct spi_slave *slave;int variant;int irq;
+       int on_time_ms;int lp_off_time;int lp_action;uint8_t sleep_pin;

2)代码功能实现

diff --git a/u-boot/drivers/power/pmic/rk8xx.c b/u-boot/drivers/power/pmic/rk8xx.c
index b11695562b..e2e4c66566 100644
--- a/u-boot/drivers/power/pmic/rk8xx.c
+++ b/u-boot/drivers/power/pmic/rk8xx.c
@@ -404,6 +404,12 @@ static int rk8xx_ofdata_to_platdata(struct udevice *dev)rk8xx->lp_action = RK8XX_LP_RESTART;elserk8xx->lp_action = RK8XX_LP_OFF;
+
+       val = dev_read_u32_default(dev, "press-on-time", 0);
+       if(val)
+               rk8xx->on_time_ms = RK8XX_ON_TIME_100MS;
+       else
+               rk8xx->on_time_ms = RK8XX_ON_TIME_500MS;val = dev_read_u32_default(dev, "not-save-power-en", 0);rk8xx->not_save_power_en = val;
@@ -478,7 +484,7 @@ static int rk8xx_probe(struct udevice *dev)int ret = 0, i, show_variant;uint8_t msb, lsb, id_msb, id_lsb;uint8_t on_source = 0, off_source = 0;
-       uint8_t pwron_key = 0, lp_off_msk = 0, lp_act_msk = 0;
+       uint8_t pwron_key = 0, on_time = 0, lp_off_msk = 0, lp_act_msk = 0;uint8_t power_en0, power_en1, power_en2, power_en3;uint8_t on, off;uint8_t value;
@@ -533,6 +539,7 @@ static int rk8xx_probe(struct udevice *dev)on_source = RK817_ON_SOURCE;off_source = RK817_OFF_SOURCE;pwron_key = RK817_PWRON_KEY;
+               on_time = RK8XX_ON_TIME;lp_off_msk = RK8XX_LP_OFF_MSK;lp_act_msk = RK8XX_LP_ACTION_MSK;init_data = rk817_init_reg;
@@ -601,7 +608,9 @@ static int rk8xx_probe(struct udevice *dev)ret = rk8xx_read(dev, pwron_key, &value, 1);if (ret)return ret;
-               value &= ~(lp_off_msk | lp_act_msk);
+               value &= ~(on_time | lp_off_msk | lp_act_msk);
+               if (on_time)
+                       value |= priv->on_time_ms;if (lp_off_

3)设备树中选择响应时间

diff --git a/kernel/arch/arm64/boot/dts/rockchip/t5.dts b/kernel/arch/arm64/boot/dts/rockchip/t5.dts
index bd32081563..86b6cc9f6a 100755
--- a/kernel/arch/arm64/boot/dts/rockchip/t5.dts
+++ b/kernel/arch/arm64/boot/dts/rockchip/t5.dts
@@ -864,6 +864,7 @@pmic-reset-func = <0>;/* not save the PMIC_POWER_EN register in uboot */not-save-power-en = <1>;
+               press-on-time = <0>;   // 0: 500ms   1: 100mslong-press-off-time-sec = <6>;long-press-restart = <1>;

[RK3568 Android11] RK809开机短按时间设置和长按电源键设置相关推荐

  1. Android 长按电源键和短按电源键的详细处理流程

    1 Android Android4.x在Framework的PhoneWindowManager对Power(KeyEvent.KEYCODE_POWER)和Home(KeyEvent.KEYCOD ...

  2. pads中如何设置等长_期货如何设置止损止盈避免交易中被套-期货学习

    导读:在期货交易中,有一个非常重要的问题,止损止盈,对于一般投资者来讲,止盈比止损要简单一些,毕竟止盈是在获取利润后的操作:可止损呢!止损可不是那... 在期货交易中,有一个非常重要的问题,止损止盈, ...

  3. 设置锁屏方式后,锁屏长按电源键还有锁屏按钮(lockdown)锁屏状态下应该没有,解锁使用后长按才有这个按钮。

    长按电源的菜单列表在frameworks/base/core/res/res/values/config.xml 里面有个<string-array translatable="fal ...

  4. android长按home键设置的,Android中屏蔽电源键长按、Home键、Home键长按

    Android中屏蔽电源键长按.Home键.Home键长按 这几个"按钮"的触发,都会产生一个Action ==Intent.ACTION_CLOSE_SYSTEM_DIALOGS ...

  5. 如何在BIOS设置电脑主机刚接通电源后开机方式

    1.首先,BIOS分为AMI和AWARD; 2.针对主机刚接通电源后开机方式两种BIOS设定有以下4种方式: (1)a.在"Power Management Setup(电源管理设置)&qu ...

  6. win10计算机恢复出厂设置,Windows 10 一键恢复出厂设置详细教程

    当Windows10系统使用久了,体积越来越大,运行卡顿缓慢,就会选择重装系统.其实Windows10内置了一键恢复出厂设置工具,我们可以使用此方法先解决系统问题哦!接下来,我就教大家Windows1 ...

  7. mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决

    前不久,MacOS推送正式版Big Sur,我满怀期待的更新.更新的过程很平缓,一切都很顺利.但在使用时,出现了一个问题,系统偏好设置的锁无法解除,导致有些软件需要权限,却不能正常允许通过,那软件自然 ...

  8. 解决:小米手机电源键坏了怎么开机

    目录 1. 结论:小米电源键真是小米杀手 2. 关机状态下,要开机的解决办法 1. 结论:小米电源键真是小米杀手 已经第二台手机因为电源键按坏了,不能开关机了. 开机状态下,要关机或者重启,可以在设置 ...

  9. 计算机休眠按钮是哪个,电源按钮设置成睡眠好还是休眠好?

    电源按钮设置成睡眠好还是休眠好?只有数量很少的朋友才会对自己的电脑精雕细琢!连电源选项设置都要照顾到!好多朋友对电源按钮有误解,以为按下电源键就是关机,实际上电子技术发展到今天,出于保护电脑硬件的考虑 ...

最新文章

  1. 010_TreeMap键使用Comparator排序
  2. C. 防止E-mail注入
  3. 【pyqt5】——入门级模板(ui文件+ui转py文件+逻辑py文件)(消息提示框)
  4. 深度优化LNMP之MySQL
  5. python连乘函数_Python常用的几种常用的内置函数
  6. oracle 等待sql,oracle sql 锁,锁等待相关sql
  7. 一网打尽软件测试面试必问的所有Web测试点,你不知道的这都有!
  8. 段错误(已转储)什么意思_发表论文已检索什么意思
  9. 关于nhibernate的一个问题
  10. linux档案内容怎么写,Linux cat输出档案命令详解
  11. c语言运算符优先级(c语言运算符优先级由高到低的顺序)
  12. [转载]Delta Lake、Iceberg 和 Hudi 三大开源数据湖不知道如何选?那是因为你没看这篇文章
  13. Antv X6 动态连线
  14. 物联网-位置信息、定位技术与位置服务
  15. 腾讯投 10 亿在武汉建中部最大研发中心
  16. 哈佛结构和冯诺依曼结构特点
  17. 做小红书推广快速涨粉的技巧_云媒易
  18. 黑盒测试用例设计方法【转】
  19. 2.4 一阶隐式微分方程与参数表示
  20. 17正交矩阵和Gram-Schmidt正交化

热门文章

  1. flowable画图教程_给初学者的RxJava2.0教程(七): Flowable
  2. 手机进程设置多少个最好_手机卡顿的4个处理方式,不用恢复出厂设置,依旧流畅如新机...
  3. 异常检测与故障诊断的区别
  4. 中位数及带权中位数问题
  5. 计算机win10如何取消密码,win10系统电脑怎么取消开机密码?
  6. 南航毕业程序媛中奖一个亿裸辞后:30岁没钱没工作!中奖不如写代码
  7. 庆阳市西峰区中小学武术教学开展现状及应对措施-1
  8. 构建数据中台常用三把武器区别在哪?(Hadoop、Spark、Storm)
  9. 学习笔记:Java Protocol Buffer的使用和编码原理学习
  10. 视觉SLAM——二维三维几何、三维空间刚体变换