除了系统要求外,还有其他软硬方面的要求。
推荐使用Ubuntu 16.04 的系统进行编译。其他版本没有具体测试,可能需要对软件包做相应调整。
操作系统安装好后,且用户已自行配置好网络环境,则可继续如下步骤完成相关软件包的安装。
$ sudo apt-get update
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl \
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev \
libxml2-utils xsltproc unzip device-tree-compiler
$ sudo apt-get install libfile-which-perl sed make binutils gcc g++ bash \
patch gzip bzip2 perl tar cpio python unzip rsync file bc libmpc3 \
git repo texinfo pkg-config cmake tree
若编译遇到报错,可以视报错信息,安装对应的软件包。
鉴于 Rockchip Buildroot SDK 目前只在 Linux 下编译,我们也仅提供了 Linux 下的交叉编译工具链。其中 U-Boot 及 Kernel 使用的编译工具链预置目录在 prebuilt/gcc下,buildroot 使用该开源软件中编译出来的工具链。
U-Boot 及 Kernel 编译工具链
prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
对应版本
gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
Buildroot 编译工具链
buildroot/output/rockchip_rk3308_release/host/bin/aarch64-rockchip-linux-gnu-
对应版本
gcc version 6.4.0 (Buildroot 2018.02-rc3-00017-g9c68ede)
如果需要其他平台或版本的工具链,需自行编译。
由于 SDK 比较大,我们提供了一个打包好的.git以供下载:
- Firefly-RK3308_Linux_SDK
下载完成后先验证一下 MD5 码:
$ md5sum Firefly-RK3308_Linux_SDK_git_20181008.7z
3800278cc016d117eec8c0381ba66769 Firefly-RK3308_Linux_SDK_git_20181008.7z
确认无误后,就可以解压:
$ mkdir -p ~/prj/Firefly-RK3308
$ cd ~/prj/Firefly-RK3308
$ 7zr x Firefly-RK3308_Linux_SDK_git_20181008.7z
$ git reset --hard
解压出来的SDK,已经默认添加远程仓库
$ git remote -v
gitlab https://gitlab.com/TeeFirefly/rk3308-linux.git (fetch)
gitlab https://gitlab.com/TeeFirefly/rk3308-linux.git (push)
以后就可以直接从 gitlab 处更新:
$ git pull gitlab firefly:firefly
也可以到 https://gitlab.com/TeeFirefly/rk3308-linux 在线浏览源码
.
├── buildroot
├── build.sh -> device/rockchip/common/build.sh
├── device
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/rk3308/mkfirmware.sh
├── prebuilts
├── rkbin
├── rockdev
├── tools
├── u-boot
└── yocto
其中:
Buildroot
目录存放 buildroot 开源项目代码,可定制根文件系统build.sh
为系统编译脚本,执行可进行 SDK 的完整编译device
目录存放板级配置及一些预置文件,开机脚本等external
目录存放 SDK 相关库及工具源码kernel
为内核部分源码mkfirmware.sh
脚本可对镜像文件进行打包,并统一拷贝至 rockdev/
目录prebuilts
目录存放 U-Boot、Kernel 编译使用的交叉编译工具链rkbin
目录存放 Rockchip 平台一些关键性二进制文件,包括ddr.bin,miniloader.bin,bl31.bin,在 U-Boot 编译过程中会用到rockdev
执行 mkfirmware.sh 会把系统编译的生成的镜像,统一拷贝至 rockdev/tools
目录存放着 Windows 及 Linux 环境下的开发工具、调试工具、量产工具u-boot
目录存放着 U-Boot 部分的源码编译 Uboot:
$ cd u-boot/
$ ./make.sh roc-rk3308-cc
编译完,会生成 trust.img、rk3308_loader_xxx.bin、uboot.img 三个镜像文件。
编译 Kernel:
$ cd kernel/
$ make arch=arm64 firefly-rk3308_linux_defconfig
$ make arch=arm64 rk3308-roc-cc-dmic-pdm_emmc.img
编译 kenrel 的时候可以直接 make dts-name.img(如 rk3308-roc-cc-dmic-pdm_emmc.img),即可生成对应的 resource.img(包含 dtb 数据)。
最终生成的kernel.img和resource.img将会被打包进boot.img,更换内核的时候,只需烧写boot.img即可
编译 Buildroot,envsetup.sh 是终端环境变量设置脚本:
$ source buildroot/build/envsetup.sh
You're building on Linux
Lunch menu...pick a combo:
1. firefly_rk3308_release
2. firefly_rk3308_recovery
3. firefly_rk3308_pcba
Which would you like? [1] 1
===========================================
如选择 firefly_rk3308_release,输入对应序号 1
执行编译:
$ make
完成编译后执行 SDK 根目录下的 mkfirmware.sh 脚本生成固件。
$ ./mkfirmware.sh
所有烧写所需的镜像都将会拷贝于 rockdev 目录。
rockdev/
├── boot.img
├── MiniLoaderAll.bin
├── misc.img
├── oem.img
├── parameter.txt
├── recovery.img
├── rootfs.img
├── trust.img
├── uboot.img
└── userdata.img
得到了所有镜像文件后,为了方便烧写及量产,通常可手动将这些单独的镜像通过脚本打包成为一个统一固件:update.img。打包方法见下文。
为了提高编译的效率,降低人工编译可能出现的误操作,该 SDK 中集成了全自动化编译脚本,方便固件编译、备份。
该全自动化编译脚本原始文件存放于:
device/rockchip/common/build.sh
在SDK根目录创建了相应软链接build.sh
。
可通过修改 device/rockchip/rk3308/BoardConfig.mk
脚本中的特定变量,以编出对应产品固件
#=========================
# Compile Config
#=========================
# Target arch
ARCH=arm64
# Uboot defconfig
UBOOT_DEFCONFIG=roc-rk3308-cc
# Kernel defconfig
KERNEL_DEFCONFIG=firefly-rk3308_linux_defconfig
# Kernel dts
KERNEL_DTS=rk3308-roc-cc-dmic-pdm_emmc
# Buildroot config
CFG_BUILDROOT=firefly_rk3308_release
# Recovery config
CFG_RECOVERY=firefly_rk3308_recovery
# Pcba config
CFG_PCBA=firefly_rk3308_pcba
# Build jobs
JOBS=12
执行自动编译脚本:
$ ./build.sh
该脚本会自动配置环境变量,并自动编译 U-Boot,编译 Kernel,编译Buildroot,编译 Recovery 继而生成固件。
为了方便开发调试,上文说到的“全自动化编译脚本”,也支持单独模块进行编译,方便模块调试,可指定并编译部分模块。
部分编译可参见使用说明:
$ ./build.sh -h
====USAGE: build.sh modules====
uboot -build uboot
kernel -build kernel
rootfs -build default rootfs, currently build buildroot as default
buildroot -build buildroot rootfs
yocto -build yocto rootfs, currently build ros as default
ros -build ros 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
save -save images, patches, commands used to debug
default -build all modules
如单独编译 kernel,只需要执行以下命令:
$ ./build.sh kernel
固件打包工具可将各零散镜像文件,打包成一个完整的 update.img 形式,方便量产烧写及升级。
Windows 系统下,打包工具存放在 tools\windows\AndroidTool\rockdev
,打包步骤如下:
打包工具存放在 SDK/tools/linux/Linux_Pack_Firmware/rockdev/
,打包步骤如下:
$ ./mkupdate.sh
另外,Linux下,SDK有提供一键打包工具,自动生成统一固件 rockdev/update.img
$ ./build.sh updateimg
请参照《升级固件》来烧写分区映像文件。