RTC的驱动,一般是放于drivers/char目录下
对应的设备为/dev/rtc,浏览了下busybox的hwclock源码发现其就是open /dev/rtc,然后ioctl来读写RTC
一个相当简单的例子,或者说是结构更妥些
static void rtc_read_time(struct rtc_time *tm)
{
// 这里实现从RTC读出放到tm
}
static int rtc_set_time(struct rtc_time *tm)
{
// 这里实现把tm写入RTC
}
// RTC的操作结构
static struct rtc_ops rtc_ops = {
.owner = THIS_MODULE,
.read_time = rtc_read_time,
.set_time = rtc_set_time,
};
// RTC初始化
static int __init rtc_init(void)
{
struct timespec tv;
struct rtc_time tm;
register_rtc (&rtc_ops); // 注册RTC操作
// 读出RTC时间到系统,相当于系统时间与RTC同步
rtc_read_time(&tm);
tv.tv_nsec = 0;
tv.tv_sec = mktime(tm.tm_year + 1900,
tm.tm_mon + 1,
tm.tm_mday,
tm.tm_hour,
tm.tm_min,
tm.tm_sec);
do_settimeofday(&tv);
return 0;
}
// 模块放入系统
module_init(rtc_init);
修改系统时间
date -s '2010/11/25 15:30:00'
或
date 112515302010.00
把系统时间写入RTC
hwclock -w
读RTC时间到系统时间
hwclock -s
显示RTC时间
hwclock -r
如果发现系统时间比RTC的时间多或少刚才是时区的数量,那就是时间的问题
可以通过tzselect进行重新设置
也可以通过命令来更改:
ln -s /etc/localtime /usr/share/zoneinfo/Asia/Shanghai
由此也可以看到,关键点在/etc/localtime文件
如果想去掉时区,也就是去掉系统时间与RTC的时差,可以从文件系统里删除/etc
/localtime就OK了 |