现在的位置: 首页 > 综合 > 正文

LINUX驱动分析之RTC(四)

2013年12月17日 ⁄ 综合 ⁄ 共 2714字 ⁄ 字号 评论关闭

*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/lmm670原创,转载请注明出处,谢谢!
/****************************************************************************************************/

 

这一节我们分析RTC驱动框架的最上层rtc-dev.c

 

 /

系统起来的时候,rtc_dev_init会被调用,此函数生成了文件/dev/rtc.

501行:把操作集rtc_dev_fops分配给/dev/rtc,而函数rtc_dev_prepare就是在rtc-s3c.c中注册RTC驱动时被调用的;

 

现在上层的接口文件/dev/rtc有了,它的操作集也有了rtc_dev_fops

 

static const struct file_operations rtc_dev_fops = {

         .owner               = THIS_MODULE,

         .llseek                = no_llseek,

         .read                  = rtc_dev_read,

         .poll           = rtc_dev_poll,

         .unlocked_ioctl         = rtc_dev_ioctl,

         .open                 = rtc_dev_open,

         .release   = rtc_dev_release,

         .fasync               = rtc_dev_fasync,

};

接下来我们就看看上层是如何最终设置RTC的。

流程大致如下:

首先上层程序会去open文件/dev/rtc,得到一个文件描述符;接下来就可以对她为所欲为了:

比如:设置RTC时间,上层通过ioctl命令RTC_SET_TIME操作文件描述符,会调用到rtc_dev_ioctl中:

rtc_set_time()位于(interface.c,跟进去:

发现调用了rtc->ops->set_time(rtc->dev.parent, tm);即回调到了我们第3节中的结构体s3c_rtcops中的s3c_rtc_settime函数,继续跟进:

 

直接对RTC寄存器进行写操作,把上层传进来的时间写到rtc寄存器中去。

到这里貌似一切该结束了,好像前面还刘了一个悬念:

Alarm.calarm-dev.c:这两个文件用来干什么呢?

因为我拿到的这份代码是 android linux kernel,这2个文件是android的开发者添加上去的,android内核把rtc-dev.c丢弃了,取而代之的就是这2个东东,因而android下对RTC的操作文件为/dev/alarm而不是我们这里的/dev/rtc,感兴趣的哥们可以好好研究一下。

好了,整个RTC驱动框架分析到此结束了。

*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/lmm670原创,转载请注明出处,谢谢!
/****************************************************************************************************/

 

这一节我们分析RTC驱动框架的最上层rtc-dev.c

 

 /

系统起来的时候,rtc_dev_init会被调用,此函数生成了文件/dev/rtc.

501行:把操作集rtc_dev_fops分配给/dev/rtc,而函数rtc_dev_prepare就是在rtc-s3c.c中注册RTC驱动时被调用的;

 

现在上层的接口文件/dev/rtc有了,它的操作集也有了rtc_dev_fops

 

static const struct file_operations rtc_dev_fops = {

         .owner               = THIS_MODULE,

         .llseek                = no_llseek,

         .read                  = rtc_dev_read,

         .poll           = rtc_dev_poll,

         .unlocked_ioctl         = rtc_dev_ioctl,

         .open                 = rtc_dev_open,

         .release   = rtc_dev_release,

         .fasync               = rtc_dev_fasync,

};

接下来我们就看看上层是如何最终设置RTC的。

流程大致如下:

首先上层程序会去open文件/dev/rtc,得到一个文件描述符;接下来就可以对她为所欲为了:

比如:设置RTC时间,上层通过ioctl命令RTC_SET_TIME操作文件描述符,会调用到rtc_dev_ioctl中:

rtc_set_time()位于(interface.c,跟进去:

发现调用了rtc->ops->set_time(rtc->dev.parent, tm);即回调到了我们第3节中的结构体s3c_rtcops中的s3c_rtc_settime函数,继续跟进:

 

直接对RTC寄存器进行写操作,把上层传进来的时间写到rtc寄存器中去。

到这里貌似一切该结束了,好像前面还刘了一个悬念:

Alarm.calarm-dev.c:这两个文件用来干什么呢?

因为我拿到的这份代码是 android linux kernel,这2个文件是android的开发者添加上去的,android内核把rtc-dev.c丢弃了,取而代之的就是这2个东东,因而android下对RTC的操作文件为/dev/alarm而不是我们这里的/dev/rtc,感兴趣的哥们可以好好研究一下。

好了,整个RTC驱动框架分析到此结束了。

抱歉!评论已关闭.