结构梳理
1、基本结构
sdk涵盖了从 Boot0 → U-Boot → Kernel → RootFS → 打包工具 → 测试例程 的所有环节。开发者只需在这个 SDK 里改代码/配置,就能编译出一个完整的可烧录镜像(.img / .fex),烧到板子上跑起来。
结构图如下:
#mermaid-svg-RnXZANhCuqTZk0kN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RnXZANhCuqTZk0kN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RnXZANhCuqTZk0kN .error-icon{fill:#552222;}#mermaid-svg-RnXZANhCuqTZk0kN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RnXZANhCuqTZk0kN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN .marker.cross{stroke:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RnXZANhCuqTZk0kN p{margin:0;}#mermaid-svg-RnXZANhCuqTZk0kN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster-label text{fill:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster-label span{color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster-label span p{background-color:transparent;}#mermaid-svg-RnXZANhCuqTZk0kN .label text,#mermaid-svg-RnXZANhCuqTZk0kN span{fill:#333;color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .node rect,#mermaid-svg-RnXZANhCuqTZk0kN .node circle,#mermaid-svg-RnXZANhCuqTZk0kN .node ellipse,#mermaid-svg-RnXZANhCuqTZk0kN .node polygon,#mermaid-svg-RnXZANhCuqTZk0kN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .rough-node .label text,#mermaid-svg-RnXZANhCuqTZk0kN .node .label text,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape .label,#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape .label{text-anchor:middle;}#mermaid-svg-RnXZANhCuqTZk0kN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .rough-node .label,#mermaid-svg-RnXZANhCuqTZk0kN .node .label,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape .label,#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape .label{text-align:center;}#mermaid-svg-RnXZANhCuqTZk0kN .node.clickable{cursor:pointer;}#mermaid-svg-RnXZANhCuqTZk0kN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN .arrowheadPath{fill:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RnXZANhCuqTZk0kN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RnXZANhCuqTZk0kN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RnXZANhCuqTZk0kN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RnXZANhCuqTZk0kN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RnXZANhCuqTZk0kN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RnXZANhCuqTZk0kN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster text{fill:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster span{color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RnXZANhCuqTZk0kN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RnXZANhCuqTZk0kN rect.text{fill:none;stroke-width:0;}#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape p,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape .label rect,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RnXZANhCuqTZk0kN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RnXZANhCuqTZk0kN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RnXZANhCuqTZk0kN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} LinuxSDK 根目录
brandy
Bootloader 源码
kernel
Linux 内核源码 + DTS 源
device
板级配置中心
sys_config.fex / 分区表 / env / 显示选项
buildroot
根文件系统构建
platform
厂商中间件/应用
tools
打包工具 pack/fex2bin
build
build.sh 脚本
test
测试程序
Boot0/SPL, U-Boot 镜像
内核镜像
DTB 由 DTS 编译
sys_config.fex → sys_config.bin
rootfs.ext4
多媒体库/GUI
pack 工具打包
编译/打包流程
外设验证程序
boot_package
系统镜像打包
最终可烧录镜像 .img/.fex
总结:
brandy保证能启动kernel驱动硬件device定义板级参数buildroot提供根文件系统platform/test增强与验证tools/build/build.sh把它们串起来out里就是最终交付物
2、结构详细说明
2.1、 brandy
brandy/brandy-2.0
- 包含
Boot0/SPL和U-Boot源码 (Bootloader源码) - 职责:
Boot0/SPL解析sys_config.bin,完成DDR初始化、电源配置。U-Boot Proper:运行在DDR上,负责加载Kernel、传递DTB参数。
- 产出
boot0.bin、u-boot.bin,最终进入boot_package.fex - 对应手册:
boot_package就是从这里编译的产物之一。
2.2、kernel
kernel/linux-4.9
Linux内核源码,包含DTS源- 职责:
- 提供
SoC驱动(显示、网络、USB、音频、摄像头...) - 解析 设备树
DTS/DTB,根据硬件资源配置驱动
- 提供
- 产出
Image/zImage+DTB - 这里改
DTS是Kernel阶段生效的配置;改驱动源码则是功能bugfix。
2.3、buildroot
buildroot/buildroot-201902
- 用户空间根文件系统构建工具
- 职责:
- 生成
rootfs(BusyBox,glibc/musl, 基本命令) - 可以裁剪/增加包,做最小系统或应用环境
- 生成
- 输出:
ext4镜像(rootfs.ext4),最终合并进系统镜像。
2.4、 device
device/config, product
- 板级配置中心,含
sys_config.fex、分区表、env、显示配置等 - 内容:
DTS源码(设备树)sys_config.fex→sys_config.bin(Boot阶段使用)- 分区表、
logo、启动参数等
- →
sys_config.fex经fex2bin转为sys_config.bin,随boot_package使用 - 职责:
- 这里是开发者日常改动最多的地方:
DDR电源参数在sys_config.fex- 驱动绑定/屏幕/触摸/网口等在
DTS
- 这里是开发者日常改动最多的地方:
2.5、 platform
platform/apps, base, core, framework, external, tools
- 厂商自定义中间件/应用,产出对应运行时库,合入
rootfs或单独分发。 - 例如多媒体框架(
CedarX,CedarV)、小型GUI(MiniGUI/Qt)、AI库、视频编解码SDK。 - 职责:扩展内核以外的软件支持,和硬件强相关。
2.6、tools
- 打包与配置工具
- 常见工具:
fex2bin/bin2fex→sys_config转换工具pack→ 把U-Boot、Kernel、RootFS、sys_config打包成.imgdragonsecboot/phoenix→ 安全烧录工具
- 职责:保证各模块编译后能被整合进最终镜像。
2.6、build
- 编译脚本(
Makefile、mkkernel.sh、pack),是编译/打包的核心逻辑。 - 包含
build.sh调用的具体规则文件:build.sh config→ 选择平台/显示方案build.sh→ 编译uboot/kernel/rootfsbuild.sh pack→ 打包成镜像
2.7、out
编译输出目录,包含交叉编译工具链、打包产物 (pack_out)、最终镜像 (t507_linux_tlt507-evm_uart0.img)
2.8、 test
- 板级测试程序(
I²C,SPI,HDMI,LCD,USB, 网口等)。 - 职责:方便 bring-up 时快速验证外设可用性。
3、板级适配开发步骤
Board Bring-up,像 T507 这种 全志的 SoC 平台,第一次从原理图到能跑 Linux系统,一般都走一条比较固定的流程。
硬件分析(原理图) → Boot 适配(sys_config.fex) → Kernel 适配(DTS) → Rootfs 工具链(Buildroot) → 打包镜像(pack) → 功能验证/调优
#mermaid-svg-kbXh4VZxUCVZFc8A{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kbXh4VZxUCVZFc8A .error-icon{fill:#552222;}#mermaid-svg-kbXh4VZxUCVZFc8A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kbXh4VZxUCVZFc8A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A .marker.cross{stroke:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kbXh4VZxUCVZFc8A p{margin:0;}#mermaid-svg-kbXh4VZxUCVZFc8A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster-label text{fill:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster-label span{color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster-label span p{background-color:transparent;}#mermaid-svg-kbXh4VZxUCVZFc8A .label text,#mermaid-svg-kbXh4VZxUCVZFc8A span{fill:#333;color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .node rect,#mermaid-svg-kbXh4VZxUCVZFc8A .node circle,#mermaid-svg-kbXh4VZxUCVZFc8A .node ellipse,#mermaid-svg-kbXh4VZxUCVZFc8A .node polygon,#mermaid-svg-kbXh4VZxUCVZFc8A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .rough-node .label text,#mermaid-svg-kbXh4VZxUCVZFc8A .node .label text,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape .label,#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape .label{text-anchor:middle;}#mermaid-svg-kbXh4VZxUCVZFc8A .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .rough-node .label,#mermaid-svg-kbXh4VZxUCVZFc8A .node .label,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape .label,#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape .label{text-align:center;}#mermaid-svg-kbXh4VZxUCVZFc8A .node.clickable{cursor:pointer;}#mermaid-svg-kbXh4VZxUCVZFc8A .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A .arrowheadPath{fill:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kbXh4VZxUCVZFc8A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kbXh4VZxUCVZFc8A .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kbXh4VZxUCVZFc8A .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kbXh4VZxUCVZFc8A .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kbXh4VZxUCVZFc8A .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster text{fill:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster span{color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kbXh4VZxUCVZFc8A .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A rect.text{fill:none;stroke-width:0;}#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape p,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape .label rect,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kbXh4VZxUCVZFc8A .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kbXh4VZxUCVZFc8A .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kbXh4VZxUCVZFc8A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-kbXh4VZxUCVZFc8A .greenNode>*{fill:#4CAF50!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .greenNode span{fill:#4CAF50!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .greenNode tspan{fill:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .redNode>*{fill:#f44336!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .redNode span{fill:#f44336!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .redNode tspan{fill:white!important;} 硬件分析
阅读原理图
Boot 阶段适配
sys_config.fex
配置 DDR 频率/电源
配置 UART 调试口
pack 生成 boot_package.fex
串口验证 SPL/U-Boot
Kernel 阶段适配
修改 DTS
eMMC 总线/速率/电压
UART 重映射
LVDS/HDMI 显示 + 背光 PWM
SPI / I²C 外设
USB OTG/Device/Gadget
以太网 PHY RMII/RGMII
编译内核 + DTB
烧录镜像启动
功能验证
Memtester 验证 DDR 稳定性
eMMC 大文件读写
UART/I²C/SPI/USB 功能测试
显示输出验证
Rootfs 构建
Buildroot
添加调试工具: ssh, i2c-tools, usbutils
配置安全机制: root 密码, 禁止空口令
系统打包
build.sh pack
生成量产镜像 .img
3.1、硬件准备阶段
- 阅读原理图
- 确认
DDR供电轨、电阻、电容、ZQ电阻 是否符合芯片推荐手册; - 看清
eMMC / SPI / I²C / UART / USB / HDMI / LVDS的连线,标记每个接口引脚的复用关系; - 找到
PMIC(电源管理芯片),核对各路DCDC/LDO输出电压与目标负载。
- 确认
- 确认
Boot介质eMMC / SD / SPI Flash?确认芯片和走线,知道系统从哪里启动。
3.2、Boot 阶段适配(sys_config.fex + Bootloader)
- 配置
sys_config.fex[dram_para]→DDR类型/频率/ODT参数;[power_sply]→PMIC输出电压,对应DDR/IO/eMMC/LVDS/HDMI;[uart_para]→ 指定调试串口引脚(保证能看到串口log)。
- 编译/打包
Boot0+U-Boot./build.sh bootloader→ 产出SPL + U-Boot;./build.sh pack→ 合并sys_config.bin,生成boot_package.fex。
- 验证串口启动
- 上电,串口能打印出
SPL→U-Boot→ 进入命令行; - 若卡死,第一怀疑点:
DDR参数错误;第二怀疑点:供电电压配置错误。
- 上电,串口能打印出
3.3、Kernel 阶段适配(设备树 DTS)
- 根据原理图修改
DTSeMMC:总线宽度/供电电压/速率模式;UART:重映射 console / 用户串口;LVDS/HDMI:使能TCON、背光PWM;SPI/I²C:确认接的外设(屏、触摸、EEPROM、传感器...);USB:配置OTG/Host/Device模式,决定是否做Gadget;Ethernet:确认RGMII/RMII,PHY地址。
- 编译内核 &
DTS./build.sh kernel;DTS→DTB合并到镜像。
- 验证启动
logdmesg里看mmc/i2c/spi/pwm等驱动是否probe成功;- 如果报错
"timeout"或"no device",回到原理图,核对引脚复用/电源rail。
3.4、Rootfs & 应用层
- 构建根文件系统(
Buildroot)./build.sh buildroot,产出rootfs.ext4;- 加必要工具:
busybox,dropbear/openssh,memtester,i2c-tools,spi-tools,usbutils。
- 调试工具
- 串口登录;
SSH(有口令);USB gadget(虚拟串口、网络);SPI/I²C测试程序。
3.5、系统打包 & 烧录
- 打包最终镜像
./build.sh pack→ 生成xxx.img;- 镜像包含:
boot_package(SPL+U-Boot+sys_config)、内核、DTB、rootfs。
- 烧录
&启动- 烧录到
eMMC / SD卡; - 上电启动,串口观察全流程。
- 烧录到
3.6、功能验证 & 调优
- 内存稳定性:
memtester跑几个小时。 - 存储稳定性:大文件反复写读。
- 外设验证:
UART回环、I²C探测、SPI回环、USB拔插、HDMI显示、LVDS点屏。 - 电源调优:测量
DDR VDD/VDDQ/VCCQ,确认电压不漂移。 - 性能调优:调频率(如
DDR从 933 → 1200),观察是否稳定。
3.7、最终集成
- 确认所有外设驱动在
Kernel中正常加载; Rootfs里添加登录/安全机制(禁止 root 空口令、配置 SSH 密码);- 生成可量产烧录的
.img,并写下BSP修改清单(sys_config改了什么,DTS改了什么)。