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模块,常用相关编译命令如下:
进入buildroot目录
SDK#cd buildroot
删除并重新编译 rockchip-test
buildroot#make rockchip-test-recreate
重编 rockchip-test
buildroot#make rockchip-testt-rebuild
删除 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 | 首次创建 |