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文件即可。