时间:2026-04-04 18:05
人气:
作者:admin
本文基于RT-Thread现有的DM(设备模型)框架,以Rock2F开发板为例,系统梳理了RK3528 SoC的快速移植流程,涵盖了CLK、Pinctrl、ADC、NVMEM、Thermal、RNG等关键驱动的适配方法。
目录
前提
产品介绍
准备
开始移植
DM 移植要素
查看需要移植的驱动
开始移植驱动
启动地址
工具链配置
Earlycon
配置启动
开始启动
代码仓库
1 前提
在bsp/rockchip中,可以看到目前已经以 DM 的方式支持了RK3566,RK3568,RK3576,RK3588等 SoC,接下来我们对来以 Rockchip RK3528 Rock2F 为例,简要说明 Rockchip 新 BSP 移植的流程。
2 产品介绍
官方网站:https://docs.radxa.com/rock2/rock2f

3 准备
这里笔者多准备了个树莓派 5 用的 FPC Connector with PCIe 2.0 用于 PCIe 的功能验证:

首先按照 Radxa 官方教程,把 RadxaOS 刷进板子:https://docs.radxa.com/rock2/rock2f/getting-started/install-os
接入串口,把板子启动起来:https://docs.radxa.com/rock2/rock2f/radxa-os/serial
DebianGNU/Linux12rock-2f ttyFIQ0
rock-2f login: radxaPassword:Linuxrock-2f6.1.43-26-rk2312 #26SMP Tue Dec3013:28:44UTC2025aarch64Theprograms included with the Debian GNU/Linux system are free software;theexact distribution terms for each program are described in theindividualfiles in /usr/share/doc/*/copyright.DebianGNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermittedby applicable law.Lastlogin: Thu Jun2614:59:52UTC2025onttyFIQ0radxa@rock-2f:~$
上下、左右滑动查看
然后通过dtc工具,把SBC的设备树搞出来:
radxa@rock-2f:~$sudodtc -I dtb -O dts /sys/firmware/fdt -o Rock2F.dts
4 开始移植
在bsp/rockchip/dm中已经了一定的 DM 驱动,也就是说,只要移植部分RK3528没有并且需要的驱动即可:

来源:https://github.com/RT-Thread/rt-thread/tree/master/bsp#-rockchip
5 DM 移植要素
在 DM 大部分平台中,以下驱动一般都是要提前确认并准备的:
PIC:中断控制器
CLK:设备时钟
Pinctrl:设备引脚复用
Power-Domain:设备电源域
UART:调试串口
以上设备基本可以保证一个 BSP 可以正常启动。
6 查看需要移植的驱动
在设备树中,我们可以看到大量以rockchip,rk3528-开头的 compatible 的设备节点,由于设备树支持驱动向下兼容,我们需要得知哪些节点是 Rockchip 在RK3528上新加的 IP 或者设备配置,所以下一步我们先把 rockchip linux 的源码 clone 下来:https://github.com/rockchip-linux/kernel/tree/develop-6.6
在 drivers 目录下,查找RK3528相关的驱动:
[gui@gui-pc drivers]$ grep -riE rk3528clk/rockchip/Makefileclk/rockchip/clk-rk3528.ccpufreq/cpufreq-dt-platdev.cdevfreq/event/rockchip-dfi.cdevfreq/rockchip_bus.cdevfreq/rockchip_dmc.cgpu/arm/mali400/mali/platform/rk/rk.cgpu/drm/rockchip/dw_hdmi-rockchip.cgpu/drm/rockchip/rockchip_drm_tve.cgpu/drm/rockchip/rockchip_drm_vkms.cgpu/drm/rockchip/rockchip_drm_vop2.cgpu/drm/rockchip/rockchip_vop2_reg.ciio/adc/rockchip_saradc.cmmc/host/sdhci-of-dwcmshc.cnet/ethernet/stmicro/stmmac/dwmac-rk.cnvmem/rockchip-otp.cpci/controller/dwc/pcie-dw-rockchip.cphy/rockchip/phy-rockchip-inno-hdmi-phy.cphy/rockchip/phy-rockchip-inno-usb2.cphy/rockchip/phy-rockchip-naneng-combphy.cpinctrl/pinctrl-rockchip.cpmdomain/rockchip/pm-domains.csoc/rockchip/rockchip-cpuinfo.csoc/rockchip/rockchip_pm_config.cthermal/rockchip_thermal.cvideo/rockchip/mpp/mpp_rkvdec2.cvideo/rockchip/mpp/mpp_rkvenc2.c
上下、左右滑动查看
我们把关注点放到几个重要的模块上:

另外,部分驱动未必使用 RK3528 来命名,所以还是需要以设备树为主,比如这个 RNG 设备:
rng: rng@ffc50000{ compatible ="rockchip,rkrng"; reg = <0x00xffc500000x00x200>; interrupts = 23IRQ_TYPE_LEVEL_HIGH>; clocks = <&scmi_clk SCMI_HCLK_TRNG>; clock-names ="hclk_trng"; resets = <&cru SRST_HRESETN_TRNG_NS>; reset-names ="reset";};
上下、左右滑动查看
我们还需要完善dm/hwcrypto/hw-rng-rockchip.c的支持。
7 开始移植驱动
也就是说,我们只要支持clk和pinctrl,Rock2F 就应该可以跑起来了,然后再去支持ADC、NVMEM、Thermal、RNG就算是完成移植了
PIC
这里还是要提一下,RK3528采用的是 GICv2:
gic: interrupt-controller@fed01000 { compatible ="arm,gic-400"; #interrupt-cells =<3>; #address-cells =<0>; interrupt-controller; reg = <0x00xfed0100000x1000>, <0x00xfed0200000x2000>, <0x00xfed0400000x2000>, <0x00xfed0600000x2000>; interrupts = 9(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;};
上下、左右滑动查看
这个在 DM 中已经移植了,打开RT_PIC_ARM_GIC就可以直接用。
CLK 移植
参考 RK3568
以RK3568为例,我们可以看到 DM 已经集成相当多 CLK 接入模块(有些新的 Rockchip SoC 可能需要补充新模块):
[...]#include"clk-rk-composite.h"#include"clk-rk-cpu.h"#include"clk-rk-divider.h"#include"clk-rk-factor.h"#include"clk-rk-fraction-divider.h"#include"clk-rk-gate.h"#include"clk-rk.h"#include"clk-rk-half-divider.h"#include"clk-rk-mmc-phase.h"#include"clk-rk-muxgrf.h"#include"clk-rk-mux.h"#include"clk-rk-pll.h"#defineDBG_TAG"clk.rk3568"#defineDBG_LVL DBG_INFO#include#include[...]
上下、左右滑动查看
而每增加一个新驱动,就是要填充 CLK Cells 表,每个设备的 CLK 都有独立描述,可以参考 TRM 和 Linux 的实现:
[...]staticstructrt_clk_cell *rk3568_clk_cells[] ={ [PLL_APLL] = &rk3568_pll_apll.rk_cell.cell, [PLL_DPLL] = &rk3568_pll_dpll.rk_cell.cell, [PLL_CPLL] = &rk3568_pll_cpll.rk_cell.cell, [PLL_GPLL] = &rk3568_pll_gpll.rk_cell.cell, [PLL_VPLL] = &rk3568_pll_npll.rk_cell.cell, [PLL_NPLL] = &rk3568_pll_vpll.rk_cell.cell, [CPLL_333M] = COMPOSITE_NOMUX(CPLL_333M,"cpll_333m","cpll", RT_CLK_F_IGNORE_UNUSED, RK3568_CLKSEL_CON(79),0,5, DFLAGS, RK3568_CLKGATE_CON(35),8, GFLAGS),[...] FACTOR(0,"clk_gmac0_tx_div5","clk_gmac0",0,1,5), FACTOR(0,"clk_gmac0_tx_div50","clk_gmac0",0,1,50), FACTOR(0,"clk_gmac0_rx_div2","clk_gmac0",0,1,2), FACTOR(0,"clk_gmac0_rx_div20","clk_gmac0",0,1,20), FACTOR(0,"clk_gmac1_tx_div5","clk_gmac1",0,1,5), FACTOR(0,"clk_gmac1_tx_div50","clk_gmac1",0,1,50), FACTOR(0,"clk_gmac1_rx_div2","clk_gmac1",0,1,2), FACTOR(0,"clk_gmac1_rx_div20","clk_gmac1",0,1,20),};[...]
上下、左右滑动查看
然后在 platform bus 注册接口 probe 中,将 CLK 注册进系统,同时注册Reset设备复位模块进系统:
[...]staticrt_err_tclk_rk3568_probe(struct rt_platform_device *pdev){ [...] if((err =rt_clk_register(&cru->clk_parent))) { goto _fail; } rockchip_clk_setup(&cru->provider, cru->clk_parent.cells, cru->clk_parent.cells_nr); if((err =rockchip_register_softrst(&cru->rstc_parent, dev->ofw_node,RT_NULL, cru->provider.reg_base+RK3568_SOFTRST_CON(0),ROCKCHIP_SOFTRST_HIWORD_MASK))) { goto _clk_unregister; } rockchip_register_restart_notifier(&cru->provider,RK3568_GLB_SRST_FST,RT_NULL); returnRT_EOK; [...]}[...]staticconststructrt_ofw_node_idclk_rk3568_ofw_ids[] ={ { .compatible="rockchip,rk3568-cru", .data= (void*)clk_rk3568_cru_init }, { .compatible="rockchip,rk3568-pmucru", .data= (void*)clk_rk3568_pmucru_init }, {/* sentinel *