0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

RT-Thread官方账号 2026-04-04 18:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文基于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

da2a377a-300d-11f1-ab55-92fbcf53809c.png

3 准备

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

da3a1a96-300d-11f1-ab55-92fbcf53809c.png

首先按照 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没有并且需要的驱动即可:

da4cd38e-300d-11f1-ab55-92fbcf53809c.png

来源: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

上下、左右滑动查看

我们把关注点放到几个重要的模块上:

da56e892-300d-11f1-ab55-92fbcf53809c.png

另外,部分驱动未必使用 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 开始移植驱动

也就是说,我们只要支持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"#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 */}};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/Kconfigbsp/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(structrockchip_pin_bank *pin_bank,intpin,intmux)[...]staticrt_err_trk3528_set_pull(structrockchip_pin_bank *pin_bank,intpin,intpull)[...]staticrt_err_trk3528_set_drive(structrockchip_pin_bank *pin_bank,intpin,intstrength)[...]staticrt_err_trk3528_set_schmitt(structrockchip_pin_bank *pin_bank,intpin,intenable)[...]/* 填充 Rockchip SoC GPIO 表 */staticstructrockchip_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添加

staticconststructsaradc_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中添加:

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

上下、左右滑动查看

Thermal 移植

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

[...]/* 填充通道值和温度的查询表 */staticconststructtsadc_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 数据 */staticconststructrt_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添加:

[...]/* 根据硬件手册实现新版本的版本初始化和读随机数接口 */staticconststructrockchip_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:MINRM SIZEROTYPEMOUNTPOINTSmmcblk1 179:0 0 29.7G 0disk├─mmcblk1p1 179:1 0 16M 0part /config├─mmcblk1p2 179:2 0 300M 0part /boot/efi└─mmcblk1p3 179:3 0 29.4G 0part /

上下、左右滑动查看

是熟悉的 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-updatedefaultl0menutitle U-Boot menuprompt1timeout10labell0 menulabel Debian GNU/Linux12(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/ appendroot=UUID=92e064a6-51dc-4433-9ae4-81e8f397a2bc console=ttyFIQ0,1500000n8 quiet splash loglevel=4rw earlycon consoleblank=0console=tty1 coherent_pool=2M irqchip.gicv3_pseudo_nmi=0cgroup_enable=cpuset cgroup_memory=1cgroup_enable=memory swapaccount=1kasan=offlabell0r menulabel Debian GNU/Linux12(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/ appendroot=UUID=92e064a6-51dc-4433-9ae4-81e8f397a2bc console=ttyFIQ0,1500000n8 splash loglevel=4rw earlycon consoleblank=0console=tty1 coherent_pool=2M irqchip.gicv3_pseudo_nmi=0cgroup_enable=cpuset cgroup_memory=1cgroup_enable=memory swapaccount=1kasan=offsingle

上下、左右滑动查看

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

labelrt-thread menuRT-Thread linux/boot/rtthread.bin fdtdir/usr/lib/linux-image-6.1.43-26-rk2312/ appendearlycon=uart8250,mmio32,0xff9f0000 console=ttyFIQ0,1500000n8 root=sd1p0 rootfstype=elm rootwait rw

上下、左右滑动查看

12 开始启动

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

da632616-300d-11f1-ab55-92fbcf53809c.png

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

da6eb256-300d-11f1-ab55-92fbcf53809c.png

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

da7e86a4-300d-11f1-ab55-92fbcf53809c.png

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

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

中断域

da8a3062-300d-11f1-ab55-92fbcf53809c.png

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

温控域

da93b542-300d-11f1-ab55-92fbcf53809c.png

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

时钟域(仅显示部分)

da9d2d5c-300d-11f1-ab55-92fbcf53809c.png

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

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")

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

    关注

    2

    文章

    4872

    浏览量

    73822
  • 开发板
    +关注

    关注

    26

    文章

    6372

    浏览量

    120037
  • RT-Thread
    +关注

    关注

    32

    文章

    1632

    浏览量

    45115
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结
    的头像 发表于 01-25 09:33 5556次阅读
    <b class='flag-5'>RT-Thread</b> Vector软件包:嵌入式开发的动态数组容器 | <b class='flag-5'>技术</b><b class='flag-5'>集结</b>

    移植RT-Thread的原理与方法

    ,在rtt论坛搜索“国产MCU移植”即可阅读。本文不介绍具体移植步骤,而是如往常一样,分享移植的原理与方法。 移植原理 移植一款软件,无非是获取源码,修改其中与硬件相关的代码以适配目标硬件。移植rt-thread也是如此,首要任
    的头像 发表于 09-17 09:41 1w次阅读

    RT-Thread全球技术大会:萤石研发团队使用RT-Thread技术挑战

    RT-Thread全球技术大会:研发团队使用RT-Thread技术挑战         审核编辑:彭静
    的头像 发表于 05-27 11:36 2545次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:萤石研发团队使用<b class='flag-5'>RT-Thread</b>的<b class='flag-5'>技术</b>挑战

    2022 RT-Thread全球技术大会:萤石EZIOT SDK对RT-Thread的支持

    2022 RT-Thread全球技术大会:RT-Thread在摄像头及IoT设备上的实践经验分享
    的头像 发表于 05-27 11:08 1991次阅读
    2022 <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:萤石EZIOT SDK对<b class='flag-5'>RT-Thread</b>的支持

    RT-Thread全球技术大会:Kconfig在RT-Thread的工作机制

    RT-Thread全球技术大会:Kconfig在RT-Thread的工作机制               审核编辑:彭静
    的头像 发表于 05-27 14:49 2469次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:Kconfig在<b class='flag-5'>RT-Thread</b><b class='flag-5'>中</b>的工作机制

    RT-Thread全球技术大会:RT-Thread测试用例集合案例

    RT-Thread全球技术大会:RT-Thread测试用例集合案例           审核编辑:彭静
    的头像 发表于 05-27 16:34 2951次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:<b class='flag-5'>RT-Thread</b>测试用例集合案例

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread文档_CAN 设备

    RT-Thread文档_CAN 设备
    发表于 02-22 18:34 0次下载
    <b class='flag-5'>RT-Thread</b>文档_CAN <b class='flag-5'>设备</b>

    RT-Thread文档_PWM 设备

    RT-Thread文档_PWM 设备
    发表于 02-22 18:35 2次下载
    <b class='flag-5'>RT-Thread</b>文档_PWM <b class='flag-5'>设备</b>

    RT-Thread文档_SPI 设备

    RT-Thread文档_SPI 设备
    发表于 02-22 18:36 3次下载
    <b class='flag-5'>RT-Thread</b>文档_SPI <b class='flag-5'>设备</b>

    RT-Thread文档_WATCHDOG 设备

    RT-Thread文档_WATCHDOG 设备
    发表于 02-22 18:36 1次下载
    <b class='flag-5'>RT-Thread</b>文档_WATCHDOG <b class='flag-5'>设备</b>

    RT-Thread文档_SENSOR 设备

    RT-Thread文档_SENSOR 设备
    发表于 02-22 18:37 0次下载
    <b class='flag-5'>RT-Thread</b>文档_SENSOR <b class='flag-5'>设备</b>

    RT-Thread文档_AUDIO 设备

    RT-Thread文档_AUDIO 设备
    发表于 02-22 18:38 1次下载
    <b class='flag-5'>RT-Thread</b>文档_AUDIO <b class='flag-5'>设备</b>

    RT-Thread文档_Pulse Encoder 设备

    RT-Thread文档_Pulse Encoder 设备
    发表于 02-22 18:39 1次下载
    <b class='flag-5'>RT-Thread</b>文档_Pulse Encoder <b class='flag-5'>设备</b>