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/:所有第三方软件包的编译脚本。比如python3、opencv、tflite。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 # 打包成烧录镜像
但实际没那么简单。我拆开给你看:
- 环境初始化:设置交叉编译器路径、导出
ARCH=arm、CROSS_COMPILE=arm-linux-gnueabihf-。 - 配置选择:
lunch命令会列出所有支持的板型。比如v853_linux_evb、v853_linux_ai。 - 分步编译:先编BSP(uboot、boot0),再编内核,最后编Rootfs。每一步都有独立的
Makefile。 - 打包镜像:把所有
.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