跳到主要内容

SDK 固件编译

本章节主要介绍获取V821 SDK后,如何编译SDK,以及编译SDK中的单个组件。如果您已拿到V821的开发板,想快速进入Demo演示和体验,可先跳过本章节,进入到 SDK固件烧录章节。

SDK 整体编译

检查SDK文件

下载完成后的 SDK 应有如下文件,可以使用 ls 或者 tree -L 1 命令检查

.
├── brandy
├── bsp
├── build
├── build.sh -> build/top_build.sh
├── device
├── kernel
├── openwrt
├── platform
├── prebuilt
├── rtos
└── tools

10 directories, 1 file

image-20241121101633861

初始化环境

使用命令 source build/envsetup.sh 初始化SDK编译环境,初始化后便可以使用快捷指令与SDK相关指令。

image-20241121101757735

选择方案

使用命令 lunch 选择编译的方案,这里以选择 v821-perf2-tina 为例,选择 4

image-20241121101927912

阅读免责声明

如果是一次下载使用SDK,lunch 选择方案后,需要等待8s来阅读免责声明,并按提示输入Y并回车确认接受免责声明。输入之后这份SDK,再做其他操作不会再有这个等待和提示。

image-20241121102029771

等待初始化环境

确认后需要等待 SDK 解压工具链,初始化开发环境

image-20241121102242572

演示

Loading asciinema cast...

完整编译SDK

使用命令 mmake 完整编译 SDK,也可以使用快捷命令 mp 执行编译和打包的动作。可以使用 m -jN 参数N为并行编译进程数量,依赖编译服务器CPU核心数,如 4 核PC,可 m -j4

image-20241121102354528

打包固件

SDK 编译完成,需要使用pack命令打包固件,其会在out目录下输出固件

image-20241121112712423

可以在 SDK 目录中的 out 文件夹找到

image-20241121113202600

SDK 组件单独编译

在开发过程中,会需要单独编译某一模块,但是完整编译太慢效率较低,这时可以使用单编命令。

命令作用作用范围
mboot编译boot0和ubootboot0和uboot
mboot0编译boot0boot0
muboot编译ubootuboot,uboot设备树
mkernel编译内核内核,设备树
mrtos编译rtos镜像rtos镜像
mkmpp编译eyesee-mpp-middlewareeyesee-mpp-middleware
cleanmpp清除eyesee-mpp-middleware的编译eyesee-mpp-middleware

编译内核与内核设备树

使用命令 mkernel 可以单独编译内核与设备树,之后可以用 p 命令打包固件,编译后的 Kernel 固件会自动拷贝到 out 目录下 out/kernel/build

mkernel

image-20241121113704394

编译 RTOS

RTOS 可以使用 mrtos 编译,编译完成后使用 pack 打包,编译后的 RTOS 固件会自动拷贝到 device 目录下对应板级配置中。例如这里使用的 v821-perf2 板,会拷贝到 device/config/chips/v821/configs/perf2/bin/amp_rv0.bin

image-20241121131758433

清理 RTOS 编译

可以使用 mrtos clean 命令清除上一次的 RTOS 编译产物。

image-20241121133001013

编译 U-Boot 与 U-Boot 设备树

U-Boot 可以使用muboot目录编译,编译前会自动执行 clean 清除之前的编译产物。编译完成后使用 pack 打包,输出的 U-Boot 文件会自动拷贝到 device 目录下对应板级配置中。例如这里使用的 v821-perf2 板,会拷贝到 device/config/chips/v821/configs/perf2/bin

muboot

image-20241121113807877

编译 SPL

SPL 可以用 mboot0 来编译,编译前会自动执行 clean 清除之前的编译产物。编译完成后使用 pack 打包,输出的 boot0 文件会自动拷贝到 device 目录下对应板级配置中。例如这里使用的 v821-perf2 板,会拷贝到 device/config/chips/v821/configs/perf2/bin

image-20241121132019013

编译 U-Boot和SPL

可以使用命令 mboot 同时编译 U-boot 和 SPL,编译前会自动执行 clean 清除之前的编译产物。该命令会先编译 U-Boot 然后再编译 SPL

image-20241121132225318

编译 MPP

可以使用 mkmpp 命令单独编译 mpp,请注意编译前需要在 menuconfig 中配置需要编译的软件包

image-20241121133134042

清除 MPP 编译

使用 cleanmpp 命令清除 MPP 编译产物

image-20241121133734468

单独编译某一软件包

SDK 支持单独编译某一软件包,方便加速开发,这里以 mtd-utils 为例,介绍单独编译某一软件包的方法

以 Package 方式编译

make openwrt_rootfs package/mtd-utils/compile
make openwrt_rootfs package/mtd-utils/clean
  • package 是指在 openwrt/openwrt/package, 和 openwrt/package 目录下搜索该软件包。 tools 是指在 openwrt/openwrt/tools 下搜索
  • mtd-utils 是定义软件包的 Makefile 所在目录的目录名,编译其他软件包时,替换该字段即可
  • compile 换成 clean 是清理软件包编译文件

image-20241122145226535

以路径方式编译

也可以使用软件包 Makefile 所在目录相对于openwrt原生代码根目录的相对路径来直接指定编译软件包

  • mtd-utils 软件包位置:openwrt/openwrt/package/utils/mtd-utils

编译指令:

make openwrt_rootfs package/utils/mtd-utils/compile
make openwrt_rootfs package/utils/mtd-utils/clean

image-20241122145355482

SDK为了区分openwrt原生代码与新增代码,软件包的 Makefile 放在 openwrt/package/ 目录下,但编译时需嵌入到 openwrt 原生代码的标准路径,SDK 使用了软链接方式,将其软链接到 openwrt/openwrt/package/subpackage。这里以 eyesee-mpp-middleware包为例:

  • 实际位置:openwrt/package/allwinner/eyesee-mpp/middleware

  • 软链接之后的位置:openwrt/openwrt/package/subpackage/allwinner/eyesee-mpp/middleware

编译指令:

make openwrt_rootfs package/subpackage/allwinner/eyesee-mpp/middleware/compile
make openwrt_rootfs package/subpackage/allwinner/eyesee-mpp/middleware/clean

image-20241122145514473

以快捷指令方式编译

SDK 提供一个快捷指令:mmo 只需要在 mmo 指令后面跟上需要编译的软件包名即可编译

mmo mtd-utils

image-20241122150151448

如果需要清理上一次编译产物,重新编译,则使用 mmo -B 命令

mmo mtd-utils -B

image-20241122150300081

前往文件夹下编译

SDK 也支持在文件夹下编译软件包,例如 mtd-utils 位于 package/utils/mtd-utils,可以前往文件夹单独编译这个软件包

编译指令:

cd openwrt/openwrt/package/utils/mtd-utils
mm # 编译软件包、
mm -B # 先 clean 后重新编译软件包

image-20241122152438273

SDK 客制化编译

V821 SDK提供 quick_config 功能,执行对应命令,可快速一键修改该功能相关的所有配置项。

使用 quick_config

lunch 后, 输入 quick_config 命令回车:

$ quick_config
Available Quick Config Name:
0 musl_toolchain : Change this board cross toolchain to musl
1 glibc_toolchain : Change this board cross toolchain to glibc
2 set_cpu_vf_0 : Set cpu 960mhz (0.92v)
3 set_cpu_vf_2 : Set cpu 1200mhz (1.00v)
4 kernel compression lzma : Set kernel compression method to lzma.
5 kernel compression gzip : Set kernel compression method to gzip.
6 kernel compression none : Set kernel compression method to none.
7 v821_smac : Set v821 smac for this board
8 v821_smac_etf : Set v821 smac_etf for this board
9 v821_fmac_etf : Set v821 fmac_etf for this board
10 memory_optimization : Set memory optimization for kernel, will disable some less commonly used functions
11 product_close_debug_config : Close debug configs for mass production
12 mpp_compile_dynamic_lib : Set mpp compile dynamic lib for this board
13 mpp_compile_static_lib : Set mpp compile static lib for this board
14 de_resize_config : Open de resize function for person detection
15 debug_linux : Open kallsyms and debug_fs for kernel debug
16 debug_rtos : Open rtos uart for rtos debug, will disable sdc0
17 secure_firmawre : Set to build secure firmawre for this board
18 default_sensor_config : Set to default camera config (gc1084)
19 one_gc1084_sensor : Set one camera of gc1084 online for this board
20 one_gc2083_sensor : Set one camera of gc2083 online for this board
21 one_sc2336_sensor : Set one camera of sc2336 online for this board
22 one_nvp6158c_sensor : Set nvp6158c 2h for this board
23 one_sc3336_sensor(2in1) : Set one camera of sc3336 2in1 mode for this board
24 one_gc4663_sensor(2in1) : Set one camera of gc4663 2in1 mode for this board
25 one_f37p_sensor : Set one camera of f37p online for this board
26 one_imx258(af)_sensor : Set one camera of imx258(af) online for this board
27 dual_gc1084_sensor : Set dual camera of gc1084 for this board
28 one_gc2083_and_one_os02g10_sensor : Set dual camera of gc2083 and os02g10 for this board, mipi and dvp
29 dual_gc2083_sensor : Set dual camera of gc2083 for this board, sensora: 0x6e, sensorb: 0x7e
30 dual_gc2083_sensor(stitch_mode) : Set dual camera of gc2083 for this board, sensora: 0x6e, sensorb: 0x7e
31 dual_sc2336_sensor : Set dual camera of sc2336 for this board, sensora: 0x60, sensorb: 0x64
32 change_to_emmc : Set device storage to emmc
33 change_to_nand : Set device storage to spi nand
34 e907_isp : Set e907 to run isp server
35 e907_dual_isp : Set e907 to run isp server (dual sensor)
36 lcd_nv3049f_480_854 : Set to support lcd nv3049f
37 pl2_pl3_uart3 : Set debug uart to pl2 pl3 with uart3
Which would you like?
  • 输入 quick_config 命令后,根据需要,选择上面序列号并回车,回车输入y(注意输入y后会修改本地环境的一些配置),就会自动修改相关配置文件,具体修改了哪些文件,执行y命令后会全部打印显示出来。请注意留意有些配置项输入y之后会提示一些额外操作,确保配置生效。
  • 输入 quick_config 命令后,若不需选择,直接回车即可,不会修改任何文件。
  • 使用 quick_config 命令配置后,这些改动是直接修改SDK中相关的文件,目前不支持清理命令。如果需要清理这些修改,需要手动使用 git 命令清理,或者根据 quick_config 命令执行后的提示,恢复相关的配置项。

quick_config 使用示例

切换板级摄像头到双目GC2083

更换摄像头模组为双目模组,可以使用 quick_config 修改配置到双目 GC2083 模组,输入 qucik_config 后可以看到选项 one_gc2083_sensor 编号为22,输入后即可切换配置。

Loading asciinema cast...

切换板级摄像头到双目GC2083

更换摄像头模组为双目模组,可以使用 quick_config 修改配置到双目 GC2083 模组,输入 qucik_config 后可以看到选项 dual_gc2083_sensor 编号为9,输入后即可切换配置。

image-20241121134552216

切换储存介质为 SPI NAND

切换储存器为NAND,输入 quick_config,可以看到用于切换的quick_config 是18,输入 18,之后会出现一个确认项,确认后将会自动执行其配置操作。

image-20241121134221893

切换 MPP 为动态库编译

默认配置下,MPP 是静态库编译的,这里可以用 quick_config 切换到动态库编译。输入 quick_config 选择选项 19,然后确认

image-20241121134711920

在切换后有提示,需要手动清除 mpp 的编译产物重新编译 mpp

image-20241121134759504

切换工具链为glibc库

SDK 默认配置使用的库是 MUSL 库,可以通过 quick_config 切换到使用 glibc 库。输入 quick_config 然后选择选项。

注意部分 quick_config 在执行前需要有其他的操作,请按照提示进行操作,例如切换工具链,会有如下提示。如果没按照要求执行可能会导致SDK无法编译通过,quick_config 也对部分文件做了检查,如果无视提示直接跳过,会直接报错。

例如这里,SDK 提示需要删除编译产物,需要手动执行 make distclean 然后再执行切换工具链的操作。

image-20241121134934915

如果无视,没有执行清理编译产物的操作,则报错退出

image-20241121135052420

执行了 make distclean 后,正常操作

image-20241121135509797

SDK 新建板级方案

在开发时,通常会建立一个新的板级方案来开发,下面将介绍如何建立板级方案

在建立方案之前,需要了解当前板级的配置,以选择当前某一板级作为基础在上面二次修改

方案名对应开发板方案说明
v821-ipc-tinaV821 IPC板单目gc1084常电方案(内置WIFI)
v821-perf2-tinaV821 PERF2板单目gc1084常电方案(内置WIFI)
v821-perf2_fastboot-tinaV821 PERF2板单目gc1084快启方案(内置WIFI)
v821-perf2b-tinaV821 PERF2B板单目gc1084常电方案(内置WIFI)
v821-perf2b_fastboot-tinaV821 PERF2B板单目gc1084低功耗快启方案(内置WIFI)

这里将以 perf2 开发板,详解如何新建一个自己的板级方案 v821-custom

使用脚本新建板级方案

V821 Tina Linux 提供了新建板级脚本 create_new_board

  1. 首先 lunch 作为基础的板级,这里执行 lunch v821-perf2-tina 导入作为原型的板级

  2. 然后执行命令 create_new_board 输入新建板子的名称,这里只需要输入名称即可,不需要带芯片型号,另外名称不支持 - 符号,支持下划线。这里输入 custom 即可创建 v821-custom 板级

  3. 按照提示,执行 source build/envsetup.sh && lunch 即可选择新板级开发

Loading asciinema cast...

  • 注:使用 create_new_board 命令配置后,这些改动是直接修改SDK中相关的文件,目前不支持清理命令。如果需要清理这些修改,需要手动使用 git 命令清理,或者根据 create_new_board 命令执行后的提示,恢复相关的配置项。

手动创建新板级

新建 device

前往目录 device/config/chips/v821/configsperf2 板级复制一份,命名为 custom

image-20241121143706220

修改两份 BoardConfig 包括 BoardConfig.mkBoardConfig_nor.mkLICHEE_RTOS_PROJECT_NAME 改为新方案对应的名字, v821_e907_custom,稍后将创建该名字的 RTOS 方案。

image-20241121143952890

新建 target

前往 openwrt/target/v821/ 目录,将 perf2 拷贝一份,重命名为 v821-custom

image-20241121144225730

进入 v821-custom 文件夹,将 v821_perf2-setup.sh 改名 v821_custom-setup.sh

image-20241121144459152

编辑 Makefile 将文件中的 perf2 改为 custom

image-20241121144714878

编辑 vendorsetup.shperf2 改为 custom

image-20241121144828945

新建 rtos

前往rtos/board/v821_e907,将 perf2 复制一份改名为 custom,这个文件夹内配置了方案RTOS的引脚文件,可以按需修改。

image-20241121144947767

前往 rtos/lichee/rtos/projects/v821_e907 目录,复制 perf2 改名为 custom

image-20241121145241130

编辑该目录下的 Makefile 增加一行,注意 CONFIG_PROJECT_V821_E907_CUSTOM 名字也需要改

obj-$(CONFIG_PROJECT_V821_E907_CUSTOM) += custom/

image-20241121145347446

回到上一级目录 rtos/lichee/rtos/projects 修改 Kconfig 增加新板级配置,这里的 config 名字需要与上面的 CONFIG_PROJECT_V821_E907_CUSTOM 同步

config PROJECT_V821_E907_CUSTOM
bool "v821 e907 custom system"
select PROJECT_V821_E907
---help---
v821 e907 custom system

image-20241121145521914

同步配置

在上面的操作完成后,还需要同步配置使得编译的产物正确

(1)刷新板级列表

使用命令 source build/envsetup.shlunch 载入新板级配置。

image-20241121145757010

(2)同步 Kernel 配置

输入 m kernel_menuconfig 什么都不修改,直接退出即可

image-20241121145922051

(3)同步应用配置

使用命令 m menuconfig 进入配置页面,选择第一项 Target System,将其改到新板级

image-20241121150100060

(3.5)同步 OTA 应用配置(可选)

部分板级支持 OTA,需要同步 OTA 板级配置,使用命令 m ota_menuconfig 进入配置页面,选择第一项 Target System,将其改到新板级,其配置方法与同步应用配置类似。

(4)RTOS 板级同步

运行 mrtos menuconfig 进入配置页面,找到 Projects Options ---> 进入

image-20241121150635958

找到 Configure Application 改为新加的 v821 e907 custom system,保存退出

image-20241121150709879

此时便完成了板级的新建,使用 mp 命令编译吧

image-20241121150938458

SDK 快捷命令

SDK 提供了一系列方便开发的快速跳转指令,在开发过程中可以使用这些指令快速跳转目录,执行操作。

命令命令有效目录作用
maketina根目录编译整个sdk
packtina根目录打包固件
mtina下任意目录make的快捷命令,编译整个sdk
ptina下任意目录pack的快捷命令,打包固件
m menuconfigtina下任意目录任意目录启动软件包配置界面
m kernel_menuconfigtina下任意目录任意目录启动内核配置界面
mrtos menuconfigtina下任意目录任意目录启动内核配置界面
croottina下任意目录快速切换到tina根目录
cconfigstina下任意目录快速切换到方案的bsp配置目录
cplattina下任意目录快速切换到tina方案配置目录
couttina下任意目录快速切换到方案的输出目录
cboot0tina下任意目录快速切换到boot0源码目录
cboottina下任意目录快速切换到uboot源码目录
ckerneltina下任意目录快速切换到linux源码目录
cbsptina下任意目录快速切换到bsp驱动源码目录
crtostina下任意目录快速切换到rtos源码目录
cgreptina下任意目录在c/c++/h文件中查找字符串
mm [-B]软件包目录编译软件包,-B指编译前先clean
cmpp_stina下任意目录快速切换到mpp middleware源码目录
cmpp_ptina下任意目录快速切换到mpp middleware配置目录
clibcedarc_stina下任意目录快速切换到libcedarc软件包目录
clibcedarc_ptina下任意目录快速切换到libcedarc配置目录
crtmedia_stina下任意目录快速切换到rt-media源码目录
crtmedia_ptina下任意目录快速切换到rt-media配置目录