RT-Thread 中设备树的适配方法 | 技术集结

描述

本文基于RT-Thread现有的DM(设备模型)框架,以Rock2F开发板为例,系统梳理了RK3528 SoC的快速移植流程,涵盖了CLK、Pinctrl、ADC、NVMEM、Thermal、RNG等关键驱动的适配方法。

目录


 

前提


 

产品介绍


 

准备


 

开始移植


 

DM 移植要素


 

查看需要移植的驱动


 

开始移植驱动


 

启动地址


 

工具链配置


 

Earlycon


 

配置启动


 

开始启动


 

代码仓库

1 前提

bsp/rockchip中,可以看到目前已经以 DM 的方式支持了RK3566RK3568RK3576RK3588等 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

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Debian GNU/Linux 12 rock-2f ttyFIQ0
rock-2f login: radxaPassword:Linux rock-2f6.1.43-26-rk2312 #26 SMP Tue Dec 3013:28:44 UTC 2025 aarch64The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Thu Jun 26 14:59:52 UTC 2025 on ttyFIQ0radxa@rock-2f:~$

上下、左右滑动查看

然后通过dtc工具,把 SBC 的设备树搞出来:

  •  

radxa@rock-2f:~$ sudo dtc -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 = 23 IRQ_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 开始移植驱动

也就是说,我们只要支持clkpinctrl,Rock2F 就应该可以跑起来了,然后再去支持ADCNVMEMThermalRNG就算是完成移植了

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"#define DBG_TAG "clk.rk3568"#define DBG_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);    return RT_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 */ }};staticstructrt_platform_driverclk_rk3568_driver ={    .name = "clk-rk3568",    .ids = clk_rk3568_ofw_ids,    .probe = clk_rk3568_probe,};staticintclk_rk3568_register(void){    rt_platform_driver_register(&clk_rk3568_driver);    return0;}INIT_SUBSYS_EXPORT(clk_rk3568_register);

上下、左右滑动查看

实现 RK3528

根据设备树可以看到RK3528有一个基于 syscon 的 CRU,和一个主 CRU:

  •  

grf: syscon@ff300000 {    compatible = "rockchip,rk3528-grf", "syscon", "simple-mfd";    reg = <0x00xff3000000x00x90000>;    grf_cru: grf-clock-controller {        compatible = "rockchip,rk3528-grf-cru";        #clock-cells = <1>;    };};cru: clock-controller@ff4a0000 {    compatible = "rockchip,rk3528-cru";    reg = <0x00xff4a00000x00x30000>;    rockchip,grf = <&grf>;    #clock-cells = <1>;    #reset-cells = <1>;    assigned-clocks =        <&cru XIN_OSC0_DIV>,        <&cru PLL_GPLL>,        <&cru PLL_PPLL>,        <&cru PLL_CPLL>,        <&cru CLK_MATRIX_250M_SRC>,        <&cru CLK_MATRIX_500M_SRC>,        <&cru CLK_MATRIX_50M_SRC>,        <&cru CLK_MATRIX_100M_SRC>,        <&cru CLK_MATRIX_150M_SRC>,        <&cru CLK_MATRIX_200M_SRC>,        <&cru CLK_MATRIX_300M_SRC>,        <&cru CLK_MATRIX_339M_SRC>,        <&cru CLK_MATRIX_400M_SRC>,        <&cru CLK_MATRIX_600M_SRC>,        <&cru CLK_PPLL_50M_MATRIX>,        <&cru CLK_PPLL_100M_MATRIX>,        <&cru CLK_PPLL_125M_MATRIX>,        <&cru ACLK_BUS_VOPGL_ROOT>,        <&cru ACLK_VO_ROOT>,        <&cru ACLK_VPU_ROOT>,        <&cru ACLK_VPU_L_ROOT>;    assigned-clock-rates =        <32768>,        <1188000000>,        <1000000000>,        <996000000>,        <250000000>,        <500000000>,        <50000000>,        <100000000>,        <150000000>,        <200000000>,        <300000000>,        <340000000>,        <400000000>,        <600000000>,        <50000000>,        <100000000>,        <125000000>,        <500000000>,        <340000000>,        <300000000>,        <200000000>;};

上下、左右滑动查看

接下来如法炮制即可,这里我们只展示需要移植的关键:


/* 导入必要的时钟 ID */#include[...]/* PLL 的时钟频率表 */staticstructrockchip_pll_rate_tablerk3528_pll_rates[] ={[...]};[...]/* CPU 的时钟频率表 */staticstructrockchip_cpu_clk_rate_tablerk3528_cpu_clk_rates[] ={[...]};/* CPU 的时钟寄存器信息 */staticconststructrockchip_cpu_clk_reg_datark3528_cpu_clk_data ={[...]};/* 定义各种时钟父级表 */PNAME(mux_pll_p)                    = "xin24m";PNAMES(mux_24m_32k_p)               = { "xin24m", "clk_32k" };[...]/* 定义各种 PLL Cell 信息 */staticstructrockchip_pll_clk_cellrk3528_pll_apll =    PLL_RAW(pll_type_rk3328, PLL_APLL, "apll", mux_pll_p, 1, RT_CLK_F_IS_CRITICAL, RK3528_PLL_CON(0), RK3528_MODE_CON,            0, 0, RK3528_GRF_SOC_STATUS0, 0, rk3528_pll_rates);[...]/* 定义各种 fracmux 子 cell 信息 */staticstructrockchip_clk_cellrk3528_uart0_fracmux =    MUX_RAW(CLK_UART0, "clk_uart0", sclk_uart0_src_p, RT_CLK_F_SET_RATE_PARENT,            RK3528_CLKSEL_CON(6), 0, 2, MFLAGS);[...]/* 定义各种 fracmux 子 cell 信息 */staticstructrockchip_clk_cellrk3528_uart0_fracmux =    MUX_RAW(CLK_UART0, "clk_uart0", sclk_uart0_src_p, RT_CLK_F_SET_RATE_PARENT,            RK3528_CLKSEL_CON(6), 0, 2, MFLAGS);[...]/* 填充 RT-Thread Cells 表,所有的 CRU 的 Cells 都需要在这里注册 */staticstructrt_clk_cell *rk3528_clk_cells[] ={    [PLL_APLL] = &rk3528_pll_apll.rk_cell.cell,    [PLL_CPLL] = &rk3528_pll_cpll.rk_cell.cell,    [PLL_GPLL] = &rk3528_pll_gpll.rk_cell.cell,    [PLL_PPLL] = &rk3528_pll_ppll.rk_cell.cell,    [PLL_DPLL] = &rk3528_pll_dpll.rk_cell.cell,    [ARMCLK] = CPU(ARMCLK, "armclk", &rk3528_pll_apll.rk_cell, &rk3528_pll_gpll.rk_cell,            rk3528_cpu_clk_rates, RT_ARRAY_SIZE(rk3528_cpu_clk_rates), &rk3528_cpu_clk_data),    /* top */    [CLK_MATRIX_250M_SRC] = COMPOSITE(CLK_MATRIX_250M_SRC, "clk_250m_src", mux_gpll_cpll_p, RT_CLK_F_IS_CRITICAL,            RK3528_CLKSEL_CON(1), 15, 1, MFLAGS, 10, 5, DFLAGS,            RK3528_CLKGATE_CON(0), 5, GFLAGS),[...]};/* 填充 RT-Thread Cells 表,所有的 GRF CRU 的 Cells 都需要在这里注册 */staticstructrt_clk_cell *rk3528_grfclk_cells[] ={    [SCLK_SDMMC_DRV] = MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "cclk_src_sdmmc0", RK3528_SDMMC_CON0, 1),    [SCLK_SDMMC_SAMPLE] = MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "cclk_src_sdmmc0", RK3528_SDMMC_CON1, 1),    [SCLK_SDIO0_DRV] = MMC(SCLK_SDIO0_DRV, "sdio0_drv", "cclk_src_sdio0", RK3528_SDIO0_CON0, 1),    [SCLK_SDIO0_SAMPLE] = MMC(SCLK_SDIO0_SAMPLE, "sdio0_sample", "cclk_src_sdio0", RK3528_SDIO0_CON1, 1),    [SCLK_SDIO1_DRV] = MMC(SCLK_SDIO1_DRV, "sdio1_drv", "cclk_src_sdio1", RK3528_SDIO1_CON0, 1),    [SCLK_SDIO1_SAMPLE] = MMC(SCLK_SDIO1_SAMPLE, "sdio1_sample", "cclk_src_sdio1", RK3528_SDIO1_CON1, 1),};/* 和 RK3568 一致的 CLK 注册流程... */

上下、左右滑动查看

RK3528 CLK 是新驱动文件,需要在bsp/rockchip/dm/clk/Kconfig bsp/rockchip/dm/clk/SConscript注册。

Pinctrl 移植

同样是参考其他 SoC 的方式,Rockchip 的 pinctrl 设计中,主要是mux IO 复用,pull 上拉drive 强度schmitt trigger 特性四大接口,不同平台有不同的写法和软件修复,在 bsp/rockchip/dm/pinctrl/pinctrl-rockchip.c 添加:

  •  
  •  

[...]staticrt_err_trk3528_set_mux(struct rockchip_pin_bank *pin_bank, int pin, int mux)[...]staticrt_err_trk3528_set_pull(struct rockchip_pin_bank *pin_bank, int pin, int pull)[...]staticrt_err_trk3528_set_drive(struct rockchip_pin_bank *pin_bank, int pin, int strength)[...]staticrt_err_trk3528_set_schmitt(struct rockchip_pin_bank *pin_bank, int pin, int enable)[...]/* 填充 Rockchip SoC GPIO 表 */static struct rockchip_pin_bank rk3528_pin_banks[] ={[...]};/* 填充 Rockchip pinctrl SoC 数据描述表 */staticstructrockchip_pin_ctrlrk3528_pin_ctrl ={    .pin_banks          = rk3528_pin_banks,    .banks_nr           = RT_ARRAY_SIZE(rk3528_pin_banks),    .label              = "RK3528-GPIO",    .type               = RK3528,    .grf_mux_offset     = 0x0,    .set_mux            = rk3528_set_mux,    .set_pull           = rk3528_set_pull,    .set_drive          = rk3528_set_drive,    .set_schmitt        = rk3528_set_schmitt,};[...]/* 添加设备树匹配 ID 和 SoC 数据 */staticconststructrt_ofw_node_idrockchip_pinctrl_ofw_ids[] ={[...]    { .compatible = "rockchip,rk3528-pinctrl", .data = &rk3528_pin_ctrl },[...]

上下、左右滑动查看

ADC 移植

Rockchip 的 ADC 移植非常简单,只需要针对不同的平台增加 ADC 通道描述即可,在 bsp/rockchip/dm/adc/adc-rockchip_saradc.c 添加

  •  

static const struct saradc_channelrockchip_rk3528_channels[] ={    SARADC_CHANNEL(0, "adc0", 10),    SARADC_CHANNEL(1, "adc1", 10),    SARADC_CHANNEL(2, "adc2", 10),    SARADC_CHANNEL(3, "adc3", 10),};/* SoC 使用的 ADC 采用不同版本的访问方式,需要根据手册选择对应版本的接口 */staticconststructrockchip_saradc_soc_datark3528_saradc_data ={    .channels = rockchip_rk3528_channels,    .num_channels = RT_ARRAY_SIZE(rockchip_rk3528_channels),    .clk_rate = 1000000,    .start = rockchip_saradc_start_v2,    .read = rockchip_saradc_read_v2,};[...]/* 添加设备树匹配 ID 和 SoC 数据 */staticconststructrt_ofw_node_idrockchip_saradc_ofw_ids[] ={[...]    { .compatible = "rockchip,rk3528-saradc", .data = &rk3528_saradc_data, },[...]

上下、左右滑动查看

NVMEM 移植

NVMEM 就更简单了,只要添加 otp 内存的长度,以及 otp 的读取接口版本就行,在bsp/rockchip/dm/nvmem/nvmem-rockchip-otp.c中添加:

  •  
  •  
  •  

[...]static const struct rockchip_otp_datark3528_data ={    .size = 0x80,    .read = rk3568_otp_read,};/* 添加设备树匹配 ID 和 SoC 数据 */static const struct rt_ofw_node_idrockchip_otp_ofw_ids[] ={[...]    { .compatible = "rockchip,rk3528-otp", .data = &rk3528_data, },[...]

上下、左右滑动查看

Thermal 移植

Thermal 这块 Rockchip 有新增加版本的接口,另外需要填充平台温度信息,在 bsp/rockchip/dm/thermal/thermal-rockchip_tsadc.c 添加:

  •  

[...]/* 填充通道值和温度的查询表 */static const struct tsadc_tablerk3528_code_table[] ={[...]}/* 填充 SoC 温度传感器实现表 */staticconststructrockchip_tsadc_chiprk3528_tsadc_data ={    .chn_offset = 0,    .chn_num = 1, /* one channels for tsadc */    /* 因为只有 CPU,所以使用默认传感器名称就行 */    .chn_name = chn_name_common,[...]    /* 新版本的接口需要根据硬件手册实现 */    .initialize = rk_tsadcv11_initialize,    .irq_ack = rk_tsadcv4_irq_ack,    .control = rk_tsadcv4_control,    .get_temp = rk_tsadcv4_get_temp,    .set_alarm_temp = rk_tsadcv3_alarm_temp,    .set_tshut_temp = rk_tsadcv3_tshut_temp,    .set_tshut_mode = rk_tsadcv4_tshut_mode,[...]}[...]/* 添加设备树匹配 ID 和 SoC 数据 */staticconst struct rt_ofw_node_id rockchip_tsadc_ofw_ids[] ={[...]    { .compatible = "rockchip,rk3528-tsadc", .data = &rk3528_tsadc_data, },[...]};

上下、左右滑动查看

RNG 移植

RNG 这块 Rockchip 有新增加版本的接口,在 bsp/rockchip/dm/hwcrypto/hw-rng-rockchip.c 添加:

  •  
  •  
  •  

[...]/* 根据硬件手册实现新版本的版本初始化和读随机数接口 */static const struct rockchip_rng_soc_datarkrng_soc_data ={    .init = rkrng_init,    .read = rkrng_read,};/* 添加设备树匹配 ID 和 SoC 数据 */staticconststructrt_ofw_node_idrockchip_rng_ofw_ids[] ={[...]    { .compatible = "rockchip,rkrng", .data = &rkrng_soc_data, },[...]

上下、左右滑动查看

8 启动地址

由于我们是直接替换板子的 Linux 运行,我们需要得知 u-boot 会把 Linux/RT-Thread 加载到哪里:

  •  
  •  
  •  

radxa@rock-2f:~$ sudo cat /proc/iomem | grep -iE Kernel  00410000-019affff : Kernel code  02050000-024cffff : Kernel data

也就是差不多 0x410000 的位置,由于当前运行的是 RT-Smart 版本,所以将ARCH_TEXT_OFFSET配置为0x410000ARCH_RAM_OFFSET配置为0x0

9 工具链配置

注意 Rock2F 采用 Cortex-A53,RK3500 默认采用 Cortex-A55 ARMv8.2 以上的选项,因此可能造成部分指令无法正常使用,编译参数需要做最小兼容:

  •  
  •  
  •  
  •  

    # For Cortex-A55/A76    # DEVICE = ' -g -march=armv8.2-a -mtune=cortex-a55 -fdiagnostics-color=always'    # For Cortex-A53/A72    DEVICE = ' -g -mcpu=cortex-a53 -fdiagnostics-color=always'

10 Earlycon

我们上机运行前,可能会遇到连启动 Logo 都看不到系统就挂了的情况,还需要启用早期调试串口:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

[...]chosen {    [...]    bootargs = "console=ttyFIQ0,1500000n8";    [...]};[...]aliases {    [...]    serial0 = "/serial@ff9f0000";    [...]};[...]serial@ff9f0000 {    compatible = "rockchip,rk3528-uart","snps,dw-apb-uart";    reg = <0x000xff9f00000x000x100>;    [...]};[...]fiq-debugger {    compatible = "rockchip,fiq-debugger";    rockchip,serial-id = <0>;    [...]};[...]

上下、左右滑动查看

一目了然,早期的串口地址就是0xff9f0000,IP 仍然是 DWC 的 8250 串口。

11 配置启动

先通过 Linux 的/boot内容获取 SBC 的启动方式:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

radxa@rock-2f:~$ ls /bootconfig-6.1.43-26-rk2312  extlinux                     uEnv.txtdtbo                     hw_intfc.conf                vmlinuz-6.1.43-26-rk2312dtbo_old                 initrd.img-6.1.43-26-rk2312efi                      System.map-6.1.43-26-rk2312radxa@rock-2f:~$ lsblkNAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTSmmcblk1      179:0    0  29.7G  0 disk├─mmcblk1p1  179:1    0    16M  0 part /config├─mmcblk1p2  179:2    0   300M  0 part /boot/efi└─mmcblk1p3  179:3    0  29.4G  0 part /

上下、左右滑动查看

是熟悉的 extlinux 启动脚本:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

radxa@rock-2f:~$ cat /boot/extlinux/extlinux.conf## /boot/extlinux/extlinux.conf#### IMPORTANT WARNING#### The configuration of this file is generated automatically.## Do not edit this file manually, use: u-boot-updatedefault l0menu title U-Boot menuprompt 1timeout 10label l0        menu label Debian GNU/Linux 12 (bookworm) 6.1.43-26-rk2312        linux /boot/vmlinuz-6.1.43-26-rk2312        initrd /boot/initrd.img-6.1.43-26-rk2312        fdtdir /usr/lib/linux-image-6.1.43-26-rk2312/        append root=UUID=92e064a6-51dc-4433-9ae4-81e8f397a2bc console=ttyFIQ0,1500000n8 quiet splash loglevel=4 rw earlycon consoleblank=0 console=tty1 coherent_pool=2M irqchip.gicv3_pseudo_nmi=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 kasan=offlabel l0r        menu label Debian GNU/Linux 12 (bookworm) 6.1.43-26-rk2312 (rescue target)        linux /boot/vmlinuz-6.1.43-26-rk2312        initrd /boot/initrd.img-6.1.43-26-rk2312        fdtdir /usr/lib/linux-image-6.1.43-26-rk2312/        append root=UUID=92e064a6-51dc-4433-9ae4-81e8f397a2bc console=ttyFIQ0,1500000n8 splash loglevel=4 rw earlycon consoleblank=0 console=tty1 coherent_pool=2M irqchip.gicv3_pseudo_nmi=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 kasan=off single

上下、左右滑动查看

我们只需要在label l0前面增加一个启动 RT-Thread 的菜单:

  •  
  •  
  •  
  •  
  •  

label rt-thread        menu RT-Thread        linux /boot/rtthread.bin        fdtdir /usr/lib/linux-image-6.1.43-26-rk2312/        append earlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0,1500000n8 root=sd1p0 rootfstype=elm rootwait rw

上下、左右滑动查看

12 开始启动

将 rtthread.bin 镜像放到/boot中(注意在 MMC 的第三个分区上),然后启动板子,在启动菜单中输入 ‘1’ 启动 RT-Thread:

设备

然后可以看到我们就进 MSH 了:

设备

我们直接使用了 DM 中大量复用的设备驱动,所以可以看看目前系统多少设备已经支持了:

设备

除了 SDMMC、NVME 我们可以直接挂载测试,其他的接口测试可以参考官方文档:https://docs.radxa.com/rock2/rock2f/getting-started/interface-usage/pin-40-test

再查看系统其他部分子模块状态:

中断域

设备

在中断域中可以看到设备触发中断的次数,以及中断的级联关系,亲和性等信息,比如 NVME 使用 DWC PCI INTx 中断,DWC PCI INTx 中断级联到了 rk-pcie 的 GICv2 上。

温控域

设备

在温控域中可以看到带温度传感器的设备的温度,以及其扇热方式,扇热机制和触发温度。当前温控域只有 CPU,采用 CPU DVFS 的方式进行扇热,由于 DVFS 还未提交至主线,这里显示不支持

时钟域(仅显示部分)

设备

在时钟域中可以看到系统各个时钟的名称和频率,以及打开次数,还有关联到的设备,时钟的父级关系等。

LED


 

可以看到 LED 以心跳的方式进行工作,这符合设备树指定的工作方式:

  •  
  •  
  •  
  •  
  •  
  •  
  •  

gpio-leds {    compatible = "gpio-leds";    state-led {        gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>;        linux,default-trigger = "heartbeat";    };};

上下、左右滑动查看

13 代码仓库

我们可以看看我们全部的修改信息:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

[gui@gui-pc rockchip]$ git status .位于分支 rockchip_rk3528尚未暂存以备提交的变更:  (使用 "git add <文件>..." 更新要提交的内容)  (使用 "git restore <文件>..." 丢弃工作区的改动)        修改:     dm/adc/adc-rockchip_saradc.c        修改:     dm/clk/Kconfig        修改:     dm/clk/SConscript        修改:     dm/hwcrypto/hw-rng-rockchip.c        修改:     dm/include/pinctrl-rockchip.h        修改:     dm/nvmem/nvmem-rockchip-otp.c        修改:     dm/pinctrl/pinctrl-rockchip.c        修改:     dm/thermal/thermal-rockchip_tsadc.c        修改:     rk3500/README.md        修改:     rk3500/README_ZH.md        修改:     rk3500/rtconfig.h        修改:     rk3500/rtconfig.py未跟踪的文件:  (使用 "git add <文件>..." 以包含要提交的内容)        dm/clk/clk-rk3528.c        dm/include/dt-bindings/clock/rk3528-cru.h修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

 

 

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

全部0条评论

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

×
20
完善资料,
赚取积分