RK3399移植u-boot


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文件即可。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45682654/article/details/131881797