RTC何时更新系统时间

时间:2022-02-26 09:02:04

RTC - real time clock维护着系统的hardware时间,当linux启动时需要用RTC hardware时钟设置system 时间。

这个过程是在drivers/rtc/hctosys.c驱动中实现的,这个驱动实际只有一个init函数,并且把自己的init 函数声明为

late_initcall,这样可以保证RTC驱动已经正常运转。

init函数从RTC设备读取当前硬件时钟,然后调用do_settimeofday改写系统时钟。


27 static int __init rtc_hctosys(void)
 28 {
 29     int err = -ENODEV;
 30     struct rtc_time tm;
 31     struct timespec tv = {
 32         .tv_nsec = NSEC_PER_SEC >> 1,
 33     };
 34     struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
 35
 36     if (rtc == NULL) {
 37         pr_err("%s: unable to open rtc device (%s)\n",
 38             __FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
 39         goto err_open;
 40     }
 41
 42     err = rtc_read_time(rtc, &tm);
 43     if (err) {
 44         dev_err(rtc->dev.parent,
 45             "hctosys: unable to read the hardware clock\n");
 46         goto err_read;
 47
 48     }
 49
 50     err = rtc_valid_tm(&tm);
 51     if (err) {
 52         dev_err(rtc->dev.parent,
 53             "hctosys: invalid date/time\n");
 54         goto err_invalid;
 55     }
 56
 57     rtc_tm_to_time(&tm, &tv.tv_sec);
 58
 59     do_settimeofday(&tv);
 60
 61     dev_info(rtc->dev.parent,
 62         "setting system clock to "
 63         "%d-%02d-%02d %02d:%02d:%02d UTC (%u)\n",
 64         tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
 65         tm.tm_hour, tm.tm_min, tm.tm_sec,
 66         (unsigned int) tv.tv_sec);
 67
 68 err_invalid:
 69 err_read:
 70     rtc_class_close(rtc);
 71
 72 err_open:
 73     rtc_hctosys_ret = err;
 74
 75     return err;
 76 }
 77

 78 late_initcall(rtc_hctosys);


34 获取RTC设备

42 从RTC设备读取时间, rtc_read_time只是rtc子系统的读时间接口函数,真正的读操作,是在特定的RTC硬件驱动中实现的

50 返回值是tm结构,rtc_valid_tm验证一下返回值是否合法

57 转换为UTC seconds 格式

59 设置系统时间

78 保证这个初始化函数是最后调用的,至少在RTC驱动初始化后调用