Zeratul平台编译
一.Zeratul编译脚本说明
Zeratul平台脚本功能说明表
脚本名称 | 脚本功能 |
Tassadar_env_setup.sh | 确保系统安装了必要工具(make、cpio、lzma、lzop、7z、dd 等),解压SDK内资源及工具链,设置环境变量。 |
build_camera_all.sh | 一键编译并打包。会校验工具链/环境,按需构建 boot、tag、kernel、rootfs、system、recovery、config,并按分区偏移打包成 .bin 固件。 |
build_camera_boot.sh | 根据 SOC、Flash、板卡版本(及可选 Flash 大小)匹配并拷贝预编译 boot 二进制到输出目录。 |
build_camera_config.sh | 主要用于 NAND 场景,生成 config 分区镜像(UBIFS + UBI 封装)并输出 config 文件。 |
build_camera_uImage.sh | 编译摄像机固件内核 uImage,可选重新加载默认 defconfig,最后将产物软链接到配置的内核输出路径。 |
build_camera_drivers.sh | 编译内核模块(make modules + make modules_install)并安装到内核目录下的 _modules 目录;支持强制使用默认 defconfig。 |
build_camera_recovery.sh | 使用 recovery defconfig 编译恢复模式内核镜像(uImage.lzma),并输出 recovery 分区文件。 |
build_camera_rootfs.sh | 组装 rootfs 内容、拷贝内核模块、移除部分 .ko 并软链到 system 分区,最终打包压缩 rootfs(lzma/lzo);也支持使用 root 权限创建设备节点。; 用法: ./build_camera_rootfs.sh; ./build/zeratul/build_camera_rootfs.sh -f -c -b; ./build/zeratul/build_camera_rootfs.sh -o; ./build/zeratul/build_camera_rootfs.sh -t lzo; ./build/zeratul/build_camera_rootfs.sh -r; -f:重新编译驱动; -c:复制用户态程序(脚本保留参数); -b:构建应用(脚本保留参数); -o:仅重打包已有 out rootfs; -t <lzma|lzo>:压缩类型; -r:使用 sudo 创建设备节点 |
build_camera_system.sh | 构建 system 分区镜像;将指定内核模块复制到 system/lib/modules;根据 Flash 类型打包为 squashfs(NOR/NOR_NAND)或 UBIFS/UBI(NAND)。 |
build_camera_tag.sh | 通过 tag 生成工具,按平台/传感器/Flash 配置生成 tag 元数据二进制。 |
pad_camera_u-boot.sh | 基于固定偏移,将自定义 u-boot 内容填充/替换到基础 boot 固件中,生成定制 boot 文件。; 示例:./pad_camera_u-boot.sh -i u-boot-with-spl.bin -o boot_custom -b prebuilt/zeratul_boot/bin/boot_PRJ009ZL_NOR_V1.bin |
build_camera_info.sh | 不支持独立使用。根据环境变量选择内核默认配置文件名称,被build_camera_drivers.sh和build_camera_uImage.sh调用。 |
build_sensor_all.sh | 编译opensource/drivers/sensors目录下所有sensor驱动,并释放到内核 arch/mips/xburst/lib/isp/sensor_PRJ00*下。 |
check_toolchain.sh | 检查当前环境工具链是否正确。 |
check_env.sh | 检查当前路劲SDK版本,LZMA、LZO版本是否正确。 |
二.系统分区编译
2.1 SDK脚本编译
注意:
使用build_camera_all.sh编译所有资源,其实际是调用编译各个分区脚本,若out/camera目录下有相应分区的文件,则不重新编译使用目录下已有的。如果需要重新编译,需要将out/camera目录下相应的分区内容删除,再次执行脚本即可。
使用build_camera_all.sh编译,会使用SDK默认配置,强制覆盖修改内容,如果需要修改分区内容,需要进行手动或者单分区脚本编译;为避免修改内容被覆盖,不建议使用build_camera_all.sh脚本编译。
Zeratul平台编译步骤如下:
步骤1:进入SDK顶层路径“software/board”目录下,输入如下命令,注意的是下面的source命令在每次开启新的终端时候必须输入,否则编译SDK错误!!!
source ./build/Tassadar_env_setup.sh
注意:
source命令在每次开启新的终端时候必须输入,否则编译SDK错误。
2.1.1 单摄配置环境流程:
SDK types: [1] ZERATUL [2] ISVP please enter the SDK type (default 1): 1 SOC Types: [1] PRJ009ZL [2] PRJ009ZN [3] PRJ009ZX [4] PRJ009VL [5] PRJ009VN [6] PRJ009VX [7] PRJ008VNP [8] PRJ008ZL [9] PRJ008ZN [10] PRJ008VL [11] PRJ008VN [12] PRJ008VNP [13] PRJ008DL [14] PRJ007ZL [15] PRJ007ZN [16] PRJ007ZX [17] PRJ007VL [18] PRJ007VN [19] PRJ007VNP [20] PRJ007DL [21] PRJ007VX please enter the SOC type index(default 1): 10 //PRJ007表示的T32,PRJ008表示T33,PRJ009表示T32Pro,后续的字母是对应芯片型号 Flash Types: [1] NOR [2] NAND [3] NOR_NAND [4] EMMC please enter the flash type index(default 1): 1 //选择存储类型 please enter the num of jobs(build threads)(defalt 1): 8 //选择编译的线程个数 Build types: [1] release [2] debug please enter the system build type(defalt 1): 1 //release是正常固件,debug是调试固件,对应系统启动后输出信息不同 please enter the FW sub version(pad to the end of the version string), or leave this empty as default: Flash Size: [1] 16M [2] 8M please enter the flash size index(default 1): 1 //配置flash的大小 Supproted sensor nums: [1] one [2] two [3] three [4] four please enter the SENSOR num(defalt 1): 1 //选择sensor的个数,后续会根据个数来选择sensor型号 Supproted sensors: [1] cv8001 [2] gc2063 [3] gc2083 [4] gc3003 [5] gc4023 [6] gc5603 [7] gc5613 [8] gc8613 [9] gc8613a [10] imx415 [11] os02g10 [12] os02k10 [13] os03a10 [14] os04d10 [15] os06a10 [16] sc200ai [17] sc301iot [18] sc3336 [19] sc3336p [20] sc401ai [21] sc431hai [22] sc4336 [23] sc4336p [24] sc450ai [25] sc501ai [26] sc630ai [27] sc8238 [28] sc231hai please enter the Camera Sensor0 index(defalt 1): 2 //选择sensor的名称 Supproted Linux version: //选择内核的版本 [1] 4.4.94 [2] 3.10.14 [3] 5.15
2.1.2 双摄配置环境流程:
SDK types: [1] ZERATUL [2] ISVP please enter the SDK type (default 1): 1 SOC Types: [1] PRJ009ZL [2] PRJ009ZN [3] PRJ009ZX [4] PRJ009VL [5] PRJ009VN [6] PRJ009VX [7] PRJ008VNP [8] PRJ008ZL [9] PRJ008ZN [10] PRJ008VL [11] PRJ008VN [12] PRJ008VNP [13] PRJ008DL [14] PRJ007ZL [15] PRJ007ZN [16] PRJ007ZX [17] PRJ007VL [18] PRJ007VN [19] PRJ007VNP [20] PRJ007DL [21] PRJ007VX please enter the SOC type index(default 1): 10 Flash Types: [1] NOR [2] NAND [3] NOR_NAND [4] EMMC please enter the flash type index(default 1): 1 please enter the num of jobs(build threads)(defalt 1): 16 Build types: [1] release [2] debug please enter the system build type(defalt 1): 1 please enter the FW sub version(pad to the end of the version string), or leave this empty as default: Flash Size: [1] 16M [2] 8M please enter the flash size index(default 1): 1 Supproted sensor nums: [1] one [2] two [3] three [4] four please enter the SENSOR num(defalt 1): 2 Supproted sensors: [1] cv8001 [2] gc2063 [3] gc2083 [4] gc3003 [5] gc4023 [6] gc5603 [7] gc5613 [8] gc8613 [9] gc8613a [10] imx415 [11] os02g10 [12] os02k10 [13] os03a10 [14] os04d10 [15] os06a10 [16] sc200ai [17] sc301iot [18] sc3336 [19] sc3336p [20] sc401ai [21] sc431hai [22] sc4336 [23] sc4336p [24] sc450ai [25] sc501ai [26] sc630ai [27] sc8238 [28] sc200ai please enter the Camera Sensor0 index(defalt 1): 2 Supproted sensors: [1] cv8001 [2] gc2063 [3] gc2083 [4] gc3003 [5] gc4023 [6] gc5603 [7] gc5613 [8] gc8613 [9] gc8613a [10] imx415 [11] os02g10 [12] os02k10 [13] os03a10 [14] os04d10 [15] os06a10 [16] sc200ai [17] sc301iot [18] sc3336 [19] sc3336p [20] sc401ai [21] sc431hai [22] sc4336 [23] sc4336p [24] sc450ai [25] sc501ai [26] sc630ai [27] sc8238 [28] sc200ai please enter the Camera Sensor1 index(defalt 1): 2 Supproted i2c nums: [1] one [2] two please enter the number of i2c used(defalt 1): 2 Supproted Linux version: [1] 4.4.94 [2] 3.10.14 [3] 5.15 please enter the Linux version index(defalt 1): 2
注:i2c选one表示一根i2c总线挂载两个从机,two则表示两根i2c总线分别挂载两个从机。
按照提示选择后,基础的环境变量就设置完成,并解压了SDK,其他编译脚本会根据这些选项,编译相应的内容。
输入export命令出现ZRT_ENV_**表示终端source环境正确。
zeratul环境

步骤二:在顶层路径使用脚本编译整个固件;
./build/zeratul/build_camera_all.sh
结束后在”board/out/” 目录下生成整个固件。在“out/camera/” 目录下生成各个分区的内容。内容如下:
├── camera │ ├── boot.bin |U-Boot firmware │ ├── recovery.bin |recovery firmware │ ├── _rootfs_camera |system rootfs │ ├── rootfs_camera.cpio.lzma |system rootfs firmware ├── rootfs_camera.cpio.recp-> /***/Tassadar-T32_T33_T32Pro-2.*.*-*-********/software/board/out/camera/rootfs_camera.cpio.jzlzma |Soft connect to target file │ ├── _rootfs_camera_recovery |recovery rootfs │ ├── system |System partition file │ ├── system.bin |System partition firmware │ ├── tag.bin |Tag partition firmware │ ├── uImage.jzlzma |kernel partition firmware │ └── uImage.zrt -> /***/Tassadar-T32_T33_T32Pro-2.*.*-*-********/software/board/out/camera/uImage.jzlzma |Soft connect to target file └── ZRT_SOC_T32ProZN_GC2063_FW.bin |Complete system firmware
脚本对应关系图
在实际使用中脚本调用关系如上图,各个分区的脚本相互独立。
脚本详细使用,请参考software/board/build/zeratul下的README.zh或README.en。
步骤三:烧录整个固件;
具体烧录方法,查看《SDK 使用指南.pdf》。
步骤四:烧录完成后测试基本功能;
往SD卡中拷贝一个对应Sensor的Sample。具体使用方法查看“[第9章 IMP库sample使用]”。
步骤五:测试并挂载SD卡;
在开发板命令行中输入命令,加载并挂载SD卡,注意此脚本的目的是在基础系统环境下测试SD卡,其脚本使用到了MMC驱动,后续使用WIFI模组不再需要此脚本,否则会影响到WIFI加载。
insmod_vfat insmod_mmc
步骤六:查看SD卡内容;
在开发板命令行中输入如下命令进入目录,即可查看SD卡内容:
cd /tmp/mnt/sdcard
步骤七:运行sample测试基本功能。
./sample-Encoder-video
三.系统分区单独编译
3.1 U-Boot使用
Bootload作为系统的引导程序,进行简单的硬件初始化工作;Zeratul的Bootload直接引导操作系统快速启动,因此不能编程,也没有U-Boot的命令行功能。若开发者需要进入U-Boot的命令行进行debug或者执行客户订制程序(如TF卡升级),可以在系统启动后,在命令行输入recovery进入Normal U-Boot。
1. Boot存在于boot分区中,开发者可以替换自己的U-Boot(第二阶段)。U-Boot的源码可以使用software/board/Ingenic-SDK/opensource/uboot下的普通U-Boot源码,编译出U-Boot后,可以通过build/zeratul/pad_camera_u-boot.sh将自己的U-Boot 替换boot.bin的U-Boot (第二阶段)。
在software/board/Ingenic-SDK/opensource/uboot/ 目录的boards.cfg文件中,包含所有支持芯片的编译命令,可以按照需要进行编译,sfcnor后缀代表nor flash启动U-Boot,sfcnand后缀代表nand flash启动U-Boot,msc0代表卡起U-Boot。
SDK中的Ingenic-SDK/resource/prebuilt/zeratul/zeratul_boot/bin 路径下存放编译好的16M flash版本U-Boot(SPL和U-Boot第二阶段)。若需使用更高容量的flash需要重新编译。
使用方法:
usage:
./pad_camera_u-boot.sh -i <input_file> -o <output_file> -b <boot.bin fw>
eg:
./pad_camera_u-boot.sh -i u-boot-with-spl.bin -o boot_custom -b ${ZRT_ENV_TOP_DIR}/firmware/camera/bootloader/boot.bin命令说明:
-i: 指定输入文件,通常为常规U-Boot编译生成的u-boot-with-spl.bin(从固定偏移拷贝U-Boot到指定文件的偏移处);
-o:指定输出文件名称;
-b:指SDK resource/prebuilt/zeratul/zeratul_boot/bin路劲下的Bin文件,或者客户自己维护的包含Bootload和U-Boot(第二阶段)的Bin文件。
注意:脚本生成的文件大小,请小于分区大小。
1. Boot打印版本说明: U-Boot打印版本说明表
V:240920-PRJ007ZN-0861515-LP | 240920:此U-Boot编译日期2024年9月20日 |
PRJ007ZN:T32 ZN 系列 | |
0861515:君正内部维护版本commit | |
HP:性能版本。; 其他:HP高性能,LP低性能 |
3.2 Tag编译
“software/board/Ingenic-SDK/resource/tools/zeratul/make_tag”目录下有如图 4-3内容。
make_tag内容图
若需要添加新的sensor,需要在上述目录下制作对应的bin文件。目录功能说明如下:
riscv_fw:文件的内容是riscv初始化对应sensor的固件。
sensor_init_setting:存放 sensor 初始化配置文件。PRJ009_<sensor>_init.c 需要手动制作,并须遵循此命名格式。
sensor_calibration_bin:存放sensor的图像效果文件。
sensor_start_table:可以根据实际sensor使用进行添加修改。其中包括IRCUT、IRLED、引脚定义,ADC阈值设置等。具体使用可以参考目录下源码。
详细文档说明请查看《Zeratul 平台TAG工具使用指南》。
3.2.1使用脚本生成TAG
修改make_tag之后,在顶层目录执行以下命令编译tag:
./build/zeratul/build_camera_tag.sh
3.2.2 对新的sensor添加tag
请查看《Zeratul 平台Sensor添加及调试说明》文档。
3.2.3 更改cmdline分区大小
详细文档说明请查看《Zeratul 平台TAG工具使用指南》。
四.Kernel编译
4.1 手动编译Kernel
进入”opensource/kernel-x.xx.xx/arch/mips/config”目录,此目录下包含常规、Zeratul平台、Atlas平台的内核配置文件。
例如PRJ009_zeratul_nor_camera_defconfig含义为:zeratul代表Zeratul 系统。PRJ007代表T32系列芯片,PRJ008代表T33系列芯片,PRJ009代表T32Pro系列芯片。
kernel板级选择表
PRJ007_zeratul_nor_camera_debug_defconfig; PRJ008_zeratul_nor_camera_debug_defconfig; PRJ009_zeratul_nor_camera_debug_defconfig | T32/T33/T32Pro Nor flash Zeratul Linux debug模式系统配置 |
PRJ007_zeratul_nor_camera_defconfig; PRJ008_zeratul_nor_camera_defconfig; PRJ009_zeratul_nor_camera_defconfig | T32/T33/T32Pro Nor flash Zeratul Linux系统配置 |
PRJ007_zeratul_nor_camera_recovery_defconfig; PRJ008_zeratul_nor_camera_recovery_defconfig; PRJ009_zeratul_nor_camera_recovery_defconfig | T32/T33/T32Pro Nor flash Zeratul recovery 系统配置 |
根据不同根根据不同的存储介质选择:
make PRJ007_zeratul_nor_camera_defconfig //T32 make PRJ008_zeratul_nor_camera_defconfig //T33 make PRJ009_zeratul_nor_camera_defconfig //T32Pro
然后输入命令:
make uImage
最后生成在目录arch/mips/boot/生成四种文件:
kernel格式对应表
Kernel 镜像 | 说明 |
uImage.zrt | 未压缩的原始kernel固件 |
uImage.lzo | 标准lzo压缩的kerenl固件 |
uImage.jzlzma | 君正lzma协议压缩的kernel固件 |
uImage.lzma | 标准lzma压缩的kernel固件 |
推荐使用jzlzma格式kernel。uImage.lzma仅recovery系统支持。
4.2 使用脚本编译Kernel
在SDK工程顶层目录输入如下命令:
./build/zeratul/build_camera_uImage.sh
脚本会根据编译环境使用arch/mips/configs下的默认配置,并编译内核,编译完成同时拷贝到“out/camera”目录下。
脚本支持加入如下参数使用。例如:
./build/zeratul/build_camera_uImage.sh -j8 -f
使用8线程编译,并且强制写入.configs,使用默认配置编译内核。
-f 参数 | 默认使用arch/mips/configs 下相应的配置,强制替换写入.config。; 注意:会掉替换更改的内容 |
-j 参数 | 使用多线程编译默认使用-j1 |
五.rootfs编译
SDK中提供了5.4.0工具链编译好的根文件系统,根据实际需求选择相应版本;在实际的使用过程中,只要将相应版本的文件系统进行压缩就可以使用。
5.1 使用脚本生成根文件系统
在顶层目录下输入如下命令:
./build/zeratul/build_camera_rootfs.sh -f
脚本实际操作是对 rootfs/rootfs_camera 目录的内容进行操作后拷贝到 out/camera/,重新命名为 _rootfs_camera,然后将 _rootfs_camera 进行 jzlzma 压缩生成 rootfs_camera.cpio.jzlzma。rootfs_camera.cpio.jzlzma 就是实际烧录进 rootfs 分区的内容。
这里注意的是,如果我们单独使用build_camera_rootfs.sh脚本编译可能会丢失一些驱动,可以加上 -f 参数来拷贝必要的ko文件。
脚本执行参数描述表
参数 | 说明 |
-o 参数 | 删除 out/camera/rootfs_camera.cpio.jzlzma,只对其目录下 _rootfs_camera 重新压缩。方便往 _rootfs_camera 添加其他内容 |
-f 参数 | 重新对驱动进行编译,并拷贝到_rootfs_camera后,再压缩。 |
六.recovery编译
注意:
recovery是分区名称,实际烧录的是一个完整OS系统,所以编译recovery的时候类似编译内核一样,详细介绍看系统分区设置一章。
如果需要更高的压缩率,可以选择LZMA压缩方式。但是需要注意LZMA工具版本,低版本会出现LZMA格式错误。
6.1 手动编译recovery
进入software/board/Ingenic-SDK/opensource/kernel-3.10.14 目录,输入以下命令列出选项,如下图:
ls arch/mips/configs/
例如使用nor flash。在PC终端的输入如下命令:
make PRJ007_zeratul_nor_camera_recovery_defconfig //T32 make PRJ008_zeratul_nor_camera_recovery_defconfig //T33 make PRJ009_zeratul_nor_camera_recovery_defconfig //T32Pro
然后输入如下命令,进行编译:
make uImage
生成的uImage文件即烧录到recovery分区文件。
七.脚本编译
在顶层目录输入如下命令使用脚本进行编译:
./build/zeratul/build_camera_recovery.sh
参数 | 说明 |
-r 参数 | 将software/board/Ingenic-SDK/opensource/kernel路径下的配置文件.config 备份一份,然后distclean。编译完成后再还原.config文件 |
-j 参数 | 使用多线程编译 |
“out/camera”下生成recovery.bin文件。
八.system编译
system 脚本执行编译默认会删除 out/camera 下的 system 文件夹,所以直接在其文件夹内添加其他内容是无效的。如果添加补充文件可以在 resource/rootfs/<工具链>/camera/system 目录下。
在顶层目录下执行脚本:
./build/zeratul/build_camera_system.sh
或者对添加其他内容后的out/camera/system文件夹,进行手动的压缩,然后重新烧录system分区来达到添加其他文件目的。具体命令为:
mksquashfs system system.bin -comp xz
九.IMP 库sample使用说明
SDK在路径software/board/Ingenic-SDK/media下,提供了供开发者使用的IMP库文件。
步骤一:确认sensor 输出分辨率、I2C地址,例如GC2063 1080P,I2C ADDR 0x37;
步骤二:打开sample-common.h,修改对应的sensor信息。其中以下信息必须填写;
FIRST_SNESOR_NAME FIRST_I2C_ADDR FIRST_SENSOR_WIDTH FIRST_SENSOR_HEIGHT
步骤三:编译sample。生成对应可执行程序;
$ make sample-Encoder-video
步骤四:将可执行程序拷到板子上,后台执行代码;
$./sample-Encoder-video &
步骤五:执行debug 命令,并查看录像文件;
$ logcat $ ls /tmp
Sample 文件 | 说明 |
sample-KernEnc.c | 当内核打开内核编码后,该程序仅获取kernel启动阶段时的编码流。 |
sample-KernEnc-video.c | 当内核打开内核编码后,该程序实现获取kernel启动阶段的编码流和应用层阶段编码出流以及JPEG抓图的基础功能。 |
sample-Snap-Kernel-raw.c | 该程序实现获取kernel启动阶段的raw图功能 |
sample-Snap-Kernel-yuv.c | 该程序实现获取kernel启动阶段的yuv图功能 |
sample-Joint-KernEnc-video.c | 当内核打开内核编码后,该程序实现获取kernel启动阶段的拼接编码流和应用层阶段拼接编码出流 |
注意:
1. 上述sample详细说明,请参考software/board/Ingenic-SDK/media/zh/samples/libimp-samples/zeratul 下README。
2. 应用阶段,可使用其它常规sample。
3. sample运行请注意cmdline中的分辨率(init_vw/init_vh)和sample中的分辨率是否一致,不一致请修改sample或者使用tag_env_info修改cmdline中分辨率,工具使用方法请参考《Zeratul 平台TAG工具使用指南》。
4. 应用层启动之前,内核数据流情况如下:
1. 未开内核编码,ISP输出填充满ISP Buffer之后,ISP不会更新覆盖Buffer已有数据。
2. 开内核编码,编码Buffer填满之后,ISP不会更新覆盖ISP Buffer已有数据,编码Buffer数据也不会被覆盖。
十.ISP驱动及其它驱动编译替换
10.1 ISP驱动编译替换
ISP驱动路劲:software/board/Ingenic-SDK/opensource/drivers/isp/
Zeratul ISP驱动路劲:software/board/Ingenic-SDK/opensource/kernel-x.xx.xx/arch/mips/xburst/lib/isp
替换方式:
1. 从最新SDK的内核Zeratul ISP路劲下拷贝。
2. 拷贝更新ISP 驱动路劲内容,先使用Zeartul配置编译内核,进入ISP 驱动路劲执行 make,执行完成,会自动释放ISP驱动到Zeratul ISP驱动路劲。
10.2 其它驱动编译
Zeratul平台为了降低内核的启动时间和内核ISP的启动时间,采用把一些驱动编译成KO的外部加载方式。
编译方法:内核编译完成后,在当前内核路劲下,执行 make modules,则会生成相应的KO驱动。
注意:
1. 开发者根据实际需求,在配置文件中,选择把对应驱动编译到内核,还是单独的KO驱动。
2. 制作文件系统脚本 ./build/zeratul/build_camera_rootfs.sh 会在内核路劲下执行 make modules,并把KO文件放在 rootfs/lib/modules/下。
在文件系统的/usr/bin目录下,存在各个模块驱动加载的脚本,会在不同阶段被调用来加载对应的驱动。

如 /etc/init.d/rcS 中调用 /usr/bin/insmod_sfc 来加载 sfc 驱动。