RTC/zh

From FriendlyELEC WiKi
Jump to: navigation, search

English

1 Step1: 设置时区

1.1 查看可用时区

timedatectl list-timezones

1.2 更改时区

sudo timedatectl set-timezone Asia/Hong_Kong

1.3 查看当前系统时间

date

2 Step2: 更换Linux系统的时间同步服务为ntpd (需连接网络)

2.1 使用ntpd代替timesyncd

sudo timedatectl set-ntp no
sudo apt update
sudo apt install ntp

3 Step2: 设置RTC设备 (以H3平台外挂Matrix-RTC为例)

3.1 将RTC驱动编译进内核 (非外部模块)

开机时, 内核会从RTC硬件读取时间并设置为系统时间, 为了让RTC驱动在这之前能初始化完成, 所以需要将外挂的RTC DS1307驱动编译进内核, 而不是外部模块, 进入以下位置进行配置:

  │   Location:                                                                                                                  │
  │     -> Device Drivers                                                                                                        │
  │       -> Real Time Clock (RTC_CLASS [=y])

配置项为:

CONFIG_RTC_DRV_DS1307

3.2 指定正确的RTC设备

由于内核默认使用的rtc设备是rtc0, 而我们在全志平台外挂rtc时, 通常外挂rtc被初始化为rtc1, 所以还需要修改以下内核配置, 指定为rtc1:

CONFIG_RTC_HCTOSYS_DEVICE="rtc1"
CONFIG_RTC_SYSTOHC_DEVICE="rtc1"

最终对内核配置的改动如下:

diff --git a/arch/arm/configs/sunxi_defconfig b/arch/arm/configs/sunxi_defconfig
index 4c88bbb8..4dbee1a9 100644
--- a/arch/arm/configs/sunxi_defconfig
+++ b/arch/arm/configs/sunxi_defconfig
@@ -1027,11 +1027,12 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
 CONFIG_LEDS_TRIGGER_PANIC=y
 CONFIG_LEDS_TRIGGER_NETDEV=y
 CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc1"
 CONFIG_RTC_INTF_DEV_UIE_EMUL=y
 CONFIG_RTC_DRV_TEST=m
 CONFIG_RTC_DRV_ABB5ZES3=m
 CONFIG_RTC_DRV_ABX80X=m
-CONFIG_RTC_DRV_DS1307=m
+CONFIG_RTC_DRV_DS1307=y
 CONFIG_RTC_DRV_DS1307_CENTURY=y
 CONFIG_RTC_DRV_DS1374=m
 CONFIG_RTC_DRV_DS1374_WDT=y

3.3 开机查看rtc的初始化情况

pi@NanoPi-M1-Plus:~$ dmesg | grep rtc
[    2.470518] sun6i-rtc 1f00000.rtc: rtc core: registered rtc-sun6i as rtc0
[    2.477351] sun6i-rtc 1f00000.rtc: RTC enabled
[    2.489685] rtc-ds1307 0-0068: registered as rtc1
[    4.009223] rtc-ds1307 0-0068: setting system clock to 2022-03-04 08:22:13 UTC (1646382133)

从上述信息可以获知, 外挂的RTC被初始化为 rtc1

3.4 测试外部RTC

$ cat /sys/class/rtc/rtc1/name
rtc-ds1307 0-0068
$ cat /sys/class/rtc/rtc1/time
00:32:27
$ cat /sys/class/rtc/rtc1/hctosys
1

看型号再次确实rtc1就是我们外挂的RTC没错了, hctosys的值为1表示内核会在开机时设置系统时间.

3.5 将系统时间写入RTC硬件

也可以用以下命令:

sudo hwclock --systohc -f /dev/rtc1

查看一下当前的硬件时间:

sudo hwclock --show -f /dev/rtc1

3.6 其他文件系统修改

用vim编辑如下文件, 将rtc0改为rtc1:

/etc/crontab
/etc/init.d/hwclock.sh
/etc/init.d/sync_ntp_rtc

4 Step3: 验证RTC是否正常工作

4.1 测试开机从RTC读取时间

关机并拨掉网线, 过一段时间重新开机, 检查一下系统时间是否正确:

echo "sys time: $(date)" && echo "hw time: " $(sudo hwclock --show -f /dev/rtc1)

如果是现实世界的时间, 说明RTC时钟工作了.

4.2 测试写入系统时间到RTC

关机, 插拨一次RTC电池让RTC时间丢失, 再插上网线开机, 最好等几分钟同步完成, 再查看状态, 因为同步时间是使用crontab设置的定时任务, 可能要等久一点:

$ echo "sys time: $(date)" && echo "hw time: " $(sudo hwclock --show -f /dev/rtc1)
sys time: Fri Mar  4 17:42:15 HKT 2022
hw time:  2022-03-04 17:42:16.493946+08:00