2. 系统开发¶
2.1. 1. Android SDK¶
2.1.1. (1). 编译环境搭建¶
2.1.1.1. A. 准备工作¶
编译 Android 对机器的配置要求较高:
64 位 CPU
16GB 物理内存+交换内存
250GB 空闲的磁盘空间
建议使用 Ubuntu 18.04 操作系统或更高版本
Ubuntu 16.04 或 18.04 软件包安装参考:
sudo apt-get update
sudo apt-get install git gnupg flex bison gperf libsdl1.2-dev \
libesd-java libwxgtk3.0-dev squashfs-tools build-essential zip curl \
libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \
xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \
lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip zip device-tree-compiler \
liblz4-tool python-pyelftools python3-pyelftools -y
2.1.1.2. B. 编译FAQ¶
由于每个人的PC系统版本和环境配置不一样,安装软件包后编译并不一定都会成功,可能会出现缺少某些软件包而引起的错误,如:
2.1.1.2.1. Q1¶
OBJCOPY spl/u-boot-spl-nodtb.bin
CAT spl/u-boot-spl-dtb.bin
COPY spl/u-boot-spl.bin
CFGCHK u-boot.cfg
ERROR: No 'dtc', please: apt-get install device-tree-compiler
此时视报错信息去安装缺少的软件包(dtc)即可
2.1.1.2.2. Q2¶
如果Kernel编译报lz4
的错误:
LZ4C arch/arm64/boot/Image.lz4
Incorrect parameters
Usage :
lz4 [arg] [input] [output]
input : a filename
with no FILE, or when FILE is - or stdin, read standard input
Arguments :
-1 : Fast compression (default)
-9 : High compression
-d : decompression (default for .lz4 extension)
-z : force compression
-f : overwrite output without prompting
-h/-H : display help/long help and exit
arch/arm64/boot/Makefile:31: recipe for target 'arch/arm64/boot/Image.lz4' failed
可以先编译Android下面的lz4
并替换系统的lz4
mmm external/lz4/
sudo cp /usr/bin/lz4 /usr/bin/lz4.org # 备份
sudo cp out/host/linux-x86/bin/lz4 /usr/bin/lz4 # 替换系统原有lz4
如果编译出现这种情况:
error: external/crosvm/rutabaga_gfx/Android.bp:91:1: "rutabaga_gfx_host_test_src_lib" depends on undefined module "libgfxstream_backend"
error: external/crosvm/rutabaga_gfx/Android.bp:13:1: "librutabaga_gfx" depends on undefined module "libgfxstream_backend"
那是因为需要先编译一次 Android 上层才可以,或者也可以直接从以下链接下载 lz4 到系统中,直接进行替换。
sudo cp /usr/bin/lz4 /usr/bin/lz4.org # 备份
sudo cp lz4 /usr/bin/lz4
2.1.2. (2). Android10.0 SDK¶
2.1.2.1. A. 下载 Android10.0 SDK¶
核心板 Core-3399-JD4 支持 Android10.0
由于 SDK 较大,可以去下载页面选择云盘下载 Firefly-RK3399_Android10.0_git_20210114.7z:
下载完成后,在解压前先校验下 MD5 码:
$ md5sum /path/to/Firefly-RK3399_Android10.0_git_20210114.7z.001
$ md5sum /path/to/Firefly-RK3399_Android10.0_git_20210114.7z.002
10bf3ca46fa629f1965c5c9c8608db7e Firefly-RK3399_Android10.0_git_20210114.7z.001
bd4c36fe268420bf6efe1a2617ab6b8b Firefly-RK3399_Android10.0_git_20210114.7z.002
然后解压:
cd ~/proj/
7z x ./Firefly-RK3399_Android10.0_git_20210114.7z.001 -ork3399_Android10.0cd ./rk3399_Android10.0
git reset --hard
注意:解压后务必要先更新下远程仓库。以下为从 gitlab 处更新的方法:
#1. 进入SDK根目录
cd ~/proj/rk3399_Android10.0
#2. 下载远程bundle仓库
git clone https://gitlab.com/TeeFirefly/rk3399-android10.0-bundle.git .bundle
#3. 若下载仓库失败,目前bundle仓库占用空间较大,所以同步的时候可能会出现卡住或失败的问题,
# 可以从下方百度云链接下载并解压到SDK根目录,解压指令如下:
7z x rk3399-android10.0-bundle.7z -r -o. && mv rk3399-android10.0-bundle/ .bundle/
#4. 更新SDK,并且后续更新不需要再次拉取远程仓库,直接执行以下命令即可
.bundle/update
#5. 按照提示已经更新内容到 FETCH_HEAD,同步FETCH_HEAD到firefly分支
git rebase FETCH_HEAD
2.1.2.2. B. 编译方法¶
2.1.2.2.1. a. R2编译方法¶
2.1.2.2.1.1. 脚本自动编译¶
./FFTools/make.sh -d rk3399-firefly-cs-r2 -j8 -l rk3399_firefly_cs_r2-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_cs_r2-userdebug
2.1.2.2.1.2. 手动编译¶
编译前执行如下命令配置环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
编译 kernel:
cd ~/proj/rk3399_Android10.0/kernel/
make ARCH=arm64 firefly_defconfig android-10.config rk3399.config
make ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3399_firefly_cs_r2/boot.img rk3399-firefly-cs-r2.img -j8
注意:若进行内核debug,需要将resource.img和kernel.img打包进去boot.img后对boot分区进行烧写才能生效。
编译 uboot:
cd ~/proj/rk3399_Android10.0/u-boot/
./make.sh rk3399
编译 Android:
cd ~/proj/rk3399_Android10.0/
source FFTools/build.sh
lunch rk3399_firefly_cs_r2-userdebug
make -j8
./mkimage.sh
打包成统一固件 update.img
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:
cd ~/proj/rk3399_Android10.0/
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_cs_r2-userdebug
打包完成后将在rockdev/Image-rk3399_firefly_cs_r2/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img 在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdev\Image 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdev\Image 目录里。
2.1.2.2.2. b. 分区镜像¶
boot.img 包含ramdis、kernel、dtb
dtbo.img Device Tree Overlays
kernel.img includekernel,目前无法单独烧写,需要打包到boot.img内烧写
MiniLoaderAll.bin 包含一级loader
misc.img 包含recovery-wipe开机标识信息,烧写后会进行recovery
odm.img 包含android odm,包含在super.img分区内,单独烧写需要用fastboot烧写
parameter.txt 包含分区信息
pcba_small_misc.img 包含pcba开机标识信息,烧写后会进入简易版pcba模式
pcba_whole_misc.img 包含pcba开机标识信息,烧写后会进入完整版pcba模式
recovery.img 包含recovery-ramdis、kernel、dtb
resource.img 包含dtb,kernel和uboot阶段的log及uboot充电logo,目前无法单独烧写,需要打包到boot.img内烧写
super.img 包含odm、vendor、system分区内容
system.img 包含android system,包含在super.img分区内,单独烧写需要同fastboot烧写
trust.img 包含BL31、BL32
uboot.img 包含uboot固件
vbmeta.img 包含avb校验信息,用于AVB校验
vendor.img 包含android vendor,包含在super.img分区内,单独烧写需要同fastboot烧写
update.img 包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包
2.1.3. (3). Android12.0 SDK¶
2.1.3.1. A. 下载 Android12.0 SDK¶
核心板 Core-3588SJD4 支持 Android12.0
SDK 源码与 bundle 压缩包均存放在云盘中。SDK通过邮件的方式获取,把订单号发送到sales@t-firefly.com邮箱并注明需要的SDK名称firefly_rk3588_android12.0_git_20220311
下载完成后,在解压前先校验下 MD5 码:
$ md5sum /path/to/firefly_rk3588_android12.0_git_20220311.7z.001
$ md5sum /path/to/firefly_rk3588_android12.0_git_20220311.7z.002
$ md5sum /path/to/firefly_rk3588_android12.0_git_20220311.7z.003
$ md5sum /path/to/firefly_rk3588_android12.0_git_20220311.7z.004
$ md5sum /path/to/firefly_rk3588_android12.0_git_20220311.7z.005
$ md5sum /path/to/firefly_rk3588_android12.0_git_20220311.7z.006
8f48ca82f247426d0a7111b851d65f0f firefly_rk3588_android12.0_git_20220311.7z.001
e99d68485860b86c2ec5b67aeda7249d firefly_rk3588_android12.0_git_20220311.7z.002
cb45fc9e39848b459398467c08acd6f1 firefly_rk3588_android12.0_git_20220311.7z.003
7774a64cc73dbf4381c100ad1d703fa9 firefly_rk3588_android12.0_git_20220311.7z.004
cd53c8c752a5162a0638da1cf9a0ed8f firefly_rk3588_android12.0_git_20220311.7z.005
fd7744c8098791a8f1dd62527fcac32c firefly_rk3588_android12.0_git_20220311.7z.006
然后解压
cd ~/proj/
7z x ./firefly_rk3588_android12.0_git_20220311.7z.001 -oRK3588_Android12.0
cd ./RK3588_Android12.0
git reset --hard
注意:不要在共享文件夹、挂载文件夹以及非英文目录解压SDK,避免产生不必要的错误
下载 SDK 后,从 gitlab 处更新代码的方法:
#1. 进入 SDK 根目录
cd ~/proj/RK3588_Android12.0
#2. 下载远程 bundle 仓库
git clone https://gitlab.com/T-Firefly/rk3588-android12.0-bundle.git .bundle
#3. bundle仓库会随着更新的资源越多而会越来越大,如果bundle仓库下载速度缓慢或若下载失败,
# 请在资源下载界面选择对应的机器bundle文件进行下载并解压到SDK根目录,解压指令如下:
7z x rk3588-android12.0-bundle.7z -r -o. && mv rk3588-android12.0-bundle .bundle
#4. 更新 SDK,并且后续更新不需要再次拉取远程仓库,直接执行以下命令即可
.bundle/update
#5. 按照提示已经更新内容到 FETCH_HEAD,同步 FETCH_HEAD 到 firefly 分支
git rebase FETCH_HEAD
2.1.3.2. B. 编译方法¶
2.1.3.2.1. a. R2编译方法¶
2.1.3.2.1.1. 脚本自动编译¶
./FFTools/make.sh -d rk3588s-firefly-cs-r2 -j8 -l rk3588s_firefly_cs_r2-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3588s_firefly_cs_r2-userdebug
2.1.3.2.1.2. 手动编译¶
编译 kernel:
cd ~/path/to/sdk/kernel-5.10
export PATH=../prebuilts/clang/host/linux-x86/clang-r416183b/bin:$PATH
alias msk='make CROSS_COMPILE=aarch64-linux-gnu- LLVM=1 LLVM_IAS=1'
msk ARCH=arm64 firefly_defconfig android-11.config pcie_wifi.config
msk ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3588s_firefly_cs_r2/boot.img rk3588s-firefly-cs-r2.img -j8
编译 uboot:
cd ~/path/to/sdk/u-boot/
./make.sh rk3588
编译 Android:
cd ~/path/to/sdk/
source build/envsetup.sh
lunch rk3588s_firefly_cs_r2-userdebug
make installclean
make -j8
./mkimage.sh
打包成统一固件 update.img
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:
cd ~/path/to/sdk/
./FFTools/mkupdate/mkupdate.sh -l rk3588s_firefly_cs_r2-userdebug
打包完成后将在rockdev/Image-rk3588s_firefly_cs_r2/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img 在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdev\Image 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdev\Image 目录里。
2.2. 2. Android 系统定制,应用开发¶
2.3. 3. Linux SDK¶
为了方便用户的使用与开发,官方提供了 Linux 开发的整套 SDK,本章详细的说明 SDK 的具体用法。
注意: Linux SDK只适用于集群服务器子板的系统开发。
2.3.1. 3.1 Ubuntu 18.04¶
核心板 Core-3399JD4 支持 Ubuntu 18.04
2.3.1.1. (1). 准备工作¶
2.3.1.1.1. A. 下载 Firefly_Linux_SDK 分卷压缩包¶
由于 Firefly_Linux_SDK 源码包比较大,部分用户电脑不支持4G以上文件或单个文件网络传输较慢, 所以我们采用分卷压缩的方法来打包SDK。用户可以通过如下方式获取 Firefly_Linux_SDK源码包:Firefly_Linux_SDK源码包
下载完成后先验证一下 MD5 码:
$ md5sum rk3399_linux_release_v2.5.1_20210301_split_dir/*firefly_split*
2cf71e64d35eb8083a4a0fc30c256484 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file0
f0e9292b3816a8f1ce0eb1eeb483ad56 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file1
c6aaa5d761d0e7917bea1cb78a0e7229 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file2
16022cc729d06a28fec30ac52885d91c rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file3
565426354c01d56c7d48479dd7f3c35b rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file4
313d311f1705fbfb7bfc45b7937ecf24 rk3399_linux_release_v2.5.1_20210301_split_dir/rk3399_linux_release_v2.5.1_20210301_firefly_split.file5
2.3.1.1.2. 解压 Firefly_Linux_SDK 分卷压缩包¶
确认无误后,就可以解压:
cat rk3399_linux_release_v2.5.1_20210301_split_dir/*firefly_split* | tar -xzv
#本SDK文件夹内包含一个 .repo 目录,解压之后,在当前目录下执行以下操作
cd rk3399_linux_release_v2.5.1_20210301
ls -al
.repo/repo/repo sync -l
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all
2.3.1.2. (2). Linux_SDK 目录介绍¶
目录:
── linux_sdk
├── app
├── buildroot buildroot 根文件系统的编译目录
├── build.sh -> device/rockchip/common/build.sh 全自动编译脚本
├── device 编译相关配置文件
├── distro debian 根文件系统生成目录
├── docs 文档
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel 内核
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh rockdev链接更新脚本
├── prebuilts
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh 烧写脚本
├── rootfs debian根文件系统编译目录
├── tools 烧写、打包工具
└── u-boot
2.3.1.3. (3). 搭建 SDK 编译环境¶
Ubuntu 固件:(根文件系统请使用官方提供的根文件系统镜像)
sudo apt-get update
sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler \
gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools \
linaro-image-tools gcc-arm-linux-gnueabihf libssl-dev liblz4-tool genext2fs lib32stdc++6 \
gcc-aarch64-linux-gnu g+conf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make \
binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file bc wget \
libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-client \
subversion asciidoc w3m dblatex graphviz python-matplotlib libc6:i386 libssl-dev texinfo fakeroot \
libparse-yapp-perl default-jre patchutils
注意: Ubuntu17.04 或者更高的系统还需要如下依赖包:
sudo apt-get install lib32gcc-7-dev g++-7 libstdc++-7-dev
2.3.1.4. (4). 编译 SDK¶
编译前配置
配置文件 CS-R2-3399-jd4-sub-ubuntu.mk:
./build.sh CS-R2-3399-jd4-sub-ubuntu.mk
文件路径在 device/rockchip/rk3399/
如果配置文件生效会连接到 device/rockchip/.BoardConfig.mk ,检查该文件可以验证是否配置成功
#!/bin/bash
CMD=`realpath $BASH_SOURCE`
CUR_DIR=`dirname $CMD`
source $CUR_DIR/BoardConfig.mk
# Uboot defconfig
export RK_UBOOT_DEFCONFIG=firefly-rk3399
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=firefly_linux_defconfig
# Kernel dts
export RK_KERNEL_DTS=rk3399-firefly
# parameter for GPT table
export RK_PARAMETER=parameter-ubuntu.txt
# packagefile for make update image
export RK_PACKAGE_FILE=rk3399-ubuntu-package-file
# Set rootfs type, including ext2 ext4 squashfs
export RK_ROOTFS_TYPE=ext4
# rootfs image path
export RK_ROOTFS_IMG=ubuntu_rootfs/rk3399_ubuntu_rootfs.img
# recovery ramdisk
export RK_RECOVERY_RAMDISK=recovery-arm64.cpio.gz
# Set userdata partition type
export RK_USERDATA_FS_TYPE=ext4
# Buildroot config
export RK_CFG_BUILDROOT=
# Recovery config
export RK_CFG_RECOVERY=
#OEM config
export RK_OEM_DIR=
#userdata config
export RK_USERDATA_DIR=
注意,十分重要!!
把得到的镜像放到 SDK 的指定目录:
#解压
tar -xvf rk3399_ubuntu18.04_LXDE.img.tgz
#sdk根目录下
mkdir ubunturootfs
mv rk3399_ubuntu18.04_LXDE.img ubunturootfs/
#修改firefly-rk3399-ubuntu.mk文件
vim device/rockchip/RK3399/firefly-rk3399-ubuntu.mk
#把RK_ROOTFS_IMG属性改成ubuntu文件系统镜像得路径(也就是rk3399_ubuntu18.04_LXDE.img)
RK_ROOTFS_IMG=ubunturootfs/rk3399_ubuntu18.04_LXDE.img
注意: Ubuntu 根文件系统镜像存放路径不能错。
#全自动编译的固件
$ ./build.sh
#部分编译
$ ./build.sh kernel
$ ./build.sh uboot
$ ./build.sh recovery
#运行 ./mkfirmware.sh 会自动更新 rockdev/rootfs.img 的链接。
$ ./build.sh firmware
#固件打包
#每次打包固件前先确保 rockdev/ 目录下文件链接是否正确:
$ ls -l
├── boot.img -> ~/project/linux_sdk/kernel/boot.img
├── idbloader.img -> ~/project/linux_sdk/u-boot/idbloader.img
├── MiniLoaderAll.bin -> ~/project/linux_sdk/u-boot/rk3399_loader_v1.14.115.bin
├── misc.img -> ~/project/linux_sdk/device/rockchip/rockimg/wipe_all-misc.img
├── parameter.txt -> ~/project/linux_sdk/device/rockchip/RK3399/parameter-ubuntu.txt
├── recovery.img -> ~/project/linux_sdk/buildroot/output/rockchip_rk3399_recovery/images/recovery.img
├── rootfs.img -> ~/project/linux_sdk/ubunturootfs/rk3399_ubuntu18.04_LXDE.img
├── trust.img -> ~/project/linux_sdk/u-boot/trust.img
├── uboot.img -> ~/project/linux_sdk/u-boot/uboot.img
└── userdata.img
#打包统一固件
# 注意:打包前请确认 tools/linux/Linux_Pack_Firmware/rockdev/package-file 是否正确。打包会根据此文件进行分区打包。此文件链接会在 ./build.sh firefly-rk3399-ubuntu.mk 命令时更新,如果配置不对请返回编译前配置一节重新配置一次。
整合统一固件:
$ ./build.sh updateimg
2.3.1.5. (5). 分区介绍¶
2.3.1.5.1. A. parameter.txt¶
parameter.txt 包含了固件的分区信息十分重要,你可以在 device/rockchip/rk3399 目录下找到一些 parameter.txt 文件,下面以 parameter-debian.txt 为例子做介绍:
FIRMWARE_VER: 8.1
MACHINE_MODEL: RK3399
MACHINE_ID: 007
MANUFACTURER: RK3399
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3399
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00010000@0x0000a000(boot),0x00010000@0x0001a000(recovery),0x00010000@0x0002a000(backup),0x00020000@0x0003a000(oem),0x00700000@0x0005a000(rootfs),-@0x0075a000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
CMDLINE 属性是我们关注的地方。以 Uboot 为例 0x00002000@0x00004000(uboot) 中 0x00004000 为 Uboot 分区的起始位置 0x00002000 为分区的大小。后面的分区规则相同。用户可以根据自己需要增减或者修改分区信息,但是请最少保留 uboot, trust, boot, rootfs 分区,这是机器能正常启动的前提条件。parameter-ubuntu.txt 中使用的就是这样的最简分区方案。
分区介绍:
uboot 分区: 烧写 uboot 编译出来的 uboot.img。
trust 分区: 烧写 uboot 编译出来的 trust.img。
misc 分区: 烧写 misc.img。开机检测进入 recovery 模式。(可省略)
boot 分区: 烧写 kernel 编译出来的 boot.img 包含 kernel 和设备树信息。
recovery 分区: 烧写 recovery.img。(可省略)
backup 分区: 预留,暂时没有用。后续跟 android 一样作为 recovery 的 backup 使用。(可省略)
oem 分区: 给厂家使用,存放厂家的 app 或数据。只读。代替原来音箱的 data 分区。挂载在/oem 目录。(可省略)
rootfs 分区: 存放 buildroot 或者 debian 编出来的 rootfs.img,只读.
userdata 分 区 : 存放 app 临时生成的文件或者是给最终用户使用。可读写,挂载在 /userdata 目录下。(可省略)
2.3.1.5.2. B. package-file¶
package-file文件应当与 parameter 保持一致,用于固件打包。可以在 tools/linux/Linux_Pack_Firmware/rockdev 下找到相关文件。以 rk3399-ubuntu-package-file 为例介绍:
# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
trust Image/trust.img
uboot Image/uboot.img
boot Image/boot.img
rootfs:grow Image/rootfs.img
backup RESERVED
以上是 SDK 编译后生成的镜像文件。根据 parameter.txt 只打包自己用到的 img 文件。
2.3.2. 3.2 Ubuntu 20.04¶
核心板 Core-3588SJD4 支持 Ubuntu 20.04
2.3.2.1. (1) 获取 SDK¶
首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以 ~/proj
为例
不要在虚拟机共享文件夹以及非英文目录存放、解压SDK,且不要使用 sudo root 权限操作, 避免产生不必要的错误
2.3.2.1.2. 初始化仓库¶
方法一(推荐国内用户使用)
SDK 源码存放于 gitlab,国内用户可能下载完整的 SDK 仓库速度比较慢,所以我们提供了一个 SDK 基础包(Linux SDK),国内用户只需要在此基础包上同步 gitlab 上的代码就可以了
下载完成后先验证一下 MD5 码:
$ md5sum rk3588_linux_release_20230114_v1.0.6c_0*
c3bcb3f92bd139f72551c89f75d39bfa rk3588_linux_release_20230114_v1.0.6c_00
ebb658571a645d4af1e2b569709480b7 rk3588_linux_release_20230114_v1.0.6c_01
9761cc324e9f7133500b590c441b0307 rk3588_linux_release_20230114_v1.0.6c_02
7adc9fe2158d7681554dce1def238f49 rk3588_linux_release_20230114_v1.0.6c_03
3d9201e3849b8a523c05920bebe28b39 rk3588_linux_release_20230114_v1.0.6c_04
6faaee006fe60fc9be60a64a01506cb6 rk3588_linux_release_20230114_v1.0.6c_05
确认无误后,就可以解压:
# 解压
mkdir -p ~/proj/rk3588_sdk
cd ~/proj/rk3588_sdk
cat path/to/rk3588_linux_release_20230114_v1.0.6c_0* | tar -xv
# 导出数据
.repo/repo/repo sync -l
方法二
通过 repo 拉取代码,此方法对网络要求较高,有条件可以使用
可选择获取完整 SDK 或者 BSP:
mkdir ~/proj/rk3588_sdk/
cd ~/proj/rk3588_sdk/
## 完整 SDK
repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u https://gitlab.com/firefly-linux/manifests.git -b master -m rk3588_linux_release.xml
## BSP ( 只包含基础仓库和编译工具 )
## BSP 包括 device/rockchip 、docs 、 kernel 、 u-boot 、 rkbin 、 tools 和交叉编译链
repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u https://gitlab.com/firefly-linux/manifests.git -b master -m rk3588_linux_bsp_release.xml
2.3.2.1.3. 同步代码¶
执行如下命令同步代码:
# 进入 SDK 根目录
cd ~/proj/rk3588_sdk
# 同步
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all
后续可以使用以下命令更新 SDK:
.repo/repo/repo sync -c --no-tags
因为网络环境等原因,.repo/repo/repo sync -c --no-tags
命令更新代码可能会失败,可多次反复执行。
2.3.2.2. (2) Linux SDK 配置介绍¶
2.3.2.2.1. 目录介绍¶
$ tree -L 1
.
├── app
├── buildroot # Buildroot 根文件系统编译目录
├── build.sh -> device/rockchip/common/build.sh # 编译脚本
├── device # 编译相关配置文件
├── docs # 文档
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh # 链接脚本
├── prebuilts # 交叉编译工具链
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh # 烧写脚本
├── tools # 工具目录
├── u-boot
2.3.2.2.2. 配置文件介绍¶
在 device/rockchip/rk3588/
目录下,有不同板型的配置文件(xxxx.mk),用于管理 SDK 每个环节的编译配置,相关配置介绍:
# Target arch
export RK_ARCH=arm64 # 64位 ARM 架构
# Uboot defconfig
export RK_UBOOT_DEFCONFIG=xxxx_defconfig # u-boot 配置文件
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=xxxx_defconfig # kernel 配置文件
# Kernel defconfig fragment
export RK_KERNEL_DEFCONFIG_FRAGMENT=xxxx.config # kernel 配置文件(fragment)
# Kernel dts
export RK_KERNEL_DTS=xxxx.dts # dts 文件
# parameter for GPT table
export RK_PARAMETER=parameter-xxxx.txt # 分区表
# rootfs image path
export RK_ROOTFS_IMG=ubuntu_rootfs/rootfs.img # 根文件系统路径
2.3.2.2.3. 分区说明¶
2.3.2.2.3.1. parameter 分区表¶
路径:device/rockchip/rk3588/parameter-xxxxxx-fit.txt
FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3588
MACHINE_ID: 007
MANUFACTURER: RK3588
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot:bootable),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x00c00000@0x00078000(rootfs),0x00040000@0x00c78000(oem),-@0x00cb8000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00004000(uboot) 中 0x00004000 为uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。
2.3.2.2.3.2. package-file¶
package-file 文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与 parameter.txt 文件保持一致。
路径:tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file
# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
uboot Image/uboot.img
misc Image/misc.img
boot Image/boot.img
recovery Image/recovery.img
rootfs Image/rootfs.img
userdata RESERVED
backup RESERVED
2.3.2.3. (3) 编译 Ubuntu20.04 固件¶
本章介绍 Ubuntu 固件的编译流程,推荐在 Ubuntu 18.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
本教程的编译部分适用于 v1.0.6e 以上 SDK 版本
$ readlink -f .repo/manifest.xml
/home/daijh/p/rk3588/.repo/manifests/rk3588/rk3588_linux_release_20230301_v1.0.6e.xml
2.3.2.3.1. 准备工作¶
搭建编译环境:
sudo apt-get install repo 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 ncurses-dev \
2.3.2.3.2. 编译 SDK¶
2.3.2.3.2.1. 编译前配置¶
在 device/rockchip/rk3588/
目录下,有不同板型的配置文件,选择配置文件:
./build.sh CS-R2-3588s-jd4-sub-minimal-ubuntu.mk
2.3.2.3.2.2. 全自动编译¶
下载根文件系统:Ubuntu 根文件系统(64位),放到 SDK 路径下
7z x ubuntu-aarch64-rootfs.7z
mkdir ubuntu_rootfs
mv ubuntu-aarch64-rootfs.img ubuntu_rootfs/rootfs.img
开始编译
./build.sh
生成的完整固件会保存到 rockdev/pack/
目录。
2.3.2.3.2.3. 部分编译¶
编译 u-boot
./build.sh uboot
编译 kernel
./build.sh extboot
编译 recovery
./build.sh recovery
下载根文件系统:Ubuntu 根文件系统(64位),放到 SDK 路径下
7z x ubuntu-aarch64-rootfs.7z
mkdir ubuntu_rootfs
mv ubuntu-aarch64-rootfs.img ubuntu_rootfs/rootfs.img
更新各部分镜像链接到
rockdev/
目录
./mkfirmware.sh
打包固件,生成的完整固件会保存到
rockdev/pack/
目录
./build.sh updateimg