1. 概述及准备
1.1 概述
Linux SDK支持buildroot、Yocto以及Debian三种根文件系统,Linux内核版本为4.19、U-Boot版本为2017.09。
1.2 准备工作
- 安装基础包
sudo apt-get update
sudo apt-get install curl python2.7 python-pyelftools git ssh make gcc libssl-dev liblz4-tool expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib unzip device-tree-compiler python3-pip libncurses-dev python3-pyelftools vim mtd-utils
- 安装repo
repo是建立在 Git上的一个多仓库管理工具,可以组织多个仓库的上传和下载, 用于 管理多个 Git存储仓库。 RK3568 Linux SDK中 代码和相关文档被划分成了若干 个 git仓库分别进行版本管理 SDK包含了若干个 git仓库) ),开发者可以使用 repo工具 对这些 git仓库进行统一下载、提交、切换分支等操作。
mkdir ~/bin
export PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo
- Git配置
git config --global user.name "your name"
git config --global user.email "your email"
配置完成后,通过以下指令查看配置结果
git config --list
1.3 安装SDK
- 拷贝SDK文件
下载【正点原子】RK3568开发板资料(B盘)-开发环境及SDK后,打开 02、ATK-DLRK3568开发板SDK 中的 linux_sdk,在windows中先解压 01、linux_sdk.zip ,解压后有两个文件:
- atk-rk3568_linux_release_v1.1_20230901.tgz
- dl.tgz
先将atk-rk3568_linux_release_v1.1_20230901.tgz 拷贝到 \wsl.localhost\Ubuntu-20.04\home{你的linux用户名}文件夹中。如下图所示。
![https://file.spartajet.com/202401112000544.png(https://file.spartajet.com/202401112000544.png)
- 解压
mkdir ~/rk3568_linux_sdk
tar xvf atk-rk3568_linux_release_v1.0_20230901.tgz -C ~/rk3568_linux_sdk
- 将python3.8设为默认python
sudo rm -rf /usr/bin/python
sudo ln -s /usr/bin/python3 /usr/bin/python
注意:正点原子的官方说明文档是将python2设置为默认python,但在检出源代码过程中会出现语法错误【该语法为python3 语言】, 所以应该使用python3.8
- 检出源代码
cd ~/rk3568_linux_sdk/
.repo/repo/repo sync -l -j10
- 配置好之后,rk3568_linux_sdk文件夹内容如图所示
- 拷贝第三方库文件
在编译根文件系统的过程中会通过网络下载很多的第三方库文件 ;首先下载过程会占用很多时间导致编译时间拉长;其次,如果用户的网络环境不稳定或者第三方库文件的下载源发生变更,很容易导致下载失败 ,进而导致根文件系统编译出错;所以,为了加快根文件系统的编译过程、也为了 降低 编译根文件系统 时出现问题的概率, 我们可以预先把编译根文件系统所需的第三方库文件拷贝到 SDK中。
将步骤a中下载 dl.tgz文件拷贝到\wsl.localhost\Ubuntu-20.04\home{你的linux用户名}中, 然后运行解压指令。
cd ~
tar -xzf dl.tgz -C ~/rk3568_linux_sdk/buildroot/
解压后就会在~/rk3568_linux_sdk/buildroot/dl/中看到第三方源码了。
2. SDK介绍
2.1 简介
SDK源码根 目录下 包含 有 app、 buildroot、 debian、 device、 external、 tools、 u-boot、 yocto等 多个 目录 每个目录或其子目录会对应一个 git工程 ;因为 SDK的代码和相关文档被划分成了若干 git仓库分别进行版本管理( 所以 SDK实际上 包含 有 若干 git仓库) ),它们按照功能、所属模块划分
2.2 SDK 目录
⚫ app:存放上层应用 app 包括 Qt应用程序,以及其它的 C/C++应用程序。
⚫ buildroot:基于 buildroot开发的根文件系统。
⚫ debian:基于 Debian开发的根文件系统。
⚫ device/rockchip 存放各芯片板级配置 文件 和 Parameter分区表 文件,以及一些编译与
打包固件的脚本和预备文件 。
⚫ docs:存放芯片模块开发指导文档、平台支持列表、芯片平台相关文档、 Linux开发指
南等。
⚫ external:存放 所需 的 第三方库 ,包括音频、视频、网络、 recovery等。
⚫ kernel Linux 4.19版本内核源码。
⚫ prebuilts:存放交叉编译工具链。
⚫ rkbin:存放 Rockchip相关的 Binary和工具。
⚫ rockdev:存放编译输出固件 ,编译 SDK后才会生成该文件夹 。
⚫ tools:存放 Linux和 Windows操作系统环境下常用 的 工具,包括镜像烧录工具、 SD卡
升级启动制作工具 、批量烧录工具等 ,譬如前面给大家介绍的 RKDevTool工具以及
Linux_Upgrade_Tool工具 都存放在该目录 。
⚫ u-boot:基于 v2017.09版本进行开发的 uboot源码。
⚫ yocto:基于 Yocto开发 的 根文件系统。
2.3 SDK框图
从下至上 分为 Bootloader、 Linux Kernel、 Libraries、 Ap-plications四个层次,各层次内容如下:
- BootLoader层主要提供底层系统支持包,如 BootLoader、 U-Boot、 ATF相关支持。
- Kernel层主要提供 Linux Kernel的标准实现, Linux也是一个开放的操作系统 。 Rockchip平台的 Linux核心 为标准的 Linux4.4/4.19/5.10内核,提供安全性、内存管理、进程管理、网络协议栈等基础支持;主要是通过 Linux内核管理设备硬件资源,如 CPU调度、缓存、内存、 I/O等。
- ibraries层对应一般嵌入式系统,相当于中间件层次,包含了各种系统基础库,以及第
三方开源程序库支持,对应用层提供 API接口,系统定制者和应用开发者可以基于Libraries层的 API开发新的应用。 - Applications层主要 是 实现具体的产品功能及交互逻辑,需要一些系统基础库及第三方程序库支持,开发者可以开发实现自己的应用程序,提供系统各种能力给到最终用户。
- ibraries层对应一般嵌入式系统,相当于中间件层次,包含了各种系统基础库,以及第
2.4 SDK版本查询
realpath .repo/manifests/rk3568_linux_release.xml
ls .repo/manifests/rk356x_linux/rk356x_linux_release*
3. Linux SDK编译
3.1 配置板级配置文件
执行编译指令
cd ~/rk3568_linux_sdk/
./build.sh lunch
这时,会让选择配置文件,选择第3个,BoardConfig-rk3568-atk-evb1-ddr4-v10.mk
build.sh 指令详情可以通过./build.sh -h
查询。具体如下:
./build.sh -h
使用如下
Usage: build.sh [OPTIONS]
Available options:
BoardConfig*.mk -switch to specified board config
lunch -list current SDK boards and switch to specified board config
uboot -build uboot
uefi -build uefi
spl -build spl
loader -build loader
kernel -build kernel
modules -build kernel modules
toolchain -build toolchain
rootfs -build default rootfs, currently build buildroot as default
buildroot -build buildroot rootfs
ramboot -build ramboot image
multi-npu_boot -build boot image for multi-npu board
yocto -build yocto rootfs
debian -build debian rootfs
pcba -build pcba
recovery -build recovery
all -build uboot, kernel, rootfs, recovery image
cleanall -clean uboot, kernel, rootfs, recovery
firmware -pack all the image we need to boot up system
updateimg -pack update image
otapackage -pack ab update otapackage image (update_ota.img)
sdpackage -pack update sdcard package image (update_sdcard.img)
save -save images, patches, commands used to debug
allsave -build all & firmware & updateimg & save
check -check the environment of building
info -see the current board building information
app/<pkg> -build packages in the dir of app/*
external/<pkg> -build packages in the dir of external/*
createkeys -create secureboot root keys
security_rootfs -build rootfs and some relevant images with security paramter (just for dm-v)
security_boot -build boot with security paramter
security_uboot -build uboot with security paramter
security_recovery -build recovery with security paramter
security_check -check security paramter if it's good
Default option is 'allsave'.
3.2 编译Linux
执行以下命令进行SDK全编译
./build.sh all
接下来就是漫长的编译过程,编译结束后会出现以下输出
3.3 编译结果
- 打包SDK到rockdev文件夹中
./build.sh firmware
- 打包update.img
./build.sh updateimg
这样,在rockdev文件夹生成update.img文件
编译后各个镜像如下表
名称 | 作用 |
---|---|
uboot.img | uboot.img是一种 FIT格式镜像,它 由多个镜像合并而成, 其中 包括trust镜像( ARM Trusted Firmware + OP-TEE OS 、 u-boot镜像、 u-boot dtb 编译 U-Boot时会将 这些镜像打包成 一个uboot.img。uboot.img会烧录到开发板 uboot分区 |
boot.img | boot.img也是一种 FIT格式镜像, 它也是由多个镜像合并而成, 其中包括 内核镜像 、 内核 DTB、 资源镜像 resource.img。boot.img会烧录到开发板 boot分区 |
MiniLoaderAll.bin | 该镜像是运行在 RK3568平台 U-Boot之前 的一段 Loader代码(也就是比 U-Boot更早阶段的 Loader MiniLoaderAll.bin由 TPL和 SPL两部分组成TPL用于初始化 DDR,运行在 SRAM 而 SPL运行在DDR,主要负责 加载 、 引导 uboot.img。 |
misc.img | 包含BCB Bootloader Control Block 信息 ,该镜像会烧写到 开发板misc分区。misc分区是一个很重要的分区,其中存放了 BCB数据块,主要用于Android/Linux系统 、 U-Boot以及 recovery之间的通信 |
oem.img | 给厂家使用,用于存放厂家的APP或数据,该镜像会烧写至开发板oem分区,系统启动之后会 将其 挂载到 /oem目录。 |
parameter.txt | 一个txt文本文件,是 RK3568平台的分区表 文件 (记录分区名以及每个分区它的起始地址、结束地址);烧写镜像时,并不需要将parameter.txt文件 烧写 到 Flash 而是 会读取它的信息去定义分区。 |
recovery.img | recovery模式 镜像, recovery.img用于进入 recovery模式 recovery.img会烧录到开发板 recovery分区 。recovery模式是一种用于对设备进行修复、升级更新的模式 。 recovery.img也是 FIT格式 镜像 也是由多个镜像合并而成,其中包括ramdisk(进入 recovery模式时 挂载 该 根文件系统 、内核镜像 (进入recovery模式时启动该内核镜像) 、 内核 DTB以及 resource.img。 |
rootfs.img | 正常启动模式下对应的根文件系统镜像, 包含有大量的库文件、可执行文件等 |
userdata.img | 给用户使用,可用于存放用户的App或数据; 该镜像会烧写至开发板 userdata分区,系统启动之后, 会 将其挂载到 /userdata目录 |
3.4 选择第三方包
buildroot帮我们预置了N多有用的第三方库,我们可以根据自己的需求选择要打包的第三方库,具体做法执行以下指令:
cd rk3568_linux_sdk/buildroot/
make menuconfig
然后会出现图形化配置窗口
选择 Target Packages,就可以选择和删除第三方包了,完成后 保存。
继续运行编译指令即可
./build.sh
3.5 编译问题解决
-
Linux系统 内存不足,问题如下图
解决方法:增加内存,一般来说,基于WSL的虚拟机不会遇到这个问题【前提是我们的win11电脑内存8个G以上】
-
Python语法问题,如下图所示
解决方法:修改对应代码,改为python3语法
修改 kernel/scripts/mkmultidtb.py 中的39行为
python(__doc__)
保存后重新运行编译代码。
还有个别需要修改 的地方,自行修改即可。
4. Debian SDK编译
Debian SDK需要在buildroot的基础上编译,所以要先按照第2部分的指导编译Buildroot镜像
4.1 安装qemu
cd debian
sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f
4.2 编译Debian
./build.sh debian
5. 镜像部署
-
打开windows 瑞芯微开发工具
右击列表中空白之处,选择导入配置菜单,选择config.cfg文件。
-
板子进入loader模式,与电脑连接的USB需要插入OTG端口,按住开发板 V+按键,然后开发板上电或复位,即可进入Loader模式
-
瑞芯微开发工具会显示“发现一个LOADDER”设备
-
点击升级固件Tab标签,选择固件编译好的update.img,点击升级即可。完成
6. 清理SDK
./build.sh cleanall