本文基于RT-Thread現(xiàn)有的DM(設(shè)備模型)框架,以Rock2F開發(fā)板為例,系統(tǒng)梳理了RK3528 SoC的快速移植流程,涵蓋了CLK、Pinctrl、ADC、NVMEM、Thermal、RNG等關(guān)鍵驅(qū)動(dòng)的適配方法。
目錄
前提
產(chǎn)品介紹
準(zhǔn)備
開始移植
DM 移植要素
查看需要移植的驅(qū)動(dòng)
開始移植驅(qū)動(dòng)
啟動(dòng)地址
工具鏈配置
Earlycon
配置啟動(dòng)
開始啟動(dòng)
代碼倉(cāng)庫(kù)
1 前提
在bsp/rockchip中,可以看到目前已經(jīng)以 DM 的方式支持了RK3566,RK3568,RK3576,RK3588等 SoC,接下來(lái)我們對(duì)來(lái)以 Rockchip RK3528 Rock2F 為例,簡(jiǎn)要說(shuō)明 Rockchip 新 BSP 移植的流程。
2 產(chǎn)品介紹
官方網(wǎng)站:https://docs.radxa.com/rock2/rock2f

3 準(zhǔn)備
這里筆者多準(zhǔn)備了個(gè)樹莓派 5 用的 FPC Connector with PCIe 2.0 用于 PCIe 的功能驗(yàn)證:

首先按照 Radxa 官方教程,把 RadxaOS 刷進(jìn)板子:https://docs.radxa.com/rock2/rock2f/getting-started/install-os
接入串口,把板子啟動(dòng)起來(lái):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:~$
上下、左右滑動(dòng)查看
然后通過(guò)dtc工具,把SBC的設(shè)備樹搞出來(lái):
radxa@rock-2f:~$sudodtc -I dtb -O dts /sys/firmware/fdt -o Rock2F.dts
4 開始移植
在bsp/rockchip/dm中已經(jīng)了一定的 DM 驅(qū)動(dòng),也就是說(shuō),只要移植部分RK3528沒(méi)有并且需要的驅(qū)動(dòng)即可:

來(lái)源:https://github.com/RT-Thread/rt-thread/tree/master/bsp#-rockchip
5 DM 移植要素
在 DM 大部分平臺(tái)中,以下驅(qū)動(dòng)一般都是要提前確認(rèn)并準(zhǔn)備的:
PIC:中斷控制器
CLK:設(shè)備時(shí)鐘
Pinctrl:設(shè)備引腳復(fù)用
Power-Domain:設(shè)備電源域
UART:調(diào)試串口
以上設(shè)備基本可以保證一個(gè) BSP 可以正常啟動(dòng)。
6 查看需要移植的驅(qū)動(dòng)
在設(shè)備樹中,我們可以看到大量以rockchip,rk3528-開頭的 compatible 的設(shè)備節(jié)點(diǎn),由于設(shè)備樹支持驅(qū)動(dòng)向下兼容,我們需要得知哪些節(jié)點(diǎn)是 Rockchip 在RK3528上新加的 IP 或者設(shè)備配置,所以下一步我們先把 rockchip linux 的源碼 clone 下來(lái):https://github.com/rockchip-linux/kernel/tree/develop-6.6
在 drivers 目錄下,查找RK3528相關(guān)的驅(qū)動(dòng):
[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
上下、左右滑動(dòng)查看
我們把關(guān)注點(diǎn)放到幾個(gè)重要的模塊上:

另外,部分驅(qū)動(dòng)未必使用 RK3528 來(lái)命名,所以還是需要以設(shè)備樹為主,比如這個(gè) RNG 設(shè)備:
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";};
上下、左右滑動(dòng)查看
我們還需要完善dm/hwcrypto/hw-rng-rockchip.c的支持。
7 開始移植驅(qū)動(dòng)
也就是說(shuō),我們只要支持clk和pinctrl,Rock2F 就應(yīng)該可以跑起來(lái)了,然后再去支持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)>;};
上下、左右滑動(dòng)查看
這個(gè)在 DM 中已經(jīng)移植了,打開RT_PIC_ARM_GIC就可以直接用。
CLK 移植
參考 RK3568
以RK3568為例,我們可以看到 DM 已經(jīng)集成相當(dāng)多 CLK 接入模塊(有些新的 Rockchip SoC 可能需要補(bǔ)充新模塊):
[...]#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[...]
上下、左右滑動(dòng)查看
而每增加一個(gè)新驅(qū)動(dòng),就是要填充 CLK Cells 表,每個(gè)設(shè)備的 CLK 都有獨(dú)立描述,可以參考 TRM 和 Linux 的實(shí)現(xiàn):
[...]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),};[...]
上下、左右滑動(dòng)查看
然后在 platform bus 注冊(cè)接口 probe 中,將 CLK 注冊(cè)進(jìn)系統(tǒng),同時(shí)注冊(cè)Reset設(shè)備復(fù)位模塊進(jìn)系統(tǒng):
[...]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);
上下、左右滑動(dòng)查看
實(shí)現(xiàn) RK3528
根據(jù)設(shè)備樹可以看到RK3528有一個(gè)基于 syscon 的 CRU,和一個(gè)主 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>;};
上下、左右滑動(dòng)查看
接下來(lái)如法炮制即可,這里我們只展示需要移植的關(guān)鍵:
/* 導(dǎo)入必要的時(shí)鐘 ID */#include[...]/* PLL 的時(shí)鐘頻率表 */staticstructrockchip_pll_rate_tablerk3528_pll_rates[] ={[...]};[...]/* CPU 的時(shí)鐘頻率表 */staticstructrockchip_cpu_clk_rate_tablerk3528_cpu_clk_rates[] ={[...]};/* CPU 的時(shí)鐘寄存器信息 */staticconststructrockchip_cpu_clk_reg_datark3528_cpu_clk_data ={[...]};/* 定義各種時(shí)鐘父級(jí)表 */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 都需要在這里注冊(cè) */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 都需要在這里注冊(cè) */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 注冊(cè)流程... */
上下、左右滑動(dòng)查看
RK3528 CLK 是新驅(qū)動(dòng)文件,需要在bsp/rockchip/dm/clk/Kconfig和bsp/rockchip/dm/clk/SConscript注冊(cè)。
Pinctrl 移植
同樣是參考其他 SoC 的方式,Rockchip 的 pinctrl 設(shè)計(jì)中,主要是mux IO復(fù)用,pull 上拉,drive 強(qiáng)度,schmitt trigger特性四大接口,不同平臺(tái)有不同的寫法和軟件修復(fù),在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 數(shù)據(jù)描述表 */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,};[...]/* 添加設(shè)備樹匹配 ID 和 SoC 數(shù)據(jù) */staticconststructrt_ofw_node_idrockchip_pinctrl_ofw_ids[] ={[...] { .compatible ="rockchip,rk3528-pinctrl", .data = &rk3528_pin_ctrl },[...]
上下、左右滑動(dòng)查看
ADC 移植
Rockchip 的 ADC 移植非常簡(jiǎn)單,只需要針對(duì)不同的平臺(tái)增加 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 采用不同版本的訪問(wèn)方式,需要根據(jù)手冊(cè)選擇對(duì)應(yīng)版本的接口 */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,};[...]/* 添加設(shè)備樹匹配 ID 和 SoC 數(shù)據(jù) */staticconststructrt_ofw_node_idrockchip_saradc_ofw_ids[] ={[...] { .compatible ="rockchip,rk3528-saradc", .data = &rk3528_saradc_data, },[...]
上下、左右滑動(dòng)查看
NVMEM 移植
NVMEM 就更簡(jiǎn)單了,只要添加 otp 內(nèi)存的長(zhǎng)度,以及 otp 的讀取接口版本就行,在bsp/rockchip/dm/nvmem/nvmem-rockchip-otp.c中添加:
[...]staticconststructrockchip_otp_datark3528_data ={ .size =0x80, .read = rk3568_otp_read,};/* 添加設(shè)備樹匹配 ID 和 SoC 數(shù)據(jù) */staticconststructrt_ofw_node_idrockchip_otp_ofw_ids[] ={[...] { .compatible ="rockchip,rk3528-otp", .data = &rk3528_data, },[...]
上下、左右滑動(dòng)查看
Thermal 移植
Thermal 這塊 Rockchip 有新增加版本的接口,另外需要填充平臺(tái)溫度信息,在bsp/rockchip/dm/thermal/thermal-rockchip_tsadc.c添加:
[...]/* 填充通道值和溫度的查詢表 */staticconststructtsadc_tablerk3528_code_table[] ={[...]}/* 填充 SoC 溫度傳感器實(shí)現(xiàn)表 */staticconststructrockchip_tsadc_chiprk3528_tsadc_data ={ .chn_offset =0, .chn_num =1,/* one channels for tsadc */ /* 因?yàn)橹挥?CPU,所以使用默認(rèn)傳感器名稱就行 */ .chn_name = chn_name_common,[...] /* 新版本的接口需要根據(jù)硬件手冊(cè)實(shí)現(xiàn) */ .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,[...]}[...]/* 添加設(shè)備樹匹配 ID 和 SoC 數(shù)據(jù) */staticconststructrt_ofw_node_id rockchip_tsadc_ofw_ids[] ={[...] { .compatible ="rockchip,rk3528-tsadc", .data = &rk3528_tsadc_data, },[...]};
上下、左右滑動(dòng)查看
RNG 移植
RNG 這塊 Rockchip 有新增加版本的接口,在bsp/rockchip/dm/hwcrypto/hw-rng-rockchip.c添加:
[...]/* 根據(jù)硬件手冊(cè)實(shí)現(xiàn)新版本的版本初始化和讀隨機(jī)數(shù)接口 */staticconststructrockchip_rng_soc_datarkrng_soc_data ={ .init= rkrng_init, .read = rkrng_read,};/* 添加設(shè)備樹匹配 ID 和 SoC 數(shù)據(jù) */staticconststructrt_ofw_node_idrockchip_rng_ofw_ids[] ={[...] { .compatible ="rockchip,rkrng", .data = &rkrng_soc_data, },[...]
上下、左右滑動(dòng)查看
8 啟動(dòng)地址
由于我們是直接替換板子的 Linux 運(yùn)行,我們需要得知 u-boot 會(huì)把 Linux/RT-Thread 加載到哪里:
radxa@rock-2f:~$ sudo cat /proc/iomem | grep -iE Kernel 00410000-019affff : Kernel code 02050000-024cffff : Kernel data
也就是差不多 0x410000 的位置,由于當(dāng)前運(yùn)行的是 RT-Smart 版本,所以將ARCH_TEXT_OFFSET配置為0x410000,ARCH_RAM_OFFSET配置為0x0。
9 工具鏈配置
注意 Rock2F 采用 Cortex-A53,RK3500 默認(rèn)采用 Cortex-A55 ARMv8.2 以上的選項(xiàng),因此可能造成部分指令無(wú)法正常使用,編譯參數(shù)需要做最小兼容:
# 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
我們上機(jī)運(yùn)行前,可能會(huì)遇到連啟動(dòng) Logo 都看不到系統(tǒng)就掛了的情況,還需要啟用早期調(diào)試串口:
[...]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>; [...]};[...]
上下、左右滑動(dòng)查看
一目了然,早期的串口地址就是0xff9f0000,IP 仍然是 DWC 的 8250 串口。
11 配置啟動(dòng)
先通過(guò) Linux 的/boot內(nèi)容獲取 SBC 的啟動(dòng)方式:
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 /
上下、左右滑動(dòng)查看
是熟悉的 extlinux 啟動(dòng)腳本:
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
上下、左右滑動(dòng)查看
我們只需要在label l0前面增加一個(gè)啟動(dòng) 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
上下、左右滑動(dòng)查看
12 開始啟動(dòng)
將 rtthread.bin 鏡像放到/boot中(注意在 MMC 的第三個(gè)分區(qū)上),然后啟動(dòng)板子,在啟動(dòng)菜單中輸入 ‘1’ 啟動(dòng) RT-Thread:

然后可以看到我們就進(jìn) MSH 了:

我們直接使用了 DM 中大量復(fù)用的設(shè)備驅(qū)動(dòng),所以可以看看目前系統(tǒng)多少設(shè)備已經(jīng)支持了:

除了 SDMMC、NVME 我們可以直接掛載測(cè)試,其他的接口測(cè)試可以參考官方文檔:https://docs.radxa.com/rock2/rock2f/getting-started/interface-usage/pin-40-test
再查看系統(tǒng)其他部分子模塊狀態(tài):
中斷域

在中斷域中可以看到設(shè)備觸發(fā)中斷的次數(shù),以及中斷的級(jí)聯(lián)關(guān)系,親和性等信息,比如 NVME 使用 DWC PCI INTx 中斷,DWC PCI INTx 中斷級(jí)聯(lián)到了 rk-pcie 的 GICv2 上。
溫控域

在溫控域中可以看到帶溫度傳感器的設(shè)備的溫度,以及其扇熱方式,扇熱機(jī)制和觸發(fā)溫度。當(dāng)前溫控域只有 CPU,采用 CPU DVFS 的方式進(jìn)行扇熱,由于 DVFS 還未提交至主線,這里顯示不支持
時(shí)鐘域(僅顯示部分)

在時(shí)鐘域中可以看到系統(tǒng)各個(gè)時(shí)鐘的名稱和頻率,以及打開次數(shù),還有關(guān)聯(lián)到的設(shè)備,時(shí)鐘的父級(jí)關(guān)系等。
可以看到 LED 以心跳的方式進(jìn)行工作,這符合設(shè)備樹指定的工作方式:
gpio-leds { compatible ="gpio-leds"; state-led { gpios = <&gpio3?RK_PC1?GPIO_ACTIVE_LOW>; linux,default-trigger ="heartbeat"; };};
上下、左右滑動(dòng)查看
13 代碼倉(cāng)庫(kù)
我們可以看看我們?nèi)康男薷男畔ⅲ?/p>
[gui@gui-pc rockchip]$ git status .位于分支 rockchip_rk3528尚未暫存以備提交的變更: (使用"git add <文件>..."更新要提交的內(nèi)容) (使用"git restore <文件>..."丟棄工作區(qū)的改動(dòng)) 修改: 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 <文件>..."以包含要提交的內(nèi)容) dm/clk/clk-rk3528.c dm/include/dt-bindings/clock/rk3528-cru.h修改尚未加入提交(使用"git add"和/或"git commit -a")
-
設(shè)備
+關(guān)注
關(guān)注
2文章
4876瀏覽量
73834 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6386瀏覽量
120282 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1634瀏覽量
45140
發(fā)布評(píng)論請(qǐng)先 登錄
RT-Thread Vector軟件包:嵌入式開發(fā)的動(dòng)態(tài)數(shù)組容器 | 技術(shù)集結(jié)
移植RT-Thread的原理與方法
RT-Thread全球技術(shù)大會(huì):螢石研發(fā)團(tuán)隊(duì)使用RT-Thread的技術(shù)挑戰(zhàn)
2022 RT-Thread全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)RT-Thread的支持
RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制
RT-Thread全球技術(shù)大會(huì):RT-Thread測(cè)試用例集合案例
RT-Thread 中設(shè)備樹的適配方法 | 技術(shù)集結(jié)
評(píng)論