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

💡 原文中文,约12800字,阅读约需31分钟。
📝

内容提要

本文介绍了Linux内核的时间子系统,包括系统时间和RTC时间的区别,以及RTC时间框架的结构和驱动注册过程。同时讨论了WT时间和RTC时间的同步问题。

🔎

延伸解读

系统时间与RTC时间的本质区别

系统时间由Linux内核维护,通过date命令查看,但掉电后丢失;RTC时间由硬件芯片(如hym8563)维护,通过hwclock命令读取,依靠纽扣电池在关机后继续计时。两者独立运行,系统启动时通过hctosys机制将RTC时间同步到系统时间,确保时间连续性。理解这一区别有助于排查时间跳变或不准的问题。

RTC驱动注册的关键步骤

RTC驱动开发的核心是填充rtc_class_ops结构体,实现read_time、set_time等回调,然后调用devm_rtc_device_register注册。注册过程中,内核会分配rtc_device、创建/dev/rtcN字符设备节点,并在sysfs和proc中生成对应接口。驱动加载成功后,应用层即可通过open/read/ioctl操作RTC设备。

sysfs与proc中的RTC接口

在sysfs中,RTC设备以符号链接形式出现在/sys/class/rtc/rtc0,链接到具体I2C总线下的设备路径,并暴露date、time、since_epoch、wakealarm等属性文件。proc文件系统则提供/proc/driver/rtc,显示当前时间、闹钟状态和中断使能信息。这些接口为应用层提供了统一的时间管理入口。

时间同步机制与权限注意

系统上电后,内核通过late_initcall调用rtc_hctosys,从RTC读取时间并设置系统时钟。瑞芯微平台中,安卓的AlarmManagerService会读取/sys/class/rtc/rtc0/hctosys的值决定是否同步,并通过ioctl设置RTC。需注意/sys/class/rtc/下文件的访问权限,瑞芯微通过sepolicy中的genfs_contexts文件进行控制,配置不当可能导致时间设置失败。

❓

Q&A

Linux内核的时间子系统包括哪些部分?

Linux内核的时间子系统包括系统时间和RTC时间。

如何查看Linux系统时间和RTC时间?

可以通过命令'date'查看系统时间,通过命令'hwclock'读取RTC时间。

RTC时间框架的主要组成部分是什么?

RTC时间框架包括硬件、驱动、接口和设备节点等部分。

RTC驱动是如何注册的?

RTC驱动通过class.c文件注册,使用devm_rtc_device_register函数创建rtc设备。

WT时间和RTC时间是如何同步的?

WT时间通过从RTC读取时间来同步,系统启动后会将RTC时间设置为系统时间。

设备关机后RTC时间如何保持?

设备关机后RTC仍能保持时间,因为RTC有纽扣电池供电。

🏷️

标签

➡️

继续阅读