ret = -ENOENT;
goto err_nores;
}
s3c_rtc_base = ioremap(res->start, res->end - res->start + 1);
if (s3c_rtc_base == NULL) {
dev_err(&pdev->dev, 'failed ioremap()n');
ret = -EINVAL;
goto err_nomap;
}
/* check to see if everything is setup correctly */
s3c_rtc_enable(pdev, 1);
pr_debug('s3c2410_rtc: RTCCON=%02xn',
readb(s3c_rtc_base + S3C2410_RTCCON));
s3c_rtc_setfreq(&pdev->dev, 1);
device_init_wakeup(&pdev->dev, 1); //驱动支持电源管理
/* register RTC and exit */
/*将RTC注册为RTC设备类,RTC设备类在RTC驱动核心部分中由系统定义好的,注意rtcops这个参数是一个结构体,该结构体的作用和里面的接口函数前面实现。rtc_device_register函数在rtc.h中定义,在drivers/rtc/class.c中实现*/
rtc = rtc_device_register('s3c', &pdev->dev, &s3c_rtcops,THIS_MODULE);
if (IS_ERR(rtc)) {
dev_err(&pdev->dev, 'cannot attach rtcn');
ret = PTR_ERR(rtc);
goto err_nortc;
}
rtc->max_user_freq = 128;
/*将RTC设备类的数据传递给系统平台设备。platform_set_drvdata是定义在platform_device.h的宏,如下:
#define platform_set_drvdata(_dev,data) dev_set_drvdata(&(_dev)->dev, (data))
而dev_set_drvdata又被定义在include/linux/device.h中,如下:
static inline void dev_set_drvdata (struct device *dev, void *data)
{
dev->driver_data = data;
}*/
platform_set_drvdata(pdev, rtc);
return 0;
err_nortc:
s3c_rtc_enable(pdev, 0);
iounmap(s3c_rtc_base);
err_nomap:
release_resource(s3c_rtc_mem);
err_nores:
return ret;
}
#ifdef CONFIG_PM
/* RTC Power management control */
static int ticnt_save;
static int s3c_rtc_suspend(struct platform_device *pdev, pm_message_t state)
{
/* save TICNT for anyone using periodic interrupts */
ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT);
s3c_rtc_enable(pdev, 0);
return 0;
}
static int s3c_rtc_resume(struct platform_device *pdev)
{
s3c_rtc_enable(pdev, 1);
writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT);
return 0;
}
#else
#define s3c_rtc_suspend NULL
#define s3c_rtc_resume NULL
#endif
static struct platform_driver s3c2410_rtc_driver = {
.probe = s3c_rtc_probe,
.remove = __devexit_p(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);
return platform_driver_register(&s3c2410_rtc_driver); //注册RTC平台驱动
}
static void __exit s3c_rtc_exit(void)
{
platform_driver_unregister(&s3c2410_rtc_driver);
}
module_init(s3c_rtc_init);
module_exit(s3c_rtc_exit);
MODULE_DESCRIPTION('Samsung S3C RTC Driver');
MODULE_AUTHOR('Ben Dooks
MODULE_LICENSE('GPL');
MODULE_ALIAS('platform:s3c2410-rtc');
配置内核,加入RTC驱动支持
Devide drivers --->
<*> Real Time Clock --->
<*> Samsung S3C series SoC RTC
测试:
# cat /proc/devices 查看rtc设备号
# ls –l /dev/rtc
crw-r--r-- 1 root root 254, 0 Jan 1 1970 /dev/rtc
lrwxr--r-- 1 root root 3Jan 1 1970 /dev/rtc0 -> rtc
date –s 072021352011 设置系统时间为2011-07-20 21:35
hwclock –w 把刚设置的系统时间存入RTC
开机时使用hwclock –s把RTC时间恢复到系统时间
hwclock参数说明:
Options:
-r Show hardware clock time
-s Set system time from hardware clock
-w Set hardware clock to system time
-u Hardware clock is in UTC
-l Hardware clock is in local time
-f FILE Use specified device (e.g. /dev/rtc2)
上一篇:S3C2440驱动篇—Linux平台设备驱动
下一篇:S3C2440-SDRAM连线分析
推荐阅读最新更新时间:2024-11-13 16:50
设计资源 培训 开发板 精华推荐
- LTC3646IDE-1 28V 输出、500kHz 工作频率同步降压转换器的典型应用电路
- LTM4630IV 36A、1.2V 输出 DC/DC 稳压器的典型应用电路
- LTC3564DCB6 演示板、采用 ThinSOT 的 2.25MHz、1.2A 同步降压稳压器
- EVAL-ADUM3151Z,用于评估 iCoupler ADuM3152ARSZ 数字隔离器的评估板
- NV706281R2DBGEVB:DB LIN ST DRIVER STALL NQ
- YuzukiXR806
- 用于增加软启动的 LT3089IFE 线性稳压器的典型应用电路
- AD8531ARTZ-REEL 单电源、立体声耳机驱动器的典型应用
- 【郑州工商学院】红外小车+180506080136
- 用于工业应用的 LT3973EMS 3.3V 降压转换器的典型应用