# RK3576 平台 RTC 时钟调试全过程

## 概述

本文档记录了在 RK3576 平台上调试 RTC(Real-Time Clock)外设的完整过程,重点解决了 AP6256 WiFi/蓝牙模块所需的 32.768kHz 低频时钟配置问题。

## 一、问题背景

### 1.1 硬件环境以及原理图

  • **SoC**: Rockchip RK3576

  • **开发板**: LubanCat-3 / CDKJ-RK3576

  • **RTC 芯片**: HYM8563 (也称 BM8563)

  • **WiFi/BT 模块**: AP6256 (基于 BCM43456 芯片)

### 1.2 问题现象

AP6256 蓝牙模块初始化失败,设备树编译报错或运行时蓝牙无法正常工作。经分析,问题根源在于 **32.768kHz 时钟源配置错误**。

### 1.3 技术背景

AP6256 WiFi/蓝牙模块需要一个稳定的 32.768kHz 低频时钟信号,用于:

  • 蓝牙低功耗模式 (BLE) 定时

  • WiFi 深度睡眠唤醒

  • 内部 RTC 功能

  • 电源管理时序


## 二、调试过程

### 2.1 第一阶段:发现时钟配置错误

原始配置分析

在 `rk3576-lubancat-3.dts` 中,蓝牙节点的原始配置如下:

```dts

wireless_bluetooth: wireless-bluetooth {

compatible = "bluetooth-platdata";

clocks = <&cru CLK_PMU0_32K_HP>;

clock-names = "ext_clock";

// ...

};

```

问题发现

编译设备树时出现错误,提示 `CLK_PMU0_32K_HP` 未定义。

通过搜索 RK3576 时钟头文件 `include/dt-bindings/clock/rockchip,rk3576-cru.h`,发现:

  • RK3576 **不存在** `CLK_PMU0_32K_HP` 时钟定义

  • 仅定义了 `CLK_32K_USB2DEBUG` (ID 473),用于 USB 调试功能

  • PMU0 时钟域只包含 `PCLK_PMU0_ROOT` 和 `PCLK_PMU0` 外设时钟

**结论**:原始配置引用了一个在 RK3576 上不存在的时钟源。


### 2.2 第二阶段:尝试使用 RTC 芯片时钟

修复尝试

既然 SoC 内部没有合适的 32kHz 时钟,考虑使用外部 RTC 芯片 HYM8563 提供的时钟输出:

```dts

/* rk3576-lubancat-generic.dts */

wireless_bluetooth: wireless-bluetooth {

compatible = "bluetooth-platdata";

clocks = <&bm8563>; /* 改用 RTC 芯片时钟 */

clock-names = "ext_clock";

// ...

};

/* rk3576-lubancat-3.dts */

wireless_bluetooth: wireless-bluetooth {

compatible = "bluetooth-platdata";

clocks = <&hym8563>; /* 改用 RTC 芯片时钟 */

clock-names = "ext_clock";

// ...

};

```

同时确保 RTC 芯片配置为时钟提供者:

```dts

&i2c6 {

status = "okay";

hym8563: rtc@51 {

compatible = "haoyu,hym8563";

reg = <0x51>;

#clock-cells = <0>; /* 配置为时钟提供者 */

clock-frequency = <32768>; /* 32.768kHz 输出 */

clock-output-names = "hym8563";

// ...

};

};

```

用户发现关键问题

用户指出:**设备树配置必须与实际硬件连接匹配!**

> "WiFi/BT 模块的时钟信号线到底是连接到 RK3576 的 GPIO 还是 HYM8563 RTC 芯片?如果时钟信号实际连接到 RK3576 引脚,却在设备树中引用 RTC 芯片时钟,那么无线模块将无法工作。"

这一关键洞察指出了问题核心:**不能仅仅为了让编译通过而修改配置,必须根据原理图确认实际硬件连接**。


### 2.3 第三阶段:确认硬件连接

原理图分析

通过查阅硬件原理图和适配指南 `RK3576与AP6256硬件适配指南.md`,确认:

  1. AP6256 模块的 32.768kHz 时钟输入引脚连接到 **RK3576 的 GPIO0_A2**

  2. RK3576 SoC 可以在 GPIO0_A2 上输出 CLK0_32K_OUT 时钟信号

  3. 这是 SoC 硬件时钟输出功能,不是软件控制的 GPIO 翻转

引脚复用配置

在 `rk3576-pinctrl.dtsi` 中找到相关定义:

```dts

/* 第 161 行附近 */

clk0_32k {

clk0_32k_out: clk0-32k-out {

rockchip,pins =

/* gpio0 PA2 function 10 = CLK0_32K_OUT */

<0 RK_PA2 10 &pcfg_pull_none>;

};

};

```

关键发现:

  • GPIO0_PA2 (即 GPIO0_A2) 可配置为 `CLK0_32K_OUT` 功能

  • **功能值必须为 10**,表示选择 CLK0_32K_OUT 硬件时钟输出

  • 功能值 1 表示普通 GPIO 模式(错误配置)


### 2.4 第四阶段:正确的设备树配置

最终修复方案

  1. **移除蓝牙节点中的显式时钟引用**(因为时钟通过 pinctrl 配置):

```dts

wireless_bluetooth: wireless-bluetooth {

compatible = "bluetooth-platdata";

/* 移除 clocks 和 clock-names 属性 */

/* 32.768kHz 时钟通过 GPIO0_A2 配置为 CLK0_32K_OUT 提供 */

// ...

};

```

  1. **添加正确的 pinctrl 时钟输出配置**:

```dts

/* CDKJ-RK3576.dts 第 958 行附近 */

&pinctrl {

wireless-wlan {

// ... WiFi 相关引脚配置

};

clk0_32k_out: clk0-32k-out {

rockchip,pins =

/* GPIO0_PA2 配置为 CLK0_32K_OUT 功能 */

<0 RK_PA2 10 &pcfg_pull_none>; /* 注意:功能值必须是 10 */

};

};

```

  1. **关键修复:引脚功能值**

原始错误配置:

```dts

<0 RK_PA2 1 &pcfg_pull_none> /* 错误!功能值 1 = GPIO 模式 */

```

正确配置:

```dts

<0 RK_PA2 10 &pcfg_pull_none> /* 正确!功能值 10 = CLK0_32K_OUT */

```


## 三、技术要点总结

3.1 RK3576 32kHz 时钟输出机制

| 方案 | 时钟源 | 引脚 | 适用场景 |

|------|--------|------|----------|

| GPIO 时钟输出 | SoC CLK0_32K | GPIO0_PA2 | AP6256 外部时钟输入 |

| RTC 芯片时钟 | HYM8563 晶振 | I2C 接口 | 系统 RTC 时间保持 |

| USB 调试时钟 | CLK_32K_USB2DEBUG | USB 内部 | USB 调试功能 |

3.2 常见错误及解决方案

| 错误类型 | 错误表现 | 解决方案 |

|----------|----------|----------|

| 时钟源不存在 | 编译错误:CLK_PMU0_32K_HP 未定义 | 使用 RK3576 支持的时钟源 |

| 时钟源不匹配 | 蓝牙初始化失败 | 根据原理图确认实际硬件连接 |

| 引脚功能错误 | 无时钟信号输出 | 将功能值从 1 改为 10 |

| 配置未引用 | 时钟功能未启用 | 在设备节点中引用 pinctrl |

3.3 调试经验教训

  1. **原理图优先**:设备树配置必须与实际硬件连接匹配

  2. **不要仅为编译通过而修改**:要理解每个配置项的实际意义

  3. **查阅芯片手册**:了解引脚复用功能的正确配置值

  4. **参考官方示例**:rk3576-evb.dtsi 提供了标准实现参考


## 四、验证方法

4.1 编译验证

```bash

编译设备树

cd /home/zzq/workspace/rk3576/LubanCat_SDK

./build.sh kernel

检查编译是否成功

ls kernel-6.1/arch/arm64/boot/dts/rockchip/CDKJ-RK3576.dtb

```

4.2 运行时验证

```bash

检查时钟输出引脚状态

cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep "gpio0-2"

检查蓝牙设备是否识别

hciconfig -a

检查 WiFi 接口

ip link show wlan0

```

4.3 示波器测量

使用示波器测量 GPIO0_A2 引脚,应观察到:

  • 频率:32.768 kHz ± 20ppm

  • 幅度:1.8V 或 3.3V(取决于 IO 电压域配置)

  • 占空比:约 50%


## 五、相关文件

| 文件路径 | 说明 |

|----------|------|

| `kernel-6.1/arch/arm64/boot/dts/rockchip/CDKJ-RK3576.dts` | 主设备树文件 |

| `kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-pinctrl.dtsi` | 引脚配置定义 |

| `kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-lubancat-3.dts` | LubanCat-3 设备树 |

| `include/dt-bindings/clock/rockchip,rk3576-cru.h` | 时钟 ID 定义 |

| `rk3576_bringup_boot/RK3576与AP6256硬件适配指南.md` | 硬件适配文档 |


## 六、调试流程图

```

┌─────────────────────────────────────────────────────────────────────────────┐

│ RK3576 RTC 时钟调试流程 │

└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────┐

│ 问题发现 │

│ 蓝牙模块无法工作 │

└────────┬────────┘

┌─────────────────────────────────────┐

│ 分析设备树配置 │

│ 发现引用 CLK_PMU0_32K_HP 时钟源 │

└────────┬────────────────────────────┘

┌─────────────────────────────────────┐

│ 搜索 RK3576 时钟定义 │

│ 在 rk3576-cru.h 中查找时钟 ID │

└────────┬────────────────────────────┘

┌─────────────────────────────────────┐ ┌────────────────────────────┐

│ CLK_PMU0_32K_HP 是否存在? │──否──▶│ 该时钟在 RK3576 上不存在 │

└────────┬────────────────────────────┘ └────────────┬───────────────┘

│是 │

▼ ▼

(不适用) ┌────────────────────────────────┐

│ 尝试方案1:使用 RTC 时钟 │

│ 修改为 clocks = <&hym8563> │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 编译通过,但... │

│ 用户提出关键问题: │

│ "时钟信号实际连到哪里?" │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 查阅硬件原理图 │

│ 确认时钟信号连接到 GPIO0_A2 │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 查找 GPIO0_A2 复用功能 │

│ 在 rk3576-pinctrl.dtsi 中搜索 │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 发现 CLK0_32K_OUT 功能定义 │

│ GPIO0_PA2 功能值 = 10 │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 检查当前设备树配置 │

│ 发现功能值错误配置为 1 │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 执行修复操作 │

│ 1. 修改引脚功能值:1 → 10 │

│ 2. 移除蓝牙节点显式时钟引用 │

│ 3. 添加 clk0_32k_out pinctrl │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 重新编译内核 │

│ ./build.sh kernel │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 烧录并测试 │

└────────────┬───────────────────┘

┌────────────────────────────────┐

│ 验证是否成功? │

└────────┬──────────┬────────────┘

│ │

是 │ │ 否

▼ ▼

┌──────────┐ ┌─────────────────┐

│ 完成! │ │ 检查其他配置 │

│ 蓝牙正常 │ │ - 电源配置 │

│ WiFi正常 │ │ - 固件路径 │

└──────────┘ │ - SDIO配置 │

└─────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐

│ 关键决策点详解 │

└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────┐

│ 32.768kHz 时钟源选择 │

└──────────────┬──────────────┘

┌───────────────────────┼───────────────────────┐

│ │ │

▼ ▼ ▼

┌───────────────┐ ┌───────────────┐ ┌───────────────┐

│ SoC PMU 时钟 │ │ RTC 芯片时钟 │ │ GPIO 时钟输出 │

│ CLK_PMU0_32K │ │ HYM8563 │ │ CLK0_32K_OUT │

└───────┬───────┘ └───────┬───────┘ └───────┬───────┘

│ │ │

▼ ▼ ▼

┌───────────────┐ ┌───────────────┐ ┌───────────────┐

│ RK3576 不支持 │ │ 需 I2C 接口 │ │ GPIO0_PA2 输出 │

│ ❌ 不可用 │ │ 适合系统RTC │ │ ✅ 适合外设时钟 │

└───────────────┘ └───────────────┘ └───────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐

│ GPIO 功能配置对比 │

└─────────────────────────────────────────────────────────────────────────────┘

GPIO0_PA2 引脚功能值

功能值 = 1 功能值 = 10

│ │

▼ ▼

┌───────────────┐ ┌───────────────┐

│ RK_FUNC_GPIO │ │ CLK0_32K_OUT │

│ 普通GPIO模式 │ │ 时钟输出模式 │

└───────┬───────┘ └───────┬───────┘

│ │

▼ ▼

┌───────────────┐ ┌───────────────┐

│ 软件控制电平 │ │ 硬件时钟发生器 │

│ 无法产生稳定 │ │ 输出稳定的 │

│ 32.768kHz信号 │ │ 32.768kHz方波 │

└───────┬───────┘ └───────┬───────┘

│ │

▼ ▼

┌───────────────┐ ┌───────────────┐

│ ❌ 错误配置 │ │ ✅ 正确配置 │

│ AP6256无法工作 │ │ AP6256正常工作 │

└───────────────┘ └───────────────┘

```


## 七、附录

A. HYM8563 RTC 芯片简介

HYM8563 是一款低功耗 CMOS 实时时钟/日历芯片:

  • I2C 接口,地址 0x51

  • 内置 32.768kHz 晶振

  • 可选时钟输出功能

  • 支持闹钟和定时器中断

  • 后备电池供电时功耗极低

B. AP6256 模块时钟要求

| 参数 | 规格 |

|------|------|

| 时钟频率 | 32.768 kHz |

| 频率精度 | ±20 ppm |

| 输入电压 | 1.8V 或 3.3V CMOS |

| 占空比 | 40%~60% |

C. 参考文档

  1. RK3576 Technical Reference Manual

  2. AP6256 Datasheet

  3. HYM8563 Datasheet

  4. Rockchip Linux SDK Documentation


*文档版本: 1.0*

*最后更新: 2026-01-29*

*作者: RK3576 Bringup Team*

## 八、AI工作流截图

相关推荐
GS8FG1 小时前
针对Linux,RK3568平台下,I2C驱动的一点小小的领悟
linux·驱动开发
Y.O.U..1 小时前
Linux复习-用户和组管理
linux·服务器
一路往蓝-Anbo1 小时前
第 4 篇:策略模式 (Strategy) —— 算法的热插拔艺术
网络·驱动开发·stm32·嵌入式硬件·算法·系统架构·策略模式
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][dma]dma-buf
linux·笔记·学习
j_xxx404_2 小时前
Linux:进程优先级与进程切换与调度
linux·运维·服务器
never_go_away2 小时前
linux Socket限制
linux·运维·服务器
济6172 小时前
linux 系统移植(第二十四期)---- 根文件系统其他功能测试---- Ubuntu20.04根文件系统其他功能测试
linux·运维·服务器
十年编程老舅2 小时前
字节跳动 Linux C/C++ 后端 面经
linux·后端面试·八股文·字节跳动·面试八股文·服务器面试
济6172 小时前
linux 系统移植(第二十五期)---- 运用MfgTool 工具进行linux系统烧写---- Ubuntu20.04
linux·运维·服务器