架构
RTC 驱动程序遵循 Linux RTC 子系统。RTC 子系统的架构示意图如下图所示。
RTC 用于跟踪实际时间。在系统处于低功耗模式时,它仍然可以工作。
RTC 设备是一个标准的字符设备。用户空间的应用程序可以通过 open、release、read、write 和 IOCTL 等功能访问 RTC 设备。另外,RTC 核心提供了 API,以便内核程序可以访问它。
RTC 核心提供了三个用户空间接口: /dev/rtc0
、 /proc/rtc
、 /sys/class/rtc/rtc0
。
实现
RTC 的驱动程序实现如下所列:
驱动程序位置 |
介绍 |
---|---|
|
RTC 驱动程序 Kconfig |
|
RTC 驱动程序 Makefile |
|
RTC 驱动程序源代码 |
配置
设备树配置
设备树节点在 <dts>/rtl8730e-ocp.dtsi
文件中定义。
rtc: rtc@4200E000 {
compatible = "realtek,ameba-rtc";
reg = <0x4200E000 0x1000>;
interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc RTK_CKE_RTC>;
};
下表列出各个属性的描述。
属性 |
描述 |
可配置? |
---|---|---|
compatible |
匹配驱动与设备的ID |
否 |
reg |
寄存器资源 |
否 |
interrupts |
SPI 中断 |
否 |
clocks |
RTC 时钟节点 |
否 |
编译配置
选择
:
APIs
用户空间 API
RTC 子系统提供了三个用户空间接口:
/dev/rtc0
:RTC 设备。/sys/class/rtc/rtc0
:Sysfs 属性支持对某些 RTC 属性的只读访问。/proc/driver/rtc
:Procfs 接口用于系统时钟 RTC 自我展示。
用户可以通过 sysfs 节点访问属性来控制 RTC 设备。以下是一些示例。
获取 RTC 日期的命令(年月日):
cat /sys/class/rtc/rtc0/date
获取 RTC 时间的命令(时分秒):
cat /sys/class/rtc/rtc0/time
参考 <sdk>/sources/kernel/<linux>/drivers/rtc/sysfs.c
获取更多有关 sysfs 的信息。
参考 RTC Drivers for Linux 获取更多信息。
RTC 设备充当字符设备。用户可以使用 open、 read、 ioctl 等操作来访问 RTC 设备。有关测试演示,请参阅 <test>/rtc
。
内核空间 API
接口 |
介绍 |
---|---|
rtc_class_open |
打开RTC设备 |
rtc_class_close |
关闭RTC类 |
rtc_read_time |
获取RTC时间 |
rtc_set_time |
设置RTC时间 |
rtc_set_ntp_time |
将NTP同步的时间保存到RTC中 |
rtc_read_alarm |
获取RTC告警时间 |
rtc_set_alarm |
设置RTC告警时间 |
rtc_irq_set_state |
启用/禁用2^N Hz周期性中断请求 |
rtc_irq_set_freq |
设置IRQ的2^N Hz周期性中断请求频率 |
rtc_update_irq_enable |
启用/禁用更新中断请求 |
rtc_alarm_irq_enable |
启用/禁用告警中断请求 |
示例:
读取挂钟时间:
err = rtc_read_time(rtc, &tm);
设置挂钟时间:
err = rtc_set_time(rtc, &tm);
设置告警时间:
err = rtc_set_alarm(rtc, &alrm);