架构

RTC 驱动程序遵循 Linux RTC 子系统。RTC 子系统的架构示意图如下图所示。

../../rst_linux/8_rtc/figures/rtc_subsystem_arch.svg

RTC 用于跟踪实际时间。在系统处于低功耗模式时,它仍然可以工作。

RTC 设备是一个标准的字符设备。用户空间的应用程序可以通过 open、release、read、write 和 IOCTL 等功能访问 RTC 设备。另外,RTC 核心提供了 API,以便内核程序可以访问它。

RTC 核心提供了三个用户空间接口: /dev/rtc0/proc/rtc/sys/class/rtc/rtc0

实现

RTC 的驱动程序实现如下所列:

驱动程序位置

介绍

<linux>/drivers/rtkdrivers/rtc/Kconfig

RTC 驱动程序 Kconfig

<linux>/drivers/rtkdrivers/rtc/Makefile

RTC 驱动程序 Makefile

<linux>/drivers/rtkdrivers/rtc/rtk-rtc.c

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 时钟节点

编译配置

选择 Device Drivers > Drivers for Realtek > RTC driver

../../rst_linux/8_rtc/figures/rtc_build_configuration.png

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 设备充当字符设备。用户可以使用 openreadioctl 等操作来访问 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);