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 | 设置中断的频率 |