RK3568关于RK808的定时开关机

  • 前言
  • 一、补丁
  • 二、测试方法
  • 总结

前言

补丁
附件是以rk808为例实现的,使用rk809思路是一样的:


一、补丁

--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -61,7 +61,7 @@ static struct mfd_cell rk808s[] = {#define VOL_MIN_IDX 0x00
#define VOL_MAX_IDX 0x3f
-
+static int getalarm[6];
const static int buck_set_vol_base_addr[] = {RK808_BUCK1_ON_REG,RK808_BUCK2_ON_REG,
@@ -1017,6 +1017,31 @@ static ssize_t rk808_test_show(struct kobject *kobj, struct kobj_attribute *attr}+static ssize_t rk808_alarm_store(struct kobject *kobj, struct kobj_attribute *attr,
+                                const char *buf, size_t n)
+{+       char cmd;
+       const char *buftmp = buf;
+
+       sscanf(buftmp, "%x%c%x%c%x%c%x%c%x%c%x", &getalarm[5],&cmd,&getalarm[4],&cmd,&getalarm[3],
+                                               &cmd,&getalarm[2],&cmd,&getalarm[1],&cmd,&getalarm[0]);
+       printk("year = %x\n", getalarm[5]);
+       printk("mon = %x\n", getalarm[4]);
+       printk("day = %x\n", getalarm[3]);
+       printk("hour = %x\n", getalarm[2]);
+       printk("min = %x\n", getalarm[1]);
+       printk("sec = %x\n", getalarm[0]);
+        return n;
+
+}
+
+static ssize_t rk808_alarm_show(struct kobject *kobj, struct kobj_attribute *attr,
+                               char *buf)
+{+       return sprintf(buf, "%x%c%x%c%x%c%x%c%x%c%x\n", getalarm[5], '_', getalarm[4], '_', getalarm[3],
+                                                       '_', getalarm[2], '_', getalarm[1], '_', getalarm[0]);
+}
+
static struct kobject *rk808_kobj;
struct rk808_attribute {struct attribute        attr;
@@ -1029,6 +1054,7 @@ struct rk808_attribute {static struct rk808_attribute rk808_attrs[] = {/*     node_name        permision               show_func       store_func */__ATTR(rk808_test,      S_IRUGO | S_IWUSR,      rk808_test_show,        rk808_test_store),
+       __ATTR(rk808_alarm,     S_IRUGO | S_IWUSR,      rk808_alarm_show,       rk808_alarm_store),
};
#endif
#if 0
@@ -1141,8 +1167,10 @@ static void rk808_shutdown(void)printk("%s,line=%d dc[%d]= %d\n", __func__,__LINE__,(i+1),val);}/*****************************************************/
-       ret = rk808_set_bits(rk808, RK808_INT_STS_MSK_REG1,(0x3<<5),(0x3<<5)); //close rtc int when power off
-       ret = rk808_clear_bits(rk808, RK808_RTC_INT_REG,(0x3<<2)); //close rtc int when power off
+       //ret = rk808_set_bits(rk808, RK808_INT_STS_MSK_REG1,(0x3<<5),(0x3<<5)); //close rtc int when power off
+       //ret = rk808_clear_bits(rk808, RK808_RTC_INT_REG,(0x3<<2)); //close rtc int when power off
+       ret = rk808_clear_bits(rk808, RK808_INT_STS_MSK_REG1,(0x3<<5)); //open rtc int when power on
+       ret = rk808_set_bits(rk808, RK808_RTC_INT_REG,(0x1<<3),(0x1<<3)); //open rtc int when power onmutex_lock(&rk808->io_lock);mdelay(100);
}
@@ -1153,9 +1181,23 @@ static struct syscore_ops rk808_syscore_ops = {static void rk808_device_shutdown(void)
{-       int ret,i;
+       int ret,i,j;u8 reg = 0;struct rk808 *rk808 = g_rk808;
+
+       for(j=0x0d; j>=0x08; j--)
+       {+               ret = rk808_i2c_write(rk808, j, 1,getalarm[j-8]);
+               if (ret <0)
+                        printk("write alarm reg error!\n");
+       }
+       for (j = 0; j < 0x13; j++)
+       {+               ret=rk808_i2c_read(rk808,j,1,&reg);
+               if (ret <0)
+                       printk("read rtc & alarm reg error!\n");
+               printk("reg[0x%x]:%x\n",j,reg);
+       }for(i=0;i < 10;i++){printk("%s\n",__func__);ret = rk808_i2c_read(rk808,RK808_DEVCTRL_REG,1,&reg);
@@ -1169,6 +1211,7 @@ static void rk808_device_shutdown(void)}while(1)wfi();
}
+
EXPORT_SYMBOL_GPL(rk808_device_shutdown);__weak void  rk808_device_suspend(void) {}

二、测试方法

用adb或者串口都行

# su
# echo +60 > /sys/class/rtc/rtc0/wakealarm cat /sys/class/rtc/rtc0/wakealarm
#reboot -p

关机之后等60S系统自动开机了,验证成功

总结

1.在底层做一个独立的alarm接口(本patch中是提供的接口为rk808_rtc_setalarm_pwron),上层设定开机时间;
2.上层设置的时间会调到该接口,然后保存开机时间;
3.等到真正关机时,在关机函数里将rtc/alarm中断全部打开,并将开机时间写进alarm寄存器;
4.一旦到达设定的时间,rtc通过唤醒pmu达到给整个系统上电的效果;
5.定时关机的功能比较简单,自己根据需求调用关机函数即可,不在赘述;补丁是以4.4kernel的rk808为例实现的,上层只需通过ioctl方法往接口里写入开机时间

RK3568关于RK808的定时开关机相关推荐

  1. 文件服务器定时开关机,如何配置作服务器定时开关机.ppt

    如何配置作服务器定时开关机 如何配置服务器定时开关机 注:本例中操作系统以Windows server2003.BIOS以phoenix-award为例 1.自动定时开机的实现 1.1启动计算机时,按 ...

  2. linux服务器定时关机重启,Ubuntu Server 10.10 每天定时开关机linux服务器应用 -电脑资料...

    Ubuntu Server 10.10定时开机方法: 按F2进入BIOS设置,设置每天定时开机, 容易出现问题: BIOS时间比系统时间慢8小时.在BIOS设置中设置时间或在Ubuntu系统中设置BI ...

  3. 定时开关机实现原理-Android4.4/6.0

    原址 一.寄存器介绍--RTCSA & RTCSAR 1.RTC是Real Time Clock的简称,它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是RTC仍然继 ...

  4. Win10、Win7定时开关机

    Win10.Win7定时开关机 Win10.Win7定时开关机 补充重点:必须取消选择"自动重新启动"--解决休眠重启问题 知识补充: 电脑在关机后有两个用户只默认登陆一个 Win ...

  5. w ndows 10关机,Win10设置定时开关机休眠唤醒的方法

    Win10如何设置定时开关机休眠唤醒?我们在没有硬件支持的情况下,可以利用Wndows系统自带的任务计划程序和休眠功能,实现计算的定时开关机,解决休眠重启问题.那要如何设置定时开关机休眠唤醒呢?下面, ...

  6. win10定时关机c语言,win10定时关机怎么设置,win10设置定时关机设置方法-电脑怎么定时开关机...

    很多时候我们都会选择在空闲的时候下载一些文件或视频,如果文件或视频比较大,那么下载的时间就会比较长,所以我们一般都会选择下载完关机的软件功能!那么如果不是利用软件下载的呢?我们总不能傻傻的等着下载完成 ...

  7. 定时开关机-Android4.4/6.0

    一.寄存器介绍--RTCSA & RTCSAR 1.RTC是Real Time Clock的简称,是一个时钟芯片.它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是R ...

  8. 【经验分享】设置电脑定时开关机

    文章目录 1.定时开机设置(BIOS固件设置) 2.定时关机设置 放长假回家,不想拷贝资料,因此打算用todesk远程连接办公.但是工位电脑一直开着,还不能睡眠,担心会过热,可能对硬件不太好.于是我和 ...

  9. 定时开关机(二):AlarmManager的使用及对定时不准问题的修改

    定时开关机(二):AlarmManager的使用及对定时不准问题的修改 AlarmManager是系统提供的定时服务,通过AlarmManager发送一个定时广播,接收方收到广播后,启动关机活动,这样 ...

最新文章

  1. #ifdef __cplusplus extern C { #endif”的定义的含义
  2. react 拖拽生成html,[React] 基于react 拖拽时间选择器
  3. DirectX视口变换矩阵详解
  4. butterknife 源码分析
  5. c# groupbox大小_【已解决】C#中使得控件随着WinForm窗体的大小改变而自动变化
  6. 编辑器内容FCKeditor的js验证以及FCKeditor内容是否为空判断
  7. Higher level thinking
  8. R和Tableau平行坐标图
  9. JavaScript基础流程控制(3)
  10. 【解题报告】Vijos1143 三取方格数
  11. 软件开发的201个原则
  12. 山东省第二届数据应用创新大赛日照赛区-公积金贷款逾期预测-赛后总结
  13. 按键精灵使用百度文字识别(百度ocr)教程
  14. 进图形界面黑屏的解决办法
  15. php实现转盘游戏后台奖品按照概率发放
  16. Rust编程语言入门教程(一)-什么是Rust
  17. 【图像分类损失】PolyLoss:一个优于 Cross-entropy loss和Focal loss的分类损失
  18. 使用MetaMask客户端获取以太坊测试网络ropsten测试币
  19. 一分钟了解“matlab得到自然常数e”
  20. java.lang.UnsatisfiedLinkError: Unable to load library ‘D:\dll\DwgOperInterface‘: 找不到指定的模块

热门文章

  1. 第006话 皮皮和月亮石!
  2. 周大福守护一生 | 在520奔赴一场终身浪漫的约会
  3. cod12正版链接在线服务器6,cod6盗版服务器管理命令(Cod6 pirated server management commands).doc...
  4. hdmi网线延长器_HDMI单网线延长器50米高清传输解决方案
  5. 如何用Excel做一个战斗模拟器(三)战斗过程模拟
  6. r55600h和i79750h哪个好
  7. 重塑 Google 搜索、Android 13 新版发布,这届 I/O 大会为开发者带来了什么?
  8. Android基础知识——Android SDK Manager详解
  9. 如何搭建多功能会议室
  10. 20200228视频播放器的字幕支持