爱板网论坛

查看: 273|回复: 0

[原创] 【更新】[盈鹏飞EVB-P6UL试用]RTC高级应用——低功耗状态唤醒

[复制链接]

主题

好友

895

积分

举人

  • TA的每日心情
    奋斗
    2018-4-22 00:36
  • 签到天数: 26 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-12-14 01:21:07 |显示全部楼层
    本帖最后由 sjqlwy 于 2017-12-29 19:57 编辑

    好多写RTC的都是简单设置读取时间。i.MX6UL一大亮点就是内置PMC电源管理,支持多种低功耗状态。(To Be Conntinued...)

    最近遇到些事情,更新一部分。
    imx6UL的一大特色就是内置PMC电源管理芯片和支持低功耗模式,前面的试用无不是读取设置一下RTC时间,并没有讲到如何使用低功耗模式以及通过RTC作为trigger唤醒。
    最初这个想法是当时看《行尸走肉》第一季,Rick拿着对讲机,约定每天固定时间打开进行联络,这样可以在有限的电力下获得更多的使用时间,私想了个名字叫“末日对讲机”,而rtc定时唤醒低功耗MPU就是这里面的一部分。
    1、什么是RTC
    系统用两个时钟保存时间:硬件时钟和系统时钟。
    1.1 硬件时钟(即实时时钟 RTC 或 CMOS 时钟)
    仅能保存年、月、日、时、分、秒这些时间数值,无法保存时间标准(UTC 或 localtime)和是否使用夏令时调节。大家还记得1秒的定义吗:1967年召开的国际计量大会上,一秒钟被定义为铯原子的9192631770次固有微波振荡次数所需的时间,这一标准沿用至今。而硬件时钟原理类似,也是通过石英晶体振荡器频率工作,详情可以去看实时时钟的百度百科。特性是系统关闭后,只要供电就会持续计时。
    1.2  系统时钟(即软件时间)
    与硬件时间分别维护,保存了时间、时区和夏令时设置。Linux 内核保存为自 UTC 时间 1970 年1月1日 00:00:00 经过的秒数。初始系统时钟是从硬件时间计算得来,计算时会考虑/etc/adjtime的设置。由于这个文件的存在,即使硬件时钟设置的为UTC时间,系统也能显示正确的本地时间。系统启动之后,系统时钟与硬件时钟独立运行。
    1.3 系统时间管理流程
    • 启动时根据硬件时钟设置系统时间
    • 运行时通过 NTP 守护进程联网校正时间
    • 关机时根据系统时间设置硬件时间。  

    通过dmesg |grep rtcsudo systemctl stop ntp命令可以证实。
    附注
    • date命令仅更改系统时钟;
    • timedatectl set-time 命令会同时影响硬件时钟和系统时钟  Via
    • ArchWiki上有更详细的讲解
    • 当然,evb6预装的系统里没有引入systemd系统

    2、如何访问板载RTC2.1 通过hwclock软件:需要管理员(root)权限
    常用命令:
    • hwclock -r读取当前硬件时钟
    • hwclock -s 以系统时钟为准写入硬件时钟
    • hwclock -w 以硬件时钟为准设置系统时钟
    • hwclock -u 设置硬件时钟为UTC标准

    时间表示有两个标准:localtime 和 UTC(Coordinated Universal Time) 。UTC 是与时区无关的全球时间标准。尽管概念上有差别,UTC 和 GMT (格林威治时间) 是一样的。localtime 标准则依赖于当前时区。  
    这里建议将硬件时钟设置为UTC标准,以避免使用localtime时可能引起的麻烦和bug。前文已经讲过,系统读取硬件时钟后会根据/etc/adjtime调整(+8h)。
    2.2 通过用户空间访问RTC
    设备地址在/dev/rtcX X为编号  cat /proc/driver/rtc 可以看到RTC时钟信息,仅记录时间数值。如图所示  在/sys/class/rtc/rtcX目录下,可以访问控制RTC参数:  详情访问这里
    3、如何使用板载RTC自动从低功耗状态唤醒
    linux提供了一个工具rtcwake,可以设置系统延时、定时从低功耗状态唤醒。  因为RTC的特点是即使系统不运行,也能继续计时。而需要在系统运行时计时的应用就没必要用RTC了。  
    3.1 低功耗状态
    我们首先来看看evb6支持哪几种低功耗状态:
    Lemaker Guitar的:TigerBoard的:
    RPi2因为没有PMU,所以不支持低功耗状态:
    • freeze:Suspend-To-Idle,纯软件实现,冻结进程+挂起设备+使处理器空闲,Kernel 3.9引入
    • standby:Power-On Suspend,唤醒速度快,CPU在电
    • mem:Suspend-to-RAM,仅内存在电,其他设备处于低功耗状态
    • disk:Suspend-to-disk,也就是常说的休眠状态,将内存内容保存到磁盘。

    耗电依次递减。详细解释可以看这里
    我们可以直接使用参数使设备进入相应的状态,例如:  echo freeze > /sys/power/state 将会使系统进入freeze状态  如何唤醒请参考PMU手册,然而一般我都是直接RESET键:-D  
    3.2 使用rtcwake唤醒设备
    例1:延迟指定时间后唤醒  rtcwake -m mem -s 20  意思是进入mem状态并于20秒后唤醒,-v会获得更多信息  
    按照剧本应该正常休眠20s唤醒,但是这里出错了:
    rtcwake: /dev/rtc not enabled for wakeup events
    搜索一番,考虑内核问题,需要重新编译内核,此外盈鹏飞官方提供的是3.x,飞思卡尔是4.x了,正好趁此机会。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /4 下一条

    手机版|爱板网

    GMT+8, 2018-6-19 02:59 , Processed in 0.081378 second(s), 13 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部