加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux时间系统之RTC时间

(2019-01-05 22:26:25)
标签:

it

分类: Linux操作系统
转载:Linux时间系统之RTC时间

一、概述

不知道有没有“时间系统”的说法,我们暂且把它作为Linux中和时间相关的内容的统称吧。
Linux时间有两个,系统时间(Wall Time),RTC时间。
系统时间(WT):由Linux系统软件维持的时间,比如command date:
$ date
2017年 02月 25日 星期六 16:58:10 CST

获取到的就是系统时间。
RTC时间:这个时间来自我们设备上的RTC芯片,通过command hwclock 可以读取:
# hwclock -r  --> root权限才可以运行
2017年02月25日 星期六 17时01分57秒  -0.906462 seconds

我们通过man查看hwclock的介绍:
hwclock - query or set the hardware clock (RTC)

接下来,通过代码看下两者的关系。

二、WT时间和RTC时间

WT时间来自于RTC时间,流程是:
上电-->RTC驱动加载-->从RTC同步时间到WT时间

上代码:
hctosys.c (drivers\rtc)
static int __init rtc_hctosys(void)
{
    struct timespec tv = {
        .tv_nsec = NSEC_PER_SEC >> 1,
    };
    
    err = rtc_read_time(rtc, &tm);
    err = do_settimeofday(&tv);
    dev_info(rtc->dev.parent,
        "setting system clock to "
        "%d-d-d d:d:d UTC (%u)\n",
        tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
        tm.tm_hour, tm.tm_min, tm.tm_sec,
        (unsigned int) tv.tv_sec);
}
late_initcall(rtc_hctosys);

late_initcall说明系统在启动流程的后面才会调用该函数去同步时间。关于late_initcall可见最后PS。
接下来从底层到上层进行梳理。

三、RTC时间框架

框架如图:

注:图中hwclock.c笔误,实为hctosys.c

Hardware:提供时间信息(time&alarm),通过一定的接口(比如I2C)和
RTC Driver:进行交互。Driver完成硬件的访问功能,提供访问接口,以驱动的形式驻留在系统。注册方式由
class.c:文件提供。驱动注册成功后会构建rtc_device结构体表征的rtc设备,并把rtc芯片的操作方式存放到rtc设备的ops成员中
interface.c:文件屏蔽硬件相关的细节,向上提供统一的获取/设置时间或Alarm的接口
rtc-lib.c:文件提供通用的时间操作函数,如rtc_time_to_tm、rtc_valid_tm等
rtc-dev.c:文件在/dev/目录下创建设备节点供应用层访问,如open、read、ioctl等,访问方式填充到file_operations结构体中
hctosys.c/rtc-sys.c/rtc-proc.c:看名字就知道其作用

接下来从驱动一层一层看下

四、RTC驱动

驱动主要工作是填充rtc_class_ops结构体,结构体描述了RTC芯片能够提供的所有操作方式:
。。。。。。。。。。。。。。。。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有