移植U-Boot思路和实践 | 基于RK3399

  0. 背景介绍

我们手里这块RK3399开发板出厂时带的是2017.09版本的U-Boot。

U-Boot 2017.09 (Sep 26 2021 - 08:53:15 +0000)Model: Forlinx OK3399 Evaluation Board
PreSerial: 2
DRAM:  2 GiB
Sysmem: init
Relocation Offset is: 7dbe9000
Using default environment

在这个基础之上为这块开发板移植一个最新版本的U-Boot,也就是U-Boot 2022.01

1. U-Boot加载方式

U-Boot实质是bootloader,它一肩挑两头,第一是初始化操作系统的运行环境,包括初始化CPU、内存、串口等,第二是加载操作系统镜像文件,通常来说是操作系统内核镜像,但对于U-Boot SPL而言,它还可以加载U-Boot镜像文件。

我们暂且先不关心如何加载操作系统镜像文件,这篇文章的目的是让新版本的U-Boot在这块板子上成功的运行起来。

既然U-Boot是bootloader,那么就不得不了解芯片上电后程序的加载流程。对于RK3399而言,关于它的启动方式请看前文:

CPU上电后加载程序的流程 | 基于RK3399

RK3399提供了外部bootloader加载的路线图,如下图示:

9b757d463ce87f6030d9f607f427ebc7.png
启动流程

按照路线图,分两部分介绍,分别是官方固件和TPL/SPL加载U-Boot。

1.1 官方固件加载

流程1是基于RK官方部件ddr.bin和miniloader.bin来实现的,这两个文件可以从RK github上获取。

git@github.com:rockchip-linux/rkbin.git

这个仓库除了包含以上两个文件之外,还包括流程2中提到的bl31.elf文件。

6c7d1fcdd45b2629eb45ceb9f256b925.png
RK官方固件

使用mkimage将官方的ddr.bin和rkxx.bin打包成Bootrom程序可识别的、带有ID Block header的文件idbloader.img。

tools/mkimage -n rkxxxx -T rksd -d rkxx_ddr_vx.xx.bin idbloader.img
cat rkxx_miniloader_vx.xx.bin >> idbloader.img

idbloader.img打包完成之后,由其中的rkxx_miniloader_xxx.bin加载u-boot.img文件。

另外,基于流程1的启动方式,还需要再生成trust.img,由rkxx_miniloader_xxx.bin负责加载。

流程1这种启动方式毕竟是基于官方固件的,不能对代码进行修改,看不见摸不到,所以不建议采用这种方式生成idbloader.img。

1.2 TPL/SPL加载

在启动流程2中,我们可以基于U-Boot编译出TPL/SPL,其中TPL负责实现DDR初始化,TPL初始化结束之后会回跳到bootrom程序,bootrom程序继续加载SPL,由SPL加载u-boot.itb文件。

通过以下命令将TPL/SPL打包成idbloader.img。

tools/mkimage -n rkxxxx -T rksd -d tpl/u-boot-tpl.bin idbloader.img
cat spl/u-boot-spl.bin >> idbloader.img

建议使用流程2的方式加载U-Boot.img,因为,可以基于U-Boot源码编译出TPL/SPL,然后自主修改各种配置。

2. U-Boot包

从RK3399启动流程图中我们能看到,U-Boot包里面除了u-boot.dtb和u-boot-nodtb.bin这两个U-Boot源码编译出来的文件之外,还包含了bl31.elf、bl32.bin、tee.bin等ARM trust固件。其中bl31.elf是必须要有的,bl32.bin、tee.bin是可选的,可以没有。

在使用TrustZone技术的嵌入式设备当中,无法避免的需要解决从非安全侧切换到安全侧的问题,而为了完成这个切换,需要一个专用的进行非安全上下文和安全上下文切换的固件,这个固件一般我们称为arm trust firmware,在ARM官方维护的github中我们能够下载到其完整的代码。

https://github.com/ARM-software/arm-trusted-firmware

当然RK官方也提供了bl31.elf文件,这样省去了我们编译bl31.elf的时间和精力。可以在Rockchip官方github下载

https://github.com/rockchip-linux/rkbin/tree/master/bin/rk33

基于以上的分析,整理出所需要的文件:

idbloader.img <--------U-Boot TPL/SPL
u-boot.itb <-----------U-Boot 和 bl31.elf

3.移植U-Boot

- step1

获取U-Boot源码,如下:

git clone https://gitlab.denx.de/u-boot/u-boot.git

获取到的U-Boot源码版本是2022.01。

# SPDX-License-Identifier: GPL-2.0+VERSION = 2022
PATCHLEVEL = 01
SUBLEVEL =
EXTRAVERSION =
NAME =

- step2

准备bl31.elf文件,如下:

git clone git@github.com:rockchip-linux/rkbin.git

进入到u-boot文件夹设置bl31.elf文件的路径。

rk@ubuntu:~/porting/u-boot$ ls ..
rk3399_bl31_v1.35.elf  u-boot
rk@ubuntu:~/porting/u-boot$export BL31=../rk3399_bl31_v1.35.elf

- step3

编译
手头没有这块板子的xxx_defconfig文件,但是从U-Boot源码中查看到很多其他家板子的xxx_defconfig文件。

rk@ubuntu:u-boot$ ls configs/ | grep 3399
evb-rk3399_defconfig
ficus-rk3399_defconfig
firefly-rk3399_defconfig
khadas-edge-captain-rk3399_defconfig
khadas-edge-rk3399_defconfig
khadas-edge-v-rk3399_defconfig
leez-rk3399_defconfig
nanopc-t4-rk3399_defconfig
nanopi-m4-2gb-rk3399_defconfig
nanopi-m4b-rk3399_defconfig
nanopi-m4-rk3399_defconfig
nanopi-neo4-rk3399_defconfig
nanopi-r4s-rk3399_defconfig
orangepi-rk3399_defconfig
pinebook-pro-rk3399_defconfig
puma-rk3399_defconfig
rock960-rk3399_defconfig
rock-pi-4c-rk3399_defconfig
rock-pi-4-rk3399_defconfig
rock-pi-n10-rk3399pro_defconfig
rockpro64-rk3399_defconfig
roc-pc-mezzanine-rk3399_defconfig
roc-pc-rk3399_defconfig
rk@ubuntu:u-boot$

从log记录来看,evb-rk3399_defconfig应该是rk官方提交的,因此,选择这个xxx_defconfig文件作为默认config。

rk@ubuntu:~/porting/u-boot$ git log configs/evb-rk3399_defconfig
...
commit 4473a1c4d648a0567c46333b81533d1030345e12
Author: Yifeng Zhao <yifeng.zhao@rock-chips.com>
Date:   Tue Jun 29 16:24:43 2021 +0800rockchip: config: evb-rk3399: add hs400 and SDMA supportThis enable hs400 and SDMA support for emmc on evb-rk3399.Signed-off-by: Yifeng Zhao <yifeng.zhao@rock-chips.com>Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
...
commit 5c5435093a6c0a6995351b64c6b8b08fe7d6bf59
Author: Kever Yang <kever.yang@rock-chips.com>
Date:   Tue Aug 11 14:47:01 2020 +0800rockchip: config: evb-rk3399: Add rockchip dwmmc supportThis enable support for SD card on evb-rk3399.Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
...

生成默认配置文件,如下:

make evb-rk3399_defconfig

编译U-Boot,交叉编译工具链使用了开发板自带的,它又不是全局环境变量,懒得改了,直接用。当然,大家可以使用自己的交叉编译工具链。

# 交叉编译工具链需要指定
make CROSS_COMPILE=xxxx/aarch64-linux-gnu-

编译结果:

...AR      tpl/fs/built-in.oLD      tpl/u-boot-tplOBJCOPY tpl/u-boot-tpl-nodtb.binCAT     tpl/u-boot-tpl-dtb.binCOPY    tpl/u-boot-tpl.binSYM     tpl/u-boot-tpl.symMKIMAGE u-boot-dtb.img
./"arch/arm/mach-rockchip/make_fit_atf.py" \
arch/arm/dts/rk3399-evb.dtb > u-boot.itsMKIMAGE u-boot.itbMKIMAGE tpl/u-boot-tpl-rockchip.binCAT     idbloader.imgCAT     u-boot-rockchip.bin
rk@ubuntu:~/porting/u-boot$

至此,我们已经获取到了所需的idbloader.imgu-boot.itb两个文件。

- step4

烧录
我手中这块开发板基于emmc启动,按照RK官方要求将idbloader.img烧录到emmc的0x40扇区,u-boot.itb烧录到0x4000扇区。

+--------+----------------+----------+-------------+---------+
| Boot   | Terminology #1 | Actual   | Rockchip    | Image   |
| stage  |                | program  |  Image      | Location|
| number |                | name     |   Name      | (sector)|
+--------+----------------+----------+-------------+---------+
| 2      |  Secondary     | U-Boot   |idbloader.img| 0x40    |
|        |  Program       | TPL/SPL  |             |         |
|        |  Loader (SPL)  |          |             |         |
|        |                |          |             |         |
| 3      |  -             | U-Boot   | u-boot.itb  | 0x4000  | 
|        |                |          | uboot.img   |         | 
+--------+----------------+----------+-------------+---------+

烧录方法有两种,一种是基于RK的官方烧录工具AndroidTool.exe,另外一种是在开发板上直接烧写emmc。

官方AndroidTool.exe是基于recovery模式实现的,如果你的板子带有recovery按键,可以使用这种方式。

06f4f7f43b321b99b8665979d60f614e.png

开发板上直接烧写emmc,可以通过网络或者串口直接将待烧录文件加载到板子中。

[root@rk3399:/]# lrz 
lrz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
Transferring idbloader.img...100%     138 KB     138 KB/sec    00:00:01       0 Errors  
Transferring u-boot.itb...100%     751 KB     150 KB/sec    00:00:05       0 Errors  
[root@rk3399:/]#

烧写,需要注意的是烧写完执行sync操作,否则,可能会烧写失败。

[root@rk3399:/]# dd if=idbloader.img of=/dev/mmcblk2 seek=64
277+1 records in
277+1 records out
142034 bytes (142 kB, 139 KiB) copied, 0.00497 s, 28.6 MB/s
[root@rk3399:/]# 
[root@rk3399:/]# dd if=u-boot.itb of=/dev/mmcblk2 seek=16384
1503+1 records in
1503+1 records out
769952 bytes (770 kB, 752 KiB) copied, 0.0608755 s, 12.6 MB/s
[root@rk3399:/]# sync

- step5

重启开发板,从U-Boot版本和编译的时间戳可以确认,成功加载并执行了新的U-Boot 2022.01:

U-Boot 2022.01-00450-g25711b07ca (Jan 14 2022 - 09:37:38 +0800)SoC: Rockchip rk3399
Reset cause: RST
Model: Rockchip RK3399 Evaluation Board
DRAM:  2 GiB
PMIC:  RK808 
Core:  245 devices, 24 uclasses, devicetree: separate
MMC:   mmc@fe320000: 1, mmc@fe330000: 0
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Model: Rockchip RK3399 Evaluation Board
Net:   eth0: ethernet@fe300000
Hit any key to stop autoboot:  0 
......

最后要说的是,我敢这么胡乱搞开发板的固件,并不担心它会成为一块砖头,因为,有Maskrom模式可以将它恢复出厂设置。

5d71dfb8c47ec58d6ea140486265145d.png
Maskrom模式

另外,移植的U-Boot是基于evb-rk3399_defconfig生成的配置文件,后面基于此进行其他修改。

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

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

相关文章

一起谈.NET技术,WPF 基础到企业应用系列5——WPF千年轮回2

一&#xff0c;摘要 首先很高兴这个系列能得到大家的关注和支持&#xff0c;前端时间身体状况不适&#xff0c;所以暂停了更新&#xff0c;对此表示非常抱歉&#xff0c;以后会逐渐加快进度&#xff0c;不过由于这是一个很长的系列&#xff0c;我也想把它写好&#xff0c;所以以…

手把手教你|拦截系统调用

一、什么是系统调用系统调用 是内核提供给应用程序使用的功能函数&#xff0c;由于应用程序一般运行在 用户态&#xff0c;处于用户态的进程有诸多限制&#xff08;如不能进行 I/O 操作&#xff09;&#xff0c;所以有些功能必须由内核代劳完成。而内核就是通过向应用层提供 系…

mysql修改列明sql语句_SqlServer修改表名、修改列名T-SQL语句

前面介绍了SQL基本用法《MSSQL数据库常见操作 SQL语句》,但是没有介绍sql修改表的相关操作,本篇文章将介绍T-SQL修改表的相关操作。1。修改表名:execute sp_rename department.mgrig ,mgrid;详述:EXEC sp_rename 表名.[原列名], 新列名, columnTransact-SQL参考sp_rename----…

公司年会

没有抽奖的年会肯定是不完美的。有抽奖没有饭局的年会也是很香的。因为疫情&#xff0c;我们没有年终饭局&#xff0c;我也不知道过去那些年腾讯是怎么开年会的&#xff0c;不过今年&#xff0c;我觉得挺不错。上周我们搞了年终活动&#xff0c;我那时候还在开会&#xff0c;CG…

给年薪不到48w的程序员提个醒!!

近日&#xff0c;一程序员在脉脉自曝“年薪37W带12人团队&#xff0c;因学历内推腾讯被拒”&#xff0c;引发争议。末流院校&#xff0c;带12人前端团队&#xff0c;到手37w股票20w&#xff0c;过硬的编程技术让他觉得可以出去“闯闯”&#xff1b;内推到腾讯&#xff0c;电话里…

实验二 网络嗅探与欺骗

实验二 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验二 网络嗅探与欺骗 学生姓名 张昊 年级 2015 区队 三 指导教师 高见 信息技术与网络安全学院 2018年9月25日 实验任务总纲 2018—20179学年 第 一 学期 一、实验目…

年终奖

我一个人走在路上&#xff0c;想说点什么&#xff0c;我觉得很难受&#xff0c;去年这个时候我一个高中同学跟我聊天&#xff0c;他跟我说「我听说你们在深圳做程序员的工资很高&#xff0c;我认识的一个朋友在深圳一个月2万多&#xff0c;年终奖发了十几万」。我想&#xff0c…

Spring AOP 五大通知类型

1.前置通知 在目标方法执行之前执行执行的通知。 前置通知方法&#xff0c;可以没有参数&#xff0c;也可以额外接收一个JoinPoint&#xff0c;Spring会自动将该对象传入&#xff0c;代表当前的连接点&#xff0c;通过该对象可以获取目标对象 和 目标方法相关的信息。 注意&…

转载CSDN博文精选:Android系列开发博客资源汇总

CSDN博客本期热文推荐&#xff0c;为您介绍有关Android应用开发的10个博客&#xff0c;分享他们的日积月累的宝贵经验&#xff0c;希望这些文章对Android开发者们能有所启发和帮助。 [1] 张国威&#xff1a;Android从入门到提高系列 前面写了十四篇关于界面的入门文章&#xff…

简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; …

Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发

前言本教程适用于以下两种用户&#xff1a;①无Linux环境搭建经验或搭建Linux开发环境不成功&#xff1b;②使用安信可windows一体化环境IDE V1.5开发环境搭建不成功&#xff1b;本教程提供了windows下搭建 ESP-IDF 开发环境的方法。适用系统&#xff1a;Windows 10 64 位版本、…

Lync Server 2010的部署系列_第六章 安装配置拓扑生成器、前端Server、前端池

一、安装 Lync Server 2010 管理工具&#xff08;包括拓扑生成器&#xff09; 1) 登录Front.Gianthard.com&#xff08;192.168.1.21&#xff09;。在“Microsoft Lync Server 2010 - 部署向导”页上&#xff0c;单击“安装拓扑生成器”。 2) 进行SQL方面的客户端。 3) 安装成功…

被 HR 直接怼:估计你一辈子就是个程序员

今天看到一个非常扯蛋的事情。事情来自网络&#xff0c;不是作者本人。我一直认为程序员是可以做一辈子的事情&#xff0c;程序员是一种做得越久技术越熟练的工作。但是有的人并不这样认为。---有程序员因为能力很强&#xff0c;公司非常满意&#xff0c;结果派了一位 HR 与其谈…

一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案

通过好友CallHot介绍Lodopweb打印控件。由于是国人开发的&#xff0c;故这两天认真了研究下&#xff0c;打算在未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方&#xff0c;希望您指出。 具体的实现步骤如下&#xff1a; 一、准备工作 1.MVC2.0 jQuery1.4.1 开…

(转)python调取C/C++的dll生成方法

本文针对Windows平台下&#xff0c;python调取C/C的dll文件。 1.如果使用C语言&#xff0c;代码如下&#xff0c;文件名为test.c。 __declspec(dllexport) int sum(int a,int b) {return (a b); } 如果使用C语言&#xff0c;代码如下&#xff0c;文件名为test_cpp.cpp。在Wind…

生产者-消费者模式

生产者/消费者问题的多种Java实现方式 实质上&#xff0c;很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式&#xff0c;而这是恰恰是在本科操作系统课堂上老师反复讲解&#xff0c;而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用…

周末,说下我喜欢的篮球

我应该有很久没有看NBA比赛了&#xff0c;没有其他原因&#xff0c;确实是因为工作太忙了&#xff0c;即使是在带薪上厕所&#xff0c;也没有足够的时间看下NBA比赛。如果说忙是一个比较好的托词&#xff0c;那还有一个原因&#xff0c;我现在更多的喜欢野球圈的新闻。刚毕业那…

没有串口,如何打印单片机调试信息?

输出调试信息是嵌入式开发中必不可少的调试利器&#xff0c;嵌入式开发的一个特点是很多时候没有操作系统&#xff0c;或者没有文件系统&#xff0c;常规的打印log到文件的方法基本不适用。最常用的是通过串口输出uart log&#xff0c;例如51单片机&#xff0c;只要实现串口驱动…

Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数

1. 前言 很多朋友在调试驱动的时候&#xff0c;都会遇到这样一个场景&#xff1a;修改一个参数&#xff0c;然后调用某个内核中的函数。比如将某个gpio的值拉高/拉低&#xff0c;修改某个寄存器的值等等。如果每一个参数都通过字符设备的ioctl接口&#xff0c;增加对应的cmd&am…

myeclipse运行java项目_myeclipse运行自己从前的或其他人的javaweb项目

1.配置javaweb 连接部署好本地的tomcat服务器方法如下&#xff1a;1.运行Myecipse-->Window-->preference2.MyEclipse-->Servers-->Runtime Environments-->add-->Apache Tomcat v8.03.next->Browser(Tomcat的安装目录)-->finishMyeclipse 设置jdk版本…