尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

RK3568 U-Boot定制实战:从menuconfig到设备树全解析

发布时间:2026/9/28 1:26:10

资讯中心
01
ARTICLE

RK3568 U-Boot定制实战:从menuconfig到设备树全解析

RK3568 U-Boot定制实战:从menuconfig到设备树全解析
RK3568这颗芯片在工业控制和边缘计算圈子里热度一直不低四核A55加Mali-G52的组合接口丰富价格也合适。但很多人拿到板子之后跑通官方SDK的默认镜像就停了真正要把它塞进自己的产品里第一道坎就是u-boot的定制。默认配置能启动不代表能用——串口波特率不对、存储介质识别不了、网络PHY驱动缺失、屏幕方向反了这些问题全都要在u-boot阶段解决。我前后经手过好几块不同厂商的RK3568板子从正点原子到核心板方案每次都要跟u-boot的menuconfig和设备树打交道踩过的坑足够写一本小册子。这篇内容就把整个定制流程拆开从配置菜单的每一项含义到设备树里每个节点的作用再到编译脚本的调用逻辑全部讲清楚。不管你是刚接触RK3568的新手还是已经能跑通系统但想深入定制的老手应该都能从中找到有用的东西。1. 先搞清楚RK3568的u-boot启动链路在动手改配置之前必须理解RK3568从上电到加载内核之间到底发生了什么。很多人改配置改出问题根本原因就是不清楚自己改的那一项在启动链路的哪个环节起作用。1.1 BootROM到SPL再到U-Boot proper的三级跳RK3568内部固化了一段BootROM代码上电后最先运行。BootROM会根据启动引脚的电平状态决定从哪个介质加载下一阶段代码——可能是SPI Flash、eMMC、SD卡或者通过USB烧录模式。它加载的第一段代码叫SPLSecondary Program Loader这个阶段非常精简主要任务是初始化DDR控制器和基本的时钟然后把完整的U-Boot proper加载到DDR里运行。这里有个关键点SPL和U-Boot proper是两份独立的二进制文件但通常打包在一起。SPL负责“把系统带起来”U-Boot proper负责“把系统交给内核”。你在menuconfig里改的很多配置其实只影响U-Boot proper对SPL没有作用。比如USB驱动、网络协议栈这些SPL阶段根本用不到。但DDR参数、时钟配置这些SPL和U-Boot proper都需要它们通常放在设备树的SPL专用节点或者独立的DDR bin文件里。我见过有人改了menuconfig里的DDR频率选项结果编译出来的固件根本起不来就是因为那个选项实际影响的是SPL阶段的DDR初始化而SPL的配置往往被单独覆盖了。所以记住一个原则改任何配置之前先确认它属于SPL阶段还是U-Boot proper阶段。1.2 为什么RK3568的u-boot定制比全志、Amlogic更麻烦瑞芯微的u-boot基于U-Boot 2017.09版本做了大量私有化改造跟主线u-boot的差异非常大。全志的u-boot虽然也有私有代码但整体结构更接近主线设备树的使用方式也比较标准。RK3568这边瑞芯微引入了自己的rockchip目录结构、私有的rkbin二进制仓库、以及一套独特的make.sh编译脚本体系。更麻烦的是瑞芯微把很多硬件初始化逻辑从C代码搬到了设备树里但又不是完全标准的设备树绑定。比如时钟树、电源域、引脚复用这些在主线u-boot里通常由驱动代码处理在RK3568的u-boot里却大量依赖设备树节点来描述。这就导致你改设备树的时候不能完全按照Linux内核的设备树语法来理解得结合瑞芯微的文档和实际代码来看。还有一个坑瑞芯微的SDK里u-boot的设备树和内核的设备树是分开的两份文件虽然名字可能一样但内容有差异。u-boot的设备树只包含启动阶段需要的节点内核的设备树包含完整的硬件描述。改的时候千万别搞混了。1.3 make.sh脚本到底做了什么瑞芯微SDK根目录下的make.sh是整个编译体系的入口。直接运行./make.sh不带参数它会打印帮助信息。常用的调用方式有这几种# 编译u-boot ./make.sh uboot # 编译内核 ./make.sh kernel # 编译整个固件 ./make.sh firmware # 只编译u-boot并打包 ./make.sh --spl这个脚本内部会做几件事设置交叉编译工具链的环境变量、根据当前配置选择对应的defconfig文件、调用u-boot的make命令、最后把编译产物拷贝到rockdev目录下。关键的是它会读取device/rockchip/rk3568/目录下的配置文件决定用哪个defconfig、哪个设备树、哪个DDR bin。我建议你在第一次编译之前先打开make.sh看一遍特别是build_uboot()这个函数。里面会显示它实际执行的make命令和参数。这样你就知道当你在menuconfig里改了配置之后make.sh会不会覆盖你的修改。有些配置项在make.sh里被硬编码了你在menuconfig里改了也没用。2. menuconfig里哪些选项真正值得改RK3568的u-boot defconfig文件通常有上千行配置menuconfig里展开的菜单更是密密麻麻。但实际项目中需要改的来来去去就那么几类。我把它们分成“必须改”“按需改”“千万别乱改”三档来说。2.1 启动介质与存储配置eMMC、SD、SPI Flash的选择逻辑RK3568支持从多种介质启动具体从哪个启动由硬件引脚决定但u-boot需要知道去哪里找内核和根文件系统。相关的配置项在Device Drivers - MMC和Device Drivers - MTD下面。如果你用的是eMMC启动需要确认CONFIG_MMCy CONFIG_MMC_SDHCIy CONFIG_MMC_SDHCI_ROCKCHIPy CONFIG_CMD_MMCy如果是SPI Flash启动则需要CONFIG_MTDy CONFIG_SPI_FLASHy CONFIG_SPI_FLASH_GIGADEVICEy CONFIG_CMD_SFy这里有个容易忽略的点RK3568的eMMC和SD卡共用一组引脚但控制器是分开的。在设备树里sdhci节点对应eMMCsdmmc节点对应SD卡。如果你同时使能了两个要确保引脚复用配置正确否则会出现其中一个识别不了的情况。我遇到过一块板子eMMC能启动但SD卡插上没反应查了半天发现是设备树里sdmmc节点的status被设成了disabled。menuconfig里明明开了MMC支持但设备树没使能对应控制器照样没用。所以记住menuconfig管驱动编译设备树管硬件使能两者缺一不可。2.2 网络PHY驱动YT8521与RTL8211的适配差异RK3568的GMAC控制器支持千兆以太网但PHY芯片的选择会影响驱动配置。常见的PHY有YT8521、RTL8211、以及一些国产替代型号。热词里提到的YT8521就是很典型的一款。在menuconfig里PHY驱动的位置在Device Drivers - Net - PHY你需要根据实际硬件选择对应的PHY驱动。如果用的是YT8521要确认CONFIG_PHY_YT8521y CONFIG_GMAC_ROCKCHIPy但光选驱动还不够。YT8521和RTL8211在设备树里的配置方式有差异。YT8521需要额外配置phy-mode和clock相关属性而RTL8211通常用标准配置就行。具体来说设备树里GMAC节点的phy-mode属性要跟硬件设计匹配——是rgmii、rgmii-id还是rmii选错了网络要么不通要么丢包严重。我实测下来YT8521在RK3568上最容易出问题的是时钟配置。如果assigned-clocks和assigned-clock-rates没设对PHY可能协商不出千兆速率只能跑百兆。这时候可以在u-boot命令行里用mii info和mii read命令查看PHY寄存器状态确认协商结果。2.3 显示与触摸从竖屏到横屏的设备树修改热词里有一条“rk3568 触摸竖屏改为横屏设备树修改”这个需求在工业HMI场景里非常常见。很多厂商的默认配置是竖屏但实际产品需要横屏显示。在u-boot阶段显示相关的配置主要在Device Drivers - Graphics support需要使能CONFIG_VIDEO_ROCKCHIPy CONFIG_DISPLAY_ROCKCHIP_HDMIy CONFIG_DISPLAY_ROCKCHIP_MIPIy CONFIG_VIDEO_BMP_GZIPy但屏幕方向的修改不在menuconfig里而在设备树的显示节点中。以MIPI DSI屏幕为例需要修改dsi节点下的panel子节点调整width-mm、height-mm以及display-timings里的时序参数。如果是竖屏改横屏本质上是要旋转显示缓冲区的内容这通常通过修改rockchip,rotation属性来实现。不过要注意u-boot阶段的显示驱动和内核阶段的显示驱动是两套独立的代码。u-boot里改了方向内核里还要再改一次。而且u-boot的显示驱动功能比较有限通常只用于显示开机logo复杂的旋转操作可能不支持。如果u-boot阶段搞不定可以只在u-boot里显示一个不旋转的logo等内核启动后再做旋转。2.4 哪些配置项改了会变砖有些配置项在menuconfig里看起来人畜无害改完之后固件直接起不来。我列几个高危项配置项位置风险说明CONFIG_SYS_TEXT_BASE架构相关改错了U-Boot proper加载地址直接跑飞CONFIG_SPL_TEXT_BASESPL配置SPL加载地址错误BootROM找不到入口CONFIG_ROCKCHIP_DDR_FREQDDR配置频率设太高DDR初始化失败CONFIG_SYS_CLK_FREQ时钟配置主频设置错误串口无输出CONFIG_BAUDRATE串口配置波特率改了但终端没改看不到任何输出特别是CONFIG_BAUDRATE很多人改了之后忘记改串口终端的波特率以为板子挂了其实只是输出乱码。我建议改这个之前先用printenv确认当前波特率改完之后同步调整终端设置。3. 设备树修改从照猫画虎到真正理解设备树是RK3568 u-boot定制里最容易出错的部分因为它没有统一的文档很多节点含义要靠读代码和实测来理解。我按照实际项目中改得最多的几类节点来说。3.1 设备树文件的位置与编译产物追踪RK3568的u-boot设备树文件通常放在arch/arm/dts/rk3568-xxx.dts其中xxx是板级名称。编译之后dtb文件会生成在u-boot/dts/rk3568-xxx.dtb但实际打包进固件的时候dtb会被追加到u-boot.bin后面形成u-boot.dtb或者被单独打包。你可以用fdtdump工具查看最终的dtb内容确认你的修改有没有生效fdtdump u-boot.dtb | grep -A5 your-node如果修改没生效先检查是不是改错了文件。瑞芯微的SDK里经常有多份相似的dts文件比如rk3568-evb.dts和rk3568-evb1-ddr4-v10.dtsmake.sh会根据配置选择其中一份。你改的那份可能根本没被编译。3.2 引脚复用配置pinctrl节点的实际作用RK3568的引脚复用通过pinctrl子系统管理。在设备树里每个外设节点通过pinctrl-0引用一组引脚配置。比如UART2的引脚配置uart2 { pinctrl-names default; pinctrl-0 uart2m0_xfer; status okay; };这里的uart2m0_xfer是在rk3568-pinctrl.dtsi里定义的引脚组。如果你要换一组引脚比如从M0换到M1就要改成uart2m1_xfer。但前提是rk3568-pinctrl.dtsi里确实定义了这组引脚。我遇到过一种情况硬件上UART2用的是M1引脚但设备树里写的是M0结果串口完全没输出。查原理图确认引脚没错最后发现是pinctrl配置写错了。这种问题在u-boot阶段特别难查因为u-boot的串口驱动初始化失败时往往没有任何报错信息。3.3 GMAC与PHY的设备树绑定细节网络部分的设备树配置是热词里反复出现的主题。以YT8521为例一个典型的GMAC节点配置是这样的gmac1 { phy-mode rgmii-id; clock_in_out output; snps,reset-gpio gpio3 RK_PB7 GPIO_ACTIVE_LOW; snps,reset-active-low; snps,reset-delays-us 0 20000 100000; assigned-clocks cru SCLK_GMAC1_RX_TX; assigned-clock-parents cru SCLK_GMAC1_RGMII_SPEED; pinctrl-names default; pinctrl-0 gmac1m1_miim gmac1m1_tx_bus2 gmac1m1_rx_bus2 gmac1m1_rgmii_clk gmac1m1_rgmii_bus; status okay; };几个关键点phy-mode必须跟硬件设计一致。rgmii-id表示PHY内部做延迟rgmii表示MAC做延迟。选错了会导致数据采样错误表现为网络能通但丢包严重。clock_in_out决定时钟方向。output表示RK3568输出时钟给PHYinput表示PHY提供时钟给RK3568。这个要根据PHY芯片的默认配置来定。snps,reset-gpio是PHY的复位引脚。如果这个配错了PHY可能一直处于复位状态网络完全不通。我在调试YT8521的时候发现一个很隐蔽的问题PHY的复位时序不对。snps,reset-delays-us里的三个值分别表示复位前延迟、复位保持时间、复位后延迟。如果复位保持时间太短PHY可能没复位成功。后来改成0 20000 100000才稳定。3.4 存储设备节点sdhci与sdmmc的区分RK3568的eMMC和SD卡分别对应sdhci和sdmmc节点。eMMC的配置通常比较简单sdhci { bus-width 8; max-frequency 200000000; non-removable; status okay; };non-removable表示eMMC是焊死的不需要检测卡。bus-width 8表示8位数据线。如果硬件只接了4位这里要改成4否则可能识别不了。SD卡的配置要多一些sdmmc { bus-width 4; max-frequency 150000000; supports-sd; cd-gpios gpio0 RK_PA4 GPIO_ACTIVE_LOW; status okay; };cd-gpios是卡检测引脚。如果这个配错了SD卡插拔检测会失效。有些板子没有卡检测引脚那就不要写这一项否则u-boot会一直认为卡不存在。4. 编译、烧录与验证的完整闭环配置改完了设备树也改完了接下来就是编译和验证。这一步看起来简单但实际操作的细节很多。4.1 make.sh的参数传递与编译产物定位前面提到过make.sh的基本用法这里补充几个实用参数# 编译u-boot并显示详细日志 ./make.sh uboot 21 | tee build.log # 只编译SPL ./make.sh spl # 清理u-boot编译产物 ./make.sh clean编译完成后产物通常在u-boot/u-boot.bin u-boot/spl/u-boot-spl.bin u-boot/u-boot.dtb但最终烧录用的固件是打包后的uboot.img位置在rockdev/uboot.img这个img文件包含了SPL、U-Boot proper和dtb。你可以用binwalk或者瑞芯微的afptool工具解包查看内容。4.2 烧录方式的选择USB、SD与网络RK3568支持多种烧录方式USB烧录通过Type-C接口使用瑞芯微的upgrade_tool或者开源的rkdeveloptool。这是最常用的方式适合开发阶段。SD卡烧录把固件写到SD卡插入板子启动。适合量产或者没有USB接口的场景。网络烧录通过TFTP从网络加载固件。适合快速迭代但需要板子已经能启动到u-boot命令行。我一般用USB烧录因为最稳定。但要注意烧录之前要确保板子进入了MaskROM模式或者Loader模式。进入MaskROM模式的方法是按住恢复按键再上电Loader模式则是在u-boot命令行里执行reboot loader。4.3 验证配置是否生效的几种手段烧录完成后怎么确认你的修改生效了我常用的方法有这几种串口输出检查最直接的方式。如果改了波特率串口输出应该正常显示。如果改了启动介质u-boot启动时会打印从哪个设备加载内核。u-boot命令行验证进入u-boot命令行后可以用这些命令检查# 查看环境变量 printenv # 查看MMC设备 mmc list # 查看网络PHY状态 mii info # 查看设备树节点 fdt print /gmac1fdt print命令特别有用它可以直接打印设备树节点的内容确认你的修改有没有被正确解析。内核启动日志u-boot的配置最终会影响内核启动。如果网络PHY配置正确内核启动时应该能看到PHY协商成功的日志。如果显示配置正确内核启动后屏幕应该正常显示。5. 那些文档里不会写的踩坑经验最后这部分是我在实际项目中积累的一些经验有些是踩坑之后的教训有些是反复调试总结出来的技巧。5.1 串口无输出时的排查顺序串口无输出是最常见的问题排查顺序很重要确认波特率RK3568默认是1500000不是115200。很多人用115200连上去看到乱码以为板子挂了。确认串口线TX和RX有没有接反GND有没有接确认设备树uart2节点的status是不是okaypinctrl配置对不对确认SPL如果SPL阶段就挂了U-Boot proper根本不会运行。这时候要检查DDR配置和SPL的串口初始化。确认硬件以上都没问题就要查原理图确认串口引脚有没有被其他功能占用。我遇到过一块板子串口无输出查了两天最后发现是硬件工程师把TX和RX画反了。所以软件查完没问题一定要怀疑硬件。5.2 网络PHY识别不到的几种原因网络不通的原因很多按概率排序PHY驱动没编译menuconfig里没选对应的PHY驱动。设备树节点没使能gmac1的status是disabled。复位引脚配置错误PHY一直处于复位状态。时钟配置错误PHY没有收到正确的参考时钟。phy-mode不匹配MAC和PHY的延迟配置不一致。我建议在u-boot命令行里用mii read命令直接读PHY寄存器。如果读出来全是0或者全是F说明PHY没有正常工作。如果能读出正确的ID说明PHY基本正常问题可能在MAC侧或者协议配置上。5.3 设备树修改后编译不生效的排查设备树改了但没生效通常是这几个原因改错了文件SDK里有多份相似的dtsmake.sh用的不是你改的那份。编译没清理dtb有缓存需要先make clean再编译。打包没更新uboot.img没有重新打包烧录的还是旧固件。烧录没成功烧录工具报错但没注意实际烧的还是旧固件。我的习惯是每次改完设备树先fdtdump确认dtb内容变了再烧录。烧录之后进u-boot命令行用fdt print确认节点内容。两步都确认了才能保证修改生效。5.4 关于EtherCAT与IGH主站的补充说明热词里提到了“适配rk3568的ethercat igh主站驱动”这是一个比较专业的工业实时以太网场景。IGH是一个开源的EtherCAT主站实现通常运行在Linux内核态。在RK3568上适配IGH主要涉及内核网卡驱动的实时性优化和EtherCAT协议栈的移植。u-boot阶段对EtherCAT的支持非常有限通常只需要保证网络PHY能正常工作让内核启动后能加载IGH驱动。如果你在做EtherCAT相关的项目建议把重点放在内核驱动的实时性调优上u-boot阶段保证网络基础功能可用即可。具体来说IGH主站对网络延迟非常敏感需要在设备树里关闭网卡的节能特性比如eee-broken-1000t和tx-delay、rx-delay的精确配置。这些配置在u-boot阶段不需要但内核设备树里必须正确设置。5.5 开机动画在u-boot阶段的实现思路热词里还有一条“rk3568 uboot添加开机动画”。u-boot阶段显示开机动画的原理是在u-boot启动过程中通过显示驱动把一张BMP图片输出到屏幕上。瑞芯微的u-boot支持CONFIG_VIDEO_BMP_GZIP和CONFIG_CMD_BMP可以加载压缩的BMP图片。实现步骤大致是在menuconfig里使能显示驱动和BMP相关配置。把BMP图片放到分区里或者编译进u-boot。在u-boot的环境变量里设置bootlogo相关参数。在启动脚本里调用bmp display命令。但要注意u-boot阶段的显示驱动功能有限分辨率支持可能不如内核完善。如果屏幕分辨率比较高或者需要复杂的动画效果建议只在u-boot阶段显示一张静态logo等内核启动后再做动画。我在实际项目中的体会是u-boot定制这件事最怕的就是“想当然”。看到menuconfig里有个选项觉得应该开看到设备树里有个节点觉得应该改结果改完之后问题更多。每次修改之前先问自己三个问题这个配置影响哪个阶段这个节点对应哪个硬件改错了会有什么后果想清楚这三个问题能省下大量调试时间。另外养成备份配置文件的习惯每次改之前先git commit一下出问题了可以快速回退。这些经验听起来简单但真正能坚持做的人不多而坚持下来的人往往就是那些调试效率最高的人。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。