2024年4月28日发(作者:)

首先rtc是实时时钟,linux中他的作用主要有两个:

①、时间日期维持功能:

主要是由RTC实时时钟控制寄存器 RTCCON进行功能的使能控制,由节拍时间

计数寄存器TICNT来产生节拍时间中断来实现实时操作系统功能相关的时间和

实时同步。其中对时间日期的操作实际上是对BCD码操作,而BCD码则是由一

系列的寄存器组成(BCD秒寄存器BCDSEC、BCD分寄存器BCDMIN、BCD小

时寄存器 BCDHOUR、BCD日期寄存器BCDDATE、BCD日寄存器BCDDAY、

BCD月寄存器BCDMON、BCD年寄存器BCDYEAR)。

②、报警功能:

主要由RTC报警控制寄存器RTCALM进行功能使能控制,并产生报警中断。报

警时间日期的设置也是对一系列的寄存器进行操作(报警秒数据寄存器ALMSEC、

报警分钟数据寄存器ALMMIN、报警小时数据寄存器ALMHOUR、报警日期数

据寄存器ALMDATE、报警月数据寄存器 ALMMON、报警年数据寄存器

ALMYEAR)。

static struct resource s3c_rtc_resource[] = {

[0] = {

.start = S3C24XX_PA_RTC,

.end = S3C24XX_PA_RTC + 0xff,

.flags = IORESOURCE_MEM,

},

#if !defined (CONFIG_CPU_S3C6400) && !defined (CONFIG_CPU_S3C6410)

[1] = {

.start = IRQ_RTC,

.end = IRQ_RTC,

.flags = IORESOURCE_IRQ,

},

[2] = {

.start = IRQ_TICK,

.end = IRQ_TICK,

.flags = IORESOURCE_IRQ

}

#else

[1] = {

.start = IRQ_RTC_ALARM,

.end = IRQ_RTC_ALARM,

.flags = IORESOURCE_IRQ,

},

[2] = {

.start = IRQ_RTC_TIC,

.end = IRQ_RTC_TIC,

.flags = IORESOURCE_IRQ

}

#endif

};

struct platform_device s3c_device_rtc = {

.name = "s3c2410-rtc",

.id = -1,

.num_resources = ARRAY_SIZE(s3c_rtc_resource),

.resource = s3c_rtc_resource,

};

EXPORT_SYMBOL(s3c_device_rtc);

以上是相应的设备资源,他也是platform设备,在板子启动的时候注册到系统中。

下面是相应的设备驱动:

static struct platform_driver s3c2410_rtcdrv = {

.probe = s3c_rtc_probe,

.remove = s3c_rtc_remove,

.suspend = s3c_rtc_suspend,

.resume = s3c_rtc_resume,

.driver = {

.name = "s3c2410-rtc",

.owner = THIS_MODULE,

},

};

static char __initdata banner[] = "S3C24XX RTC, (c) 2004,2006 Simtec

Electronicsn";

static int __init s3c_rtc_init(void)

{

printk(banner);

MSG(INFO,("lzf-%s-%sn",__FUNCTION__,__FILE__));

return platform_driver_register(&s3c2410_rtcdrv);

}

static void __exit s3c_rtc_exit(void)

{

MSG(INFO,("lzf-%s-%sn",__FUNCTION__,__FILE__));

platform_driver_unregister(&s3c2410_rtcdrv);

}

module_init(s3c_rtc_init);

module_exit(s3c_rtc_exit);

MODULE_DESCRIPTION("Samsung S3C RTC Driver");