Rockchip RK3399 - uboot移植

发布时间 2023-05-07 21:54:35作者: 大奥特曼打小怪兽

----------------------------------------------------------------------------------------------------------------------------
开发板  :NanoPC-T4开发板
eMMC   :16GB
LPDDR3:4GB
显示屏  :15.6英寸HDMI接口显示屏
u-boot    :2014.10
----------------------------------------------------------------------------------------------------------------------------

一、安装交叉编译工具链

NanoPC-T4开发板,主控芯片是Rockchip RK3399,big.LITTLE大小核架构,双Cortex-A72大核(up to 2.0GHz) + 四Cortex-A53小核结构(up to 1.5GHz);Cortex-A72处理器是Armv8-A架构下的一款高性能、低功耗的处理器。

选择交叉编译工具这一步需要慎重,我们首先要知道我们自己使用的开发板采用的ARM架构是哪一个?ARM目前总共发布了8种架构:ARMv1、ARMv2、ARMv3、ARMv4、ARMv5、ARMv6、ARMv7、ARMv8。

确认了ARM架构之后,选择支持该架构的交叉编译环境。可以参考GNU Arm Embedded Toolchain官网中的文档和说明来确定march支持的版本。在ARM官方提供的文档中,可以查看到march选项支持的处理器架构和对应的版本。例如,使用arm-linux-gcc --march=armv8-a命令编译代码时,表示编译针对于Cortex-A53处理器。

1.1 下载

因此我们必须选择一个支持Armv8-A架构的交叉编译工具,编译工具链下载地址http://releases.linaro.org/components/toolchain/binaries/。这里我们直接选择最新版本的交叉编译工具:

然后选择64位架构编译器:

选择在64位主机上运行:

复制下载地址,下载在/work/sambashare/tools/路径:

root@zhengyang:/work/sambashare/tools# wget http://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

1.2. 安装

使用如下命令进行解压:

root@zhengyang:/work/sambashare/tools# tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /

执行该命令,将把arm-linux-gcc 自动安装到/usr/loca/arm/7.5.0 目录。

root@zhengyang:/work/sambashare/tools# cd /usr/local/arm/7.5.0
root@zhengyang:/work/sambashare/tools/usr/local/arm/7.5.0# ll

接下来配置系统环境变量,把交叉编译工具链的路径添加到环境变量PATH中去,这样就可以在任何目录下使用这些工具:

root@zhengyang:/work/sambashare/tools/usr/local/arm/7.5.0# vim /etc/profile

添加如下代码:

 export PATH=$PATH:/usr/local/arm/7.5.0/bin

接下来使用命令:source /etc/profile,使修改后的profile文件生效。

然后,使用命令:arm-none-linux-gnueabi-gcc -v查看当前交叉编译链工具的版本信息,arm-none-linux-gnueabi-gcc和arm-linux-gcc命令意义一样:

二、编译uboot

uboot通常有三种:

  • uboot官方源码:https://github.com/u-boot/u-boot,uboot官方源码是由uboot官方维护,支持非常全面的芯片,但对具体某款开发板支持情况一般;
  • 半导体厂商瑞芯微官方源码:https://github.com/rockchip-linux/u-boot,半导体厂商基于uboot官方源码进行修改,对自家的芯片进行完善的支持,针对某款处理器支持情况较好;
  • 开发板友善之家官方源码:https://github.com/friendlyarm/uboot-rockchip,开发板厂商基于半导体厂商维护的uboot,对自家的开发板进行板级支持,针对某款开发板支持情况较好;

这里我们本着学习的原则,所以这里我们直接选择半导体厂商瑞芯微官方源码维护的uboot。然后后面参考开发板友善之家官方源码修改使其能够支持NanoPC-T4开发板。

2.1 源码下载

我们可以在瑞芯微的github上下载到芯片厂商提供的u-boot源码,如下图所示:

这里我们下载的是release分支的代码:

root@zhengyang:/work/sambashare/rk3399# git clone https://github.com/rockchip-linux/u-boot.git --depth 1 -b release

此外还需要下载rockchip-linux/rkbin到uboot同级目录:

root@zhengyang:/work/sambashare/rk3399# git clone https://github.com/rockchip-linux/rkbin --depth 1 

这里我是下载到/work/sambashare/rk3399路径下的,这个路径后面专门存放与rk3399相关的内容。

进入到u-boot文件夹里,这就是我们需要的uboot的源码了,后面就可以进行二次开发了;

root@zhengyang:/work/sambashare/rk3399/u-boot# cd ..
root@zhengyang:/work/sambashare/rk3399# cd u-boot/
root@zhengyang:/work/sambashare/rk3399/u-boot# ls -l
总用量 488
drwxr-xr-x   2 root root   4096 5月   7 20:00 api
drwxr-xr-x  14 root root   4096 5月   7 20:00 arch
drwxr-xr-x 181 root root   4096 5月   7 20:00 board
drwxr-xr-x   6 root root   4096 5月   7 20:00 cmd
drwxr-xr-x   5 root root   4096 5月   7 20:00 common
-rw-r--r--   1 root root   2260 5月   7 20:00 config.mk
drwxr-xr-x   2 root root  69632 5月   7 20:00 configs
drwxr-xr-x   2 root root   4096 5月   7 20:00 disk
drwxr-xr-x  10 root root  12288 5月   7 20:00 doc
drwxr-xr-x   3 root root   4096 5月   7 20:00 Documentation
drwxr-xr-x  56 root root   4096 5月   7 20:00 drivers
drwxr-xr-x   2 root root   4096 5月   7 20:00 dts
drwxr-xr-x   2 root root   4096 5月   7 20:00 env
drwxr-xr-x   4 root root   4096 5月   7 20:00 examples
drwxr-xr-x  12 root root   4096 5月   7 20:00 fs
drwxr-xr-x  32 root root  16384 5月   7 20:00 include
-rw-r--r--   1 root root   1863 5月   7 20:00 Kbuild
-rw-r--r--   1 root root  14162 5月   7 20:00 Kconfig
drwxr-xr-x  14 root root   4096 5月   7 20:00 lib
drwxr-xr-x   2 root root   4096 5月   7 20:00 Licenses
-rw-r--r--   1 root root  12587 5月   7 20:00 MAINTAINERS
-rw-r--r--   1 root root  56469 5月   7 20:00 Makefile
-rwxr-xr-x   1 root root  19845 5月   7 20:00 make.sh
drwxr-xr-x   2 root root   4096 5月   7 20:00 net
-rwxr-xr-x   1 root root   1640 5月   7 20:00 pack_resource.sh
drwxr-xr-x   5 root root   4096 5月   7 20:00 post
-rw-r--r--   1 root root     34 5月   7 20:00 PREUPLOAD.cfg
-rw-r--r--   1 root root 189024 5月   7 20:00 README
drwxr-xr-x   6 root root   4096 5月   7 20:00 scripts
-rw-r--r--   1 root root     17 5月   7 20:00 snapshot.commit
drwxr-xr-x  12 root root   4096 5月   7 20:00 test
drwxr-xr-x  16 root root   4096 5月   7 20:00 tools

2.2 编译源码

uboot的编译分为两步:配置、编译:

2.2.1 配置

配置选择所要使用的board ,我使用的是rk3399,在./configs目录下有rk3399_defconfig这个文件,因此执行如下命令,生成.config文件:

root@zhengyang:/work/sambashare/rk3399/u-boot# make rk3399_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

这里会在当前路径下生成.config文件,这实际上是一个配置文件。在编译的时候,会根据这个文件生成include/config/auto.conf文件。include/config/auto.conf是由fixdep在编译时生成的依赖文件。

在顶层Makefile会引入auto.conf文件:

ifeq ($(dot-config),1)
# Read in config
-include include/config/auto.conf

这样在执行make编译过程中,就可以根据include/config/auto.conf中的宏的定义编译不同的库文件。

2.2.2 编译

 编译、执行make命令,生成u-boot文件:

root@zhengyang:/work/sambashare/rk3399/u-boot#  make ARCH=arm CROSS_COMPILE=arm-linux-

如果需要输出u-boot反汇编代码,执行时加入-j4参数,会在u-boot根目录下生成u-boot.map文件,在map文件中,包含函数名以及函数所在文件。

make ARCH=arm CROSS_COMPILE=arm-linux- -j4

直接反汇编u-boot文件,可以得到反汇编代码:

arm-linux-objdump -D u-boot > u-boot.dis

CROSS-COPILE是在Makefile文件中定义的变量,是用来指定交叉工具链,ARCH用来指定处理器架构。此外,我们可以在u-boot的顶层Makefile中定义:

CROSS_COMPILE=arm-linux-
ARCH=arm

这样就省去了每次编译都要在控制台输入的麻烦。

编译成功后会生成一个u-boot.bin,可以烧写到开发板上。

2.2.3 简单方式

u-boot文件夹下有个make.sh,它是个编译脚本,该脚本实际上就是做了我们之前说的配置、编译的过程,有兴趣,可以看一下这个shell的源码。

在命令行输入:

root@zhengyang:/work/sambashare/rk3399/u-boot# ./make.sh help

查看具体编译指令,如下图:

root@zhengyang:/work/sambashare/rk3399/u-boot# ./make.sh help

Usage:
        ./make.sh [board|subcmd] [O=<dir>]

         - board: board name of defconfig
         - subcmd: loader|loader-all|trust|uboot|elf|map|sym|<addr>|
         - O=<dir>: assigned output directory

Example:

1. Build board:
        ./make.sh evb-rk3399               --- build for evb-rk3399_defconfig
        ./make.sh evb-rk3399 O=rockdev     --- build for evb-rk3399_defconfig with output dir ./rockdev
        ./make.sh firefly-rk3288           --- build for firefly-rk3288_defconfig
        ./make.sh                          --- build with exist .config

        After build, Images of uboot, loader and trust are all generated.

2. Pack helper:
        ./make.sh trust                    --- pack trust.img
        ./make.sh uboot                    --- pack uboot.img
        ./make.sh loader                   --- pack loader bin
        ./make.sh loader-all               --- pack loader bin (all supported loaders)

3. Debug helper:
        ./make.sh elf                      --- dump elf file with -D(default)
        ./make.sh elf-S                    --- dump elf file with -S
        ./make.sh elf-d                    --- dump elf file with -d
        ./make.sh <no reloc_addr>          --- dump function symbol and code position of address(no relocated)
        ./make.sh <reloc_addr-reloc_off>   --- dump function symbol and code position of address(relocated)
        ./make.sh map                      --- cat u-boot.map
        ./make.sh sym                      --- cat u-boot.sym

修改 make.sh设置交叉编译工具路径:

TOOLCHAIN_ARM32=../gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
TOOLCHAIN_ARM64=../gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin

第一次编译的时候,uboot目录下并没有.config 配置文件,需要指定默认的配置文件。

要编译rk3399,使用的deconfig文件为configs/rk3399_defconfig,则可以直接使用如下命令来编译:

root@zhengyang:/work/sambashare/rk3399/u-boot# ./make.sh rk3399

生成烧录两个镜像文件uboot.img和trust.img。

2.3 u-boot镜像烧写

 

参考文章

[1]RK3399-Linux

[2]rk3399移植 u-boot

[3]Firefly-Rk339 U-Boot 使用

[4]RK3399驱动开发笔记 | 01- 开发环境搭建(编译工具链安装、uboot编译、kernel编译)

[5] uboot官方源码:https://github.com/u-boot/u-boot

[6] 瑞芯微官方源码:https://github.com/rockchip-linux/u-boot

[7] 开发板官方源码:https://github.com/friendlyarm/uboot-rockchip