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 设备树属性对比

三款 RTC 设备树节点属性对比 属性 DS1307 PCF8563 RX8025 compatible maxim,ds1307 nxp,pcf8563 epson,rx8025 I²C 地址 0x68(固定) 0x51(固定) 0x32/0x33(可选) 中断类型 上升沿 下降沿 低电平有效 后备电源 涓流充电支持 电池切换 内置 TCXO 时钟输出 SQW(1Hz/4kHz/8kHz/32kHz) CLKOUT(可编程) FOUT(32.768kHz) 典型精度 ±2 ppm(25°C) ±5 ppm(25°C) ±1.5 ppm(-40~85°C) 选择依据:低成本选 DS1307,需要时钟输出选 PCF8563,高精度宽温环境选 RX8025

4.5 设备树节点编写通用检查清单

  1. 确认 I²C 地址:查阅芯片数据手册,确认 7 位地址(左对齐),避免与同总线其他设备冲突。
  2. 匹配 compatible 字符串:在内核源码中搜索对应驱动文件(如 rtc-ds1307.c),确认 compatible 表项。
  3. 中断引脚配置:确认 GPIO 编号、中断控制器(interrupt-parent)和触发类型(上升沿/下降沿/电平)。
  4. 后备电源描述:对于支持涓流充电的芯片(如 DS1307),添加 trickle-resistor-ohms 属性。
  5. 时钟输出(可选):若需 RTC 输出时钟信号给其他外设,配置 clocks 和 #clock-cells。
  6. status 属性:确保节点 status = "okay",且父 I²C 控制器 status = "okay"。
调试技巧:设备树编译后,使用 dtc -I dtb -O dts 反编译确认节点内容。在 Linux 启动日志中搜索 "rtc" 或具体芯片名,检查驱动是否成功 probe。使用 i2cdetect -y <bus> 验证 I²C 地址是否响应。