RTC/zh
From FriendlyELEC WiKi
Contents
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
4 Step3: 验证RTC是否正常工作
关机并拨掉网线, 过一段时间重新开机, 检查一下系统时间是否正确:
echo "sys time: $(date)" && echo "hw time: " $(sudo hwclock --show -f /dev/rtc1)
如果是现实世界的时间, 说明RTC时钟工作了.