Linux常见的驱动在driver目录下都有一个文件夹,进入kernel主目录下的drivers/rtc,发现下面包含了许多芯片的RTC驱动,我们这里是以pcf8563为主,她是我们要分析的核心。其他几个相关联的文件分别是:alarm.c、alarm-dev.c、class.c、hctosys.c、interface.c和rtc-dev.c。
class.c:向linux设备模型核心注册了一个类RTC,提供了RTC子系统的一些公共函数,让各个RTC驱动注册集成到我们的linux内核中,向驱动程序提供了注册/注销接口。
rtc-dev.c:定义了基本的设备文件操作函数,用户程序与RTC驱动的接口函数,这里定义了每个ioctl命令需要调用的函数,还有open,read等。
interface.c:提供了ioctl各个命令需要调用的函数。
rtc-sysfs.c:与sysfs有关,提供通过sys文件系统操作pcf8563。
rtc-proc.c:与proc文件系统有关,提供通过proc文件系统操作pcf8563。
hctosys.c:系统起来之后会调用到这个文件中的rtc_hctosys()函数,主要功能是系统起来的时候去读RTC硬件中的时间,然后更新我们的系统时间。
rtc.h:定义了与RTC有关的数据结构。
pcf8563.c是最底层的直接和硬件打交道的驱动文件,pcf8563.c上面一层为interface.c,为接口文件,它主要是对pcf8563.c进行封装,给上层提供统一的接口,屏蔽底层差异化。Interface.c再往上就到了rtc-dev.c.,rtc-dev.c最终生成了/dev/rtc设备节点,上层的应用程序就是通过操作此文件来进行RTC相关的设置系统时间和闹钟等操作的。
文件关系图如下:
(1)处理一个idr结构,idr在linux内核中指的就是整数ID管理机制,从本质上来说,idr是一种将整数ID号和特定指针关联在一起的机制。这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁。现在在内核的很多地方都可以找到idr的身影。这里从内核中获取一个idr结构,并与id相关联。
(2)分配了一个rtc_device的结构–rtc,并且初始化了相关的成员:id, rtc_class_ops等等。
(3)首先调用rtc_dev_prepare(在rtc-dev.c中定义)。因为RTC设备本质来讲还是字符设备,所以这里初始化了字符设备相关的结构:设备号以及文件操作。然后调用device_register将设备注册到linux设备模型核心。这样在模块加载的时候,udev daemon就会自动为我们创建设备文件rtc(n)。
(4)先后调用rtc_dev_add_device,rtc_sysfs_add_device,rtc_proc_add_device三个函数。 rtc_dev_add_device注册字符设备,rtc_sysfs_add_device只是为设备添加了一个闹钟属性,rtc_proc_add_device 创建proc文件系统接口。
rtc_init 首先调用class_create创建了一个类–rtc。我们知道类是一个设备的高层视图,他抽象出了底层的实现细节。类的作用就是向用户空间提供设备 的信息,驱动程序不需要直接处理类。然后初始化类结构的相应成员,rtc_suspend,rtc_resume这两个函数也是在class.c中实现 的。接下来调用rtc_dev_init(),这个函数为RTC设备动态分配设备号,保存在rtc_devt中。最后调用 rtc_sysfs_init,初始化rtc_class的性。
Cat/proc/devices 发现rtc已经注册到内核中,打印如下信息 :254 rtc
通过 dmesg |grep rtc,(打印一下rtc驱动加载相关信息.)打印如下信息
[ 4.234402] rtc-ds1307: probe of 2-0068 failed with error -5
[ 4.508771] drivers/rtc/hcto open rtc device (rtc0)
打电话给飞凌开发板厂家,RTC芯片由ds1337更换为xxxx,提供了补丁文件。
手动打上补丁,内核中将ds1307的驱动去掉,编译后上电 rtc-rx8010 2-0032: setting system clock to 2016-07-07 18:05:14 UTC (1467914714)。
说明rtc驱动正常加载,dev目录下有了rtc0
date命令操作Linux的系统(软件)时钟,hwclock命令操作硬件时钟(rtc模块),我们要验证rtc驱动是否工作正常,只需要hwclock,
将Linux系统时间设置到硬件rtc中hwclock -w ,hwclock -s把rtc时间写到Linux系统时间里面去
设置的格式,上面提示的很清楚了,MM是月份,DD是日期,hh是小时,mm是分钟,年份可以写2位的YY或者4位的YYYY,秒可以用.ss表示
date 110313172009.05 Tue Nov 3 13:17:05 MST 2009
hwclock -w
hwclock【RTC驱动的应用】Tue Nov 3 13:18:33 2009 0.000000 seconds
hwclock