4. RTC 设备树节点编写:常见芯片示例
设备树中 RTC 节点的编写质量直接决定驱动能否正确匹配、I²C 地址是否冲突、中断是否丢失以及后备电源管理是否生效。本章以三款主流 RTC 芯片——DS1307(Dallas/Maxim)、PCF8563(NXP)和 RX8025(Epson)——给出可直接参考的设备树节点,并解释每个属性的工程含义。
编写原则:RTC 节点必须包含 compatible(精确匹配驱动)、reg(I²C 地址)、 interrupts(如使用中断脚)和后备电源描述。对于 I²C 型 RTC,节点应挂在对应 I²C 控制器的子节点下。
4.1 DS1307 设备树节点
DS1307 是最常见的低成本 I²C RTC,I²C 地址固定为 0x68,支持 56 字节 NVRAM。典型应用中使用外部 32.768 kHz 晶振和 3V 纽扣电池。
/* DS1307 RTC 节点示例 */
&i2c1 {
status = "okay";
clock-frequency = <100000>; /* 标准模式 100kHz */
ds1307: rtc@68 {
compatible = "maxim,ds1307";
reg = <0x68>;
status = "okay";
/* 中断引脚:GPIO3_19,上升沿触发 */
interrupts = <3 19 IRQ_TYPE_EDGE_RISING>;
interrupt-parent = <&gpio3>;
/* 后备电池描述(可选,用于电源管理) */
trickle-resistor-ohms = <2000>;
aux-voltage-chargeable = <1>;
};
};
| 属性 | 值/说明 | 工程意义 |
|---|---|---|
| compatible | "maxim,ds1307" | 匹配内核驱动 rtc-ds1307.c |
| reg | 0x68 | 7 位 I²C 地址,DS1307 硬件固定 |
| interrupts | <3 19 IRQ_TYPE_EDGE_RISING> | GPIO 中断,用于 SQW 输出或报警 |
| trickle-resistor-ohms | 2000 | 涓流充电限流电阻,保护后备电池 |
常见错误:DS1307 的 I²C 地址不可更改,若同一总线上挂载地址为 0x68 的其他设备(如某些 EEPROM),将导致地址冲突。务必用 i2cdetect 确认总线地址空闲。
4.2 PCF8563 设备树节点
PCF8563 是 NXP 的低功耗 RTC,I²C 地址为 0x51,内置报警、定时器和时钟输出功能。其设备树节点需要特别注意中断类型和时钟输出频率配置。
/* PCF8563 RTC 节点示例 */
&i2c2 {
status = "okay";
clock-frequency = <400000>; /* 快速模式 400kHz */
pcf8563: rtc@51 {
compatible = "nxp,pcf8563";
reg = <0x51>;
status = "okay";
/* 中断引脚:GPIO1_12,下降沿触发 */
interrupts = <1 12 IRQ_TYPE_EDGE_FALLING>;
interrupt-parent = <&gpio1>;
/* 时钟输出频率:0=禁用,1=32.768kHz,2=1.024kHz,3=1Hz */
clocks = <&clk32k>;
clock-output-names = "pcf8563-clkout";
#clock-cells = <0>;
};
};
关键差异:PCF8563 支持作为时钟源提供方(clock provider),通过 clocks 和 #clock-cells 属性向系统其他模块输出 32.768 kHz、1.024 kHz 或 1 Hz 信号。这在需要同步多个外设的系统中非常有用。
| 属性 | 值/说明 | 工程意义 |
|---|---|---|
| compatible | "nxp,pcf8563" | 匹配内核驱动 rtc-pcf8563.c |
| reg | 0x51 | 7 位 I²C 地址,硬件固定 |
| interrupts | <1 12 IRQ_TYPE_EDGE_FALLING> | 报警中断,下降沿触发 |
| clocks / #clock-cells | 引用外部晶振 / 0 | 使 RTC 可作为系统时钟源 |
4.3 RX8025 设备树节点
RX8025(Epson)是高精度 RTC,内置温度补偿晶振(TCXO),I²C 地址可选 0x32 或 0x33。其设备树节点需要指定地址选择引脚状态,并注意中断输出为开漏结构。
/* RX8025 RTC 节点示例 */
&i2c3 {
status = "okay";
clock-frequency = <400000>;
rx8025: rtc@32 {
compatible = "epson,rx8025";
reg = <0x32>; /* AD0=GND 时地址 0x32 */
status = "okay";
/* 中断引脚:GPIO2_5,低电平有效 */
interrupts = <2 5 IRQ_TYPE_LEVEL_LOW>;
interrupt-parent = <&gpio2>;
/* 指定外部晶振频率(内部 TCXO 已校准) */
clock-frequency = <32768>;
};
};
地址选择:RX8025 的 I²C 地址由 AD0 引脚电平决定:AD0=GND 时地址为 0x32,AD0=VDD 时地址为 0x33。设计 PCB 时需确认该引脚连接,并在设备树中写入对应 reg 值。
4.4 三款 RTC 设备树属性对比
4.5 设备树节点编写通用检查清单
- 确认 I²C 地址:查阅芯片数据手册,确认 7 位地址(左对齐),避免与同总线其他设备冲突。
- 匹配 compatible 字符串:在内核源码中搜索对应驱动文件(如 rtc-ds1307.c),确认 compatible 表项。
- 中断引脚配置:确认 GPIO 编号、中断控制器(interrupt-parent)和触发类型(上升沿/下降沿/电平)。
- 后备电源描述:对于支持涓流充电的芯片(如 DS1307),添加 trickle-resistor-ohms 属性。
- 时钟输出(可选):若需 RTC 输出时钟信号给其他外设,配置 clocks 和 #clock-cells。
- status 属性:确保节点 status = "okay",且父 I²C 控制器 status = "okay"。
调试技巧:设备树编译后,使用
dtc -I dtb -O dts 反编译确认节点内容。在 Linux 启动日志中搜索 "rtc" 或具体芯片名,检查驱动是否成功 probe。使用 i2cdetect -y <bus> 验证 I²C 地址是否响应。