RK3588 U-Boot手动移植实战:从源码编译到串口调试避坑指南

基于arm64的RK3588 U-Boot移植超详细版教程 详解基于arm64架构的RK3588平台U-Boot移植全过程,涵盖关键配置与编译步骤。针对arm64处理器特性优化启动流程,适合嵌入式开发人员快速掌握核心移植技术。 阅读详情

1. 为什么我选择手动移植而不是直接用官方固件

拿到RK3588开发板的第一天,大多数人会先刷一遍官方提供的固件,能跑起来就行。但真到了产品化阶段,你迟早会遇到一个绕不开的问题:官方固件里的uboot是编译好的二进制,你改不了启动参数、加不了自定义的启动逻辑、也没法针对自己的硬件做裁剪。这时候,手动移植uboot源码就成了必须跨过去的一道坎。

我这次移植的目标很明确:基于RK3588平台,从uboot官方源码或者Rockchip维护的uboot分支出发,编译出一个能正常启动、能加载内核、能通过串口和网络调试的bootloader。整个过程涉及源码获取、交叉编译工具链配置、板级配置文件修改、设备树适配、编译烧录、串口验证这几个核心环节。适合有一定嵌入式Linux基础、能看懂Makefile和Kconfig、会用串口工具调试的开发者。如果你连交叉编译都没做过,建议先把这部分补一补再来看。

先说结论:RK3588的uboot移植不算特别难,但坑很分散。有的坑在工具链版本上,有的坑在DDR初始化参数上,有的坑在设备树的引脚配置上。我前后折腾了大概一周,踩了不下十个坑,下面把整个流程和避坑经验完整梳理一遍。

2. 移植前的整体思路与方案选型

2.1 用官方uboot还是主线uboot

这是第一个要做的决策。Rockchip官方维护了一个uboot分支,通常放在他们自己的代码托管平台上,版本一般是基于uboot 2017.09或者更新的版本做了大量Rockchip专属的修改。主线uboot从某个版本开始也逐步加入了对RK3588的支持,但完善程度和官方分支比还有差距。

我的建议是:如果你是做产品开发,优先用Rockchip官方的uboot分支。原因很简单,DDR初始化、电源管理、时钟树这些底层配置,官方分支里已经调好了,你直接拿来用就行。主线uboot虽然更“干净”,但你需要自己补大量Rockchip特有的驱动和配置,工作量成倍增加。我一开始不信邪,试了主线uboot,结果卡在DDR初始化阶段整整两天,最后还是老老实实换回官方分支。

官方分支的获取方式一般是通过git clone,仓库地址在Rockchip的代码托管页面上能找到。下载下来之后,你会看到board/rockchip/目录下有evb_rk3588、rk3588_s等板级配置目录,这些就是你的起点。

2.2 交叉编译工具链怎么选

RK3588是ARM Cortex-A76+A55的大小核架构,64位处理器,所以你需要aarch64架构的交叉编译工具链。常见的选择有:

  • Linaro GCC :老牌工具链,稳定,但版本更新慢
  • ARM官方GCC :ARM自己维护的,针对自家核心优化好
  • Rockchip提供的工具链 :官方SDK里自带,兼容性最有保障

我实测下来,用Rockchip SDK里自带的工具链最省心。版本一般是gcc 10.3或者11.3,具体看你拿到的SDK版本。如果你手头没有SDK,去Linaro官网下载aarch64-linux-gnu系列的GCC也能用,但要注意glibc版本不能太新,否则编译出来的uboot在板子上跑不起来。

注意:工具链的路径一定要加到PATH环境变量里,而且要在编译前用 aarch64-linux-gnu-gcc -v 确认版本。我遇到过一次因为系统里装了多个工具链,编译时调用了错误的版本,导致链接阶段报了一堆莫名其妙的错误。

2.3 编译框架:Makefile + Kconfig

uboot的编译框架是Makefile加Kconfig,和Linux内核类似。你需要先通过 make xxx_defconfig 生成.config文件,然后再 make 编译。对于RK3588,对应的defconfig文件通常在configs/目录下,名字类似 rk3588_defconfig 或者 evb-rk3588_defconfig 。

这里有个细节:Rockchip的uboot分支里,defconfig文件可能不止一个,对应不同的板型。你要根据自己手上的板子选对应的配置。比如正点原子的RK3588板子和Rockchip

RK3588开发实战:如何从零开始手动移植uboot源码(避坑指南) 本文是一份详尽的RK3588开发实战指南,专注于从零开始手动移植U-Boot源码。文章深入解析了源码结构、设备树适配、配置定制等核心步骤,并提供了关键的避坑技巧和编译调试方法,旨在帮助开发者彻底理解嵌入式Linux启动流程,摆脱对官方SDK的依赖,实现深度定制。 阅读详情

相关推荐

RK3588 U-Boot手动移植实战:从源码编译到启动调试全流程

嵌入式Linux开发中,U-Boot移植是连接硬件与操作系统的关键环节。其原理是通过板级配置和设备树让引导程序识别SoC外设与存储介质,技术价值在于掌握启动链路底层控制权,应用场景涵盖开发板调试、量产固件定制等。以RK3588为例,手动移植U-Boot源码涉及交叉编译工具链搭建、defconfig定制、DDR初始化适配及串口调试等步骤,能有效解决官方固件无法修改启动时序、外设驱动受限等问题,帮助开发者从应用层深入到底层启动流程。

weixin_34315485的博客 380

rk3588 U-Boot避坑指南:从官方源码到ArmSoM定制版的5个关键差异点

本文深度解析了RK3588平台U-Boot引导程序的选型与定制实践。针对新手常见误区,文章对比了官方主线U-Boot与Rockchip维护版的核心差异,并详细阐述了从芯片参考板到ArmSoM-W3开发板的板级适配关键步骤,包括设备树定制、板级初始化与存储配置,旨在帮助开发者高效完成移植,避开启动失败等常见陷阱。

weixin_29172201的博客 355

RK3588嵌入式开发实战:U-Boot设备树文件修改全指南(含常见踩坑点)

本文为RK3588嵌入式开发者提供了一份详尽的U-Boot设备树文件修改实战指南。文章深入解析了设备树的核心架构,从基础硬件适配到时钟、电源管理等进阶配置,并重点总结了内存节点、串口输出、电源时序等常见踩坑点与解决方案,旨在帮助开发者高效、稳健地完成U-Boot移植与定制工作。

yhn456789的博客 719

Rockchip rk3588 U-Boot深度解析:从官方源码到ArmSoM定制化实践

本文深度解析了Rockchip RK3588平台U-Boot的启动原理与定制化实践。以ArmSoM-W3开发板为例,详细阐述了从官方主线源码、Rockchip厂商分支到板级适配的完整“谱系”,并提供了获取源码、编译配置、烧写测试及进阶定制(如修改设备树、添加命令)的实战指南,帮助开发者掌握嵌入式系统启动的关键第一步。

weixin_29159441的博客 408

RK3588 U-Boot深度定制化移植实战指南

U-Boot是嵌入式系统启动的关键固件,其核心价值在于为Linux内核提供硬件抽象与可信引导环境。理解U-Boot启动流程、SPL阶段初始化机制及设备树(DTS)与源码的协同关系,是实现硬件适配的技术基础。在Rockchip RK3588平台,由于DDR训练参数、SPI NOR Flash识别、PCIe PHY配置等高度依赖PCB设计,通用镜像往往失效,必须开展源码级定制化移植。该过程涉及HAL层重写、寄存器级时序调优、Kconfig模块裁剪及裸寄存器操作等硬核实践,广泛应用于工业控制、边缘AI终端与国产化

weixin_29194255的博客 259

深入解析RK3588嵌入式Linux开发:从uboot源码移植到定制化编译实战

本文详细解析了RK3588嵌入式Linux开发中U-Boot源码移植与定制化编译的全过程。通过手动移植U-Boot,开发者可以获得透明、轻量且灵活的启动流程控制,文章从编译环境搭建、设备树定制、环境变量配置到专属编译脚本编写,提供了完整的实战指南,帮助开发者深入理解并掌握RK3588平台的启动原理与定制开发。

weixin_29185493的博客 242

避开20GB官方SDK!手把手教你从GitHub直接移植RK3588的U-Boot(附完整编译脚本)

本文提供了一种绕过庞大官方SDK,直接从GitHub获取源码移植和编译RK3588平台U-Boot的轻量化实战方案。文章详细解析了源码结构、关键文件,并手把手指导完成从EVB模板到自定义板卡的设备树、环境变量及配置文件的定制化移植,最后附带了完整的自动化编译脚本与构建流程,帮助开发者实现更透明、自主的嵌入式系统启动引导开发。

weixin_29186249的博客 433

避开20GB官方SDK!手把手教你从GitHub直接移植RK3588的U-Boot源码

本文详细介绍了如何绕过20GB的官方SDK,直接从GitHub移植RK3588的U-Boot源码。通过环境配置、设备树定制、编译脚本编写等步骤,帮助开发者实现轻量化、自主可控的嵌入式Linux开发,特别适合需要深度定制启动流程的场景。

weixin_30642561的博客 143

深入解析RK3588嵌入式Linux开发:uboot源码定制化移植实战

本文深入解析RK3588嵌入式Linux开发中的uboot源码定制化移植实战,涵盖双系统引导、异构多核初始化和安全启动链等关键技术。通过详细的设备树修改、环境变量配置和编译系统改造指南,帮助开发者高效完成RK3588平台的uboot移植,并提供了常见问题排查与高级定制技巧。

weixin_30879169的博客 440

Unidbg逆向阿里系App签名:从环境补全到算法还原实战

在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算

weixin_42525738的博客 920

量化金融笔记1-股票量化基础

股票量化基础 文章目录什么是股票股票的定义及其诞生所解决的问题股票的主体和流通股票的常规分类股票价格收益率什么是股票价格的收益率股票价格收益率计算在python中的实现两种收益率算法的特点及应用场合股票交易规则场内交易与场外交易A股、B股、H股国内多层次的资本市场股票交易指令和撮合机制股票交易时间股票交易成本股票复权股票数据介绍与提取行业分类和指数行情数据因子数据标的数据基本面数据 什么是股票 股票的定义及其诞生所解决的问题 股票的定义:股票是一种有价证券,是股份有限公司公开发行的用以证明投资者的股东身份

折桂狂人的博客 2390

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 343

计算机视觉之姿态识别(原理+代码实操)

计算机视觉中的姿态识别原理+模型介绍,同时通过代码实操简单的演示基于mediapipe的单人姿态识别。

输出既学习 3万+

Synopsys AXI VIP 从环境搭建到首个验证场景运行

本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。

weixin_29185493的博客 332

3、固定翼无人机模型解析

本文详细解析了固定翼无人机的动力学模型与纵向模型,涵盖位置、速度、角度及角速度的变化率方程,并介绍了力和力矩的计算方法以及气动系数的表达式。通过关键参数分析,探讨了速度、迎角和倾斜角对飞行性能的影响。文章还展示了模型在编队飞行和任务规划中的应用,并提出了参数优化与先进控制策略等优化思路,为无人机飞行控制系统设计提供了理论基础。

gaochao的博客 239

RML2018.01a数据集的读取与使用

基于深度学习的自动调制识别

QAQIknow的博客 1万+

Ardupilot EKF3核心算法《开篇》

Ardupilot EKF3核心算法本专栏重点,透彻,详细的分析了ardupilot的EKF3,保证是你看到的最完美的EKF3资料,相信你的选择不会错误。网上EKF资料真是太多,说真的没有一篇讲解好的。!!

陌城烟雨 1411

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: Linux设备驱动模型核心机制解析:从kobject到platform驱动
下一篇: 不用真实PLC,用PLCSIM-Advanced跑通S7-1500开放式TCP通信全流程
weixin_34306593
博客等级 码龄11年 3862粉丝 1114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值