这一节我们分析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.c和alarm-dev.c:这两个文件用来干什么呢?
因为我拿到的这份代码是 Android linux kernel,这2个文件是android的开发者添加上去的,android内核把rtc-dev.c丢弃了,取而代之的就是这2个东东,因而android下对RTC的操作文件为/dev/alarm而不是我们这里的/dev/rtc,感兴趣的哥们可以好好研究一下。
好了,整个RTC驱动框架分析到此结束了。