RK3399移植u-boot

news2024/11/27 11:50:15

RK3399移植u-boot

  • 0.前言
  • 一、移植
    • 1.交叉工具链安装
    • 2.获取bl31.elf
    • 3.移植u-boot
      • 1)下载:
      • 2)配置:
        • 修改串口波特率:
        • 修改emmc:
        • 配置FIT:
        • 配置boot delay:(可选)
      • 3)编译:
      • 4)生成idbloader.img文件:
        • 将spl/u-boot-spl.bin合并到idbloader.img:
      • 5)生成u-boot.its文件


0.前言

  最近在海鲜市场淘了一块SW799板子,像是某个智能终端的拆机板,主控是rk3399,双核1.8GHz A72+四核1.4GHz A53,4G RAM + 16G eMMC的配置,性能看上去还不错,之前的i.mx6q-sdb出手了,正好换个国产主控玩玩。选这个板子主要是有大佬反编译出了设备树文件,有移植条件,就算刷成砖也有办法补救。而且找到了一些相关的移植案例,先玩玩试试。

一、移植

注:
  移植步骤主要参考@大奥特曼打小怪兽博主的帖子,rk3399有关的芯片原理部分也可以移步拜读,写的很有水平和参考价值。笔者在这里只做一些步骤方面的精简,仅作参考。
  另外,此篇的内容也暂时按照大佬的案例,基于官方evb评估板的配置进行移植,先熟悉一下开发流程,后续再对SW799进行适配,所以想直接移植同款板子的可能还需要先自行摸索。

1.交叉工具链安装

  下载GNU Arm Embedded Toolchain官网提供的交叉编译工具链,需要根据芯片架构进行选择,这里用的是:
在这里插入图片描述
下载后解压到/usr/local/arm目录下,修改/etc/profile文件,将工具链添加到环境变量:

sudo vim /etc/profile
export PATH=$PATH:/usr/local/arm/arm-gnu-xxxx/bin
#保存后重新加载环境变量
source /etc/profile

查看是否安装成功:

aarch64-none-linux-gnu-gcc -v

2.获取bl31.elf

  rk3399是Armv8-A架构,也需要arm可信固件(arm-trusted-firmware)的验证方式。所以需要先编译TF-A获取bl31.elf,用于之后与u-boot合并。
  下载arm-trusted-fireware源码,进入该目录后使用以下命令进行编译:

make CROSS_COMPILE=aarch64-none-linux-gnu- PLAT=rk3399

报错:缺少​​arm-none-eabi-gcc​​工具链
在这里插入图片描述

sudo apt-get install gcc-arm-none-eabi

然后重新编译即可,将build/rk3399/release/bl31/bl31.elf文件拷贝出去备用。

3.移植u-boot

u-boot软件包下载网站:https://ftp.denx.de/pub/u-boot/

1)下载:

wget https://ftp.denx.de/pub/u-boot/u-boot-2023.07.tar.bz2
tar -jxf u-boot-2023.07.tar.bz2

2)配置:

make evb-rk3399_defconfig V=1
make menuconfig

修改串口波特率:

ctrl + 回车进入修改

Device Drivers  ---> 
      Serial --->     
           (115200) Default baudrate 

修改emmc:

将CONFIG_MMC_HS400_SUPPORT,CONFIG_MMC_SDHCI_SDMA配置关掉,这两个选项和emmc的读写方式有关,现在打开会造成无法读取emmc的问题,后续移植相关的驱动后再尝试适配。

Device Drivers  ---> 
      MMC Host controller Support  --->
            [ ] MMC debugging
            [ ] enable HS400 support  
            [ ] Support IO voltage configuration
            [ ] Support SDHCI SDMA  

配置FIT:

下载rockchip瑞芯微官方的u-boot,将官方源码中生成fit文件的脚本拷贝过来:

git clone https://github.com/rockchip-linux/u-boot.git
cp rockchip-linux/u-boot/arch/arm/mach-rockchip/make_fit_atf.py u-boot-2023.07/arch/arm/mach-rockchip/

然后在menuconfig中添加脚本路径:

Boot options  --->    
     Boot images  --->
         [*] Use a script to generate the .its script                                                 
        (arch/arm/mach-rockchip/make_fit_atf.py) .its file generator script for U-Boot FIT image

配置boot delay:(可选)

Boot options  --->    
     Autoboot options --->
         (5) delay in seconds before automatically booting

设置完成后将此配置保存为my-rk3399_defconfig,后续的移植就在此配置基础上进行修改。

3)编译:

make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu-

报错:缺少了atf-bl31文件
在这里插入图片描述
将上一步保存的bl31.elf拷贝到此u-boot的根目录下,重命名并重新编译即可:

cp <path>/bl31.elf u-boot-2023.07/
cp bl31.elf atf-bl31

如果报错Failed to read ELF file: Python: No module named 'elftools',使用pip3 install pyelftools安装即可。

4)生成idbloader.img文件:

  基于uboot源码编译出TPL/SPL,其中TPL负责实现DDR初始化,TPL初始化结束之后会回跳到BootROM程序,BootROM程序继续加载SPL,SPL加载u-boot.itb文件,然后跳转到uboor执行。
  idbloader.img是由tpl/u-boot-tpl.bin和spl/u-boot-spl.bin文件生成,需要使用到tools目录下的mkimage工具。

tools/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin idbloader.img
  • -n rk3399将镜像文件的名称设置为"rk3399";
  • -T rksd将映像类型指定为Rockchip SD卡启动映像;
  • -d tpl/u-boot-tpl.bin将生成的TPL镜像文件"tpl/u-boot-tpl.bin"指定为输入文件,而idbloader.img则指定为输出文件。

将spl/u-boot-spl.bin合并到idbloader.img:

cat spl/u-boot-spl.bin >> idbloader.img

在这里插入图片描述

5)生成u-boot.its文件

make u-boot.itb ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu-

这个命令编译时会报错,是因为脚本可以一次编译出多个文件,而填入的参数只有its相关的。编译完成后,在当前目录下存在u-boot.its和u-boot.itb文件即可。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/780246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Docker 快速上手中文版 LLaMA2 开源大模型

本篇文章&#xff0c;我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型&#xff0c;国内第一个真正开源&#xff0c;可以运行、下载、私有部署&#xff0c;并且支持商业使用。 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后&#xff0c;Git…

实验五 分支限界法

实验五 分支限界法 01背包问题的分治限界法的实现 剪枝函数 限界函数 1.实验目的 1、理解分支限界法的剪枝搜索策略&#xff0c;掌握分支限界法的算法框架 2、设计并实现问题&#xff0c;掌握分支限界算法。 2.实验环境 java 3.问题描述 给定n种物品和一背包。物品i的重…

JMeter基础入门教程之CSV数据文件设置CSV Data Set Config

最近在做压力测试&#xff0c;登录功能用到了配置元件&#xff1a;CSV 数据文件设置&#xff0c;可以将登录用户名和密码放在一个csv文件中&#xff0c;然后通过CSV数据文件设置元件读取出来&#xff0c;用来做压测。 一、CSV文件 CSV文件小知识分享&#xff1a;是指"逗号…

Linux内核--内存管理

MMU的产生背景 在计算机出现的早期&#xff0c;其内存资源十分有限&#xff0c;一般只有几十几百KB&#xff0c;当时的程序规模也小&#xff0c;对于当时的程序而言&#xff0c;KB级的内存资源尚足够使用。但随着计算机技术的发展&#xff0c;应用程序的规模不断膨胀&#xff…

k8s部署wordpress+mysql博客平台

k8s部署wordpressmysql博客平台 1、yaml文件准备1.1 wordpress-db.yaml1.2 wordpress.yaml 2、部署安装2.1 先创建wordpress命名空间2.2 部署wordpress-db2.3部署wordpress 3、访问测试 1、yaml文件准备 1.1 wordpress-db.yaml apiVersion: apps/v1kind: Deploymentmetadata:…

【flink】ColumnarRowData

列式存储 在调试flink读取parquet文件时&#xff0c;读出来的数据是ColumnarRowData&#xff0c;由于parquet是列式存储的文件格式&#xff0c;所以需要用一种列式存储的表示方式&#xff0c;ColumnarRowData就是用来表示列式存储的一行数据&#xff0c;它包含多个数组的数据结…

Matlab求解基于RRT算法的自定义垛型的路径避障

目录 背景 1 RRT搜索算法 2 基于Matlab的RRT搜索算法 3 基于Matlab的自定义垛型绘制 4 基于RRT算法的自定义垛型的路径避障 背景 在码垛机械臂路径规划过程中&#xff0c;需要根据现有箱子的码垛状态&#xff0c;给出下一个箱子的最佳码放无碰撞路径。RRT 快速搜索随机…

vue2项目 自定义详情组件

vue2项目 自定义详情组件 效果组件代码组件引入以及传参格式寄语 效果 组件代码 DetailFormRow.vue已经封装好&#xff0c;根据数据格式直接引用即可。 <template><div class"detail-form"><el-row class"detail-form-row" style"ma…

基本函数、常见曲线图像

基本函数图像是指一些常见的数学函数的图像&#xff0c;这些函数在数学和工程等领域中经常被使用。下面是一些常见的基本函数及其图像&#xff1a; 参考文献&#xff1a;同济版高等数学【第七版】上下册教材

几张表格搞定Mysql的SQL语句

一、数据库的登录与退出 登录Mysqlmysql -uroot -p123退出Mysqlexit 二、对数据库的操作 查询所有数据库show databases;创建数据库create database 数据库名字;删除数据库drop database 数据库名字;查询创建数据库的具体语句show create database 数据库名字;使用数据库use…

自学网络安全(黑客),遇到问题怎么解决

自学网络安全很容易学着学着就迷茫了&#xff0c;找到源头问题&#xff0c;解决它就可以了&#xff0c;所以首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题&#xff0c;看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xf…

RocketMQ的系统设计

消息存储 下图为producer、broker、consumer的交互过程 1.消息存储整体架构 CommitLog&#xff1a;消息主体以及元数据的存储主体&#xff0c;存储Producer端写入的消息主体内容(即Producer端投递的消息都会先写入CommitLog中)&#xff0c;消息内容不是定长的。单个文件大小默…

代码随想录day8 | KMP 28.实现strStr() 459.重复的子字符串

文章目录 一、实现strStr()二、重复的子字符串 一、实现strStr() 先学学KMP算法&#xff0c;代码随想录 28.实现strStr() class Solution { public:void getNext(int* next, const string& s) {int j -1;next[0] j;for(int i 1; i < s.size(); i) { // 注意i从1开始…

win 安装虚拟机 再安装macos

0 视频教程 windows虚拟机一键安装苹果系统macos&#xff0c;轻松拥有xcode环境_哔哩哔哩_bilibili在windows环境下vmware虚拟机一键安装macos Catalina10.15.7苹果系统&#xff0c;帮助学习ios编程的朋友们实现xcode环境。文字教程&#xff1a;https://www.dhzy.fun/archives…

【Matlab】基于遗传算法优化 BP 神经网络的数据分类预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

Qt ComboBox 下拉框设置多列

Qt ComboBox 下拉框设置多列 通过设置listview实现。 class MultiColumnComboBoxItemDelegate; class MultiColumnComboBoxListView;class MultiColumnComboBox : public QComboBox {Q_OBJECT public:explicit MultiColumnComboBox(QWidget *parent nullptr);~MultiColumnCo…

Linux -- 进阶 自动挂载服务 ( autofs ) 介绍及安装 主配置文件分析

背景引入 &#xff1a; 针对于 挂载 &#xff0c; 大家有没有思考过一个问题&#xff0c;如果我们需要挂载的文件或访问的远程数据甚至只是挂载一些设备&#xff0c;如果太多的话&#xff0c;数量很大的话&#xff0c;那 光每次挂载 敲的 mount 命令&#xff0c;都得敲很多遍…

Flask 文件上传,删除上传的文件

目录结构 app.py from flask import Flask, request, render_template, redirect, url_for import osapp Flask(__name__) BASE_DIR os.getcwd() UPLOAD_FOLDER os.path.join(BASE_DIR, testfile)app.route(/) def home():files os.listdir(UPLOAD_FOLDER)return render_t…

如何对maven项目进行打jar包,出现不能打包的情况

若没有正确执行相应的操作,就会出现模块依赖无法找到的情况 Could not find artifact xxx:caro2o-system:pom:3.8.5 in public (https://maven.aliyun.com/repository/public)正确的打包操作 1.将现有的包清空 2.重新下载包 3.为确保数据正确,再次进行打包操作 4.观察控制…

【Python】基于Python和Qt的海康威视相机开发

文章目录 0 前期教程1 前言2 例程解析3 图像获取4 其他问题与解决办法5 使用到的python包 0 前期教程 【项目实践】海康威视工业相机SDK开发小白版入门教程&#xff08;VS2015OpenCV4.5.1&#xff09; 1 前言 此前写了一篇基于C开发海康威视相机的博客&#xff0c;貌似看的人…