SSD201 BSP 开发教程

Purple Pi开发板硬件解析与嵌入式Linux开发实战 嵌入式Linux开发中,SoC选型与开发环境搭建是关键环节。SigmaStar SSD201作为一款双核Cortex-A7处理器,以1.2GHz主频和256KB二级缓存的配置,为轻量级Linux系统提供了理想的硬件平台。在工程实践中,开发板通过40pin GPIO排针兼容树莓派生态,同时集成USB OTG、红外接收等接口,显著扩展了嵌入式应用场景。针对Ubuntu 18.04/20.04 LTS开发环境,需要特别注意gcc-arm-linux-gnueabihf工具链版本管理,以及Python3-distu 阅读详情

本文章由 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。


目录

  1. 整体架构总览
  2. BSP 源码组织
  3. 构建系统与完整构建流程
  4. Flash 分区与内存布局
  5. 板端环境:启动链与运行时
  6. 烧录与升级
  7. 常用开发迭代流程
  8. 附录:本项目环境搭建记录

1. 整体架构总览

SSD20X 系列的 BSP 由四个顶层源码包组成:boot(U-Boot)、kernel(Linux 内核)、sdk(MI 中间件示例应用/验证代码)、project(构建中枢:打包、rootfs、板级资源)。project 是唯一需要"操作"的入口,它把其他三部分的结果组装成可烧录镜像。

镜像产物 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 顶层目录

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)+ 可加载模块

内核编译有两个注意点(本项目已踩坑并固化):

  1. 内核 Makefile 用裸 python 调用 py2 脚本(scripts/ms_gen_mvxv_h.py 等)→ 需要 python2;
  2. 宿主 gcc ≥ 10 时 scripts/dtc 报 yylloc 重定义 → make 时需追加 HOSTCFLAGS=…-fcommon。

2.4 project/ —— 构建中枢(最核心)

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/lib
    ex_libs/dynamic/ffmpeg、curl 等第三方库/config/lib
    modules/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 目标,把应用装进打包目录:

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 流程总览

① 解压 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"描述每个分区:

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 里的每个名字:

  1. 按 $(RESOUCE) 取原始数据(编译产物或预编译目录);
  2. rootfs 类分区先组装目录树(rootfs.mk:解 rootfs.tar.gz → busybox → glibc → MI 库/模块到 miservice → 应用 app 目标);
  3. 用 mksquashfs/mkfs.ubifs/ubinize 等工具生成镜像文件;
  4. 生成同名烧录脚本 scripts/[[xxx.es;
  5. 最后把 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.binimage 打包工具生成分区总表(含 BOOTTAB/SYSTAB),写固定 PBA
ipl_s.bin / ipl_cust_s.binproject/board/i2m/boot/ipl/IPL.bin / IPL_CUST.bin预编译启动引导(SigmaStar 不提供源码),各存 2 分区 3 副本
uboot_s.binboot/ 编译产物我们自己编译的 U-Boot
kernelkernel 编译产物 uImage.xz写入 KERNEL,同时复制到 RECOVERY
logoBOOTLOGO_FILE jpg 经 logogen 处理开机 logo
rootfs.ubifsrootfs.tar.gz + busybox + glibc + etc/只读根文件系统
miservice.ubifsrelease/.../common/glibc/8.2.1 的库、模块、工具 + board 配置挂载到 /config(可读写)
customer.ubifsverify 应用产物 + demo.sh + htop挂载到 /customer(可读写,用户区)
appconfigs.ubifs应用配置挂载到 /appconfigs

4. Flash 分区与内存布局

4.1 SPI-NAND 分区表(spinand.ubifs.p2.partition.config)

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 启动链

失败

上电复位

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):

# 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 115200U-Boot 与 Linux console(console=ttyS0,115200)
telnet 23rcS 已启动 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/mtdMTD 分区设备

6. 烧录与升级

6.1 方式一:U-Boot + TFTP(日常开发首选)

前提:PC 运行 TFTP 服务(如 tftpd64),work/images/ 设为共享目录;板卡与 PC 同网段。

板卡 U-Boot PC(TFTP服务器) 板卡 U-Boot PC(TFTP服务器) 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/ 提供打包脚本:

./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 改内核

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:

# 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
换开机 logoBOOTLOGO_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 可一键复现):

  1. 工具链:gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf(解压于 work/,PATH 经 env.sh 或 ~/.bashrc 导出);
  2. apt 安装:bison flex bc xz-utils automake libtool pkg-config libncurses-dev mtd-utils lzop python2;
  3. i386 多架构运行库(SDK 打包工具是 32 位 ELF):dpkg --add-architecture i386 + libc6:i386 libstdc++6:i386 zlib1g:i386 libuuid1:i386 liblzma5:i386;
  4. python2:内核构建脚本为 py2 语法,经 work/tools-local/bin/python → /usr/bin/python2 符号链接注入构建 PATH;
  5. 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
保姆级教程:在Ubuntu 16.04上搞定SSD202开发板全套环境(含uboot、kernel、buildroot) 本文提供在Ubuntu 16.04上搭建SSD202开发板全套环境的保姆级教程,涵盖uboot、kernel和buildroot的源码编译与配置。通过详细的步骤说明和常见问题解决方案,帮助开发者高效完成环境搭建,避免常见错误,提升嵌入式Linux开发效率。 阅读详情

相关推荐

Contex-M3寄存器组整理

看我以前的博客,关于ARM 寄存器和汇编,我之前写过和写过相关的博客至少有三次,可是实际情况却是过了一两年就基本忘了,感觉之前学的都是囫囵吞枣,没有真正的明白,也许学习就是这样,一开始只能记个大概,多看几遍多用几遍也许就理解了。每次看到汇编的地方,必然就会想起R0-R15寄存器的意思是啥。

tecoes的博客 104

【SSD202 开发实战 05】U-Boot 移植与定制开发

本文详细介绍了 SigmaStar SSD202 平台 U-Boot 的完整移植与定制开发流程。从开发环境搭建、官方 SDK 获取开始,深入解析 SSD202 特有的 U-Boot 源码结构,讲解基础编译与多种烧写方式(ISP、TFTP、USB)。重点阐述板级移植的核心步骤,包括 DDR 初始化、串口配置、SPI NAND Flash 驱动适配等,并提供实用的定制开发技巧,如环境变量默认值设置、启动流程优化、自定义命令添加。最后汇总了开发过程中常见的问题及解决方案,帮助开发者快速上手 SSD202 的 U-

435

【信息科学与工程学】【制造工程】计算机科学与自动化——服务器制造中的学科知识01

由可数可加性:μ(A)=∑k=1∞​μ(Bk​)=limn→∞​∑k=1n​μ(Bk​)=limn→∞​μ(⋃k=1n​Bk​)=limn→∞​μ(An​)。:若limsupAn​=liminfAn​=A,则A中的元素恰是那些“最终总是属于An​”的元素,也是那些“属于无穷多个An​但不属于无穷多个Anc​”的元素。:通过构造一个不相交的序列{Bn​},其中B1​=A1​, Bn​=An​∖(⋃k=1n−1​Ak​)。则⋃n​Bn​=⋃n​An​,且Bn​⊂An​。我们称A为一个“集类”或“集合族”。

weixin_49199313的博客 553

SigmaStar SSD20X嵌入式显示方案:高集成度SoC在智能设备中的应用与开发

在嵌入式系统开发中,片上系统(SoC)通过将处理器核心、内存、外设控制器等关键组件集成于单一芯片,实现了硬件设计的极大简化与成本优化。其核心原理在于通过高度集成的架构,减少外部元器件数量,降低PCB层数与布线复杂度,从而提升系统可靠性与开发效率。这一技术为智能显示、物联网网关等场景提供了高性价比的解决方案。具体到嵌入式显示领域,SigmaStar SSD20X系列处理器便是这一设计理念的典型代表。它集成了ARM Cortex-A7双核、内置DDR内存、视频编解码引擎、显示驱动、网络PHY及音频Codec,形

weixin_42530536的博客 568

【信息科学与工程学】【数据科学】第一百八十八篇 线性/非线性泛函分析01

​ 普通数值函数 f:R→R​泛函⬇️最规矩的孩子:线性泛函(面积、加权求和)⬇️大多数自然界的现象:非线性泛函(曲线的能量、弧长)⬇️最光滑好算的:连续/可微泛函(可用欧拉-拉格朗日方程求极值的)⬇️刺头:不连续/奇异泛函(狄拉克 Delta,阶跃)弧长泛函​ — 变分法/几何最速降线泛函(时间泛函)​ — 变分法/经典力学动能-势能差(作用量)泛函​ — 拉格朗日力学Dirichlet能量泛函​ — PDE/位势论/调和函数线性积分泛函(Lebesgue空间上的有界线性泛函)

weixin_49199313的博客 192

如何使用JMeter进行大模型的压力测试?

使用JMeter进行大模型的压力测试,核心是通过模拟高并发请求,测试大模型在极限负载下的性能表现(如响应时间、吞吐量、错误率、资源瓶颈等)。通过以上步骤,可系统性评估大模型在高压下的性能极限,为优化模型(如量化、蒸馏)、扩容硬件(增加GPU)或调整接口限流策略提供数据依据。)、请求方式(POST)、认证方式(API Key放在Header)、请求参数(作用:避免瞬间高压压垮系统,更精准找到瓶颈点。等)、响应格式(同步/流式)。需获取:API地址(如。通过CSV文件引入不同。

alankuo的专栏 787

‌树莓派Pico‌硬件和软件iic的SSD3306

pico-sdk-api文档rp2040-datasheet.pdfgetting-started-with-pico.pdf树莓派 Pico 之可编程 IO(PIO)

qq_26074053的博客 657

STM32L431电池供电项目实战:用STOP2模式把功耗降到5uA以下(CubeMX配置详解)

本文详细介绍了如何在STM32L431电池供电项目中利用STOP2模式实现5μA以下的超低功耗设计。通过CubeMX配置、硬件优化和软件策略,成功将农业温湿度监测节点的待机功耗控制在4.7μA,确保CR2032电池供电下3年以上的工作寿命。文章包含完整的低功耗实现路径和实测数据,特别适合物联网边缘设备开发者参考。

weixin_30345577的博客 392

ROG枪神8Plus的打开方式,在《幻兽帕鲁》的世界中彻底释放

存储方面,ROG枪神8 Plus标配高性能的1TB PCIe 4.0 SSD,读取速率高达7000MB/s,写入速度同样达到了约5000MB/s的水准,文件的存储、应用程序的安装、开启速度更快,体验更为极致。同时,该机还配备满功耗140W的Nvidia RTX4070显卡,该显卡拥有8GB GDDR6大容量显存并支持DLSS 3.5,配合Nvidia Studio创意加速,可实现热门创意应用的优化,带来更为出色的图显性能。性能方面,该机还支持双显三模热切换,屏幕更是支持4种色域可切换,实用性极高。

2301_78436271的博客 1441

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7795

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月13日-安全配置-准备工作

请遵循本规程将SABRE 3D/3DxT/3D Scimitar系统设置为安全配置,以便能够在电镀单元、APT模块、XMM(或SRD)模块、工厂接口(FI)外壳或中央通道内部及周边区域执行作业p104-p117。在生产过程中暂停调度程序存在一定风险:若待维护模块未离线且在其他模块完成处理前重启调度程序,可能对生产晶圆造成影响。维护人员需特别注意电镀模块内的晶圆状态,并尽可能快速地恢复调度程序。确认待维护模块内无晶圆滞留暂停调度程序并将相应模块设置为离线状态打开模块检修门并关闭安全盖板(槽位)

weixin_46735260的博客 1363

ATF在IoT SoC上的移植实践与安全固件审计要点

在嵌入式安全体系中,TrustZone和可信固件构成了设备可信运行的基础。Arm Trusted Firmware(ATF)作为EL3特权级固件,负责安全世界与非安全世界的隔离,并通过PSCI提供电源管理、系统复位等运行时服务。其链式信任机制从Boot ROM逐级验签至BL33,确保固件镜像的完整性与抗回滚能力。在IoT设备日趋复杂、安全漏洞频发的背景下,理解ATF的分层架构(BL1/BL2/BL31/BL32/BL33)不仅是平台移植的前提,也是安全固件审计的关键路径。本文从安全固件概念与启动信任链原理入

weixin_29192141的博客 310

U24时钟信号上升下降沿出现非单调性--简单分析

交换机U24时钟信号上升下降沿出现非单调性--简单分析

qq_45185504的博客 1131

边缘AI芯片SoC选型实战:12种组合与算力功耗权衡

边缘AI正从概念走向工程落地,其核心载体SoC(系统级芯片)将CPU、GPU、NPU等资源集成于一体,如何在算力、功耗、成本之间取舍成为产品成败关键。理解SoC工作原理与不同算力梯队的适用边界,是嵌入式开发者与产品经理构建智能硬件的基础能力。从MCU级轻量感知到视觉类AP级多路分析,再到BMS、UWB等专用场景,不同SoC组合对应差异化功耗与开发效率。量体裁衣的选型策略,结合电源时序、散热设计等工程实践,才能规避性能过剩、供货中断等深坑,实现可靠量产的边缘AI设备。本文基于真实项目梳理12种SoC组合,为边

weixin_34122810的博客 380

Zephyr RTOS -- 学习笔记总述

文章目录摘要1. 开发基础部分2. 内核服务入门 本笔记基于 Zephyr 版本 2.6.0-rc2 摘要 1. 开发基础部分 2. 内核服务入门 2.1 线程简介 2.2 线程 2.3 工作队列线程 2.4 调度 2.5 中断 2.6 轮询 API 2.7 信号量

思想给了我们太多的自由,而我们拖累了思想...... 4824

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 782

【STM32】 ADC 完全指南:从模拟信号采样量化到五大架构原理

本文系统介绍ADC核心概念与五大主流架构。模拟信号具时间与幅值连续性,需经采样(满足奈奎斯特准则防混叠)、量化(引入±1/2LSB误差,SNR≈6.02N+1.76dB)、编码三步转为数字信号。重点解析Flash(并行高速但受限于比较器数量)、SAR(逐次逼近,低功耗适合MCU如STM32)、双积分(高精度抗工频,用于万用表)、流水线(高速吞吐)及Σ-Δ(高分辨率,靠过采样与噪声整形)五类架构原理、优缺点与应用场景。强调分辨率≠精度,选型本质是速度、精度、功耗与面积的权衡。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 426

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6282

18.STM32F103C8T6时钟系统基础

本文以电脑与单片机类比,阐释时钟系统在嵌入式开发中的核心作用。单片机内核类比CPU,AHB/APB类比PCle与USB接口,Flash与RAM对应硬盘与内存。通过CubeMX配置时钟,从8MHz内部时钟到72MHz外部晶振,改变HCLK影响主频,进而改变板载LED闪烁速度。分析for循环耗时:虽理论800万次循环应耗1秒,但实际受指令周期、编译优化(可能删除空循环)、数据类型及中断影响,耗时可达数秒或趋近零。强调时钟频率决定“心跳”,但精准定时需考虑多因素,验证时钟差异需依赖实际配置调整。

2603_94865212的博客 209

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

基于STM32的智能浇花系统

本文设计基于STM32F103C8T6的智能浇花系统,集成DHT11、YL-69、MQ-135、GL5528四类传感器,实现温湿度、土壤湿度、CO₂浓度与光照的实时监测。系统支持自动、手动、远程三模式联动控制,通过ESP8266-01S以MQTT协议上云,配合手机APP实现数据可视化与远程指令下发。硬件采用多通道ADC采样、继电器驱动与OLED显示,软件实现精准时序控制与双向通信。测试表明系统稳定可靠,完整覆盖“感知—控制—云联”IoT全链路,具备高扩展性与工程实践价值。

weixin_45732499的博客 153

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

网口ps端--基础知识--调试(1)--deepseek

你现在卡住,是因为这每一层(硬件、驱动、lwIP 协议、IP 地址)中,只要有一层不对,网口就不通。物理层:看灯。灯亮说明线没问题,PHY 没死。MAC 驱动层:看串口打印。有没有打印出Link Speed?如果卡在自协商,说明你的 PHY 驱动还没配好。lwIP 协议层:如果底层通了,IP 也配对了,你调用udp_recv注册了回调函数,当电脑发来 UDP 包时,lwIP 会自动把数据包拆开,送到你的回调函数里。你之前一直在改,就是一直在死磕第 1 层和第 2 层。

AlibabaApple的博客 95

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

35ms 抗量子握手:ESP32-S3 跑通 ML-KEM-768

ML-KEM(Module-Lattice-based Key Encapsulation Mechanism)基于格密码,是 NIST 2024 年正式发布的 FIPS 203 标准。选 768 参数级(而不是更低的 512)是因为它被广泛视为"长期安全"档位——CATAPULT 等行业联盟也推荐 IoT 长寿命设备直接上 768。密钥交换的抗量子性。现有 IoT 设备大量使用 ECDH,量子计算机(Shor 算法)一旦可用,ECDH 直接失效。

嵌入式单片机实验室 206

S021D-基于STM32单片机自动追光系统(舵机)【Proteus仿真+Keil程序+原理图】

设计以STM32单片机、四路GL5516光敏电阻、两路SG90舵机、OLED、按键搭建双轴追光云台系统。支持手动/自动模式切换,按键可调节追光灵敏度并保存至FLASH;自动模式依靠四路光敏采集光照差值计算方位,驱动舵机跟踪光源,OLED实时显示云台角度与工作状态。

51单片机实物制作DIY设计 180

认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇14

本文系统阐述了STM32晶振电路设计要点,强调负载电容匹配与R_Ext必要性需基于计算验证,指出PCB寄生参数对振荡精度影响显著。重点提出振荡器PCB设计规范:缩短走线、加地保护环、分离地平面、避免串扰,并说明焊接工艺与环境防护对稳定性的重要性。同时解析内部时钟不可用于USB因温漂大,且PLL不放大ppm误差。最后推荐使用MEMS振荡器替代传统晶振,实现低功耗、小体积与高可靠性。

一只天天被叨叨的小可爱 287

ARM64-GNU汇编器

o伪指令分配大小例子伪指令分配大小例子.byte1 字节.byte 0x412 字节.word / .long 4 字节8 字节.ascii字符串(不加 \0)字符串(自动加 \0).byte:把 8位数当成数据插入汇编代码中。.hword和 .short:把16 位数当成数据插入汇编代码中。.long和 .int:这两个伪指令的作用相同,都把 32位数当成数据插入汇编代码中。.word:把 32位数当成数据插入汇编代码中。

weixin_43903002的博客 172
上一篇: 大家都来用DeepSeek-Harness调试开发板吧!鲸鱼真可爱
下一篇: 某上位机项目 PyInstaller 与 Nuitka 打包方案对比评估报告
燕卫博
博客等级 码龄7年 312粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值