RK3568 Android14 集成 HYM8563 外部 RTC (I2C接口)
前言
虽然 RK3568 SoC 内部自带了 RTC 控制器(rtc-rkw808),但在很多工业板卡或手持设备设计中,为了更低的待机功耗和更灵活的电池备份方案,硬件工程师往往会选择外挂一颗低功耗 RTC 芯片。
HYM8563 (与 BM8563、PCF8563 寄存器兼容)是最常见的一种 I2C 接口 RTC 芯片。本文将记录在 RK3568 Android 14 平台上,如何驱动这颗芯片,并使其成为系统的主 RTC。
一、 硬件原理与连接
1.1 硬件接口
HYM8563 是一颗标准的 I2C 从设备。
通讯接口:I2C (SCL/SDA)
设备地址:0x51 (7-bit address)
中断引脚:INT (输出低电平有效,非常重要,用于实现定时开机/唤醒功能)
1.2 原理图参考
假设我们将 RTC 挂载在 I2C5 总线上,中断脚连接到 GPIO0_D3。
HYM8563与RK3568引脚对应表
| BM8563引脚 | RK3568引脚 | 功能说明 |
|---|---|---|
| SCL | I2C5_SCL_M0 | I2C时钟信号线 |
| SDA | I2C5_SDA_M0 | I2C数据信号线 |
| INT | GPIO0_D3 | 中断输出,用于唤醒主控 |
| VCC | VCC_3V3 | 供电(纽扣电池或常电) |
二、 内核驱动配置 (Kernel Config)
Rockchip 的 Linux 5.10 / 6.1 内核源码中已经包含了该芯片的通用驱动。
2.1 检查 Menuconfig
执行 make menuconfig,确保勾选以下选项:
Device Drivers--->[*]Real Time Clock---><*>Philips PCF8563/Epson RTC8564/Haoyu HYM8563对应的 .config 配置项为:
CONFIG_RTC_DRV_HYM8563=y注意:通常驱动源码位于 drivers/rtc/rtc-hym8563.c。
2.2 设备树配置 (DTS)
这是集成的核心步骤。我们需要在对应的 I2C 节点下添加 RTC 设备,并指定中断引脚。
打开 arch/arm64/boot/dts/rockchip/rk3568-your-board.dts:
/* 启用 I2C3 控制器 */&i2c5{status="okay";/* 添加 RTC 节点 */hym8563:hym8563@51{status="okay";compatible="haoyu,hym8563";reg=<0x51>;pinctrl-names="default";/* 配置中断脚: GPIO0_D3 *//* RK_PD3 需要在头文件中查找或直接写数字,通常推荐使用宏定义 */pinctrl-0=<&rtc_int>;interrupt-parent=<&gpio0>;interrupts=<RK_PD3 IRQ_TYPE_LEVEL_LOW>;};};/* 配置引脚复用(如果该引脚默认为其他功能) */&pinctrl{rtc{rtc_int:rtc-int{rockchip,pins=<0RK_PD3 RK_FUNC_GPIO&pcfg_pull_up>;};};};三、 编译与验证
编译内核并烧录 boot.img 和 dtbo.img (如有)。
3.1 功能验证 (Linux 层)
# 读取硬件时间 hwclock-r-f/dev/rtc0 # 将系统时间写入硬件 RTC date-s"2025-05-01 12:00:00"hwclock-w-f/dev/rtc0 # 断电重启,再次读取,检查时间是否保存3.2 唤醒测试 (关键)
HYM8563 的中断脚连接到 GPIO,主要为了支持 “设置闹钟唤醒系统”(深度休眠唤醒)。
设置定时唤醒:
echo+30>/sys/class/rtc/rtc0/wakealarm(表示30秒后触发中断)让系统进入休眠:
echo mem>/sys/power/state观察:
30秒后,系统应该自动亮屏或串口打印唤醒日志。如果无法唤醒,请检查:
INT 引脚的硬件连接是否正确。
DTS 中 interrupts 极性配置是否为 IRQ_TYPE_LEVEL_LOW。
示波器测量 INT 脚是否有电平拉低动作。
四.、常见问题 (FAQ)
Q1: 读取时间报错 “RTC_RD_TIME: Invalid argument”
原因:RTC 芯片内部寄存器数据非法(通常是电池没电或初次上电未初始化,Voltage Low 标志位被置起)。
解决:写入一次正确时间即可清除标志位:hwclock -w。
Q2: 系统重启后时间变回 1970 年
原因:纽扣电池没电,或者板子上并没有给 VCC 脚接常电。
解决:测量电池电压;检查 hctosys 是否开启(内核配置 CONFIG_RTC_HCTOSYS=y)。
Q3: I2C 通讯失败 (Timeout / No ack)
原因:地址错误(7位地址是 0x51,8位读地址是 0xA3),或者 I2C 上拉电阻缺失。
解决:检查原理图,确认 SDA/SCL 是否有 4.7k 上拉电阻。
总结
集成 HYM8563 相对简单,主要是标准的 I2C 设备调试。但在 Android 14 上,需要额外注意 aliases 别名 的设置,确保系统将 HYM8563 识别为 rtc0,否则系统可能依然读取 SoC 内部的默认时间,导致掉电时间不准。