`
helloyesyes
  • 浏览: 1269483 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Linux驱动修炼之道-RTC子系统框架与源码分析

阅读更多

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/21/6436215.aspx

RTC(实时时钟)是一种典型的字符设备,作为一种字符设备驱动,RTC需要有file_operations中接口函数的实现,如open(),release(),read(),poll(),ioctl()等,而典型的ioctl包括RTC_SET_TIME,RTC_ALM_READ,RTC_ALM_SET,RTC_IRQP_SET,RTC_IRQP_READ等,这些对于所有的RTC是通用的,只有底层的具体实现是设备相关的。如下图可以清楚看出RTC子系统的框架。


下面介绍几个重要的数据结构:

rtc_device用来描述rtc设备:

rtc_time用于get time/set time:

描述报警状态的结构:

现在来看看rtc子系统是怎么注册上的:

在class.c文件函数rtc_init中生成rtc类,然后调用rtc-dev.c文件中的rtc_dev_init分配设备号。
在rtc-dev.c中声明了file_operations,因为rtc也是一个字符设备:

下面来分析rtc-s3c.c源码:
首先看模块的注册和撤销:

从上边的代码可以看出rtc driver作为platform_driver注册进内核,挂在platform_bus上。

在arch/arm/plat-s3c24xx/devs.c中定义了rtc的platform_device:

平台驱动中定义了probe函数,下面来看他的实现:

函数rtc_device_register在文件class.c中实现:

下边是s3c_rtc_enable函数的实现:

这里是电源管理部分,在挂起时保存TICNT的值,并禁止RTCCON,TICNT;在休眠的时候开启RTCCON,并恢复TICNT的值。

s3c_rtcops是RTC设备在RTC核心部分注册的对RTC设备进行操作的结构体,类似字符设备在驱动中的file_operations对字符设备进行操作的意思。

这两个是下边会用到的中断处理函数,产生一个时钟中断的时候就更新一下rtc_irq_data的值,也就是说只有当产生一个时钟中断(也就是一个滴答tick)才返回给用户一个时间。

首先来看打开和关闭函数:

RTC设备类关闭接口函数:

更新RTCALM寄存器的状态,是否使能:

更新TICNT寄存器的状态,是否使能:

更新TICNT节拍时间计数的值:

获取报警时间的值:

设置报警时间的值:

下面来分析一下是怎样获取和设置时间的:
通过用户空间的ioctl,在rtc-dev.c中实现了rtc_dev_ioctl,其中获取和设置时间如下:

通过copy_to_user和copy_from_user实现时间在内核空间与用户空间的传递。这里调用到的rtc_read_time和rtc_set_time在interface.c中实现:

可以看出他们调用了具体RTC设备驱动中的read_time和set_time函数,对应了s3c2410中的s3c_rtc_gettime和s3c_rtc_settime,这里使用的rtc_tm_to_time函数实现在rtclib.c中,/drivers/rtc/interface.c定义了可供其它模块访问的接口。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics