D13x平台Luban-Lite RTOS启动全解析
根据 Luban-Lite RTOS SDK 文档(D13x 平台为主),下面按时间顺序梳理从上电到应用运行的完整启动过程。
一、总体启动链(四级)
文档定义的 Luban-Lite 标准启动流程为:
| 阶段 | 名称 | 运行位置 | 主要职责 |
|---|---|---|---|
| 1 | BROM | 芯片内部 Boot ROM | 从启动介质加载下一级程序;客制化方案下可直接加载用户程序 |
| 2 | PBP | 由 BROM 加载运行 | 初始化DRAM/PSRAM(合封 PSRAM 芯片必需) |
| 3 | tinySPL | Flashspl分区 | 加载应用、USB/SD/U盘升级、命令行调试 |
| 4 | Application | os等分区 | RT-Thread 系统及业务应用 |
参考文档:topics/sdk/boot/lite_boot_direct.html
二、硬件层:上电与复位
2.1 上电时序(D13x)
VCC33_IO、VDD11_SYS、LDO18无严格上电顺序。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 NAND | APP 不能超过2 个物理块 |
| eMMC | APP 不能超过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 KB(
0x30040000起)被 BROM 占用,镜像不能加载到此区间 - 镜像头占256 字节,
Load address与Entry 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 执行流程
- BROM 加载 PBP(
d13x.pbp)及私有配置(pbp_cfg.bin) - PBP 完成内存初始化
- 返回 BROM,BROM 继续加载并跳转用户程序 / Bootloader
4.3 镜像打包示例
在image_cfg.json的resource中关联 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代码,便于板级适配。
源码结构:
| 模块 | 路径 | 说明 |
|---|---|---|
| Sys | bsp/artinchip/sys/<chip>/ | SoC 初始化 |
| Board | target/<chip>/<board>/ | 板级初始化 |
| HAL | bsp/artinchip/hal/ | 驱动 HAL |
| Boot | application/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 bootaicupg usb/aicupg nand/aicupg nor(升级)- SD 卡 / U 盘 FAT32 烧录升级
进入命令行方式:启动时按住Ctrl+C、加载应用失败、或升级中 Ctrl+C 中止。
参考文档:topics/sdk/boot/lite_boot_test_guide.html、lite_boot_config_guide.html
5.5 Bootloader 编译与部署
scons --apply-def d21x_demo88-nand_baremetal_bootloader_defconfig scons产物:
output/.../images/下 elftarget/<chip>/<board>/pack/bootloader.bin(供打包烧录)
注意:编译应用时才打包完整烧录镜像;若bootloader.bin已存在且分区未变,可不重编 Boot。
六、Flash 分区与存储布局
6.1 分区类型
| 类型 | 典型分区名 | 用途 |
|---|---|---|
| 启动分区 | spl(可自定义) | 存放 Bootloader(tinySPL) |
| 系统分区 | os | RT-Thread 应用固件 |
| 只读数据 | rodata | APP 资源(FAT,只读) |
| 可写数据 | data | 运行时数据(LittleFS/FATFS) |
| A/B 系统 | os/os_r等 | OTA 双系统,B分区加_r后缀 |
6.2 各介质启动分区默认尺寸
| 介质 | 位置 | 默认大小 | 说明 |
|---|---|---|---|
| SPI NOR | 0 ~ X | 256 KB | BROM 从此读 Bootloader |
| SPI NAND | 前 4 个物理块 | 128K 块→512 KB;256K 块→1 MB | 4 块存两份启动镜像 |
| eMMC | UDA 17K ~ X | 建议< 512 KB | BROM 从该区域读取 |
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.html、topics/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 相同或不同) |
属性:file、ram(下载地址)、attr(required/run)。
组件顺序决定 USB 升级时的下载与执行顺序。
7.2 target(写入 Flash)
| 属性 | 说明 |
|---|---|
file | 源文件 |
part | 目标分区名 |
attr | burn/mtd/ubi/block/required/optional |
典型映射:bootloader.bin→spl,rtthread.bin→os。
八、Application(RT-Thread)阶段
8.1 正常启动路径
- tinySPL 执行
nor_boot/nand_boot/mmc_boot - 从
os分区读取应用镜像到 RAM(或 XIP 直执) - 跳转到应用入口,RT-Thread 开始调度
8.2 XIP 启动(SPI NOR 可选方案)
若启用 XIP(eXecute In Place):
- Bootloader 使能 XIP 寄存器
- 配置 NOR Flash 控制器时序与地址映射
- 将启动代码放到 NOR 指定区域
- 初始化完成后,直接从 Flash 执行RTOS,减少 RAM 占用、加快启动
参考文档:topics/sdk/xip/1_introduction.html
8.3 OTA 后的重启流程
应用层 OTA 典型步骤:
ota_init()分配缓冲区- 分片下载
ota_shard_download_fun()写入 Flash(常写入 B 分区) aic_upgrade_end()更新环境变量(切换启动分区)rt_hw_cpu_reset()复位- 再次走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 ENC | SPI 总线数据加密 |
| 固件加密启动 | 固件密文解密后执行 |
| 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/PSRAM | topics/sdk/d13x_bare_boot/init-config-prsam.html |
| XIP | topics/sdk/xip/xip_user_guide.html |
| SD/U盘烧录 | topics/sdk/advanced/burn-procedure-by-diff-media.html |
以上梳理基于当前工作区中的 Luban-Lite SDK 文档。
