Linux的RTC驱动相对还是比较简单的,可以将它作为一个普通的字符型设备,或者一个misc设备,也可以是一个平台设备,这都没有关系,主要还是对rtc_ops这个文件操作结构体中的成员填充,这里主要涉及到两个方面比较重要:
1. 在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
系统时钟的设定就是我们常用的date命令,而我们写的RTC驱动就是为硬件时钟服务的,它有属于自己的命令hwclock,因此使用date命令是不可能调用到我们的驱动的(在这点上开始把我郁闷到了,写完驱动之后,傻傻的用date指令来测试,当然结果是什么都没有),我们可以通过hwclock的一些指令来实现更新rtc时钟——也就是系统时钟和硬件时钟的交互。
hwclock –r显示硬件时钟与日期
hwclock –s将系统时钟调整为与目前的硬件时钟一致。
hwclock –w将硬件时钟调整为与目前的系统时钟一致。
用户输入 hwclck -s // 这个命令是 把硬件的时钟更新到系统中去
这个命令会调用busybox源码中的hwclock.c,在目录util-linux/hwclock.c 中的 ->int hwclock_main(int argc UNUSED_PARAM, char **argv)
后面的参数会以argv形式接收
opt = getopt32(argv, "lurswtf:", &rtcname);
会把argv的参数进行转换 l -> 0x01
u -> 0x02
r -> 0x04
s -> 0x08
w -> 0x10
t -> 0x20
f -> 0x40
: -> 0x80
#define HWCLOCK_OPT_LOCALTIME 0x01
#define HWCLOCK_OPT_UTC 0x02
#define HWCLOCK_OPT_SHOW 0x04 // 等价 hwclock –r 显示硬件的时间
#define HWCLOCK_OPT_HCTOSYS 0x08 // 等价 hwclock –s 硬件时间更新到系统时间
#define HWCLOCK_OPT_SYSTOHC 0x10 // 等价 hwclock –w 系统时间更新到硬件时间
#define HWCLOCK_OPT_SYSTZ 0x20
#define HWCLOCK_OPT_RTCFILE 0x4