本文章由 GLM-5.3-Flash 基于 SDK 自动编译整理生成。
SDK分享:https://pan.baidu.com/s/1Uzi9_kIBVmh_NjEFvIHNCQ?pwd=rwkb
基于 ZLG 致远 IDO-SOM2D01 模组 (SigmaStar SSD201 / SSC011A-S01A,64MB DDR2 + 128MB SPI-NAND)
SDK 版本 TAKOYAKI_DLS00V008 (2024-05),构建环境 Ubuntu 22.04 + gcc-arm-8.2-2018.08
所有路径以本项目工作目录
~/AUTOWORK_SSD201/work/为根(下文简写为work/),原始 SDK 在SSD201/(只读)。本教程中的分区表、脚本、配置均摘自本 SDK 实际源码,配置文件为
spinand.glibc.011a.64。
目录
- 整体架构总览
- [BSP 源码组织](#BSP 源码组织)
- 构建系统与完整构建流程
- [Flash 分区与内存布局](#Flash 分区与内存布局)
- 板端环境:启动链与运行时
- 烧录与升级
- 常用开发迭代流程
- 附录:本项目环境搭建记录
1. 整体架构总览
SSD20X 系列的 BSP 由四个顶层源码包组成:boot (U-Boot)、kernel (Linux 内核)、sdk (MI 中间件示例应用/验证代码)、project (构建中枢:打包、rootfs、板级资源)。project 是唯一需要"操作"的入口,它把其他三部分的结果组装成可烧录镜像。
#mermaid-svg-CmKcshhsbx9JvhCh{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-CmKcshhsbx9JvhCh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CmKcshhsbx9JvhCh .error-icon{fill:#552222;}#mermaid-svg-CmKcshhsbx9JvhCh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CmKcshhsbx9JvhCh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CmKcshhsbx9JvhCh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CmKcshhsbx9JvhCh .marker.cross{stroke:#333333;}#mermaid-svg-CmKcshhsbx9JvhCh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CmKcshhsbx9JvhCh p{margin:0;}#mermaid-svg-CmKcshhsbx9JvhCh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CmKcshhsbx9JvhCh .cluster-label text{fill:#333;}#mermaid-svg-CmKcshhsbx9JvhCh .cluster-label span{color:#333;}#mermaid-svg-CmKcshhsbx9JvhCh .cluster-label span p{background-color:transparent;}#mermaid-svg-CmKcshhsbx9JvhCh .label text,#mermaid-svg-CmKcshhsbx9JvhCh span{fill:#333;color:#333;}#mermaid-svg-CmKcshhsbx9JvhCh .node rect,#mermaid-svg-CmKcshhsbx9JvhCh .node circle,#mermaid-svg-CmKcshhsbx9JvhCh .node ellipse,#mermaid-svg-CmKcshhsbx9JvhCh .node polygon,#mermaid-svg-CmKcshhsbx9JvhCh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CmKcshhsbx9JvhCh .rough-node .label text,#mermaid-svg-CmKcshhsbx9JvhCh .node .label text,#mermaid-svg-CmKcshhsbx9JvhCh .image-shape .label,#mermaid-svg-CmKcshhsbx9JvhCh .icon-shape .label{text-anchor:middle;}#mermaid-svg-CmKcshhsbx9JvhCh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CmKcshhsbx9JvhCh .rough-node .label,#mermaid-svg-CmKcshhsbx9JvhCh .node .label,#mermaid-svg-CmKcshhsbx9JvhCh .image-shape .label,#mermaid-svg-CmKcshhsbx9JvhCh .icon-shape .label{text-align:center;}#mermaid-svg-CmKcshhsbx9JvhCh .node.clickable{cursor:pointer;}#mermaid-svg-CmKcshhsbx9JvhCh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CmKcshhsbx9JvhCh .arrowheadPath{fill:#333333;}#mermaid-svg-CmKcshhsbx9JvhCh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CmKcshhsbx9JvhCh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CmKcshhsbx9JvhCh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CmKcshhsbx9JvhCh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CmKcshhsbx9JvhCh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CmKcshhsbx9JvhCh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CmKcshhsbx9JvhCh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CmKcshhsbx9JvhCh .cluster text{fill:#333;}#mermaid-svg-CmKcshhsbx9JvhCh .cluster span{color:#333;}#mermaid-svg-CmKcshhsbx9JvhCh 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-CmKcshhsbx9JvhCh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CmKcshhsbx9JvhCh rect.text{fill:none;stroke-width:0;}#mermaid-svg-CmKcshhsbx9JvhCh .icon-shape,#mermaid-svg-CmKcshhsbx9JvhCh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CmKcshhsbx9JvhCh .icon-shape p,#mermaid-svg-CmKcshhsbx9JvhCh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CmKcshhsbx9JvhCh .icon-shape .label rect,#mermaid-svg-CmKcshhsbx9JvhCh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CmKcshhsbx9JvhCh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CmKcshhsbx9JvhCh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CmKcshhsbx9JvhCh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 镜像产物 work/images/
构建主机(x86_64)
源码包(work/ 下)
make → u-boot_spinand.xz.img.bin
make → uImage.xz + *.ko
app 目标 → demo 应用
estar / SD 卡 / OTA
boot
U-Boot 2015.01
kernel
Linux 4.9.84
sdk
MI 示例应用
project
打包中枢/rootfs
gcc-arm-8.2
arm-linux-gnueabihf
打包工具
dispcfggen/mksquashfs...
cis / ipl / uboot / kernel
rootfs.ubifs / miservice.ubifs
customer.ubifs / appconfigs.ubifs
scripts/estar 烧录脚本
开发板
SSD201 + SPI-NAND
核心思想:
- boot / kernel 是"标准开源代码 + SigmaStar 平台层",用交叉工具链独立编译;
- project 负责"组装" :rootfs 骨架是预编译好的 tar 包(rootfs.tar.gz、busybox、glibc),MI 中间件以预编译库 + 内核模块 形式在
release/目录提供,打包阶段只是把它们与 boot/kernel 产物拼装成 flash 镜像; - sdk/verify 是示例/客户应用 ,通过开关(
verify_zk:=enable等)选择是否编入镜像。
2. BSP 源码组织
2.1 顶层目录
#mermaid-svg-9fggSDxceX8SfRud{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-9fggSDxceX8SfRud .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9fggSDxceX8SfRud .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9fggSDxceX8SfRud .error-icon{fill:#552222;}#mermaid-svg-9fggSDxceX8SfRud .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9fggSDxceX8SfRud .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9fggSDxceX8SfRud .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9fggSDxceX8SfRud .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9fggSDxceX8SfRud .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9fggSDxceX8SfRud .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9fggSDxceX8SfRud .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9fggSDxceX8SfRud .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9fggSDxceX8SfRud .marker.cross{stroke:#333333;}#mermaid-svg-9fggSDxceX8SfRud svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9fggSDxceX8SfRud p{margin:0;}#mermaid-svg-9fggSDxceX8SfRud .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9fggSDxceX8SfRud .cluster-label text{fill:#333;}#mermaid-svg-9fggSDxceX8SfRud .cluster-label span{color:#333;}#mermaid-svg-9fggSDxceX8SfRud .cluster-label span p{background-color:transparent;}#mermaid-svg-9fggSDxceX8SfRud .label text,#mermaid-svg-9fggSDxceX8SfRud span{fill:#333;color:#333;}#mermaid-svg-9fggSDxceX8SfRud .node rect,#mermaid-svg-9fggSDxceX8SfRud .node circle,#mermaid-svg-9fggSDxceX8SfRud .node ellipse,#mermaid-svg-9fggSDxceX8SfRud .node polygon,#mermaid-svg-9fggSDxceX8SfRud .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9fggSDxceX8SfRud .rough-node .label text,#mermaid-svg-9fggSDxceX8SfRud .node .label text,#mermaid-svg-9fggSDxceX8SfRud .image-shape .label,#mermaid-svg-9fggSDxceX8SfRud .icon-shape .label{text-anchor:middle;}#mermaid-svg-9fggSDxceX8SfRud .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9fggSDxceX8SfRud .rough-node .label,#mermaid-svg-9fggSDxceX8SfRud .node .label,#mermaid-svg-9fggSDxceX8SfRud .image-shape .label,#mermaid-svg-9fggSDxceX8SfRud .icon-shape .label{text-align:center;}#mermaid-svg-9fggSDxceX8SfRud .node.clickable{cursor:pointer;}#mermaid-svg-9fggSDxceX8SfRud .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9fggSDxceX8SfRud .arrowheadPath{fill:#333333;}#mermaid-svg-9fggSDxceX8SfRud .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9fggSDxceX8SfRud .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9fggSDxceX8SfRud .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9fggSDxceX8SfRud .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9fggSDxceX8SfRud .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9fggSDxceX8SfRud .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9fggSDxceX8SfRud .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9fggSDxceX8SfRud .cluster text{fill:#333;}#mermaid-svg-9fggSDxceX8SfRud .cluster span{color:#333;}#mermaid-svg-9fggSDxceX8SfRud 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-9fggSDxceX8SfRud .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9fggSDxceX8SfRud rect.text{fill:none;stroke-width:0;}#mermaid-svg-9fggSDxceX8SfRud .icon-shape,#mermaid-svg-9fggSDxceX8SfRud .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9fggSDxceX8SfRud .icon-shape p,#mermaid-svg-9fggSDxceX8SfRud .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9fggSDxceX8SfRud .icon-shape .label rect,#mermaid-svg-9fggSDxceX8SfRud .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9fggSDxceX8SfRud .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9fggSDxceX8SfRud .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9fggSDxceX8SfRud :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} work/
boot/ U-Boot 2015.01
kernel/ Linux 4.9.84
project/ 构建中枢
sdk/ MI 应用与示例
toolchain + env.sh + build_all.sh
2.2 boot/ ------ U-Boot(v2015.01)
| 路径 | 作用 |
|---|---|
boot/configs/infinity2m_spinand_defconfig |
本项目的 U-Boot 配置 (nor 方式则用 infinity2m_defconfig) |
boot/include/configs/infinity2m.h |
板级宏:DDR 参数、bootcmd 默认值、IPL 加载地址等 |
boot/board/mstar/、arch/mstar/ |
SigmaStar 平台代码(该 U-Boot 是 SigmaStar 深度魔改的 2015.01) |
boot/drivers/mstar/spinand/ |
SPI-NAND 驱动与坏块管理 |
产物 u-boot_spinand.xz.img.bin |
编译产物,需手动拷贝 到 project/board/i2m/boot/spinand/uboot/ 供打包 |
U-Boot 产物有三份(.img.bin/.mz.img.bin/.xz.img.bin),区别是压缩方式;spinand 打包固定用 xz 版本(见 project/image/configs/i2m/spinand.ubifs.p2.partition.config 中 uboot$(RESOUCE))。
2.3 kernel/ ------ Linux 4.9.84
| 路径 | 作用 |
|---|---|
kernel/arch/arm/configs/infinity2m_spinand_ssc011a_s01a_minigui_defconfig |
本项目的内核配置(另有 fastboot 版本) |
kernel/drivers/sstar/msys/ |
系统基础设施:MIU、时钟、中断(isrcb)、DMA(bdma/movedma)、内存池(mma_heap)、寄存器访问 |
kernel/drivers/sstar/camdriver/ |
各外设驱动:emac(网口)、sdmmc、spi、uart、i2c、pwm、gpio、padmux、spinand...... |
kernel/drivers/sstar/emac/ 等 |
上层设备驱动 |
产物 arch/arm/boot/uImage.xz 与 *.ko |
内核镜像(lzma 压缩 uImage)+ 可加载模块 |
内核编译有两个注意点(本项目已踩坑并固化):
- 内核 Makefile 用裸
python调用 py2 脚本(scripts/ms_gen_mvxv_h.py等)→ 需要 python2; - 宿主 gcc ≥ 10 时
scripts/dtc报yylloc重定义 →make时需追加HOSTCFLAGS=...-fcommon。
2.4 project/ ------ 构建中枢(最核心)
#mermaid-svg-0DeplwZ3bVRK8Jx7{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-0DeplwZ3bVRK8Jx7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .error-icon{fill:#552222;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .marker.cross{stroke:#333333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 p{margin:0;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .cluster-label text{fill:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .cluster-label span{color:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .cluster-label span p{background-color:transparent;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .label text,#mermaid-svg-0DeplwZ3bVRK8Jx7 span{fill:#333;color:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .node rect,#mermaid-svg-0DeplwZ3bVRK8Jx7 .node circle,#mermaid-svg-0DeplwZ3bVRK8Jx7 .node ellipse,#mermaid-svg-0DeplwZ3bVRK8Jx7 .node polygon,#mermaid-svg-0DeplwZ3bVRK8Jx7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .rough-node .label text,#mermaid-svg-0DeplwZ3bVRK8Jx7 .node .label text,#mermaid-svg-0DeplwZ3bVRK8Jx7 .image-shape .label,#mermaid-svg-0DeplwZ3bVRK8Jx7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .rough-node .label,#mermaid-svg-0DeplwZ3bVRK8Jx7 .node .label,#mermaid-svg-0DeplwZ3bVRK8Jx7 .image-shape .label,#mermaid-svg-0DeplwZ3bVRK8Jx7 .icon-shape .label{text-align:center;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .node.clickable{cursor:pointer;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .arrowheadPath{fill:#333333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0DeplwZ3bVRK8Jx7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0DeplwZ3bVRK8Jx7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0DeplwZ3bVRK8Jx7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .cluster text{fill:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .cluster span{color:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 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-0DeplwZ3bVRK8Jx7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0DeplwZ3bVRK8Jx7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .icon-shape,#mermaid-svg-0DeplwZ3bVRK8Jx7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .icon-shape p,#mermaid-svg-0DeplwZ3bVRK8Jx7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .icon-shape .label rect,#mermaid-svg-0DeplwZ3bVRK8Jx7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0DeplwZ3bVRK8Jx7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0DeplwZ3bVRK8Jx7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0DeplwZ3bVRK8Jx7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} project/
configs/
current.configs(setup_config 生成)
image/ 打包系统
release/ 预编译产物库
board/ 板级二进制资源
kbuild/ 内核编译环境
image.mk / boot.mk / ota.mk
configs/i2m/spinand.ubifs.p2.partition.config
★分区表★
etc/ rootfs 基础配置(rcS等)
makefiletools/bin 打包工具
busybox/ 预编译 busybox
nvr/i2m/common/glibc/8.2.1
MI 库、内核模块、工具
customer_tailor/ ★功能裁剪开关★
customer_options/
i2m/boot/{ipl,spinand}/ IPL等启动件
i2m/mmap/MMAP_I2M_64M.h ★内存布局★
i2m/{pq,vdec_fw,tp_fw} 画质参数/固件
kbuild/4.9.84/
release.sh 释放内核产物
关键文件逐个说明:
-
project/setup_config.sh------ 构建第一步。它把选定的配置(如configs/nvr/i2m/8.2.1/spinand.glibc.011a.64)拼上 mmap 解析结果,生成configs/current.configs,这是全构建系统的"事实来源"。本项目的 current.configs 核心内容:BOARD = 011A # SSC011A-S01A (SSD201) PRODUCT = nvr TOOLCHAIN = glibc # glibc 2.28 / busybox 1.20.2 KERNEL_VERSION = 4.9.84 IMAGE_CONFIG = spinand.ubifs.p2.partition.config # 分区表 MMAP = MMAP_I2M_64M.h # 64MB DDR 内存布局 DISP_OUT_NAME = SAT070CP50 # 7寸屏 BOOTLOGO_FILE = sigmastar1024_600.jpg KERNEL_BOOT_ENV = LX_MEM=... mma_heap=... mmap_reserved=fb,... -
project/makefile------ 顶层目标:目标 含义 make image-nocheck日常打包入口(跳过 release/include 头文件 git 检查) make image同上 + 头文件一致性检查(git 管控时用) make release只执行 sdk 侧 release(头文件/库整理) make image-ota生成 OTA 升级包 make distclean全清理( make clean会先 clean 再重新生成配置) -
project/release/customer_tailor/nvr_i2m_display_glibc_tailor.mk------ 功能裁剪总开关 :interface_vdec/venc/wlan等决定 MI 中间件哪些接口编入;verify_zk:=enable等决定把哪个示例应用打入 customer 分区(默认全部注释,见 §7.3)。 -
project/release/nvr/i2m/common/glibc/8.2.1/------ SigmaStar 预编译产物:子目录 内容 板端去向 mi_libs/dynamic/libmi_sys.so、libmi_disp.so 等 miservice 分区 /config/libex_libs/dynamic/ffmpeg、curl 等第三方库 /config/libmodules/mhal.ko、mi_*.ko、fbdev.ko 等 /config/modules/4.9.84/bin/config_tool、riu_r/riu_w、verify 等 /config/package/glibc 2.28 运行库 rootfs /lib -
project/board/i2m/mmap/MMAP_I2M_64M.h------ 内存布局 的权威定义(LX、MMA、FB 等每块内存的地址/大小),mmapparser工具解析它生成 bootargs 里的LX_MEM=...等参数。改内存配置必须从这里入手。
2.5 sdk/ ------ MI 示例应用
sdk/verify/
├── application/ # 客户示例应用(选择哪个由 tailor 开关决定)
│ ├── app.mk # ★应用选择器:读 verify_* 开关 → include 对应 image.mk
│ ├── customer_zk/ # GUI demo(zkgui,1024x600/800x480 两种)
│ ├── zk_mini/ zk_full/ # 轻量/完整 demo
│ ├── bootanimation/ jpeg2disp/ ssplayer/ smarthome/ smarttalk/
│ └── ...
├── feature/ # 各功能特性代码(含 add-config.mk/clear-config.mk)
└── mi_demo/ # MI API 级示例代码(学习 MI 接口用)
以 customer_zk/image.mk 为例,它定义了 app 目标,把应用装进打包目录:
makefile
app:
@cp -rf $(APPLICATION_PATH)/customer_zk/bin/zkgui_1024_600 $(IMAGE_INSTALL_DIR)/customer/zkgui
@cp -rf $(APPLICATION_PATH)/customer_zk/lib $(IMAGE_INSTALL_DIR)/customer
@cp -rf $(APPLICATION_PATH)/customer_zk/res $(IMAGE_INSTALL_DIR)/customer
@cp -rf $(APPLICATION_PATH)/customer_zk/etc/* $(IMAGE_INSTALL_DIR)/rootfs/etc/
@cat $(APPLICATION_PATH)/customer_zk/demo.sh >> $(IMAGE_INSTALL_DIR)/customer/demo.sh
即:示例应用同时向 customer 分区(主体)和 rootfs 分区(配置文件、启动脚本)投放文件 ,demo.sh 是板端的应用启动入口。
3. 构建系统与完整构建流程
3.1 流程总览
#mermaid-svg-XRoVPfgsaPS1se3N{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-XRoVPfgsaPS1se3N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XRoVPfgsaPS1se3N .error-icon{fill:#552222;}#mermaid-svg-XRoVPfgsaPS1se3N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XRoVPfgsaPS1se3N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XRoVPfgsaPS1se3N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XRoVPfgsaPS1se3N .marker.cross{stroke:#333333;}#mermaid-svg-XRoVPfgsaPS1se3N svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XRoVPfgsaPS1se3N p{margin:0;}#mermaid-svg-XRoVPfgsaPS1se3N .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XRoVPfgsaPS1se3N .cluster-label text{fill:#333;}#mermaid-svg-XRoVPfgsaPS1se3N .cluster-label span{color:#333;}#mermaid-svg-XRoVPfgsaPS1se3N .cluster-label span p{background-color:transparent;}#mermaid-svg-XRoVPfgsaPS1se3N .label text,#mermaid-svg-XRoVPfgsaPS1se3N span{fill:#333;color:#333;}#mermaid-svg-XRoVPfgsaPS1se3N .node rect,#mermaid-svg-XRoVPfgsaPS1se3N .node circle,#mermaid-svg-XRoVPfgsaPS1se3N .node ellipse,#mermaid-svg-XRoVPfgsaPS1se3N .node polygon,#mermaid-svg-XRoVPfgsaPS1se3N .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XRoVPfgsaPS1se3N .rough-node .label text,#mermaid-svg-XRoVPfgsaPS1se3N .node .label text,#mermaid-svg-XRoVPfgsaPS1se3N .image-shape .label,#mermaid-svg-XRoVPfgsaPS1se3N .icon-shape .label{text-anchor:middle;}#mermaid-svg-XRoVPfgsaPS1se3N .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XRoVPfgsaPS1se3N .rough-node .label,#mermaid-svg-XRoVPfgsaPS1se3N .node .label,#mermaid-svg-XRoVPfgsaPS1se3N .image-shape .label,#mermaid-svg-XRoVPfgsaPS1se3N .icon-shape .label{text-align:center;}#mermaid-svg-XRoVPfgsaPS1se3N .node.clickable{cursor:pointer;}#mermaid-svg-XRoVPfgsaPS1se3N .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XRoVPfgsaPS1se3N .arrowheadPath{fill:#333333;}#mermaid-svg-XRoVPfgsaPS1se3N .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XRoVPfgsaPS1se3N .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XRoVPfgsaPS1se3N .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XRoVPfgsaPS1se3N .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XRoVPfgsaPS1se3N .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XRoVPfgsaPS1se3N .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XRoVPfgsaPS1se3N .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XRoVPfgsaPS1se3N .cluster text{fill:#333;}#mermaid-svg-XRoVPfgsaPS1se3N .cluster span{color:#333;}#mermaid-svg-XRoVPfgsaPS1se3N 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-XRoVPfgsaPS1se3N .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XRoVPfgsaPS1se3N rect.text{fill:none;stroke-width:0;}#mermaid-svg-XRoVPfgsaPS1se3N .icon-shape,#mermaid-svg-XRoVPfgsaPS1se3N .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XRoVPfgsaPS1se3N .icon-shape p,#mermaid-svg-XRoVPfgsaPS1se3N .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XRoVPfgsaPS1se3N .icon-shape .label rect,#mermaid-svg-XRoVPfgsaPS1se3N .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XRoVPfgsaPS1se3N .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XRoVPfgsaPS1se3N .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XRoVPfgsaPS1se3N :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ① 解压 boot/kernel/project/sdk 到 work/
② 编译 U-Boot
make infinity2m_spinand_defconfig && make
拷贝 u-boot_spinand.xz.img.bin
→ project/board/i2m/boot/spinand/uboot/
③ 编译内核
make infinity2m_spinand_ssc011a_s01a_minigui_defconfig
make -j16 HOSTCFLAGS=...-fcommon
④ 选择配置
./setup_config.sh configs/nvr/i2m/8.2.1/spinand.glibc.011a.64
⑤ 释放内核产物
kbuild/4.9.84/release.sh -k .../kernel
-b 011A -p nvr -f spinand -c i2m -l glibc -v 8.2.1
⑥ 打包
cd project && make image-nocheck
⑦ 镜像输出
project/image/output/images → work/images/
rootfs.mk: 解 rootfs.tar.gz + busybox + glibc
app 目标: sdk/verify 应用装入 customer
image.mk: 逐分区生成 ubifs/cis/bin
生成 scripts/estar 烧录脚本
对应一键脚本 work/build_all.sh(本教程环境已验证跑通,EXIT=0)。
3.2 image/ 打包系统工作原理
make image-nocheck 展开后进入 project/image/,核心是 image.mk。它读取分区配置文件 configs/i2m/spinand.ubifs.p2.partition.config,该文件用统一的"属性 DSL"描述每个分区:
makefile
IMAGE_LIST = cis ipl ipl_cust uboot logo kernel rootfs miservice customer appconfigs
OTA_IMAGE_LIST = ipl ipl_cust uboot logo kernel miservice customer appconfigs
FLASH_TYPE = spinand
CIS_PBAs = 10 # CIS 固定写在物理块 10
CIS_COPIES = 5 # CIS 存 5 份
ENV_CFG = /dev/mtd6 0 0x20000 0x60000 # U-Boot env 位置
kernel$(PATSIZE) = 0x500000 # 分区大小
kernel$(MTDPART) = 0x500000(KERNEL),0x500000(RECOVERY) # 内核双分区(主+备份)
rootfs$(FSTYPE) = ubifs # 文件系统类型
rootfs$(BOOTENV) = console=ttyS0,115200 ubi.mtd=UBI,2048 root=ubi:rootfs ...
miservice$(MOUNTTG) = /config # UBI 卷挂载点
customer$(PATSIZE) = 0x5100000
打包时 image.mk 对 IMAGE_LIST 里的每个名字:
- 按
$(RESOUCE)取原始数据(编译产物或预编译目录); - rootfs 类分区先组装目录树(
rootfs.mk:解 rootfs.tar.gz → busybox → glibc → MI 库/模块到 miservice → 应用 app 目标); - 用
mksquashfs/mkfs.ubifs/ubinize等工具生成镜像文件; - 生成同名烧录脚本
scripts/[[xxx.es; - 最后把 CIS/分区信息(PARTINFO.pni、SPINANDINFO.sni)与各 bin 汇总到
output/images/。
这也是为什么本环境需要 i386 运行库:
makefiletools/bin下的 dispcfggen(生成 logo 显示配置)、logogen 及image/build/下的 mksquashfs、mkfs.jffs2、make_ext4fs 都是 32 位 ELF。
3.3 各分区镜像产物与源数据对应
| 镜像文件 | 数据来源 | 说明 |
|---|---|---|
cis.bin |
image 打包工具生成 | 分区总表(含 BOOTTAB/SYSTAB),写固定 PBA |
ipl_s.bin / ipl_cust_s.bin |
project/board/i2m/boot/ipl/IPL.bin / IPL_CUST.bin |
预编译启动引导(SigmaStar 不提供源码),各存 2 分区 3 副本 |
uboot_s.bin |
boot/ 编译产物 |
我们自己编译的 U-Boot |
kernel |
kernel 编译产物 uImage.xz |
写入 KERNEL,同时复制到 RECOVERY |
logo |
BOOTLOGO_FILE jpg 经 logogen 处理 |
开机 logo |
rootfs.ubifs |
rootfs.tar.gz + busybox + glibc + etc/ | 只读根文件系统 |
miservice.ubifs |
release/.../common/glibc/8.2.1 的库、模块、工具 + board 配置 |
挂载到 /config(可读写) |
customer.ubifs |
verify 应用产物 + demo.sh + htop | 挂载到 /customer(可读写,用户区) |
appconfigs.ubifs |
应用配置 | 挂载到 /appconfigs |
4. Flash 分区与内存布局
4.1 SPI-NAND 分区表(spinand.ubifs.p2.partition.config)
#mermaid-svg-OF17Kh60HIuMKjgB{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-OF17Kh60HIuMKjgB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OF17Kh60HIuMKjgB .error-icon{fill:#552222;}#mermaid-svg-OF17Kh60HIuMKjgB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OF17Kh60HIuMKjgB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OF17Kh60HIuMKjgB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OF17Kh60HIuMKjgB .marker.cross{stroke:#333333;}#mermaid-svg-OF17Kh60HIuMKjgB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OF17Kh60HIuMKjgB p{margin:0;}#mermaid-svg-OF17Kh60HIuMKjgB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OF17Kh60HIuMKjgB .cluster-label text{fill:#333;}#mermaid-svg-OF17Kh60HIuMKjgB .cluster-label span{color:#333;}#mermaid-svg-OF17Kh60HIuMKjgB .cluster-label span p{background-color:transparent;}#mermaid-svg-OF17Kh60HIuMKjgB .label text,#mermaid-svg-OF17Kh60HIuMKjgB span{fill:#333;color:#333;}#mermaid-svg-OF17Kh60HIuMKjgB .node rect,#mermaid-svg-OF17Kh60HIuMKjgB .node circle,#mermaid-svg-OF17Kh60HIuMKjgB .node ellipse,#mermaid-svg-OF17Kh60HIuMKjgB .node polygon,#mermaid-svg-OF17Kh60HIuMKjgB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OF17Kh60HIuMKjgB .rough-node .label text,#mermaid-svg-OF17Kh60HIuMKjgB .node .label text,#mermaid-svg-OF17Kh60HIuMKjgB .image-shape .label,#mermaid-svg-OF17Kh60HIuMKjgB .icon-shape .label{text-anchor:middle;}#mermaid-svg-OF17Kh60HIuMKjgB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OF17Kh60HIuMKjgB .rough-node .label,#mermaid-svg-OF17Kh60HIuMKjgB .node .label,#mermaid-svg-OF17Kh60HIuMKjgB .image-shape .label,#mermaid-svg-OF17Kh60HIuMKjgB .icon-shape .label{text-align:center;}#mermaid-svg-OF17Kh60HIuMKjgB .node.clickable{cursor:pointer;}#mermaid-svg-OF17Kh60HIuMKjgB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OF17Kh60HIuMKjgB .arrowheadPath{fill:#333333;}#mermaid-svg-OF17Kh60HIuMKjgB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OF17Kh60HIuMKjgB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OF17Kh60HIuMKjgB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OF17Kh60HIuMKjgB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OF17Kh60HIuMKjgB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OF17Kh60HIuMKjgB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OF17Kh60HIuMKjgB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OF17Kh60HIuMKjgB .cluster text{fill:#333;}#mermaid-svg-OF17Kh60HIuMKjgB .cluster span{color:#333;}#mermaid-svg-OF17Kh60HIuMKjgB 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-OF17Kh60HIuMKjgB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OF17Kh60HIuMKjgB rect.text{fill:none;stroke-width:0;}#mermaid-svg-OF17Kh60HIuMKjgB .icon-shape,#mermaid-svg-OF17Kh60HIuMKjgB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OF17Kh60HIuMKjgB .icon-shape p,#mermaid-svg-OF17Kh60HIuMKjgB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OF17Kh60HIuMKjgB .icon-shape .label rect,#mermaid-svg-OF17Kh60HIuMKjgB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OF17Kh60HIuMKjgB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OF17Kh60HIuMKjgB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OF17Kh60HIuMKjgB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} UBI 卷(ubi0:x)
MTD 分区(mtd0→mtd11)
裸区(MTD 之外,固定 PBA,多副本)
CIS 0x40000×5份
IPL0/1
0x20000×2
mtd0-1
IPL_CUST0/1
0x20000×2
mtd2-3
UBOOT0/1
0x40000×2
mtd4-5
ENV
0x60000
mtd6
KEY_CUST
0x20000
mtd7
LOGO
0x60000
mtd8
KERNEL
0x500000
mtd9
RECOVERY
0x500000
mtd10
UBI 大分区
mtd11
rootfs
0xA00000
只读根文件系统
miservice
0xA00000
→ /config
customer
0x5100000
→ /customer
appconfigs
0x500000
→ /appconfigs
要点:
- 所有可升级件都做了双分区/多副本 :IPL/IPL_CUST/UBOOT 各 2 个分区(每分区内部 3 份冗余 + 坏块预留),KERNEL 与 RECOVERY 互为备份(烧 kernel 时两个分区都写,见
[[kernel.es); - ENV 固定 mtd6 (
ENV_CFG = /dev/mtd6 0 0x20000 0x60000),板端可用fw_printenv/fw_setenv或 U-Boot 下printenv访问; - 可写空间主要在 customer(81MB),用户应用、资源、数据都应放这里;
- 修改分区表 = 改
spinand.ubifs.p2.partition.config→ 重新打包 → 板端重新[[set_partition.es+ 全部重烧。
4.2 DDR 内存布局(MMAP_I2M_64M.h)
mmapparser 从 mmap 头文件解析出 bootargs:
LX_MEM=0x3f00000 # Linux 可用内存 ≈ 63MB
mma_heap=mma_heap_name0,miu=0,sz=0x1a00000 # 媒体内存池 26MB(解码/显示用)
mmap_reserved=fb,miu=0,sz=0x300000,max_start_off=0x3300000 # FrameBuffer 保留 3MB
即 64MB DDR 中:Linux 63MB − 内核内 MMA 堆 26MB − FB 3MB 。媒体业务(vdec/venc/disp)的 buffer 都从 MMA 堆分配,由 mmap.ini(板端 /config/mmap.ini)与内核共享同一份布局定义。
5. 板端环境:启动链与运行时
5.1 启动链
#mermaid-svg-3M0jQsQZEuWXaoFm{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-3M0jQsQZEuWXaoFm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3M0jQsQZEuWXaoFm .error-icon{fill:#552222;}#mermaid-svg-3M0jQsQZEuWXaoFm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3M0jQsQZEuWXaoFm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3M0jQsQZEuWXaoFm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3M0jQsQZEuWXaoFm .marker.cross{stroke:#333333;}#mermaid-svg-3M0jQsQZEuWXaoFm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3M0jQsQZEuWXaoFm p{margin:0;}#mermaid-svg-3M0jQsQZEuWXaoFm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm .cluster-label text{fill:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm .cluster-label span{color:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm .cluster-label span p{background-color:transparent;}#mermaid-svg-3M0jQsQZEuWXaoFm .label text,#mermaid-svg-3M0jQsQZEuWXaoFm span{fill:#333;color:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm .node rect,#mermaid-svg-3M0jQsQZEuWXaoFm .node circle,#mermaid-svg-3M0jQsQZEuWXaoFm .node ellipse,#mermaid-svg-3M0jQsQZEuWXaoFm .node polygon,#mermaid-svg-3M0jQsQZEuWXaoFm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3M0jQsQZEuWXaoFm .rough-node .label text,#mermaid-svg-3M0jQsQZEuWXaoFm .node .label text,#mermaid-svg-3M0jQsQZEuWXaoFm .image-shape .label,#mermaid-svg-3M0jQsQZEuWXaoFm .icon-shape .label{text-anchor:middle;}#mermaid-svg-3M0jQsQZEuWXaoFm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3M0jQsQZEuWXaoFm .rough-node .label,#mermaid-svg-3M0jQsQZEuWXaoFm .node .label,#mermaid-svg-3M0jQsQZEuWXaoFm .image-shape .label,#mermaid-svg-3M0jQsQZEuWXaoFm .icon-shape .label{text-align:center;}#mermaid-svg-3M0jQsQZEuWXaoFm .node.clickable{cursor:pointer;}#mermaid-svg-3M0jQsQZEuWXaoFm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3M0jQsQZEuWXaoFm .arrowheadPath{fill:#333333;}#mermaid-svg-3M0jQsQZEuWXaoFm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3M0jQsQZEuWXaoFm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3M0jQsQZEuWXaoFm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3M0jQsQZEuWXaoFm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3M0jQsQZEuWXaoFm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3M0jQsQZEuWXaoFm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3M0jQsQZEuWXaoFm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3M0jQsQZEuWXaoFm .cluster text{fill:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm .cluster span{color:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm 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-3M0jQsQZEuWXaoFm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3M0jQsQZEuWXaoFm rect.text{fill:none;stroke-width:0;}#mermaid-svg-3M0jQsQZEuWXaoFm .icon-shape,#mermaid-svg-3M0jQsQZEuWXaoFm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3M0jQsQZEuWXaoFm .icon-shape p,#mermaid-svg-3M0jQsQZEuWXaoFm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3M0jQsQZEuWXaoFm .icon-shape .label rect,#mermaid-svg-3M0jQsQZEuWXaoFm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3M0jQsQZEuWXaoFm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3M0jQsQZEuWXaoFm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3M0jQsQZEuWXaoFm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败
上电复位
IPL (BootROM后第一段)
初始化DDR/Flash,加载IPL_CUST
IPL_CUST
加载 U-Boot(xz解压)
U-Boot 2015.01
解析CIS→mtdparts、读ENV
bootlogo 0 0 0 0 0
显示LOGO分区画面
mw 1f001cc0 11
gpio out 8 0/1 (WiFi时钟/使能)
nand read.e 0x22000000 KERNEL
bootm 0x22000000
nand read.e ... RECOVERY
bootm 0x22000000
Linux 4.9.84 启动
按 bootargs 挂载 ubi0:rootfs
init=/linuxrc → /etc/inittab
→ /etc/init.d/rcS
rcS: mount -a / mdev -s
telnetd -l sh(开放23端口)
customer/demo.sh
批量 insmod → 运行应用
set_config 烧录脚本中的 bootcmd 原文(注意 RECOVERY 兜底):
setenv bootcmd ' bootlogo 0 0 0 0 0; mw 1f001cc0 11; gpio out 8 0;
nand read.e 0x22000000 KERNEL 0x500000; gpio out 8 1; bootm 0x22000000;
nand read.e 0x22000000 RECOVERY 0x500000; bootm 0x22000000'
setenv dispout SAT070CP50
5.2 根文件系统视图
/ ← rootfs 分区(squashfs 语义:出厂只读)
├── bin sbin usr ← busybox-1.20.2 + 基础工具
├── lib ← glibc 2.28
├── etc/ ← inittab、fstab、init.d/rcS、mdev.conf、fw_printenv
├── linuxrc ← init
├── config/ ← ★miservice UBI卷(rw):MI 运行时
│ ├── modules/4.9.84/ mhal.ko mi_sys.ko mi_disp.ko mi_vdec.ko ...
│ ├── lib/ libmi_*.so + 第三方库
│ ├── mmap.ini fbdev.ini LCM/ pq/ vdec_fw/
│ └── config_tool riu_r riu_w dump_mmap
├── customer/ ← ★customer UBI卷(rw):用户应用区
│ ├── demo.sh ← MI 模块加载 + 应用启动入口
│ └── zkgui ... ← verify 应用(启用后)
└── appconfigs/ ← ★appconfigs UBI卷(rw):应用配置
设计模式 :只读的 rootfs 保持最小化与一致性,所有可写/可升级内容放在三个 UBI 可读写卷。/config 相当于"系统运行时配置+内核模块",/customer 是用户地盘。
5.3 MI 中间件模块体系
板端执行 customer/demo.sh 时按序加载(摘自实际 demo.sh):
sh
# 1. 文件系统/USB 类内核模块
insmod /config/modules/4.9.84/fat.ko vfat.ko ntfs.ko ehci-hcd.ko ...
# 2. 硬件抽象层
insmod /config/modules/4.9.84/mdrv_crypto.ko
insmod /config/modules/4.9.84/mhal.ko # MHAL:寄存器/硬件抽象
# 3. MI 核心 + 各业务接口(未启用的接口已被 tailor 裁掉,不生成 .ko)
insmod /config/modules/4.9.84/mi_sys.ko # MI 框架核心(buffer 流转)
insmod /config/modules/4.9.84/mi_gfx.ko # 2D 图形加速
insmod /config/modules/4.9.84/mi_divp.ko # 图像后处理(缩放/去交错)
insmod /config/modules/4.9.84/mi_disp.ko mi_panel.ko mi_fbdev.ko # 显示
insmod /config/modules/4.9.84/mi_vdec.ko mi_venc.ko # 视频解码/编码
insmod /config/modules/4.9.84/mi_ai.ko mi_ao.ko # 音频
应用通过 libmi_*.so + /dev/mi_poll 与内核模块交互。新增/裁剪 MI 接口 由两处共同决定:customer_tailor/...tailor.mk 的 interface_xxx:=enable/disable(决定编不编库和模块)+ configs/current.configs。
5.4 板端调试入口
| 途径 | 说明 |
|---|---|
| 串口 UART0 115200 | U-Boot 与 Linux console(console=ttyS0,115200) |
| telnet 23 | rcS 已启动 telnetd -l sh,网络通即可登录 |
fw_printenv / fw_setenv |
在 Linux 下读写 U-Boot 环境变量(/etc/fw_env.config 指向 /dev/mtd6) |
riu_r / riu_w |
直接读写芯片寄存器(bank:addr),调试硬件必备 |
config_tool / dump_mmap / dump_config |
查看/校验 mmap 与分区配置 |
/dev/mtd*, /proc/mtd |
MTD 分区设备 |
6. 烧录与升级
6.1 方式一:U-Boot + TFTP(日常开发首选)
前提:PC 运行 TFTP 服务(如 tftpd64),work/images/ 设为共享目录;板卡与 PC 同网段。
板卡 U-Boot PC(TFTP服务器) 板卡 U-Boot PC(TFTP服务器) #mermaid-svg-xsn0tVoYVANL8gFG{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-xsn0tVoYVANL8gFG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xsn0tVoYVANL8gFG .error-icon{fill:#552222;}#mermaid-svg-xsn0tVoYVANL8gFG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xsn0tVoYVANL8gFG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xsn0tVoYVANL8gFG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xsn0tVoYVANL8gFG .marker.cross{stroke:#333333;}#mermaid-svg-xsn0tVoYVANL8gFG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xsn0tVoYVANL8gFG p{margin:0;}#mermaid-svg-xsn0tVoYVANL8gFG .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xsn0tVoYVANL8gFG text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-xsn0tVoYVANL8gFG .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-xsn0tVoYVANL8gFG .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-xsn0tVoYVANL8gFG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-xsn0tVoYVANL8gFG .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-xsn0tVoYVANL8gFG #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-xsn0tVoYVANL8gFG .sequenceNumber{fill:white;}#mermaid-svg-xsn0tVoYVANL8gFG #sequencenumber{fill:#333;}#mermaid-svg-xsn0tVoYVANL8gFG #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-xsn0tVoYVANL8gFG .messageText{fill:#333;stroke:none;}#mermaid-svg-xsn0tVoYVANL8gFG .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xsn0tVoYVANL8gFG .labelText,#mermaid-svg-xsn0tVoYVANL8gFG .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-xsn0tVoYVANL8gFG .loopText,#mermaid-svg-xsn0tVoYVANL8gFG .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-xsn0tVoYVANL8gFG .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-xsn0tVoYVANL8gFG .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-xsn0tVoYVANL8gFG .noteText,#mermaid-svg-xsn0tVoYVANL8gFG .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-xsn0tVoYVANL8gFG .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xsn0tVoYVANL8gFG .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xsn0tVoYVANL8gFG .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-xsn0tVoYVANL8gFG .actorPopupMenu{position:absolute;}#mermaid-svg-xsn0tVoYVANL8gFG .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-xsn0tVoYVANL8gFG .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-xsn0tVoYVANL8gFG .actor-man circle,#mermaid-svg-xsn0tVoYVANL8gFG line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-xsn0tVoYVANL8gFG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} setenv serverip 192.168.x.x setenv ipaddr 192.168.x.y saveenv loop 每个分区脚本(ipl.es ... appconfigs.es) estar scripts/set_partition.es tftp 0x21000000 <镜像文件> 传输镜像 nand erase.part / ubi write 写入对应分区 estar scripts/set_config (设置bootargs/bootcmd) reset 启动新系统
estar 脚本语法 (# 注释、% 结尾符,内容就是 U-Boot 命令):
# [[kernel.es ------ 内核烧录(主备两个分区都写)
tftp 0x21000000 kernel
nand erase.part KERNEL
nand write.e 0x21000000 KERNEL ${filesize}
nand erase.part RECOVERY
nand write.e 0x21000000 RECOVERY ${filesize}
%
# [[rootfs.es ------ UBI 卷烧录
ubi part UBI
tftp 0x21000000 rootfs.ubifs
ubi write 0x21000000 rootfs ${filesize}
%
完整烧录顺序 (即 auto_update.txt):
estar scripts/[[cis.es # 分区总表
estar scripts/[[set_partition.es # 建立 MTD/UBI 卷
estar scripts/[[ipl.es [[ipl_cust.es [[uboot.es
estar scripts/[[logo.es [[kernel.es [[rootfs.es
estar scripts/[[miservice.es [[customer.es [[appconfigs.es
estar scripts/set_config # bootargs/bootcmd/dispout
reset
只改了应用 → 只烧
[[customer.es;只改内核 →[[kernel.es;改了分区表 → 从[[cis.es全部重烧。
6.2 方式二:SD 卡 / U 盘升级(现场升级)
project/ 提供打包脚本:
sh
./make_sd_upgrade_sigmastar.sh # 生成 SigmastarUpgradeSD/ 目录
./make_usb_upgrade_sigmastar.sh # 生成 U 盘升级镜像
把生成目录按脚本提示放入 FAT 格式 SD 卡(含 auto_update.txt + 各镜像),板端 U-Boot 检测到卡内升级文件即自动按脚本逐分区烧写。适合无网络的现场维护,脚本机制与 estar 完全相同。
6.3 方式三:工厂生产烧录
- 空片(裸 flash) :用 SigmaStar USB Debug Tool(硬件工具,接 CON3 调试座)配合 PC 端 Flash 烧录工具直接写裸 flash;SDK 文档《SigmaStar 工具使用说明.pdf》有详细步骤;
- 母片 :
SSD201/Source/document/SpinandPackBinTool/(含"红旗补丁")把全部分区镜像拼成一个完整 flash bin,供编程器批量烧录母片。
6.4 方式四:OTA 在线升级
分区配置中 OTA_IMAGE_LIST 定义了可 OTA 的分区集合,每个分区都有对应的升级设备(OTABLK,如 kernel→/dev/mtdblock9、miservice→/dev/ubi0_1)。make image-ota 生成升级包,配合文档《系统模块/Ota打包和升级.pdf》实现运行中升级(下载→校验→写备份分区→切换)。
7. 常用开发迭代流程
7.1 改内核
sh
cd work/kernel && source ../env.sh
make menuconfig # 或直接改 defconfig
make -j16 HOSTCFLAGS="... -fcommon"
# 快速部署:拷 uImage.xz 替换 work/images/kernel,板端只烧 [[kernel.es
7.2 改 rootfs / 板端配置
- 基础配置(inittab、fstab、rcS、mdev.conf)在
project/image/etc/; - rootfs 额外文件可加进
rootfs.mk的拷贝链; - 改完
cd project && make image-nocheck,重烧 rootfs/miservice 对应脚本。
7.3 启用 GUI demo 应用(zkgui)
默认发布包没有启用任何示例应用(customer 分区只有 demo.sh 框架 + htop)。要打入 GUI demo:
sh
# 1) 打开开关:project/release/customer_tailor/nvr_i2m_display_glibc_tailor.mk
verify_zk:=enable # 选择 customer_zk (zkgui) 应用
# 2) 重新打包(sdk/verify 的 app 目标会把 zkgui/lib/res 装入 customer 目录树)
cd work/project && make image-nocheck
# 3) 重烧 customer(及 rootfs,因为 etc 有新增)
开发自己的应用也可以仿照 customer_zk/image.mk:把可执行文件放入 $(IMAGE_INSTALL_DIR)/customer,启动命令追加到 demo.sh。
7.4 新增 MI 接口模块
在 nvr_i2m_display_glibc_tailor.mk 中把对应 interface_xxx 改为 enable,重跑 make image-nocheck:新 mi_xxx.ko 会出现在 /config/modules/4.9.84/、libmi_xxx.so 出现在 /config/lib/,demo.sh 的 #kernel_mod_list 段由打包自动更新。
7.5 改屏幕/改内存
| 需求 | 修改点 |
|---|---|
| 换屏 | board/i2m/ 下 LCM 参数 + current.configs 的 DISP_OUT_NAME;set_config 里 dispout |
| 换开机 logo | BOOTLOGO_FILE(current.configs),重打包烧 logo 分区 |
| 调整内存分配 | project/board/i2m/mmap/MMAP_I2M_64M.h,mmapparser 自动重算 bootargs |
| 换 flash 类型/大小 | 换 setup_config 配置(如 nor 用 nor.glibc-squashfs.011a.64)+ 换 U-Boot defconfig |
8. 附录:本项目环境搭建记录
Ubuntu 22.04 上构建本 SDK 所需的全部适配(已固化,work/build_all.sh 可一键复现):
- 工具链 :
gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf(解压于work/,PATH 经env.sh或~/.bashrc导出); - apt 安装 :
bison flex bc xz-utils automake libtool pkg-config libncurses-dev mtd-utils lzop python2; - i386 多架构运行库 (SDK 打包工具是 32 位 ELF):
dpkg --add-architecture i386+libc6:i386 libstdc++6:i386 zlib1g:i386 libuuid1:i386 liblzma5:i386; - python2 :内核构建脚本为 py2 语法,经
work/tools-local/bin/python → /usr/bin/python2符号链接注入构建 PATH; - dtc 编译修复 :宿主 gcc≥10 需
-fcommon(make HOSTCFLAGS="-Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89 -fcommon")。
参考文档(SSD201/Source/document/):
- 《SSD201用户开发指南.pdf》------ 编译环境与烧录 SOP
- 《SSD20x平台开发手册_V1.4.pdf》------ 平台总览
- 《系统模块/分区介绍文档 .pdf》《系统模块/Memory Layout介绍.pdf》------ 分区与内存
- 《环境搭建/SigmaStar 工具使用说明.pdf》------ USB Debug Tool 烧空片
- 《系统模块/Ota打包和升级.pdf》------ OTA