RTC 使用指南
1. 模块介绍
1.1. 术语定义
术语 | 定义 | 注释说明 |
---|---|---|
RTC | Real Time Clock | 实时时钟 |
1.2. 模块简介
RTC(Real Time Clock)模块用于日期时间的保存和更新,在无网络下为系统提供一份有效的日期和时间。通过备用电池 供电,在断电场景下也可以一直计数和保存时间,同时还有闹钟唤醒的功能。
- 以秒为单位,最大支持100年跨度
- 精度取决于晶振精度。RTC V1.0支持校准,校准范围±975ppm(每百万次计数的误差)
- 支持一路闹钟设置(可通过软件来扩展成多路闹钟),闹钟精确到秒
- 闹钟支持输出一个中断信号(该信号也可以用于32K时钟输出)给外部系统
- RTC V1.0支持128bit 的系统数据备份,可用于掉电场景的数据保护
1.2.1. 低功耗设计
RTC V1.0控制器为了低功耗设计,选用8bit APB总线作为数据总线,带来的影响是相关的寄存器都是8bit格式。
- 如果要设置一个32bit的秒数,就需要将其拆分成4个8bit写入4个寄存器;
- 如果是读取秒数,就需要从4个寄存器的值组合成一个32bit数。
图 4.9 RTC 模块的硬件原理框图
2. 参数配置
2.1. 内核配置
在luban根目录下执行 make kernel-menuconfig,进入kernel的功能配置,按如下选择 :
Linux
Device Drivers
[*] Real Time Clock
[*] Artinchip Soc RTC
2.2. DTS 参数配置
2.2.1. RTC 自定义参数
RTC驱动支持从DTS中配置的自定义参数,如下表:
参数名称 | 适用版本 | 类型 | 取值范围 | 功能说明 |
---|---|---|---|---|
aic,alarm-io-output | V0.1/V1.0 | boolean | 有 - 1,无 - 0 | 是否使能Alarm的IO输出功能 |
aic,32k-io-output | V1.0 | boolean | 有 - 1,无 - 0 | 是否使能32K时钟输出功能 |
clock-rate | V1.0 | 正整数 | 3276800±3196 | 时钟源的实测频率值*100,用于时钟校准 |
aic,clock-driver | V1.0 | 正整数 | [0, 15] | clock驱动能力,数值越小越省功耗 |
注解
- 参数
aic,clock-driver
的值,需要通过一个 Sysfs 节点 驱动能力扫描 来扫描得到。 - 参数
aic,alarm-io-output
和aic,32k-io-output
共用一个IO输出,所以只能二选一。 clock-rate
取时钟源频率值的 100倍,是为了提高校准的精度,校准可以精确到0.03Hz。
2.2.2. D211 配置
common/d211.dtsi中的参数配置:
rtc: rtc@19030000 {
compatible = "artinchip,aic-rtc-v1.0";
reg = <0x0 0x19030000 0x0 0x1000>;
interrupts-extended = <&plic0 50 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cmu CLK_RTC>;
resets = <&rst RESET_RTC>;
};
xxx/board.dts中的参数配置:
&rtc {
aic,alarm-io-output;
clock-rate = <3276851>;
aic,clock-driver = <13>;
status = "okay";
};
2.3. 时区配置
luban SDK中默认配置时区为 Asia/Shanghai
,即中国的 +8 时区。 在luban根目录下执行 make menuconfig,进入功能配置:
System configuration
(Asia/Shanghai) default local time
有没有时区配置,可以通过shell命令 date
的输出信息判断,有 “UTC” 字样表示未配置时区,有 “CST” 字样表示已经配置了 +8 时区。
# date
Tue Jan 6 01:41:27 UTC 1970 - 未配置时区
# date
Tue Jan 6 01:41:27 CST 1970 - 已配置 +8 时区
未配置时区的时候,RTC 时间 和 系统时间(date命令的输出)是一致的;增加了时区配置后,两个会有一个时区差,关系:
系统时间 = RTC 时间 + 时区
以 +8 时区为例,可以通过 hwclock 命令 看到这个差别:
# date - 系统时间
Tue Jan 6 01:49:53 CST 1970
# hwclock - 原始的RTC时间
Mon Jan 5 17:49:17 1970 0.000000 seconds
# hwclock -u - RTC时间 + 时区,和系统时间一致
Tue Jan 6 01:49:20 1970 0.000000 seconds
注解
在打开时区的情况下,从 系统时间同步到RTC时间 的设置命令用 hwclock -wu
,查看RTC时间的方式也应该加参数 -u
(告诉hwclock工具RTC中保存的是UTC时间)。
3. 调试指南
3.1. 调试开关
在luban根目录下执行 make kernel-menuconfig,进入kernel的功能配置,可以打开RTC模块的DEBUG选项:
Linux
Kernel hacking
Artinchip Debug
[*] RTC driver debug
此DEBUG选项打开的影响:
- RTC驱动以-O0编译
- RTC的pr_dbg()和dev_dbg()调试信息会被编译
在系统运行时,如果要打印pr_dbg()和dev_dbg()信息,还需要调整loglevel为8,两个方法:
- 在board.dts中修改bootargs,增加“loglevel=8”
- 在板子启动到Linux shell后,执行命令:
echo 8 > /proc/sys/kernel/printk