系统开发 1. Android SDK (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 B. 编译FAQ 由于每个人的PC系统版本和环境配置不一样,安装软件包后编译并不一定都会成 功,可能会出现缺少某些软件包而引起的错误,如: 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)即可 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). Android10.0 SDK 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 B. 编译方法 a. R1编译方法 脚本自动编译 ./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 手动编译 编译前执行如下命令配置环境变量: 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 目录里。 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文件,可以用于工具直接烧写整个固件包 (3). Android12.0 SDK 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 B. 编译方法 a. R1编译方法 脚本自动编译 ./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 手动编译 编译 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. Android 系统定制,应用开发 参考 Firefly Android 使用手册 3. Linux SDK 为了方便用户的使用与开发,官方提供了 Linux 开发的整套 SDK,本章详细的 说明 SDK 的具体用法。 注意: Linux SDK只适用于集群服务器子板的系统开发。 3.1 Ubuntu 18.04 核心板 Core-3399JD4 支持 Ubuntu 18.04 (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 解压 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 更新 Firefly_Linux_SDK 后续可以使用以下命令更新 SDK .repo/repo/repo sync -c --no-tags (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 (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 (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 (5). 分区介绍 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 目录下。(可省略) 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 文件。 3.2 Ubuntu 20.04 核心板 Core-3588SJD4 支持 Ubuntu 20.04 (1) 获取 SDK 首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以 "~/proj" 为例 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK,且不要使用 sudo root 权限操作, 避免产生不必要的错误 安装工具 获取 SDK 需要先安装: sudo apt update sudo apt install -y repo git python 初始化仓库 方法一(推荐国内用户使用) 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 同步代码 执行如下命令同步代码: # 进入 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) Linux SDK 配置介绍 目录介绍 $ 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 配置文件介绍 在 "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 # 根文件系统路径 分区说明 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 为分区的大小,以此类推。 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 (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 准备工作 搭建编译环境: 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 \ 编译 SDK 编译前配置 在 "device/rockchip/rk3588/" 目录下,有不同板型的配置文件,选择配置文 件: ./build.sh CS-R1-3588s-jd4-sub-minimal-ubuntu.mk 全自动编译 下载根文件系统: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/" 目录。 部分编译 编译 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 4. Linux 系统定制, 应用开发 参考 Firefly Ubuntu 使用手册