4、V853 SDK框架解析:SDK目录结构、关键组件(BSP、Kernel、Rootfs)、编译系统(mksunxi)

好,咱们今天来啃一块硬骨头——V853的SDK框架。

说实话,我第一次拿到全志这套SDK的时候,头都大了。目录一层套一层,光看名字根本猜不到是干嘛的。但后来摸熟了才发现,这结构其实挺讲究的。你想想看,一个芯片要跑Linux,又要跑AI,还要处理视频流,不乱才怪。

所以这一章,我就带你把它拆开揉碎。咱们不搞什么「首先其次最后」,直接看干货。

4.1 SDK顶层目录结构

先看根目录下都有啥。你解压完SDK,第一眼看到的大概是这样:

V853_Linux_SDK/
├── brandy/          # 启动引导相关
├── build/           # 编译脚本和配置
├── buildroot/       # 根文件系统构建
├── device/          # 设备树、分区表、板级配置
├── kernel/          # Linux内核源码
├── lichee/          # 全志BSP核心包
├── out/             # 编译输出目录
├── tools/           # 烧录、调试工具
├── .repo/           # repo管理仓库
├── Makefile         # 顶层Makefile
└── mksunxi.sh       # 一键编译脚本

嗯,这里要注意:lichee/ 这个目录,很多人以为是放荔枝的,其实它是全志BSP的代号。我习惯叫它「核心套件」,因为里面包含了芯片底层几乎所有东西。

我的经验:刚入门时,别在 brandy/device/ 里花太多时间。先把 kernel/buildroot/ 搞明白,项目就能跑起来了。

4.2 关键组件之一:BSP(Board Support Package)

BSP说白了就是「芯片的翻译官」。它把Linux内核的通用接口,翻译成V853硬件能听懂的话。

BSP主要藏在 lichee/ 目录下,我挑几个重要的说:

  • boot0/uboot:第一级和第二级引导程序。负责初始化DDR、加载内核。
  • sunxi drivers:全志自己写的驱动,比如显示、编解码、ISP。
  • arisc:Cortex-M4协处理器的固件。这个我后面会专门讲。
  • tools:一些板级调试工具,比如 sunxi-fel

我曾经在调MIPI屏的时候,死活点不亮。折腾了两天,最后发现是BSP里一个时序参数配错了。从那以后,我每次改BSP都会先看 lichee/tools 下的验证脚本。

小技巧:BSP里的驱动,很多是闭源的。如果你遇到奇怪的问题,先查 lichee/linux-4.9/drivers/sunxi/ 下的日志打印。全志的工程师其实留了不少调试口子。

4.3 关键组件之二:Kernel(Linux内核)

V853用的是Linux 4.9内核。为什么选这个版本?我猜是因为它稳定,而且全志在这个版本上积累了大量补丁。

内核目录结构跟标准Linux差不多,但有几个地方你要特别关注:

路径 说明 我踩过的坑
arch/arm/boot/dts/ 设备树文件,定义硬件资源 GPIO复用配错,导致I2C无法通信
drivers/media/platform/sunxi/ 视频采集和ISP驱动 帧率上不去,发现是buffer没对齐
drivers/net/wireless/ WiFi和蓝牙驱动 模块加载顺序不对,死机
drivers/video/fbdev/sunxi/ 显示驱动框架 双屏异显时,图层叠加搞混了

为什么会这样?因为全志把很多硬件细节都藏在了设备树里。你改一个 dts 文件,可能比改十行C代码还管用。

注意:内核配置别乱改。我见过有人把 CONFIG_PREEMPT 打开,结果AI推理的实时性反而变差了。内核不是越新越好,也不是选项越多越好。

4.4 关键组件之三:Rootfs(根文件系统)

Rootfs就是你的系统跑起来后,能看到的所有文件和目录。V853 SDK用Buildroot来构建它。

Buildroot的好处是:你配一个 defconfig,它就能自动下载、编译、打包所有软件包。坏处是:第一次编译能让你等到怀疑人生。

我建议你重点关注这几个目录:

  • buildroot/package/:所有第三方软件包的编译脚本。比如 python3opencvtflite
  • buildroot/board/v853/:板级配置,包括分区大小、文件系统类型。
  • buildroot/fs/:文件系统构建逻辑。默认是 squashfs,只读的,适合量产。

嗯,这里有个坑:默认的Rootfs很小,只有几十兆。你如果想把AI模型放进去,得先改分区表。我一般会在 device/config/chips/v853/configs/default/ 下把 sys_partition.fex 里的 rootfs 分区调大。

我的习惯:调试阶段用 initramfs,把Rootfs直接打进内核。这样改完文件系统不用重新烧录,重启就行。量产时再切回 squashfs

4.5 编译系统:mksunxi.sh 深度解析

终于说到编译了。你可能会问:为什么全志要自己搞一套编译系统,而不是直接用 make

原因很简单:因为要编译的东西太多了。BSP、内核、Rootfs、NPU模型、第三方库……如果全靠手动敲命令,一天啥也别干了。

mksunxi.sh 就是那个「一键搞定」的脚本。它的核心流程是这样的:

# 简化后的mksunxi.sh执行流程
1. source build/envsetup.sh    # 加载环境变量
2. lunch                      # 选择板型配置
3. make -j8                   # 并行编译
4. pack                       # 打包成烧录镜像

但实际没那么简单。我拆开给你看:

  1. 环境初始化:设置交叉编译器路径、导出 ARCH=armCROSS_COMPILE=arm-linux-gnueabihf-
  2. 配置选择lunch 命令会列出所有支持的板型。比如 v853_linux_evbv853_linux_ai
  3. 分步编译:先编BSP(uboot、boot0),再编内核,最后编Rootfs。每一步都有独立的 Makefile
  4. 打包镜像:把所有 .bin.img 文件拼成一个 v853_linux_evb.img,直接烧录到SD卡或eMMC。

避坑指南:我曾经在 make -j16 时把服务器搞崩了。全志的SDK对并行编译支持一般,建议用 -j4-j8。还有,第一次编译一定要联网,因为Buildroot会下载很多源码包。

4.6 实战:从零编译一个可运行的镜像

光说不练假把式。咱们走一遍完整流程:

# 1. 进入SDK根目录
cd V853_Linux_SDK/

# 2. 加载环境
source build/envsetup.sh

# 3. 选择板型(我选AI开发板)
lunch v853_linux_ai

# 4. 开始编译(第一次大概要1-2小时)
mksunxi.sh

# 5. 编译完成后,镜像在 out/ 目录下
ls out/v853_linux_ai.img

嗯,这里要注意:如果你只改了内核驱动,可以用 mksunxi.sh kernel 单独编译内核,然后用 mksunxi.sh pack 重新打包。这样能省不少时间。

我的经验:我习惯在 build/ 目录下建一个 myconfig.sh,把常用的编译选项写进去。比如:

#!/bin/bash
export PATH=$PATH:/opt/gcc-linaro-7.5.0/bin
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make -j4

这样每次编译就不用重新敲环境变量了。

4.7 总结与思考

V853的SDK框架,说白了就是三层:BSP管硬件、Kernel管调度、Rootfs管应用。编译系统 mksunxi.sh 把这三层串起来。

你可能会问:我能不能只改其中一层?当然可以。但要注意接口一致性。比如你改了BSP里的DDR频率,内核的设备树也得同步更新,否则系统起不来。

我记得有一次,我为了优化AI推理速度,把NPU频率调高了。结果忘了改内核的电压调节策略,芯片直接过热重启。嗯,从那以后我改任何参数都会先看三遍文档。

下一章,咱们会深入NPU驱动和模型部署。到时候你会发现,今天讲的SDK框架,就是后面所有操作的地基。


公众号:蓝海资料掘金营,微信deep3321