OK3568 RTC 驱动适配与 Linux 系统时间管理总结
OK3568 RTC 驱动适配与 Linux 系统时间管理总结文章目录OK3568 RTC 驱动适配与 Linux 系统时间管理总结一、背景二、适配步骤2.1 I2C 总线确认2.2 驱动文件确认2.3 修改设备树2.4 内核配置开启 RX8010 驱动2.5 烧写验证三、RTC 与系统时间的关系核心知识点3.1 两个时钟的区别3.2 上电同步hctosys3.3 运行期间的同步命令3.4 时区注意四、调试过程与问题解决4.1 问题一Frequency stop 告警五、BMS 场景的时间管理方案六、总结一、背景硬件平台RTC 芯片FCU2601 核心板RX8010SJEPSONOK3568 开发板PCF8563NXPBCU3.0 产品RX8010SJBCU3.0 使用的核心板与 OK3568 开发板一致都是飞凌的 OK3568-C但 RTC 芯片从 PCF8563 换成了 RX8010SJ因此需要将软件从 PCF8563 适配到 RX8010SJ。二、适配步骤2.1 I2C 总线确认查看 BCU3.0 原理图与 OK3568 原理图两颗 RTC 芯片都挂在 RK3568 的I2C3总线上芯片I2C 地址RX80100x32PCF85630x51I2C 总线驱动不需要修改只需调整设备树。2.2 驱动文件确认OK3568 SDK 内核源码中已包含两套 RTC 驱动lskernel/drivers/rtc/rtc-rx8010.clskernel/drivers/rtc/rtc-pcf8563.c不需要自己编写驱动关键是要在内核配置中启用 RX8010 驱动。2.3 修改设备树文件位置OK3568_Linux_fs/kernel/arch/arm64/boot/dts/rockchip/OK3568-C-common.dtsi修改前原代码i2c3 { status okay; rx8010: rx801032 { compatible epson,rx8010; reg 0x32; }; pcf8563: pcf856351 { compatible nxp,pcf8563; reg 0x51; #clock-cells 0; }; };修改后i2c3 { status okay; rx8010: rx801032 { compatible epson,rx8010; reg 0x32; status okay; /* 启用 RX8010 */ }; pcf8563: pcf856351 { compatible nxp,pcf8563; reg 0x51; status disabled; /* 禁用 PCF8563 */ }; };关键变化RX8010 加status okayPCF8563 加status disabled。确保同一 I2C 总线上只有一颗 RTC 芯片被使能。2.4 内核配置开启 RX8010 驱动这是整个适配中最容易被忽略的一步。默认的 OK3568 板级 defconfig 中 RX8010 驱动未使能zcat /proc/config.gz|grepRX8010# 输出# CONFIG_RTC_DRV_RX8010 is not set需要修改板级 defconfig注意直接make menuconfig改.config无效因为飞凌的build.sh kernel每次会用 defconfig 覆盖.configcd/home/forlinx/3568/OK3568-linux-source/kernel/arch/arm64/configs/vimOK3568-C-linux_defconfig在文件末尾添加CONFIG_RTC_DRV_RX8010y保存后重新编译内核cd/home/forlinx/3568/OK3568-linux-source ./build.sh kernel编译完成后验证grepRX8010 kernel/.config# 预期输出CONFIG_RTC_DRV_RX8010y2.5 烧写验证将新生成的boot.img烧写到开发板 boot 分区重启后验证# 1. 确认驱动已编译进内核zcat /proc/config.gz|grepRX8010# → CONFIG_RTC_DRV_RX8010y# 2. 确认驱动注册成功dmesg|grep-irtc# → rtc-rx8010 3-0032: rtc core: registered rx8010 as rtc0# → rtc-rx8010 3-0032: setting system clock to 2026-06-05 02:35:21 UTC# 3. 确认设备节点存在ls/dev/rtc*# → /dev/rtc /dev/rtc0三、RTC 与系统时间的关系核心知识点3.1 两个时钟的区别┌─────────────────────────────────────────┐ │ Linux 系统 │ │ │ │ 系统时间 (Software Clock) │ │ · 内核维护的软件计数器 │ │ · date / timedatectl 查看 │ │ · 纳秒级精度 │ │ · 基于 CPU 定时器中断累加 │ │ · ❌ 断电丢失重启归零 │ │ │ │ ↕ hwclock 命令 │ │ │ │ RTC 硬件时钟 (Hardware Clock) │ │ · I2C 芯片 RX8010 内部计时 │ │ · hwclock -r 查看 │ │ · 秒级精度 │ │ · 32.768kHz 晶振 │ │ · ✅ Vbat 供电 → 断电保持 │ └─────────────────────────────────────────┘系统时间RTC 硬件时钟存储位置内核内存变量I2C RTC 芯片寄存器断电后丢失保持精度纳秒级秒级读取命令datehwclock -r写入命令date -shwclock -w3.2 上电同步hctosysLinux 内核启动时如果开启了CONFIG_RTC_HCTOSYSy会自动从 RTC 读取时间并设置为系统时间zcat /proc/config.gz|grepHCTOSYS# → CONFIG_RTC_HCTOSYSy# → CONFIG_RTC_HCTOSYS_DEVICErtc0dmesg 日志中能看到rtc-rx8010 3-0032: setting system clock to 2026-06-05 02:35:21 UTC这个过程是内核自动完成的不需要用户编写任何代码。3.3 运行期间的同步命令场景命令说明查看系统时间date本地时区显示查看 RTC 时间sudo hwclock -r读硬件时钟RTC → 系统sudo hwclock -shctosys 手动版系统 → RTCsudo hwclock -wsystohc查看完整信息timedatectl status含时区、NTP 状态设置系统时间sudo date -s 2026-06-05 15:30:00临时校准3.4 时区注意RTC 硬件时钟通常存储UTC 时间内核驱动默认行为系统时间显示为本地时间08:00北京时区。dmesg 里看到的是 UTC02:35:21 UTCdate显示是10:35:21 CST差了 8 小时是正常的。应用程序拿时间用time()/gettimeofday()取系统时间即可时区转换由系统处理。四、调试过程与问题解决4.1 问题一Frequency stop 告警首次上电后 dmesg 出现rtc-rx8010 3-0032: Frequency stop was detected rtc-rx8010 3-0032: hctosys: unable to read the hardware clock原因RX8010 上电后检测到内部振荡器曾停振XST 标志位驱动拒绝读取时钟。这是新芯片首次上电、或者 Vbat 备份电源掉过电的典型现象。解决先用hwclock -w写入一次系统时间驱动写入操作会清除 XST 标志# 先随便设一个系统时间或从网络获取sudodate-s2026-06-05 15:30:00# 写入RTC同时清除XST标志sudohwclock-w-f/dev/rtc0# 验证读数正常sudohwclock-r-f/dev/rtc0写入成功后Frequency stop告警消失hctosys恢复正常。五、BMS 场景的时间管理方案BCU3.0 常规运行不联网没有 NTP 时间源。时间同步闭环如下上电启动 └── 内核 hctosysRTC → 系统时间自动零代码 │ 运行期间104 主站对时 └── 收到时钟同步指令 ├── settimeofday() 校准系统时间 └── hwclock -w 写入 RTC │ 下次断电再上电 └── RTC 保持正确时间 → hctosys → 系统时间恢复环节负责方是否需要自己写代码上电 RTC→系统内核CONFIG_RTC_HCTOSYSy不需要运行中读取时间time()/gettimeofday()一行调用时间校准104 主站下发对时指令需实现 handler校准后写回 RTChwclock -w一行命令故障录波时间戳直接从系统时间取不需要六、总结RTC 驱动的适配本质上是三件事设备树——让内核知道 I2C3 上挂了什么芯片内核配置——把对应驱动编译进去CONFIG_RTC_DRV_RX8010y理解 RTC 与系统时间的关系——启动自动同步hctosys、运行中读写hwclock、断电保持备份电池整个过程中不需要自己写一行 RTC 驱动代码内核社区已经做好了全部工作。你的应用程序只需要time()取系统时间即可RTC 对上层透明。参考资料EPSON RX8010SJ DatasheetLinux kernel RTC subsystem飞凌 OK3568-C 开发板资料前篇OK3568 设备树适配 RX8010最后更新2026-06-05