hwclock
hwclock的源码路径:sys-utils/hwclock.c
源码:
if (opt & HWCLOCK_OPT_HCTOSYS)
to_sys_clock(&rtcname, utc);
else if (opt & HWCLOCK_OPT_SYSTOHC)
from_sys_clock(&rtcname, utc);
else if (opt & HWCLOCK_OPT_SYSTZ)
set_system_clock_timezone(utc);
else
/* default HWCLOCK_OPT_SHOW */
show_clock(&rtcname, utc);
---
static void from_sys_clock(const char **pp_rtcname, int utc)
{
#if 1
struct timeval tv;
struct tm tm_time;
int rtc;
rtc = rtc_xopen(pp_rtcname, O_WRONLY);
gettimeofday(&tv, NULL); //精确时间。它的精度可以达到微妙,是C标准库的函数。
/* Prepare tm_time */
if (sizeof(time_t) == sizeof(tv.tv_sec)) {
if (utc)
gmtime_r((time_t*)&tv.tv_sec, &tm_time);
else
localtime_r((time_t*)&tv.tv_sec, &tm_time);
} else {
time_t t = tv.tv_sec;
if (utc)
gmtime_r(&t, &tm_time);
else
localtime_r(&t, &tm_time);
}
#else
...
#endif
tm_time.tm_isdst = 0;
xioctl(rtc, RTC_SET_TIME, &tm_time);
if (ENABLE_FEATURE_CLEAN_UP)
close(rtc);
}
hwclock将会从rtc硬件(寄存器)中读取时间或往rtc硬件中写入时间,与rtc硬件息息相关。
xioctl(rtc, RTC_SET_TIME, &tm_time);
将会调用到const char **pp_rtcname指代的那个rtc设备的ioctl
测试过程1
date 设置系统时间
通过hwclock -s 从rtc读取时间设置给系统
date检查时间是否同步
测试过程2
date 设置系统时间
通过hwclock -w 将系统时间设置给RTC
通过hwclock -r 读取RTC硬件时间检验是否等于系统时间
这次出现了问题
问题根源在于无法设置RTC时间
如果系统中/dev下有多个rtc设备,那么运行hwclock命令时必须带上-f 指定使用哪个rtc设备,否则会报错hwclock: RTC_RD_TIME: Invalid argument或者hwclock: RTC_SET_TIME: Invalid argument