Linux驱动 | Linux内核 RTC时间架构
0赞上一篇文章我们给大家讲解了基于瑞芯微rk3568平台芯片hym8563驱动的移植,本文给大家详细讲解Linux内核的时间子系统。
一、Linux 时间操作命令 :date、hwclock
Linux时间有两个:系统时间(Wall Time), RTC时间
。
1)系统时间(WT):
由Linux系统软件维持的时间,通过Linux命令date查看:
获取到的就是系统时间。
2)RTC时间:
这个时间来自我们设备上的RTC芯片,通过Linux命令hwclock可以读取:
我们通过man查看date和hwclock的介绍:
命令说明
1)date
2)hwclock
接下来,通过代码看下两者的关系。
二、RTC时间框架
框架如图:
下面我们从底层往上层来一步步分析。
1、rtc_class_ops 填充
驱动主要工作是填充 rtc_class_ops结构体,结构体描述了RTC芯片能够提供的所有操作方式:
从log可得 5-0051: 5表示I2C通道5,0051表示从设备地址 rtc0 :注册的rtc设备为rtc0
2、class.c和RTC驱动注册
class.c文件在RTC驱动注册之前开始得到运行:
函数功能:
1、创建名为rtc的class
2、提供PM相关接口suspend/resume
3、rtc_dev_init():动态申请/dev/rtcN的设备号
4、rtc_sysfs_init():rtc类具有的device_attribute属性
3、RTC驱动注册函数devm_rtc_device_register():
rtc_device_register()定义如下
有了 /dev/rtc0后,应用层就可以通过 open/read/ioctl操作RTC设备了,对应与内核的file_operations:
4、硬件抽象层interface.c
硬件抽象,即屏蔽具体的硬件细节,为上层用户提供统一的调用接口,使用者无需关心这些接口是怎么实现的。 以RTC访问为例,抽象的实现位于interface.c文件,其实现基于class.c中创建的rtc_device设备。 实现原理,以rtc_set_time为例:
5、rtc在sysfs文件系统中的呈现
之前曾建立过名为rtc的class:
我们系统中只有一个RTC,所以编号为rtc0。
同时发现rtc0文件为指向/sys/devices/platform/fe5e0000.i2c/i2c-5/5-0051/rtc/rtc0的符号链接,
RTC芯片是I2C接口,所以rtc0挂载在I2C的总线上,总线控制器地址fe5e0000,控制器编号为5,RTC芯片作为slave端地址为0x51。
rtc0 设备属性:
6、rtc在proc文件系统中的呈现
之前曾rtc0设备加入到了/proc
三、WT时间和RTC时间同步问题
1)
WT时间来自于RTC时间,流程是:
2)瑞芯微时间操作
在瑞芯微的系统中,安卓部分程序其实最终也是依赖**/sys/class/rtc/rtc0** 下的文件节点实现时间管理功能的。
安卓程序会通过AlarmImpl::getTime、AlarmImpl::setTime()方法来获得和设置RTC时间:
系统上电后,会先读取文件hctosys中的值,来决定是否将RTC时间写入到wall time:
269行,就是读取文件hctosys中的值,值为1则允许rtc时间写入到wall time,为0或者其他错误则不允许。
只需要按照对应的格式增加对应文件信息即可。
原文链接:https://mp.weixin.qq.com/s/qMbCr-k45_btsc2_M4MzQQ
电子技术应用专栏作家一口Linux