RTC模块 下载本文

RTC(Real-Time Clock)实时时钟为操作系统提供了一个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,一直运行下去。

RTC通过STRB/LDRB这两个ARM指令向CPU传送8位数据(BCD码)。数据包括秒,分,小时,日期,天,月和年。RTC实时时钟依靠一个外部的32.768Khz的石英晶体,产生周期性的脉冲信号。每一个信号到来时,计数器就加1,通过这种方式,完成计时功能。

RTC实时时钟有如下一些特性:

1,BCD数据:这些数据包括秒、分、小时、日期、、星期几、月和年。 2,闰年产生器

3,报警功能:报警中断或者从掉电模式唤醒

4,解决了千年虫问题 (详见http://baike.http://www.35331.cn//view/9349.htm) 5,独立电源引脚RTCVDD

6,支持ms中断作为RTOS内核时钟 7,循环复位(round reset)功能

如图,RTC实时时钟的框架图,XTIrtc和XTOrtc产生脉冲信号,即外部晶振。传给2^15的一个时钟分频器,得到一个128Hz的频率,这个频率用来产生滴答计数。当时钟计数为0时,产生一个TIME TICK中断信号。时钟控制器用来控制RTC实时时钟的功能。复位寄存器用来重置SEC和MIN寄存器。闰年发生器用来产生闰年逻辑。报警发生器用来控制是否产生报警信号。

1,闰年产生器:

闰年产生器可以基于BCDDATE,BCDMON,BCDYEAR决定每月最后一天的日期是28、29、30、31.一个8位计数器只能表示两位BCD码,每一位BCD码由4位表示。因此不能支持。因此不能决定00年是否为闰年,例如不能区别1900和2000年。RTC模块通过硬件逻辑支持2000年为闰年。因此这两位00指的是2000,而不是1900 2,后备电池:

即使系统电源关闭,RTC模块可以由后备电池通过RTCVDD引脚供电。当系统电源关闭时,CPU和RTC的接口应该被阻塞,后备电池应该只驱动晶振电路和BCD计数器,以消耗最少的电池。 3,报警功能:

在正常模式和掉电模式下,RTC在指定的时刻会产生一个报警信号。正常模式下,报警中断ALMINT有效,对应INT_RTC引脚。掉电模式下,报警中断ALMINT有效外还产生一个唤醒信号PMWKUP,对应PMWKUP引脚。RTC报警寄存器RTCALM决定是否使能报警状态和设置报警条件

RTC工作原理上网查一下,很多。而且不同板子的RTC寄存器也不同,这里以S3C2440为例

下面是RTC实时时钟构架:

与RTC核心有关的文件有:

/drivers/rtc/class.c 这个文件向linux设备模型核心注册了一个类RTC,然后向驱动程序提供了注册/注销接口

/drivers/rtc/rtc-dev.c 这个文件定义了基本的设备文件操作函数,如:open,read等

/drivers/rtc/interface.c 顾名思义,这个文件主要提供了用户程序与RTC驱动的接口函数,用户程序一般通过ioctl与RTC驱动交互,这里定义了每个ioctl命令需要调用的函数

/drivers/rtc/rtc-sysfs.c 与sysfs有关

/drivers/rtc/rtc-proc.c 与proc文件系统有关

/include/linux/rtc.h 定义了与RTC有关的数据结构

static char __initdata banner[] = \Electronics\\n\//标志语

static int __init s3c_rtc_init(void) //初始化模块

{

printk(banner);

return platform_driver_register(&s3c2410_rtc_driver);

}

static void __exit s3c_rtc_exit(void) //卸载模块 {

platform_driver_unregister(&s3c2410_rtc_driver); }

module_init(s3c_rtc_init); module_exit(s3c_rtc_exit);

void platform_driver_unregister(struct platfort_driver *drv) {

driver_unregister(&drv->driver); }

RTC实时时钟的平台驱动设备定义:

static struct platform_driver s3c2410_rtc_driver = { .probe =

s3c_rtc_probe, //RTC探测函数 .remove =

__devexit_p(s3c_rtc_remove), //RTC移除函数 .suspend =

s3c_rtc_suspend, //RTC挂起函数 .resume =

s3c_rtc_resume, //RTC恢复函数 .driver = {

.name =

\//驱动名字 .owner =

THIS_MODULE, //驱动模块 }, };

当调用plat_driver_register()函数注册驱动以后,会触发平台设备和驱动的匹配函数platform_match()。匹配成功,则会调用平台驱动中的probe()函数,RTC实时时钟驱动中对应的函数就是s3c_rtc_probe()。主要任务有以下:(请参考下面源代码) 1,读取平台设备的资源结构体s3c_rtc_resource中的第二个中断号,即滴答中断号 2,读取平台设备的资源结构体s3c_rtc_resource中的第一个中断号,即报警中断号