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. R1编译方法
2.1.2.2.1.1. 脚本自动编译
./FFTools/make.sh -d rk3399-firefly-sr-c11g-jd4 -j8 -l rk3399_firefly_sr_c11g_jd4-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_sr_c11g_jd4-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_sr_c11g_jd4/boot.img rk3399-firefly-sr-c11g-jd4.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_sr_c11g_jd4-userdebug
make -j8
./mkimage.sh

打包成统一固件 update.img

编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:

cd ~/proj/rk3399_Android10.0/
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_sr_c11g_jd4-userdebug

打包完成后将在rockdev/Image-rk3399_firefly_sr_c11g_jd4/ 目录下生成统一固件: 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. R1编译方法
2.1.3.2.1.1. 脚本自动编译
./FFTools/make.sh -d rk3588s-firefly-sr-c11g-jd4 -j8 -l rk3588s_firefly_sr_c11g_jd4-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3588s_firefly_sr_c11g_jd4-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_sr_c11g_jd4/boot.img rk3588s-firefly-sr-c11g-jd4.img -j8
  • 编译 uboot:

cd ~/path/to/sdk/u-boot/
./make.sh rk3588
  • 编译 Android:

cd ~/path/to/sdk/
source build/envsetup.sh
lunch rk3588s_firefly_sr_c11g_jd4-userdebug
make installclean
make -j8
./mkimage.sh

打包成统一固件 update.img

编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:

cd ~/path/to/sdk/
./FFTools/mkupdate/mkupdate.sh -l rk3588s_firefly_sr_c11g_jd4-userdebug

打包完成后将在rockdev/Image-rk3588s_firefly_sr_c11g_jd4/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img 在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdev\Image 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdev\Image 目录里。

2.2. 2. Android 系统定制,应用开发

参考 Firefly 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.1.3. 更新 Firefly_Linux_SDK

后续可以使用以下命令更新 SDK

.repo/repo/repo sync -c --no-tags

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 或者更高的系统还需要如下依赖包:

  1. sudo apt-get install lib32gcc-7-dev g++-7 libstdc++-7-dev

2.3.1.4. (4). 编译 SDK

编译前配置

配置文件 CS-R1-3399-jd4-sub-ubuntu.mk:

./build.sh CS-R1-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=

注意,十分重要!!

前往下载页面 下载对应的Ubuntu 根文件系统镜像

把得到的镜像放到 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 中使用的就是这样的最简分区方案。

分区介绍:

  1. uboot 分区: 烧写 uboot 编译出来的 uboot.img。

  2. trust 分区: 烧写 uboot 编译出来的 trust.img。

  3. misc 分区: 烧写 misc.img。开机检测进入 recovery 模式。(可省略)

  4. boot 分区: 烧写 kernel 编译出来的 boot.img 包含 kernel 和设备树信息。

  5. recovery 分区: 烧写 recovery.img。(可省略)

  6. backup 分区: 预留,暂时没有用。后续跟 android 一样作为 recovery 的 backup 使用。(可省略)

  7. oem 分区: 给厂家使用,存放厂家的 app 或数据。只读。代替原来音箱的 data 分区。挂载在/oem 目录。(可省略)

  8. rootfs 分区: 存放 buildroot 或者 debian 编出来的 rootfs.img,只读.

  9. 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.1. 安装工具

获取 SDK 需要先安装:

sudo apt update
sudo apt install -y repo git python
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-R1-3588s-jd4-sub-minimal-ubuntu.mk
2.3.2.3.2.2. 全自动编译
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
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

2.4. 4. Linux 系统定制, 应用开发

参考Firefly Ubuntu 使用手册