一口Linux

电子技术应用专栏作家——一口Linux。一起学习嵌入式、Linux、网络、驱动、arm知识

Linux驱动 | Linux内核 RTC时间架构

0
阅读(1079)

上一篇文章我们给大家讲解了基于瑞芯微rk3568平台芯片hym8563驱动的移植,本文给大家详细讲解Linux内核的时间子系统。

Linux驱动|rtc-hym8563移植笔记

一、Linux 时间操作命令 :date、hwclock

Linux时间有两个: 系统时间(Wall Time), RTC时间

1)系统时间(WT):

由Linux系统软件维持的时间,通过Linux命令date查看:

image.png

获取到的就是系统时间。

2)RTC时间:

这个时间来自我们设备上的RTC芯片,通过Linux命令hwclock 可以读取:

image.png

我们通过man查看date和hwclock的介绍:

命令说明

1)date

image.png

2)hwclock

image.png

接下来,通过代码看下两者的关系。

二、RTC时间框架

框架如图:

image.png

下面我们从底层往上层来一步步分析。

1、rtc_class_ops 填充

驱动主要工作是填充 rtc_class_ops结构体,结构体描述了RTC芯片能够提供的所有操作方式:

image.png

image.png

从log可得 5-0051:   5表示I2C通道5,0051表示从设备地址 rtc0   :注册的rtc设备为rtc0

2、class.c和RTC驱动注册

class.c文件在RTC驱动注册之前开始得到运行:

image.png

函数功能:

  • 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():

image.png

rtc_device_register()定义如下

image.png

image.png

有了 /dev/rtc0后,应用层就可以通过 open/read/ioctl操作RTC设备了,对应与内核的file_operations:

image.png

4、硬件抽象层interface.c

硬件抽象,即屏蔽具体的硬件细节,为上层用户提供统一的调用接口,使用者无需关心这些接口是怎么实现的。 以RTC访问为例,抽象的实现位于interface.c文件,其实现基于class.c中创建的rtc_device设备。 实现原理,以rtc_set_time为例:

image.png

5、rtc在sysfs文件系统中的呈现

之前曾建立过名为rtc的class:

image.png

我们系统中只有一个RTC,所以编号为rtc0。

同时发现rtc0文件为指向/sys/devices/platform/fe5e0000.i2c/i2c-5/5-0051/rtc/rtc0的符号链接,

RTC芯片是I2C接口,所以rtc0挂载在I2C的总线上,总线控制器地址fe5e0000,控制器编号为5,RTC芯片作为slave端地址为0x51。

rtc0 设备属性:

image.png

6、rtc在proc文件系统中的呈现

之前曾rtc0设备加入到了/proc

image.png

三、WT时间和RTC时间同步问题

1)

WT时间来自于RTC时间,流程是:

image.png

2)瑞芯微时间操作

在瑞芯微的系统中,安卓部分程序其实最终也是依赖**/sys/class/rtc/rtc0** 下的文件节点实现时间管理功能的。

安卓程序会通过AlarmImpl::getTime、AlarmImpl::setTime()方法来获得和设置RTC时间:

image.png

image.png

系统上电后,会先读取文件hctosys中的值,来决定是否将RTC时间写入到wall time:

image.png

269行,就是读取文件hctosys中的值,值为1则允许rtc时间写入到wall time,为0或者其他错误则不允许。

image.png

只需要按照对应的格式增加对应文件信息即可。


原文链接:https://mp.weixin.qq.com/s/qMbCr-k45_btsc2_M4MzQQ

微信图片_20220701092006.jpg

电子技术应用专栏作家  一口Linux