您的位置:首页 > 其它

RTC何时更新系统时间

2011-11-09 18:37 316 查看
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驱动初始化后调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: