RTC - 实时时钟
在 Linux 内核中,RTC(Real Time Clock)驱动负责管理和操作系统中的实时时钟硬件设备,以便系统可以获取当前的实时时间。RTC 驱动通常涉及到与硬件设备进行交互,包括读取当前时间、设置时间、处理中断等功能。
下面是 RTC 驱动在 Linux 内核中的一些重要方面和功能:
-
硬件抽象层(Hardware Abstraction Layer):Linux 内核为不同类型的实时时钟硬件提供了通用的抽象接口,使得不同类型的 RTC 设备可以通过统一的接口进行访问和操作。
-
设备驱动接口:RTC 驱动程序通常将其表示为字符设备,并通过
/dev/rtc
设备节点向用户空间提供实时时钟的访问接口。用户空间的程序可以通过读写该设备节点来获取或设置系统时间。 -
中断处理:RTC 驱动通常会注册一个中断处理程序,以处理实时时钟硬件产生的中断。这样,在每秒钟更新时间的时候,RTC 可以生成一个中断信号,通知内核来更新系统时间。
-
电源管理:RTC 驱动可能还涉及到系统的电源管理,特别是在系统进入低功耗模式时,RTC 可能需要保持运行以继续跟踪时间。
-
Sysfs 接口:除了字符设备接口外,Linux 内核还提供了 Sysfs 接口,通过
/sys/class/rtc
目录下的文件可以查看和修改 RTC 驱动的一些配置参数和信息。 -
RTC 子系统:Linux 内核中还有一个 RTC 子系统,用于管理系统中所有 RTC 设备的注册和操作。RTC 驱动程序通过注册到 RTC 子系统来与其他部分进行交互。
模块配置
驱动配置
RTC Drivers ->
<*> RTC Support for Allwinner SoCs
[*] Enable RTC General Registers for Reboot Flag
[*] Enable RTC Alarm in Power-Off State
< > Allwinner timer alarm
[ ] support fake poweroff
设备树配置
在 Device Tree
中对每一个RTC
控制器进行配置,一 个RTC
控制器对应一个RTC
节点,节点属性的含义见注释。
rtc: rtc@7090000 {
compatible = "allwinner,rtc-v201";
device_type = "rtc";
wakeup-source; // 表示RTC是具备休眠唤醒能力的中断唤醒源
reg = <0x0 0x07090000 0x0 0x320>;// RTC寄存器基地址和映射范围
interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>; // RTC硬件中断号
clocks = <&r_ccu CLK_BUS_R_RTC>, <&rtc_ccu CLK_RTC_1K>, <&rtc_ccu CLK_RTC_SPI>; // RTC所用到的时钟
clock-names = "r-ahb-rtc", "rtc-1k", "rtc-spi"; // 上述时钟的名字
resets = <&r_ccu RST_R_RTC>;
gpr_cur_pos = <6>; // 当前被用作reboot-flag的通用寄存器的序号
gpr_bootcount_pos = <7>; // 用于存储启动原因,如冷启动,热启动
};
模块驱动
RTC 驱动的源代码位于BSP独立仓库的 drivers/rtc
目录下,具体的路径如下所示:
.
├── Kconfig
├── Makefile
├── rtc-jxr160.c
├── rtc-sd2059.c
├── rtc-sunxi.c
├── rtc-sunxi.h
└── sunxi_timer_alarm.c
用户层接口
RTC驱动加载成功后会注册生成串口设备/dev/rtcN
,应用层的使用只需遵循Linux系统中的标准RTC编程方法即可。
确认RTC驱动正确加载
小机端执行命令:
ls /dev/rtc*
能够查询到RTC设备,表明内核RTC驱动正确加载。
RTC驱动支持 ioctl
指令功能描述:
指令 | 功能描述 |
---|---|
RTC_ALM_READ | 读取闹钟时间 |
RTC_ALM_SET | 设置闹钟时间 |
RTC_SET_TIME | 设置时间与日期 |
RTC_PIE_ON | 开RTC 全局中断 |
RTC_PIE_OFF | 关RTC 全局中断 |
RTC_AIE_ON | 使能RTC闹钟中断 |
RTC_AIE_OFF | 禁止RTC闹钟中断 |
RTC_UIE_ON | 使能RTC更新中断 |
RTC_UIE_OFF | 禁止RTC更新中断 |
RTC_IRQP_SET | 设置中断的频率 |