RK平台U-Boot驱动层全景与调试定位技巧

电子说

1.4w人已加入

描述

U-Boot 的驱动层约占整个代码量的 50%。RK 平台的驱动采用「core + per-SoC」的模式,所有驱动按子系统组织。本文完整梳理 11 大驱动子系统地图,附驱动快速定位、实操调试全套技巧,RK 底层开发必备参考。

一、驱动层全景划分

RK 平台 U-Boot 驱动全部存放于drivers/目录下,拆分十余个子目录,按开发使用频次、重要程度分为三大类:核心子系统、功能子系统、专用子系统。

u-boot

分类说明

1.核心子系统:项目开发、硬件调试高频修改模块,时钟、引脚、DDR、PHY、显示是开机、外设调试核心;

2.功能子系统:存储、网口、USB 等标准外设驱动,成熟稳定,多数场景仅配置不修改源码;

3.专用子系统:加密、电源、OTP 等小众功能,仅特定产品需求才会改动。

二、RK 驱动通用架构:core + per-SoC

全平台驱动统一采用「通用核心代码 + 单 SoC 专属代码」分层架构,大幅复用逻辑、降低多芯片维护成本。

u-boot

核心设计思想

1.Core 通用层:clk_pll.c、pinctrl-rockchip-core.c 存放全系列芯片通用操作逻辑,无需每个 SoC 重复实现;

2.per-SoC 专属层:clk_rk3576.c、pinctrl-rk3576.c 仅存放对应芯片独有的寄存器定义、参数表、引脚映射,差异化内容集中管理。

三、11 大驱动子系统详细拆解

3.1 时钟子系统 clk/rockchip/

文件路径:drivers/clk/rockchip/
文件规模:23 个文件,合计约 15000 行代码

代码分层

•clk_pll.c:通用 PLL 基础操作,包含频率配置、锁相检测公共函数;

•clk_rk3576.c:RK3576 专属时钟树,定义 PLL 参数、时钟门控、复用关系。

核心对外接口

 

// 获取时钟频率static ulong rk3576_clk_get_rate(struct clk *clk);// 设置目标时钟频率static ulong rk3576_clk_set_rate(struct clk *clk, ulong rate);// 使能对应外设时钟static int rk3576_clk_enable(struct clk *clk);// 关闭外设时钟static int rk3576_clk_disable(struct clk *clk);

 

调试修改场景

CPU 主频调整、总线时钟配置、外设时钟无输出 / 门控异常。

3.2 引脚控制子系统 pinctrl/rockchip/

文件路径:drivers/pinctrl/rockchip/
文件规模:20 个文件,合计约 10000 行代码

代码分层

•pinctrl-rockchip-core.c:引脚复用、电气配置通用底层逻辑;

•pinctrl-rockchip.c:设备树 compatible 匹配顶层绑定;

•pinctrl-rk3576.c:RK3576 完整引脚功能映射数据表。

核心数据结构示例

 

// pinctrl-rk3576.c 引脚分组定义static struct rockchip_pin_bank rk3576_pin_banks[] = {    PIN_BANK_IOC(0, 32, "gpio0", "ioc_rk3576"),    PIN_BANK_IOC(1, 32, "gpio1", "top_ioc"),    PIN_BANK_IOC(2, 20, "gpio2", "top_ioc"),    // ...剩余引脚组};

 

调试修改场景

外设引脚功能失效、硬件原理图与软件复用功能不匹配、IO 复用冲突。

3.3 DDR 内存子系统 ram/rockchip/

文件路径:drivers/ram/rockchip/
文件规模:20 个文件,合计约 8000 行代码

代码分层

•rockchip_sdram.c:DMC 内存控制器通用驱动框架;

•sdram_rk3576.c:RK3576 DDR 初始化封装入口;

•sdram_common.c:DDR 时序、容量参数通用计算逻辑。

特殊说明

DDR 初始化属于开源 + 闭源混合逻辑:
sdram_rk3576.c 仅做上层封装,核心 DDR 训练算法存放于 rkbin 闭源二进制文件,执行流程:
读取 DTS DDR 配置 → 调用 rkbin 闭源训练函数 → 识别并返回内存容量。

3.4 显示子系统 video/rockchip/

文件路径:drivers/video/rockchip/
文件规模:20 + 文件,合计约 25000 行代码,是体积最大的驱动子系统

核心驱动文件

•rockchip_vop2.c:VOP2 视频输出处理器核心驱动;

•rockchip_display.c:显示框架统一管理;

•rockchip_dw_hdmi.c / rockchip_dw_hdmi_qp.c:HDMI 输出驱动;

•rockchip_mipi.c:MIPI DSI 屏幕驱动;

•rockchip_dp.c:DP 显示输出;

•rockchip_spl_display.c:SPL 启动阶段 LOGO 显示驱动。

3.5 存储子系统 mmc/ufs/spi

 

drivers/mmc/rockchip_dw_mmc.c    // DesignWare MMC控制器drivers/mmc/rockchip_sdhci.c     // SDHCI高速eMMC控制器drivers/ufs/ufs-rockchip.c       // UFS存储+RPMB安全分区drivers/spi/rockchip_sfc.c       // SPI Flash控制器

 

3.6 其余功能子系统清单

•drivers/phy/:USB3 PHY、DP PHY、PCIe PHY、Combo 综合 PHY;

•drivers/net/:GMAC 以太网硬件驱动;

•drivers/usb/:DWC3 OTG、EHCI、OHCI 各类 USB 控制器;

•drivers/crypto/:硬件加密模块(v1/v2、PKA、RSA 算法);

•drivers/power/:RK8xx 系列 PMIC、IO 电压域、DVFS 动态调频;

•drivers/misc/:OTP/eFUSE 一次性存储器、硬件解压;

•drivers/thermal/:芯片内部温度传感器;

•drivers/watchdog/:硬件看门狗复位驱动。

四、外设异常?3 种方法快速定位对应驱动

方法 1:通过设备树 compatible 匹配查找

compatible 是设备树与驱动绑定的唯一标识,精准定位首选方案

 

# 1. 在对应SoC设备树文件查找外设compatible属性grep "compatible" arch/arm/dts/rk3576.dtsi | grep gmac# 输出示例compatible = "rockchip,rk3576-gmac";# 2. 全局检索该字符串,直接锁定驱动文件grep -r "rk3576-gmac" drivers/

 

方法 2:通过 defconfig 配置项查找

根据编译开关判断驱动所属目录

 

# 检索MMC/SD相关配置grep "MMC|SDHCI" configs/rk3576_defconfig# 输出对应路径映射CONFIG_MMC_DW=y → drivers/mmc/CONFIG_MMC_SDHCI=y → drivers/mmc/

 

方法 3:U-Boot 命令行实时查看驱动挂载

串口进入 U-Boot 交互界面,直接查看已加载驱动树

 

# 打印完整驱动设备树dm tree# 输出示例#  Class     Probed   Name#  ----------------------------------------#  clk       [ + ]   clk_rk3576           ← 时钟驱动#  pinctrl   [ + ]   pinctrl-rk3576       ← 引脚控制#  mmc       [ + ]   sdhci@2a330000       ← eMMC存储

 

五、U-Boot 驱动调试常用命令与日志手段

串口调试命令(U-Boot 命令行)

 

dm tree         # 打印完整驱动设备树,查看设备挂载状态dm uclass       # 列出所有驱动分类uclassdm devres       # 查看驱动占用内存、寄存器资源clk dump        # 打印全部时钟当前频率、开关状态gpio status     # 实时查看所有GPIO引脚电平、复用功能

 

驱动日志打印开启方式

在驱动文件头部添加 DEBUG 宏,使用 debug () 函数输出详细调试日志

 

#define DEBUG#include // 代码中打印调试信息debug("clk rate: %lun", rate);

 

六、全文小结

1.U-Boot 驱动层占整体代码 50%,是底层开发核心模块,全部按功能划分为 11 大子系统;

2.全 RK 平台统一「core 通用层 + per-SoC 专属层」架构,减少多芯片冗余代码,维护成本更低;

3.设备树compatible属性是串联硬件描述与驱动代码的核心桥梁;

4.外设故障可通过设备树、defconfig、U-Boot dm 命令三种方式快速定位驱动文件,搭配内置调试命令高效排错。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分