/ *****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/lmm670原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
这里我们针对三星的S3C24XX系列进行RTC驱动框架的分析,关于RTC(实时时钟)的功能和硬件原理我就不在这里啰嗦了,相信大家都十分清楚,不清楚的可以google或者百度一下,我想通过RTC驱动和大家探讨一下linux驱动的一般框架,为大家在linux驱动的学习路上起到一个抛砖引玉的作用。那有哥们就要问了,为什么选择RTC驱动呢?就是因为它简单明了,大家都容易明白的东西才是好东西,好啦,废话不多说,开始进入正题:
Linux常见的驱动在driver目录下都有一个文件夹,当然我们的RTC也不例外,我们进入kernel主目录下的drivers/rtc,发现下面包含了许多开发平台的RTC驱动,我们这里是以S3C24xx为主,所以我们要寻找的是“rtc-s3c.c”这个美人儿,她是我们要分析的核心;其他几个相关联的文件分别是:alarm.c, alarm-dev.c,class.c, hctosys.c, interface.c, rtc-dev.c.这几个文件就是我们这部戏的主角儿。
看戏大家都喜欢去研究人物之间的关系,A喜欢B,B喜欢C,C又喜欢D…….这里我们也来先理顺一下这几个主角之间微妙的关系:
首先,当然是我们主角中的战斗机rtc-s3c.c,她是最顶层的直接和硬件打交道的驱动文件,每个平台,高通,marvell,三星都有自己的这部分,一般被命名为类似的”rtc-msm.c,rtc-pxa.c,rtc-s3c.c”;就像每个国家每个部落,总有一批底层工作者,在默默的为上层的骄奢淫逸,荣华富贵贡献着自己的血汗;
rtc-s3c.c上面的是interface.c,顾名思义就知道是接口文件,它主要是对rtc-s3c.c进行封装,给上层提供统一的接口,屏蔽底层差异化的东东。
Interface.c再往上就到了rtc-dev.c.,rtc-dev.c最终生成了/dev/rtc,上层的应用程序就是通过操作此文件来进行RTC的相关的设置系统时间,设置闹钟,等等。
所有整个人物关系图如下:
上层应用层序
|
|
V
rtc-dev.c
|
|
V
interface.c
|
|
V
rtc-s3c.c
好像三个文件就已经把整个RTC从底层到上层所有的东东都讲完了,那么还剩下几个文件干嘛呢?
Alarm.c和alarm-dev.c:这两个文件用来干什么呢?这里先留个悬念,后面和大家慢慢说明
class.c:提供了RTC子系统一些的公共函数,让各个RTC驱动注册集成到我们的linux内核中,她实际上是一个粘合剂。
hctosys.c:系统起来之后,会调用到这个文件中的rtc_hctosys()函数,主要功能是系统起来的时候,去读RTC硬件中的时间,然后更新我们的系统时间。
好啦,到这里,相信我们已经对整个rtc驱动各个层都比较清楚了,小时候我语文老师叫我们写作文的时候就喜欢玩“总分”结构,先“总”对整个过程有个大概把握,再“分”起来就容易多了,感觉一切都逃出不我们的“五指山”。
后面的几个小节,开始我们的“分”,从细节去分析理解每个文件。