9. RTC

RTC全称为Real Time Clock,是一个专门用来记录时间的硬件设备,一般可以集成在soc内部,或者选择外挂,通过i2c与其通信。

那为什么会需要RTC,因为系统时间(也就是我们常说的wall time)只能在系统运行时使用,系统关机时间就丢了,而RTC可以在系统关闭后,依靠外部电池或其他supply继续工作,这才将时间保存下来。

LubanCat-RK系列板卡需要RTC电池才能开启RTC的功能,RTC电池的选型如下:

注解

链接仅供参考,如需要,请自行根据上述链接的关键词搜索购买

接线的正负极如下:

未找到该图片

如果线序不对,可以使用镊子调整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.1. 应用测试

可参考“野火安卓综合测试应用”章节的“RTC测试”小节进行测试,如下图:

应用测试

9.3.2. 实现方式

读写RTC数据调用jni接口方式,参考野火应用源码ebf_android_app/app/src/main/cpp/rtc.cpp

在Activity中声明JNI方法进行使用:

ebf_android_app/app/src/main/java/com/example/ebf_android_app/RtcTestActivity.java
1
2
3
4
// 读取RTC硬件时间
public native long readRtcTime();
// 设置RTC硬件时间
public native boolean setRtcTime(long time);

值得注意的是普通用户没有读写RTC接口的权限,需要添加权限, 在野火应用源码的RtcTestActivity.java中提供了executeRootCommand函数用来执行root命令, 通过executeRootCommand函数执行chmod命令为RTC接口添加权限。

ebf_android_app/app/src/main/java/com/example/ebf_android_app/RtcTestActivity.java
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中拷贝脚本进系统。