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
3.2. Sysfs 节点
3.2.1. 状态信息
Linux内核原生提供一些 RTC 的 Sysfs 节点,可以用来获取(只读)时间、范围等信息:
# ls /sys/class/rtc/rtc0/
date hctosys range time
dev max_user_freq since_epoch uevent
device name subsystem
# cat /sys/class/rtc/rtc0/time
00:00:00
# cat /sys/class/rtc/rtc0/date
1970-01-01
在RTC驱动初始化成功后,会在Sysfs中注册生成一个 status
节点,其中打印了当前的RTC配置及状态信息:
[aic@] # cd /sys/devices/platform/soc/19030000.rtc/
[aic@19030000.rtc] # cat status
In RTC V1.00:
Module Enable: 1
Alarm Enable: 0, Output alarm IO: 2/1, Output 32K: 0
Clock rate: 32787, Driver: 13
Calibration Slow, Value: -608
3.2.2. 驱动能力扫描
RTC V1.0为了节省功耗,可以调低32K时钟的驱动能力,驱动力范围是 [0, 15],值越大功耗越大。
RTC驱动提供了一个Sysfs节点 driver_capability
,用来给客户方便扫描出最适合的驱动力值。在RTC驱动初始化成功后,可以在其Sysfs目录,找到此节点,执行cat命令可触发扫描:
[aic@] # cd /sys/devices/platform/soc/19030000.rtc/
[aic@19030000.rtc] # cat driver_capability
[ 95.755513] 32K-clk driver 0 is OK
[ 97.835482] 32K-clk driver 1 is OK
[ 99.915447] 32K-clk driver 2 is OK
[ 101.995471] 32K-clk driver 3 is OK
[ 104.075494] 32K-clk driver 4 is OK
[ 106.155478] 32K-clk driver 5 is OK
[ 108.235529] 32K-clk driver 6 is OK
[ 110.315497] 32K-clk driver 7 is OK
[ 112.395507] 32K-clk driver 8 is OK
[ 114.475539] 32K-clk driver 9 is OK
[ 116.555492] 32K-clk driver 10 is OK
[ 118.635732] 32K-clk driver 11 is OK
[ 120.715503] 32K-clk driver 12 is OK
[ 122.795466] 32K-clk driver 13 is OK
[ 124.875483] 32K-clk driver 14 is OK
[ 126.955511] 32K-clk driver 15 is OK
The status of RTC driver:
Driver 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Status OK OK OK OK OK OK OK OK OK OK OK OK OK OK OK OK
客户可以从扫描结果中标注 “OK” 的值中选取一个配置到 :ref:`ref_to_rtc_dts` 。
小技巧
驱动力扫描的整个过程大约需要 16s。
3.3. hwclock 命令
busybox会带一个hwclock工具,可以用来读取、设置RTC时间。用法如下:
# hwclock -r —— 读取当前RTC时间(不加任何参数时就默认是读取)
Thu Jan 1 00:00:00 1970 0.000000 seconds
# hwclock -ru —— 读取当前RTC时间,然后加上时区校准
# hwclock -w —— 将当前的系统时间同步设置到RTC
# hwclock -wu —— 将当前的系统时间减去时区值,然后同步设置到RTC
# hwclock -s —— 将RTC时间同步设置到系统时间