当前位置: 首页 > news >正文

D13x平台Luban-Lite RTOS启动全解析

根据 Luban-Lite RTOS SDK 文档(D13x 平台为主),下面按时间顺序梳理从上电到应用运行的完整启动过程。


一、总体启动链(四级)

文档定义的 Luban-Lite 标准启动流程为:

正常启动

升级模式

失败/CTRL+C

上电 / 复位

Boot ROM BROM
芯片内置 ROM

需要初始化
DRAM/PSRAM?

PreBootProgram PBP
初始化内存

tinySPL Bootloader
裸机引导程序

启动模式

加载并跳转 Application
RT-Thread 应用

aicupg USB/SD/U盘 烧录

串口命令行控制台

烧录完成,重新上电

阶段名称运行位置主要职责
1BROM芯片内部 Boot ROM从启动介质加载下一级程序;客制化方案下可直接加载用户程序
2PBP由 BROM 加载运行初始化DRAM/PSRAM(合封 PSRAM 芯片必需)
3tinySPLFlashspl分区加载应用、USB/SD/U盘升级、命令行调试
4Applicationos等分区RT-Thread 系统及业务应用

参考文档:topics/sdk/boot/lite_boot_direct.html


二、硬件层:上电与复位

2.1 上电时序(D13x)

  • VCC33_IOVDD11_SYSLDO18无严格上电顺序
  • VCC33_IO上升沿需> 150 µs

2.2 复位源

任一复位条件成立即复位芯片,主要包括:

  • 系统上电复位VCC33_IO+VDD11_SYS上电后产生,约 10 ms 内自动释放。
  • RTC 上电复位、外部RESETN(低电平 ≥ 2 ms)、JTAG 复位、看门狗、过温、电压比较复位等。

参考文档:topics/product/d13x-pullup-down-timing.html


三、Boot ROM(BROM)阶段

3.1 基本行为

  • 芯片上电后首先执行 BROM(固化在芯片内)。
  • BROM 从配置的启动介质(SPI NOR / SPI NAND / eMMC / SD 等)读取符合 AIC 镜像格式的程序并执行。
  • 程序必须按规定格式打包(.aic),否则 BROM 不会运行。

3.2 BROM 运行环境限制(D13x)

BROM 运行时性能受限,影响加载速度:

限制项说明
CPU 频率24 MHz
Cache未使能
中断未使能

因此:镜像不宜过大;超过一定大小应走 tinySPL,而不是让 BROM 直接加载大应用。

3.3 BROM 直接加载的大小限制

存储介质限制
SPI NANDAPP 不能超过2 个物理块
eMMCAPP 不能超过512 KB
SPI NOR启动分区默认 256 KB,可加载更大程序但 BROM 速度慢,不建议过大

参考文档:topics/sdk/d13x_bare_boot/brom-load-limit-and-notes.html

3.4 D13x 内存加载地址约束(客制化 / BROM 直启)

  • SRAM 起始:0x30040000
  • 最低 16 KB0x30040000起)被 BROM 占用,镜像不能加载到此区间
  • 镜像头占256 字节Load addressEntry point至少相差 256 字节
  • 推荐加载地址:0x30044000

示例配置:

"loader":{"file":"app.bin","load address":"0x30044000","entry point":"0x30044100"}

参考文档:topics/sdk/d13x_bare_boot/generate-cus-brom-app.html


四、PreBootProgram(PBP)阶段

4.1 作用

  • PBP 是BROM 的扩展,在 BROM 与主程序之间运行。
  • 主要完成DRAM / PSRAM 初始化
  • 合封 PSRAM的 D13x 芯片,若应用要用 PSRAM,必须先跑 PBP

4.2 执行流程

  1. BROM 加载 PBP(d13x.pbp)及私有配置(pbp_cfg.bin
  2. PBP 完成内存初始化
  3. 返回 BROM,BROM 继续加载并跳转用户程序 / Bootloader

4.3 镜像打包示例

image_cfg.jsonresource中关联 PBP:

"resource":{"pbp":"d13x.pbp","private":"pbp_cfg.bin"}

生成命令:

mk_private_resource.py-lpbp_cfg.json-opbp_cfg.bin mk_image.py-p-cimage_cfg.json-d.

参考文档:topics/sdk/d13x_bare_boot/init-config-prsam.html


五、tinySPL(Bootloader)阶段

5.1 定位与架构

  • Luban-Lite 使用tinySPL作为 Bootloader(非 U-Boot)。
  • 基于 HAL 的裸机程序:无线程、无中断处理、按需初始化驱动以加快启动。
  • 与 RT-Thread 应用共用Sys/Board/HAL代码,便于板级适配。

源码结构:

模块路径说明
Sysbsp/artinchip/sys/<chip>/SoC 初始化
Boardtarget/<chip>/<board>/板级初始化
HALbsp/artinchip/hal/驱动 HAL
Bootapplication/baremetal/bootloader/Bootloader 本体

参考文档:topics/sdk/boot/lite_boot_design_guide.html

5.2 系统初始化调用链

_start // startup_gcc.S → save_boot_params // 保存 BROM 传入的启动参数 → icache_enable() → dcache_enable() → SystemInit() → main() // bootloader/main.c → board_init() → heap_init() → aic_board_sysclk_init() → aic_board_pinmux_init() → uart_init(cons_uart) → stdio_set_uart(cons_uart) → console_init()

原则:不做多余驱动初始化,用时再初始化,缩短启动时间。

5.3 启动与升级主流程

main() → board_init() → console_init() → bd = aic_get_boot_device() // 判断当前启动设备 → console_set_bootcmd("nor_boot") // 按介质设置:nor_boot / nand_boot / mmc_boot / aicupg usb 0 等 → console_loop() → console_run_cmd(bootcmd) // 自动执行启动命令 → _console_loop() // bootcmd 失败则进入交互命令行

5.4 支持的启动介质与命令

menuconfig 中可配置:

  • nor boot/nand boot/mmc boot
  • aicupg usb/aicupg nand/aicupg nor(升级)
  • SD 卡 / U 盘 FAT32 烧录升级

进入命令行方式:启动时按住Ctrl+C、加载应用失败、或升级中 Ctrl+C 中止。

参考文档:topics/sdk/boot/lite_boot_test_guide.htmllite_boot_config_guide.html

5.5 Bootloader 编译与部署

scons --apply-def d21x_demo88-nand_baremetal_bootloader_defconfig scons

产物:

  • output/.../images/下 elf
  • target/<chip>/<board>/pack/bootloader.bin(供打包烧录)

注意:编译应用时才打包完整烧录镜像;若bootloader.bin已存在且分区未变,可不重编 Boot。


六、Flash 分区与存储布局

6.1 分区类型

类型典型分区名用途
启动分区spl(可自定义)存放 Bootloader(tinySPL)
系统分区osRT-Thread 应用固件
只读数据rodataAPP 资源(FAT,只读)
可写数据data运行时数据(LittleFS/FATFS)
A/B 系统os/os_rOTA 双系统,B分区加_r后缀

6.2 各介质启动分区默认尺寸

介质位置默认大小说明
SPI NOR0 ~ X256 KBBROM 从此读 Bootloader
SPI NAND前 4 个物理块128K 块→512 KB;256K 块→1 MB4 块存两份启动镜像
eMMCUDA 17K ~ X建议< 512 KBBROM 从该区域读取

6.3 分区表示例(SPI NAND)

"spi-nand":{"size":"128m","partitions":{"spl":{"size":"1m"},"os":{"size":"2m"},"rodata":{"size":"4m"},"data":{"size":"28m"}}}

参考文档:topics/sdk/advanced/partition_intro.htmltopics/sdk/linux/burn-image-partition-table.html


七、烧录镜像结构(image_cfg.json)

打包后的烧录镜像包含三部分:

"image": { "info": { ... }, // 平台、版本、存储介质信息 → 生成 Image Header "updater": { ... }, // USB/SD 刷机时在 RAM 中运行的组件 "target": { ... } // 要写入 Flash 的组件 }

7.1 updater(刷机时 RAM 执行)

组件说明
spl第一级引导(tinySPL)
第二级组件刷机程序(可与正常 SPL 相同或不同)

属性:fileram(下载地址)、attrrequired/run)。
组件顺序决定 USB 升级时的下载与执行顺序。

7.2 target(写入 Flash)

属性说明
file源文件
part目标分区名
attrburn/mtd/ubi/block/required/optional

典型映射:bootloader.binsplrtthread.binos


八、Application(RT-Thread)阶段

8.1 正常启动路径

  1. tinySPL 执行nor_boot/nand_boot/mmc_boot
  2. os分区读取应用镜像到 RAM(或 XIP 直执)
  3. 跳转到应用入口,RT-Thread 开始调度

8.2 XIP 启动(SPI NOR 可选方案)

若启用 XIP(eXecute In Place):

  1. Bootloader 使能 XIP 寄存器
  2. 配置 NOR Flash 控制器时序与地址映射
  3. 将启动代码放到 NOR 指定区域
  4. 初始化完成后,直接从 Flash 执行RTOS,减少 RAM 占用、加快启动

参考文档:topics/sdk/xip/1_introduction.html

8.3 OTA 后的重启流程

应用层 OTA 典型步骤:

  1. ota_init()分配缓冲区
  2. 分片下载ota_shard_download_fun()写入 Flash(常写入 B 分区)
  3. aic_upgrade_end()更新环境变量(切换启动分区)
  4. rt_hw_cpu_reset()复位
  5. 再次走BROM → PBP → tinySPL → 新固件

参考文档:topics/sdk/ota/ota_programming.html


九、特殊启动模式

9.1 USB 烧录(BROM 升级模式)

  • 设备进入BROM USB 升级模式(通常配合 AiBurn 工具)
  • PC 通过 USB 下发updater中的组件到 RAM 并按序执行
  • target组件烧入对应分区

9.2 SD 卡 / U 盘工厂烧录

方式流程概要
SD 卡FAT32 根目录放bootloader.aic+bootcfg.txt→ 上电进 tinySPL 自动烧录 →拔卡再上电
U 盘类似,需使能aicupg udisk upgrade

注意:烧录完成后不会自动重启,防止重复进入烧录模式。

参考文档:topics/sdk/advanced/burn-procedure-by-diff-media.html

9.3 客制化启动(跳过 Luban-Lite 标准链)

  • 上电后 BROM直接运行用户客制程序(不必是 SDK 编译的 RT-Thread)
  • 需按 AIC 镜像格式打包,并遵守内存地址约束
  • 可选嵌入 PBP 做 PSRAM 初始化

参考文档:topics/sdk/d13x_bare_boot/index.html


十、安全启动(可选)

若通过 eFuse 使能安全特性,BROM 阶段会增加:

eFuse 功能作用阶段
安全启动RSA 验签,仅运行合法签名固件
SPI ENCSPI 总线数据加密
固件加密启动固件密文解密后执行
PBP 加密PBP 程序加密

开启安全启动后,Bootloader 等组件也需参与签名打包。

参考文档:topics/sdk/secure/章节


十一、端到端时序总结

[硬件] 上电 → 系统复位释放(~10ms) ↓ [BROM] 24MHz/无Cache,读启动介质 spl 区或客制镜像 ↓ [PBP] (可选) 初始化 PSRAM/DRAM → 回 BROM ↓ [tinySPL] 使能 Cache,初始化时钟/UART/堆 ↓ ├─ bootcmd 成功 → 读 os 分区 → 跳转 RT-Thread ├─ USB/SD/U盘升级 → aicupg 烧写 Flash └─ 失败/Ctrl+C → 串口命令行 (nor_boot/mem/mtd...) ↓ [Application] RT-Thread 启动 → 驱动/文件系统/业务任务

十二、关键文档索引

主题文档路径
启动总览topics/sdk/boot/lite_boot_direct.html
tinySPL 设计topics/sdk/boot/lite_boot_design_guide.html
Boot 配置编译topics/sdk/boot/lite_boot_config_guide.html
分区说明topics/sdk/advanced/partition_intro.html
镜像配置topics/sdk/boot/image-file-intro.html
D13x 客制化启动topics/sdk/d13x_bare_boot/
PBP/PSRAMtopics/sdk/d13x_bare_boot/init-config-prsam.html
XIPtopics/sdk/xip/xip_user_guide.html
SD/U盘烧录topics/sdk/advanced/burn-procedure-by-diff-media.html

以上梳理基于当前工作区中的 Luban-Lite SDK 文档。

http://www.jsqmd.com/news/854287/

相关文章:

  • LibreSprite:5步开启你的像素艺术创作之旅
  • 基于PIC单片机与PWM的RGB LED光效控制:从电路设计到低功耗优化
  • 高校实验室利用 Taotoken 平台让学生便捷接触多种大模型
  • Tycoon2FA 利用 OAuth 设备码钓鱼劫持 Microsoft 365 账户的机理与防御
  • 2026深度分析罗兰艺境B2B企业服务-礼品定制GEO技术案例,测评义乌礼通优化过程与效果验证 - 罗兰艺境GEO
  • 终极指南:如何用通达信缠论可视化插件轻松掌握技术分析
  • 原子之心-虚拟机版 Build.22917609 全DLC(Atomic Heart)免安装中文版
  • 00000
  • 自适应动态规划HDP vs. 经典强化学习Actor-Critic:在控制问题中该如何选择?
  • 《ROS 2机器人开发从入门到实践》 2.3 使用功能包组织C++节点
  • 手把手教你免拆机救活魔百盒CM201-2(ZG朝哥代工版),附Hi3798MV300芯片EMMC/NAND通刷固件
  • YOLOv8模型家族全解析:P2、P6、标准版到底该选哪个?一张图帮你搞定选择困难症
  • 你的AI Agent为什么一上线就翻车?8层架构告诉你真相
  • 告别Rufus!在Ubuntu 22.04上用Ventoy打造你的万能Windows安装盘(附PE系统集成)
  • 书评质量断崖式提升的关键一步,Perplexity辅助写作的3层认知跃迁与2个致命误用陷阱
  • JavaScript自动化PPT生成解决方案:PptxGenJS高效实践指南
  • 代码随想录算法训练营第六十天|Bellman_ford 队列优化算法、Bellman_ford之判断负权回路、bellman_ford之单源有限最短路
  • 高光谱数据校正避坑指南:从采集到反射率,新手最容易忽略的5个细节(以SUSE数据为例)
  • 【2026年】伺服电机编码器选择指南:增量式vs绝对式,哪个更适合你的项目?
  • Midjourney企业级订阅落地手册(含GDPR合规配置、团队权限分级与成本分摊公式)
  • 告别单一视角:用Transformer融合骨架与轮廓,实战提升步态识别鲁棒性
  • 为什么顶尖技术博主都在悄悄升级Perplexity写作辅助?揭秘3个未公开的上下文增强策略
  • 3分钟上手:Windows上运行安卓应用的终极方案——APK安装器全面指南
  • 国内开通 GPT 会员的自助充值流程记录
  • 学术论文翻译翻车重灾区!Perplexity翻译查询功能如何通过引用锚点保留+LaTeX公式智能隔离实现零失真输出(仅限Pro+订阅用户可见的隐藏模式)
  • 谷歌运营公司热门推荐
  • 7.C# —— 方法返回值、值传递、ref/out/in/params
  • 别再手动点选了!用C#给NX二次开发控件加过滤器,效率翻倍(附两种方法对比)
  • 《CVPR2025-DEIM创新改进项目实战:从原理到部署的深度学习优化全攻略》007、数据准备——ImageNet/COCO数据集预处理与增强策略
  • 电池模型参数辨识避坑指南:HPPC数据拟合时,你的1RC和2RC模型初始值设对了吗?