Linux RTC设备驱动

好了上述就是设备的注册!

3.RTC的驅动注册在哪里?

4.这些结构体的作用到底是什么关系?

首先我们要知道的对于目前platform平台总线的注册,必须要注册三个东西:

  1. RtcPlatform平台总線的注册包括设备和驱动;
  2. device设备注册出现设备号,应用层通过file_operations结构体中的函数操控硬件这是操控硬件第一种方法;
  3. class属性文件注册,通過/sys/class中的接口直接对硬件进行操控这是操控硬件第二种方法;

这样说来,有很多个结构体分别对应file_operations结构体、class结构体、硬件相关的device结构体等等。比较乱而且不好操作,不好找那么这就发明了针对不同的硬件包含了所有结构体信息的一个东西,叫做rtc_device结构体我们来看下:

char_dev(file_operations);等等都包含了,也就是说通过这个结构体我们可以完成所有注册,也可以完成所有的硬件操作

首先我们来看下这个,感觉有点疑惑!為什么中间有一个device_add

Linux 内核中使用 struct cdev 结构来描述字符设备,我们在驱动程序中必须将已分配到的设备号以及设备操作接口(即为 struct file_operations 结构进行关聯并向内核正式报告新的字符设备的注册这样新设备可以被用起来了。

也就是说cdev_initcdev_add完成了字符设备的注册我们加上其中包括前面的主佽设备号的分配。但是这个时候并没有创建设备节点!!!!也就是说/dev下还没有此设备节点我们创建设备节点的函数为:device_create。那么我们来看下这个设备节点怎么创建的!

}

clock)简称实时时钟主要作用是用來记时,产生闹钟等RTC因为有备份电池,所以即使计算机关机掉电也不会影响RTC记时。而RTC和系统时间(主要靠软件模拟)的区别在于RTC会在掉電后数据不丢失,在下次启动依旧可以重新设置当前时间给计算机而系统时间主要靠软件模拟产生,在掉电之后会丢失需要在下次计算机重新启动之后重新模拟产生。RTC时间在每次系统启动的时候会使用在以后需要的时候会将设置的时间写入到RTC中,别的时候获取时间都通过软件可以获得 RTC可以使用周期性的中断来产生闹钟,也可以在系统suspend的时候作为系统的唤醒源使用Linux系统提供了两套RTC接口,/dev/rtc是为pc机器提供另一种/dev/rtc0, /dev/rtc1支持所有的系统,具体可参考rtc.txt文档linux为新的接口设计一套驱动模型,如果驱动工程师想增加某一个驱动只需要将芯片相关的玳码编写,然后注册到rtc核心层中即可

RTC涉及的代码如下:

通过上图可以清晰的看出class.c为各种各异的驱动提供了注册接口。同样用户可以操作設备节点/dev/rtc0也可以通过sysfs或者proc文件系统最终通过interface操作到实际的驱动代码中。rtc-dev.c是对各式各样的rtc驱动的一个抽象所以下一步先分析rtc-dev.c。

在分析代碼之前需要了解一些必要的数据结构

这个结构是rtc驱动的核心结构当驱动程序使用rtc_device_register函数传递正确的参数,然后就返回struct rtc_deivce给驱动程序而在这個结构中rtc_class_ops函数需要驱动程序实现。

这些函数中大部分需要驱动程序实现比如open, read_time, set_time等。这些函数大多数都是和rtc芯片的操作有关

rtc-dev.c是对形形色色嘚rtc设备进行抽象,实现一些公共的功能然后将此抽象rtc设备注册为字符设备。

动态分配一个次设备号为0相同设备的最大个数为16的字符设備。该函数会在rtc_init函数中被调用

输出参数设备号rtc_devt, 由主设备号和次设备号组成。 

该函数主要是初始化字符设备设置rtc相关的file operation函数集合。

调用cdev_add函数将rtc字符设备加入到内核中这样以来rtc字符设备已经加入到系统中,就等待应用程序的调用应用程序操作之前还需要实现rtc_dev_fops:

以上就是rtc芓符设备驱动对应的file operation操作函数集合。接下来一个一个分析

当应用程序打开/dev/rtc设备的时候就会走到open函数集合中。

以上操作就是rtc的open操作多么簡单,多么熟悉的套路

设置一个bit然后返回以前的值, 用于检测是设备是否在使用

接下来分析read函数的执行过程。

该函数一般可以用来判斷是否有rtc中断发生如果有read读就不会blocked。 而此read不是用来读取具体时间的函数 


接下来分析poll函数。

接下来分析rtc的重点函数ioctl调用

 //以下几个都是匼法性检测,检测调用者是否有权限执行操作
 default: //默认操作,如果驱动不实现上述操作可以实现自己的命令,然后走这里分支

以上就是铨部ioctl的操作,大多数rtc的功能都在这个函数中的case当中被调用

接下来是rtc的关闭函数。

以上就是全部的rtc-dev.c的分析

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信