9. RTC¶
RTC全称为Real Time Clock,是一个专门用来记录时间的硬件设备,一般可以集成在soc内部,或者选择外挂,通过i2c与其通信。
那为什么会需要RTC,因为系统时间(也就是我们常说的wall time)只能在系统运行时使用,系统关机时间就丢了,而RTC可以在系统关闭后,依靠外部电池或其他supply继续工作,这才将时间保存下来。
LubanCat-RK系列板卡需要RTC电池才能开启RTC的功能,RTC电池的选型如下:
购买链接(仅供参考): (淘宝野火)CR1220锂电池带线带插头电池RTC记忆时钟后备电池3v
购买链接(仅供参考): (淘宝)CR2032联想 IBM笔记本台式机主板电池3V纽扣COMS 带线 2针
购买链接(仅供参考): (淘宝)原装KTS CR2032纽扣电池3V笔记本遥控器台式机主板电脑锂电池带线
注解
链接仅供参考,如需要,请自行根据上述链接的关键词搜索购买
接线的正负极如下:

如果线序不对,可以使用镊子调整RTC电池的接口:

9.1. 板卡使用的RTC型号¶
9.1.1. rk809¶
RK809是一款高性能PMIC,RK809 集成5个大电流DCDC、9个LDO、2个开关SWITCH、 1个RTC、1个高性能CODEC、可调上电时序等功能。
LubanCat-RK3562/RK3566/RK3568系列板卡均使用RK809作为pmic使用,但是真正使用RK809的RTC功能的有:
LubanCat-1(V1、V2)
LubanCat-2(V1、V2)
LubanCat-2N(V1、V2),
以上板卡从V3版本开始均使用外部低功耗RTC。
注意
rk809的内部rtc电流在30uA,外置的rx8010芯片的电流在0.8uA,相差整整37.5倍,如果使用rk809的内部rtc电池很快就会没电,如果是需要长时间使用rtc的场景,建议使用外部rtc。
9.1.2. rx8010¶
RX8010是爱普生推出的一款低功耗、高性能的实时时钟(RTC)芯片,由于其高精度、低功耗和多功能特性, 广泛应用于智能家居设备、工业控制器、物联网设备等各种需要精确时间信息的嵌入式系统中。
使用rx8010的RTC的有:
LubanCat-1IO
LubanCat-2IO
9.1.3. HYM8563S/BM8563¶
HYM8563S和BM8563都是低功耗、高性能的实时时钟(RTC)芯片,芯片具有一个可编程的时钟输出、一个中断输出、一个掉电检测器以及片内电源复位功能, 还支持设置闹钟和周期性报警,可根据用户设定的时间间隔发出报警信号。
使用HYM8563S/BM8563的有:
LubanCat-1(V3)
LubanCat-1h
LubanCat-1hs
LubanCat-2(V3)
LubanCat-2n(V3)
LubanCat-3
LubanCat-3IO
LubanCat-4
LubanCat-4IO
LubanCat-5
LubanCat-5IO
9.2. 使用shell命令读写RTC时间¶
Linux内核提供了三种用户空间调用接口,在板卡中对应的路径为:
SYSFS接口:/sys/class/rtc/rtc0/
PROCFS接口: /proc/driver/rtc
IOCTL接口: /dev/rtc0
SYSFS接口:
1 2 3 4 | rk3588s_lubancat_4_v1_mipi1080p:/ $ cat /sys/class/rtc/rtc0/date
2025-07-30
rk3588s_lubancat_4_v1_mipi1080p:/ $ cat /sys/class/rtc/rtc0/time
06:20:22
|
PROCFS接口:
1 2 3 4 5 6 7 8 9 10 11 12 | rk3588s_lubancat_4_v1_mipi1080p:/ $ cat /proc/driver/rtc
rtc_time : 06:20:32
rtc_date : 2025-07-30
alrm_time : 12:00:00
alrm_date : 2021-01-02
alarm_IRQ : no
alrm_pending : no
update IRQ enabled : no
periodic IRQ enabled : no
periodic IRQ frequency : 1
max user IRQ frequency : 64
24hr : yes
|
IOCTL接口:
1 2 | #可以参考内核文档作为例子
tools/testing/selftests/timers/rtctest.c
|
9.2.1. 一些常用的命令¶
1 2 3 | date //查看或者修改系统时钟,具体命令参数可date --help查看
hwclock -s //将硬件时间同步到系统时间
hwclock -w //将系统时间同步到硬件时间
|
一般同步时间步骤为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #连接shell终端
adb shell
#切换root
su root
#手动设置时间,设置的时间不能太“远古”,建议设置当前时间或者近期时间
date "2025-7-30 08:00:00"
#系统时间同步到硬件rtc
hwclock -w
#硬件rtc同步到系统
hwclock -s
|
以上手动设置时间或者网络同步时间后,-w将系统时间写入到硬件rtc,-s再将rtc时间写回系统,这样每次重启板卡都会进行rtc时间同步到系统时间。
当rtc中没有数据时需要指定路径才能写时间:
1 2 3 4 5 | #查看rtc0的时间
hwclock --show --rtc=/dev/rtc0
#系统时间同步到硬件rtc,并指定设备为/dev/rtc0
hwclock --systohc --rtc=/dev/rtc0
|
9.3. 使用安卓应用读写RTC时间¶
野火提供的安卓综合测试应用能很方便的读写RTC和系统时间。
9.3.2. 实现方式¶
读写RTC数据调用jni接口方式,参考野火应用源码ebf_android_app/app/src/main/cpp/rtc.cpp
在Activity中声明JNI方法进行使用:
1 2 3 4 | // 读取RTC硬件时间
public native long readRtcTime();
// 设置RTC硬件时间
public native boolean setRtcTime(long time);
|
值得注意的是普通用户没有读写RTC接口的权限,需要添加权限, 在野火应用源码的RtcTestActivity.java中提供了executeRootCommand函数用来执行root命令, 通过executeRootCommand函数执行chmod命令为RTC接口添加权限。
1 | private boolean executeRootCommand(String command)
|
那么读取RTC时间的流程为:
1 2 3 4 5 | // 添加权限
boolean permResult = executeRootCommand("chmod 777 /dev/rtc* && chmod 777 /sys/class/rtc/rtc0/*");
// 读取RTC时间
long rtcTime = readRtcTime();
|
除了使用jni接口,直接使用executeRootCommand函数执行前面介绍的shell命令读写时间也十分方便。
除了在Activity中添加RTC权限,也可以在系统shell脚本中提前添加权限,在Activity中省去添加权限步骤。
系统自启动的shell脚本位于/system/bin/android_shell.sh,由/vendor/etc/init/init.rk3588.rc调用执行(如果是其他芯片则是[对应芯片名字].rc),修改步骤如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #重新挂载系统
adb root && adb remount
#拉取系统中的android_shell.sh
adb pull system/bin/android_shell.sh
#电脑文本软件打开android_shell.sh,在其末尾添加权限命令
chmod 777 /dev/rtc* && chmod 777 /sys/class/rtc/rtc0/*
#将修改后的android_shell.sh的覆盖到系统system/bin/
adb push android_shell.sh system/bin/
#重启系统
adb reboot
#查看目录权限
adb shell ls -l /dev/rtc*
#信息输出如下
crwxrwxrwx 1 system system 250, 0 2025-07-30 08:41 /dev/rtc0
|
最终可以看到重启系统后,/dev/rtc0文件普通用户也具有读写权限。
如需修改SDK源码来修改android_shell.sh,该文件位于SDK源码/device/rockchip/rk[具体芯片]/android_shell.sh,由SDK源码/device/rockchip/rk[具体芯片]/init.rk[具体芯片].rc中调用脚本, 由SDK源码/device/rockchip/rk[具体芯片]/device.mk中拷贝脚本进系统。