5. SDK 配置及编译说明

SDK可通过 ./build.sh [OPTIONS] 加目标参数进行相关功能的配置和编译。

注解

为了确保SDK每次更新都能顺利进行,建议在更新前清理之前的编译产物。这样做可以避免潜在的兼容性问题或编译错误,因为旧的编译产物可能不适用于新版本的SDK。要清理这些编译产物,可以直接运行命令 ./build.sh cleanall

5.1 SDK编译命令查看

./build.sh help

############### Rockchip Linux SDK ###############
Manifest: rk356x_linux5.10_release_v1.5.0_20240620.xml //SDK所使用的清单文件,包含项目的结构、依赖和构建信息等。
Version: linux-5.10-gen-rkr8 //显示当前SDK所使用的Linux内核版本

Log colors: message notice warning error fatal  //说明不同日志的消息显示的颜色

Usage: build.sh [OPTIONS]    //脚本使用说明

Available options:           //允许的可选配置[OPTIONS]

**芯片和配置选择**
chip[:<chip>[:<config>]]          	choose chip  //选择芯片平台,已默认指定对应芯片平台
defconfig[:<config>]              	choose defconfig  //选择默认的板级配置文件
 *_defconfig                      	switch to specified defconfig
    available defconfigs:
	rockchip_defconfig
	rockchip_rk3566_evb2_lp4x_v10_32bit_defconfig
	rockchip_rk3566_evb2_lp4x_v10_defconfig
	rockchip_rk3568_evb1_ddr4_v10_32bit_defconfig
	rockchip_rk3568_evb1_ddr4_v10_defconfig
	rockchip_rk3568_evb8_lp4_v10_32bit_defconfig
	rockchip_rk3568_evb8_lp4_v10_defconfig
	rockchip_rk3568_pcie_ep_lp4x_v10_defconfig
	rockchip_rk3568_r600_v10_defconfig
 olddefconfig                     	//解决 .config 文件中未解决的符号问题
 savedefconfig                    	//将当前的配置保存为默认配置文件
 menuconfig                       	//启动一个基于文本界面的交互式配置工具
config                            	//修改 SDK 的默认配置文件

**分区操作**
print-parts                        	//打印当前的分区表信息
list-parts                         	//list-parts 是 print-parts 的别名,功能相同
mod-parts                          	//启动一个交互式的分区表修改工具
edit-parts                         	//直接编辑原始的分区信息
new-parts:<offset>:<name>:<size>...	//重新创建分区,需要指定分区的偏移量
insert-part:<idx>:<name>[:<size>]  	insert partition
del-part:(<idx>|<name>)            	delete partition
move-part:(<idx>|<name>):<idx>     	move partition
rename-part:(<idx>|<name>):<name>  	rename partition
resize-part:(<idx>|<name>):<size>  	resize partition

**镜像构建操作**
misc                              	//打包 misc 镜像
kernel[:dry-run]                 	//构建内核,dry-run 选项表示只进行预检查,不实际执行构建操作
recovery-kernel[:dry-run]        	//构建用于恢复模式的内核,支持 dry-run 选项
modules[:dry-run]                	//构建内核模块,支持 dry-run 选项
linux-headers[:dry-run]          	//构建 Linux 内核头文件,支持 dry-run 选项
kernel-config[:dry-run]          	//修改内核的默认配置文件,支持 dry-run 选项
kconfig[:dry-run]                	//kconfig 是 kernel-config 的别名,功能相同
kernel-make[:<arg1>:<arg2>]      	//执行内核的 make 命令,可以传递额外的参数(<arg1>、<arg2>)
kmake[:<arg1>:<arg2>]            	//alias of kernel-make
wifibt[:<dst dir>[:<chip>]]       	//构建 Wi-Fi 和蓝牙相关的组件,可以指定目标目录和芯片型号
amp                              	//构建并打包 AMP(Asymmetric Multi-Processing)系统
buildroot-config[:<config>]       	//修改 Buildroot 的默认配置文件,可以指定具体的配置(<config>
bconfig[:<config>]                	//abconfig 是 buildroot-config 的别名,功能相同
buildroot-make[:<arg1>:<arg2>]    	//执行 Buildroot 的 make 命令,可以传递额外的参数
bmake[:<arg1>:<arg2>]             	//bmake 是 buildroot-make 的别名,功能相同
rootfs[:<rootfs type>]            	//构建默认的根文件系统,可以指定根文件系统的类型(<rootfs type>)
buildroot                         	//使用 Buildroot 构建根文件系统
yocto                             	//使用 Yocto 构建根文件系统
debian                            	//构建基于 Debian 的根文件系统
recovery                          	//构建恢复模式的镜像

**安全相关操作**
security-createkeys               	//创建用于安全机制的密钥
security-misc                     	//使用系统加密密钥构建 misc 镜像
security-ramboot                  	//构建安全的 RAM 启动镜像
security-system                   	//构建安全系统

**引导加载程序相关操作**
loader[:dry-run]                 	//构建引导加载程序(U-Boot),支持 dry-run 选项
uboot[:dry-run]                  	//构建 U-Boot,支持 dry-run 选项
u-boot[:dry-run]                 	//alias of uboot
uefi[:dry-run]                   	//构建 UEFI(统一可扩展固件接口),支持 dry-run 选项

**其他操作**
extra-parts                       	//打包额外的分区镜像
firmware                          	//打包并检查固件
edit-package-file                 	//编辑包文件
edit-ota-package-file             	//编辑用于 OTA(Over-the-Air)更新的包文件
updateimg                         	//构建更新镜像
ota-updateimg                     	//构建用于 OTA 更新的镜像
all                               	//构建所有的镜像
release                           	//发布镜像和构建信息
all-release                       	//构建并发布所有镜像
shell                             	//启动一个用于开发的 shell 环境
cleanall                          	//清理所有构建生成的文件
clean[:module[:module]]...        	//清理指定的模块,可以指定多个模块名称,后面列出了可用的模块选项
    available modules:
	all
	amp
	config
	extra-parts
	firmware
	kernel
	loader
	misc
	recovery
	rootfs
	security
	updateimg
post-rootfs <rootfs dir>          	//触发根文件系统构建后的钩子脚本,需要指定根文件系统的目录
help                              	//显示脚本的使用说明

Default option is 'all'.    //说明如果不指定任何选项,脚本的默认操作是执行 all,即构建所有的镜像。

6.2 SDK板级配置

板级配置文件存放位置:[SDK]/device/rockchip/rk3566_rk3568/(以RK3566/RK3568芯片平台为例)

打开这个目录会有类似如下的以_defconfig为后缀的板级配置文件

板级配置文件

说明

rockchip_rk3588_evb1_lp4_v10_defconfig

适用于 RK3588 EVB1 搭配 LPDDR4 开发板

rockchip_rk3588_evb7_lp4_v11_defconfig

适用于 RK3588 EVB7 搭配 LPDDR4 开发板

rockchip_rk3588s_evb1_lp4x_v10_defconfig

适用于 RK3588S EVB1 搭配 LPDDR4 开发板

rockchip_rk3562_evb1_lp4x_v10_defconfig

适用于 RK3562 EVB1 搭配 LPDDR4 开发板

rockchip_rk3562_evb2_ddr4_v10_defconfig

适用于 RK3562 EVB2 搭配 DDR4 开发板

rockchip_defconfig

默认配置, 具体会软链接到默认一个板级配置,可通过./build.sh lunch 进行配置

6.2.1 选择一个板级配置文件

比如R600为例,在SDK目录下执行:./build.sh defconfig或者./build.sh lunch,会出现如下选择菜单:

############### Rockchip Linux SDK ###############

Manifest: rk356x_linux5.10_release_v1.5.0_20240620.xml
Version: linux-5.10-gen-rkr8

Log colors: message notice warning error fatal

Log saved at /nnewn-backup/kwf/NNEWN_SDK_DEBUG/RK356X_LINUX5.10.209_XNIUPI_R600_SDK/output/sessions/2025-04-06
Pick a defconfig:

1. rockchip_defconfig
2. rockchip_rk3566_evb2_lp4x_v10_32bit_defconfig
3. rockchip_rk3566_evb2_lp4x_v10_defconfig
4. rockchip_rk3568_evb1_ddr4_v10_32bit_defconfig
5. rockchip_rk3568_evb1_ddr4_v10_defconfig
6. rockchip_rk3568_evb8_lp4_v10_32bit_defconfig
7. rockchip_rk3568_evb8_lp4_v10_defconfig
8. rockchip_rk3568_pcie_ep_lp4x_v10_defconfig
9. rockchip_rk3568_r600_v10_defconfig
Which would you like? [1]: 

选择我们想要的板级配置文件即可,比如输入9选择R600的SDK板级配置文件rockchip_rk3568_r600_v10_defconfig

6.2.2 新建一个板级配置文件

如果我们准备适配一个新的硬件,可以按照如下步骤创建一个新的板级defconfig并绑定对应的dts

1. 在`sdk/kernel/arch/arm64/boot/dts/rockchip/`目录下新建一个`dts`

2. 仿照`rockchip_rk3568_r600_v10_defconfig`新建一个板级defconfig文件,并修改
`RK_KERNEL_DTS_NAME`属性,将其指向我们刚刚新创建的`dts`

3. 重新执行`./build.sh defconfig`,就会发现我们刚刚新创建的defconfig已经出现在菜单中了

6.3 SDK定制化配置

SDK可通过 make menuconfig 进行相关配置,目前可配组件主要如下:

(rk3562) SoC
Rootfs --->
Loader (u-boot) --->
RTOS --->
Kernel --->
Boot --->
Recovery (based on buildroot) --->
PCBA test (based on buildroot) --->
Security --->
Extra partitions --->
Firmware --->
Update (Rockchip update image) --->
Others configurations --->

注解

  • Rootfs: 这里的Rootfs代表“根文件系统”,在这里可选择Buildroot、Yocto、Debian等不同的根文件系统配置。

  • Loader (u-boot): 这是引导加载器的配置,通常是u-boot,用于初始化硬件并加载主操作系统。

  • RTOS: 实时操作系统(RTOS)的配置选项,适用于需要实时性能的应用。

  • Kernel: 这里配置内核选项,定制适合自己的硬件和应用需求的Linux内核。

  • Boot: 这里配置Boot分区支持格式。

  • Recovery (based on buildroot): 这是基于buildroot的recovery环境的配置,用于系统恢复和升级。

  • PCBA test (based on buildroot): 这是一个基于buildroot的PCBA(印刷电路板组装)测试环境的配置。

  • Security: 安全功能开启, 包含Secureboot开启方式、Optee存储方式、烧写Key等。

  • Extra partitions: 用于配置额外的分区。

  • Firmware: 在这里配置固件相关选项。

  • Update (Rockchip update image): 用于配置Rockchip完整固件的选项。

  • Others configurations: 其他额外的配置选项。

通过 make menuconfig 配置界面提供了一个基于文本的用户界面来选择和配置各种选项。配置完成后,使用 make savedefconfig 命令保存这些配置,这样定制化编译就会根据这些设置来进行。 通过以上config,可选择不同Rootfs/Loader/Kernel等配置,进行各种定制化编译,这样就可以灵活地选择和配置系统组件以满足特定的需求。

6.4 一键编译

进入工程根目录执行以下命令自动完成所有的编译:

./build.sh all 
# 只编译模块代码(u-Boot,kernel,Rootfs,Recovery)
# 需要再执行`./build.sh ./mkfirmware.sh 进行固件打包
./build.sh 
# 编译模块代码(u-Boot,kernel,Rootfs,Recovery)
# 打包成update.img完整升级包
# 所有编译信息复制和生成到out目录下

默认是 Buildroot,可以通过设置坏境变量 RK_ROOTFS_SYSTEM 指定不同 rootfs。

RK_ROOTFS_SYSTEM 目前可设定三种系统:buildroot、debian、 yocto

比如需要 Debian 可以通过以下命令进行生成:

export RK_ROOTFS_SYSTEM=debian
./build.sh
或
RK_ROOTFS_SYSTEM=debian ./build.sh

6.5 模块编译

6.5.1 U-Boot编译

进入SDK工程。运行如下命令进行编译:

./build.sh uboot

6.5.2 Kernel编译

进入工程目录根目录执行以下命令自动完成 kernel 的编译及打包:

./build.sh kernel

6.5.3 Recovery编译

进入工程根目录执行以下命令自动完成 Recovery 的编译及打包:

./build.sh recovery

编译后在 Buildroot 目录 output/rockchip_rk3568_recovery/images生成 recovery.img(以RK3568为例)

recovery.img 是包含内核,所以每次 Kernel 更改,Recovery 是需要重新打包生成。Recovery重新打包的方法如下:

<SDK>#source buildroot/envsetup.sh
<SDK>#cd buildroot
<SDK>#make recovery-reconfigure
<SDK>#cd -
<SDK>#./build.sh recovery

小技巧

Recovery是非必需的功能,有些板级配置不会设置

6.5.4 Buildroot编译

进入工程目录根目录执行以下命令自动完成buildroot Rootfs 的编译及打包:

./build.sh rootfs

编译后在Buildroot目录 output/rockchip_rk3568/images 下生成不同格式的镜像, 默认使用rootfs.ext4格式。

6.5.5 Debian编译

进入工程目录根目录执行以下命令自动完成Debian Rootfs 的编译及打包:

./build.sh debian

编译后在 debian 目录下生成 linaro-rootfs.img

注解

如果您的服务器没有相关依赖包,需要预先安装相关依赖包

sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f

6.5.6 Yocto 编译

进入工程目录根目录执行以下命令自动完成 Rootfs 的编译及打包:

./build.sh yocto

编译后在 yocto 目录 build/lastest 下生成 rootfs.img

默认用户名登录是 root。

因为编译yocto需要连接外网从外网仓库在线下载,因此需要VPN,一般提供给海外客户使用。

如果编译过程遇到如下问题:

Please use a locale setting which supports UTF-8 (such as LANG=en_US.UTF-8).
Python can't change the filesystem locale after loading so we need a UTF-8
when Python starts or things won't work.

可以尝试这样解决:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en LC_ALL=en_US.UTF-8

6.5.7 交叉编译

SDK prebuilts目录预置交叉编译

目录

说明

prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu

gcc arm 10.3.1 64位工具链

prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf

gcc arm 10.3.1 32位工具链

您也可以访问以下地址下载工具链:瑞芯微官方工具链下载

Buildroot内置交叉编译

可通过 source buildroot/envsetup.sh 来设置不同芯片和目标功能的配置

$ source buildroot/envsetup.sh
Top of tree: rk3562
You're building on Linux
Lunch menu...pick a combo:
44. rockchip_rk3562
45. rockchip_rk3562_32
46. rockchip_rk3562_dictpen
47. rockchip_rk3562_ramboot
48. rockchip_rk3562_recovery
49. rockchip_rk3562_robot
...
Which would you like? [1]:

默认选择44 , rockchip_rk3562 。然后进入RK3562的Buildroot目录,开始相关模块的编译。 其中 rockchip_rk3562_32 是32位Buildroot系统编译, rockchip_rk3562_recovery 是用来编译 Recovery 模块。

比如编译rockchip-test模块,常用相关编译命令如下:

  1. 进入buildroot目录

SDK#cd buildroot
  1. 删除并重新编译 rockchip-test

buildroot#make rockchip-test-recreate
  1. 重编 rockchip-test

buildroot#make rockchip-testt-rebuild
  1. 删除 rockchip-test

buildroot#make rockchip-test-dirclean
或者
buildroot#rm -rf output/rockchip_rk3562/build/rockchip-test-master/

若需要编译单个模块或者第三方应用,需交叉编译环境进行配置。比如RK3562其交叉编译工具位于buildroot/output/rockchip_rk3562/host/usr 目录下,需要将工具的bin/目录和aarch64-buildroot-linux-gnu/bin/ 目录设为环境变量,在顶层目录执行自动配置环境变量的脚本:

source buildroot/envsetup.sh rockchip_rk3562

然后输入以下命令查看:

cd buildroot/output/rockchip_rk3562/host/usr/bin
./aarch64-linux-gcc --version

此时会打印如下信息:

aarch64-linux-gcc.br_real (Buildroot) 12.3.0

保存到rootfs配置文件

buildroot$ make update-defconfig

修订历史

修订时间 版本号 修订人 修订内容
2025年3月21号 V0.9 nnewn-kwf 首次创建