RK3568学习笔记3: RK3568 SDK编译

Dr.Guo
发布于 2024-01-12 / 404 阅读
0
0

RK3568学习笔记3: RK3568 SDK编译

1. 概述及准备

1.1 概述

Linux SDK支持buildroot、Yocto以及Debian三种根文件系统,Linux内核版本为4.19、U-Boot版本为2017.09。

1.2 准备工作

  1. 安装基础包
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
  1. 安装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
  1. Git配置
git config --global user.name "your name" 
git config --global user.email "your email"

配置完成后,通过以下指令查看配置结果

git config --list

1.3 安装SDK

  1. 拷贝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)

  1. 解压
mkdir ~/rk3568_linux_sdk 
tar xvf atk-rk3568_linux_release_v1.0_20230901.tgz -C ~/rk3568_linux_sdk
  1. 将python3.8设为默认python
sudo rm -rf /usr/bin/python 
sudo ln -s /usr/bin/python3 /usr/bin/python

注意:正点原子的官方说明文档是将python2设置为默认python,但在检出源代码过程中会出现语法错误【该语法为python3 语言】, 所以应该使用python3.8

  1. 检出源代码
cd ~/rk3568_linux_sdk/ 
.repo/repo/repo sync -l -j10
  1. 配置好之后,rk3568_linux_sdk文件夹内容如图所示

  1. 拷贝第三方库文件

在编译根文件系统的过程中会通过网络下载很多的第三方库文件 ;首先下载过程会占用很多时间导致编译时间拉长;其次,如果用户的网络环境不稳定或者第三方库文件的下载源发生变更,很容易导致下载失败 ,进而导致根文件系统编译出错;所以,为了加快根文件系统的编译过程、也为了 降低 编译根文件系统 时出现问题的概率, 我们可以预先把编译根文件系统所需的第三方库文件拷贝到 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层主要 是 实现具体的产品功能及交互逻辑,需要一些系统基础库及第三方程序库支持,开发者可以开发实现自己的应用程序,提供系统各种能力给到最终用户。

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 编译结果

  1. 打包SDK到rockdev文件夹中
./build.sh firmware
  1. 打包update.img
./build.sh updateimg

这样,在rockdev文件夹生成update.img文件

编译后各个镜像如下表

名称作用
uboot.imguboot.img是一种 FIT格式镜像,它 由多个镜像合并而成, 其中 包括trust镜像( ARM Trusted Firmware + OP-TEE OS 、 u-boot镜像、 u-boot dtb 编译 U-Boot时会将 这些镜像打包成 一个uboot.img。uboot.img会烧录到开发板 uboot分区
boot.imgboot.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.imgrecovery模式 镜像, 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 编译问题解决

  1. Linux系统 内存不足,问题如下图

解决方法:增加内存,一般来说,基于WSL的虚拟机不会遇到这个问题【前提是我们的win11电脑内存8个G以上】

  1. 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. 镜像部署

  1. 打开windows 瑞芯微开发工具

右击列表中空白之处,选择导入配置菜单,选择config.cfg文件。

  1. 板子进入loader模式,与电脑连接的USB需要插入OTG端口,按住开发板 V+按键,然后开发板上电或复位,即可进入Loader模式

  2. 瑞芯微开发工具会显示“发现一个LOADDER”设备

  3. 点击升级固件Tab标签,选择固件编译好的update.img,点击升级即可。完成

6. 清理SDK

./build.sh cleanall

评论