首先RTC设备是一种片上设备, 用platform_device来表示 该设备(即platform_device的RTC对象)在设备的初始化过程中就已经注册进了系统(可以参考2410下soc上的设备的驱动流程(RTC, watchdog等)), 因此我们在RTC驱动的初始化里把RTC驱动注册到系统后,系统会probe到这个RTC设备,最后调用我们RTC驱动的probe函数.
下面就重点分析2410的RTC驱动.
首先是初始化函数和退出函数:
static void __init s3c2410_rtc_init(void)
{
printk(banner);
/*
* 这就把这个RTC驱动注册进了系统,同时系统会查找匹配的RTC设备,并调用
* s3c2410_rtcdrv的probe函数.
*/
return platform_driver_register(&s3c2410_rtcdrv);
}
Static void __exit s3c2410_rtc_exit(void)
{
/*卸载这个RTC驱动, 之后RTC设备就无法使用了*/
platform_driver_unregister(&s3c2410_rtcdrv);
}
static struct platform_driver s3c2410_rtcdrv = {
.probe = s3c2410_rtc_probe,
.remove = s3c2410_rtc_remove,
.suspend = s3c2410_rtc_suspend,
.resume = s3c2410_rtc_resume,
.driver = {
.name = “s3c2410-rtc”, //这个字符串必须和RTC设备的定义一样,系统才会匹配正确.
.owner = THIS_MODULE,
},
};
当系统把RTC设备注册到系统后,它就开始查找相应总线上的所有设备, 并与这个驱动比较, 如果系统找到匹配的RTC设备就会调用RTC驱动的s3c2410_rtc_probe函数, 注意RTC设备实在系统初始化时就注册进了系统.
static int s3c2410_rtc_probe(struct platform_device *pdev /*rtc设备*/)
{
struct resource *res;
int ret;
pr_debug("%s: probe=%p/n", __FUNCTION__, pdev);
/*
* 获取设备的tick中断资源, 通过查看platform_get_irq可知,实际上通过查找pdev的资源获得的, * 而pdev的资源是在构建platform_device对象的时候就指定好的, 可到Devs.c中查看
*/
s3c2410_rtc_tickno = platform_get_irq(pdev, 1);
if (s3c2410_rtc_tickno < 0) {
dev_err(&pdev->dev, "no irq for rtc tick/n");
return -ENOENT;
}
/*
* 获取设备的rtc中断资源, 通过查看platform_get_irq可知,实际上通过查找pdev的资源获得的, * 而pdev的资源是在构建platform_device对象的时候就指定好的, 可到Devs.c中查看
*/
s3c2410_rtc_alarmno = platform_get_irq(pdev, 0);
if (s3c2410_rtc_alarmno < 0) {
dev_err(&pdev->dev, "no irq for alarm/n");
return -ENOENT;
}
pr_debug("s3c2410_rtc: tick irq %d, alarm irq %d/n",
s3c2410_rtc_tickno, s3c2410_rtc_alarmno);
/*
* 获取设备的memory资源, 通过查看platform_get_irq可知,实际上通过查找pdev的资源获得的, * 而pdev的资源是在构建platform_device对象的时候就指定好的, 可到Devs.c中查看
*/
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res == NULL) {
dev_err(&pdev->dev, "failed to get memory region resource/n");
return -ENOENT;
}
/*
* 查看指定的memory是否可以使用.
*/
s3c2410_rtc_mem = request_mem_region(res->start, res->end-res->start+1,
pdev->name);
if (s3c2410_rtc_mem == NULL) {
dev_err(&pdev->dev, "failed to reserve memory region/n");
ret = -ENOENT;
goto exit_err;
}
/*
* 重映射指定的内存区域,即把原来的物理地址映射到相应的虚拟地址, 这样以后就可以用这个* 虚拟地址直接访问原来的物理地址了, 这里是映射RTC的寄存器地址区间.
*/
s3c2410_rtc_base = ioremap(res->start, res->end - res->start + 1);
if (s3c2410_rtc_base == NULL) {
dev_err(&pdev->dev, "failed ioremap()/n");
ret = -EINVAL;
goto exit_err;
}
s3c2410_rtc_mem = res;
pr_debug("s3c2410_rtc_base=%p/n", s3c2410_rtc_base);
pr_debug("s3c2410_rtc: RTCCON=%02x/n", readb(S3C2410_RTCCON));
/*正确初始化RTC设备 */
s3c2410_rtc_enable(pdev, 1);
pr_debug("s3c2410_rtc: RTCCON=%02x/n", readb(S3C2410_RTCCON));
/*设置好设备的频率*/
s3c2410_rtc_setfreq(s3c2410_rtc_freq);
/* 注册RTC设备的操作函数, 以后对该设备的访问将调用这些操作函数*/
register_rtc(&s3c2410_rtcops);
return 0;
exit_err:
dev_err(&pdev->dev, "error %d during initialisation/n", ret);
return ret;
}
分享到:
相关推荐
在"Rtc.rar_s3c2410 RTC AR"这个压缩包中,我们有两个文件:www.pudn.com.txt可能是一个包含链接或说明的文本文件,而"Rtc"文件可能是一个包含了RTC驱动程序和示例代码的工程文件。 S3C2410的RTC模块是一个硬件...
5. 能耗管理:在低功耗模式下,RTC驱动需要确保正确地管理硬件电源状态,以减少系统能耗。 RTC5驱动可能提供了API接口,使得上层应用可以通过调用这些接口来访问和操作RTC。例如,`rtc_set_time()`函数用于设置时间...
5. **电源管理**:在低功耗场景下,RTC驱动需要处理电源管理问题。例如,在系统进入休眠模式时,确保RTC芯片继续保持工作,以便在预设的唤醒时间点唤醒系统。 6. **同步与对齐**:在多处理器系统中,RTC驱动可能...
9. **电源管理**:考虑到功耗,RTC驱动可能需要实现节能模式,比如在系统休眠时降低RTC的工作频率或关闭不必要的功能。 理解并掌握以上知识点,将有助于开发者正确地编写和使用8025T RTC的IIC驱动,实现对硬件时间...
8. **调试工具**:内核源码中可能包含了用于调试RTC驱动的工具和日志输出,帮助开发者理解RTC驱动的工作流程,定位和修复问题。 理解并掌握这些知识点,对于开发和维护s3c2410芯片在Linux上的RTC功能至关重要。这...
- **rtc-s3c.c**:针对三星ARM芯片的RTC驱动程序。 - **alarm.c**:用于处理RTC的报警功能。 - **alarm-dev.c**:提供更高级别的报警接口。 在`rtc-s3c.c`中,通过平台设备驱动模型实现了S3C系列RTC的驱动: ```c ...
2. 引入RTC驱动:将压缩包中的RTC驱动源码加入到工程中,并确保其被正确编译链接。 3. 编写应用代码:使用RT-Thread提供的RTC API编写应用程序。例如,`rt_device_find`找到RTC设备,然后使用`rt_device_open`打开...
在Linux内核中,RTC驱动一般会实现以下功能: 1. 初始化:设置SPI接口参数,与DS3234建立连接。 2. 读取和写入时间:驱动程序应能读取DS3234的当前时间,并设置新的时间值。 3. 设定报警:允许用户设置定时器,当...
这个压缩包包含了三个主要部分,分别涉及RX8130CE的数据手册、RTC驱动代码以及针对8130CE的协议分析。 首先,RX8130CE是一款高性能的实时时钟/日历芯片,广泛应用于各种嵌入式系统,如智能设备、家用电器和工业控制...
RTC(Real-Time Clock)是计算机系统...通过分析和理解"rtc-rx8025t.c"源代码,开发者可以深入学习Linux驱动开发,尤其是RTC驱动的实现细节,这对于在Linux系统中开发或移植其他RTC芯片的驱动程序具有重要的参考价值。
RTC(Real-Time Clock)是计算机系统中的一个重要组件,它能够独立于CPU运行,持续地记录当前时间。...通过分析RTC.c文件,我们可以深入理解RTC驱动的设计和实现,从而更好地利用这一关键硬件资源。
pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z http://blog.csdn.net/21cnbao/article/details/7919055 在Android源码树中添加userspace I2C读写...
通过分析I2C总线架构、RTC设备的工作原理以及Linux内核驱动模型,作者给出了具体的驱动设计步骤,并在实际应用中验证了设计的有效性。这对于进行类似嵌入式系统开发的工程师来说,是一份有价值的参考资料。
STM32驱动RTC6705的源码分析与实现 STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计,包括各种实时时钟(RTC)应用。RTC6705是一款高效能、低功耗的实时时钟模块,它能够提供精确的时间保持...
#### S3C2410 RTC驱动分析 在深入探讨Linux设备驱动模型前,我们首先来看一个具体的实例:S3C2410 RTC驱动程序。在`drivers/rtc/rtc-s3c.c`中,S3C2410 RTC驱动定义如下: ```c static struct platform_driver s3c...
修改linux内核3.2.0 的 rtc 驱动 rtc-pcf8563.c (源码位置: drivers/rtc), 实现 i2c 驱动层平台设备的动态生成, 而无需在板级初始化中注册 i2c 设备 资源包含两个文件: rtc-pcf8563.c 和 rtc-pcf8563内核源码.c, ...
综上所述,这个压缩包提供了学习和实践Linux下RTC开发的机会,涵盖了RTC驱动编程、接口使用、唤醒功能以及电源管理等多个方面的知识。通过分析`rtc_test.c`代码并结合参考资料,开发者可以深入理解RTC在Linux系统中...
2. **误差分析**:根据采集的数据,RTC5可以分析出振镜在各个角度下的偏差,这包括静态和动态误差。 3. **校正算法**:软件内置了高级算法,能够计算出最优的校正值,以最小化振镜的运动误差。 4. **校正文件生成*...
在Linux操作系统中,RTC(Real-Time Clock)是一个重要的硬件组件,用于保持系统时间即使在关机或无电源状态下也能准确计时。RTC功能测试对于确保系统时间的准确性、可靠性和稳定性至关重要。本测试主要目的是验证...
在实际应用中,开发或修改RTC驱动通常包括以下步骤: 1. **硬件初始化**:配置STM32的GPIO、I2C或SPI接口,使能RTC功能。 2. **驱动注册**:在内核中注册RTC设备,分配设备号,创建设备节点。 3. **操作函数实现**:...