客制化启动
Luban-Lite SDK 支持客制化启动方案,即在芯片上电后运行客制化开发的程序,而不是 Luban-Lite SDK 编译出来的程序。本节演示了如何让 CPU 上电立刻运行客制化的程序。
生成客制化的 Boot ROM 启动程序
芯片在上电启动时,首先运行芯片内部的 Boot ROM 程序,Boot ROM 程序加载并运行下一级程序。
-
配置启动镜像格式中的以下关键字段:
-
Loader binary data: 客制化程序存放的区域。
-
Load address: 启动镜像的加载地址。
-
Entry point: 客制化程序的程序入口地址,对应程序的链接地址。
-
- 做好内存空间使用规划:
-
D13x SRAM 的开始地址为 0x30040000
-
SRAM 的最开始 16K Byte,Boot ROM 运行时在使用,因此启动镜像不能被加载到该区间。
-
启动镜像头信息占用 256 字节,因此 Load address 和 Entry point之间至少预留 256 字节。
启动镜像加载的内存地址,应该是 0x30044000 之后:
-
-
tools/scripts/mk_image.exe
-
tools/scripts/mk_image.py
-
参考下面的 image_cfg.json 文件配置,进行打包并生成 app.aic 镜像:
{ "pre-process": { // Pre-proccess to generate image components from raw data "aicimage": { // Create aic boot image "app.aic": { "loader": { "file": "app.bin", "load address": "0x30044000", "entry point": "0x30044100", // 256 byte aic header }, }, }, }, }
此处 image_cfg.json 描述了将 app.bin 打包生成 app.aic ,放到 loader 区域,并且设置了加载地址和入口地址。
-
执行下列命令在当前目录生成 app.aic 文件,此文件为芯片 Boot ROM 可加载的镜像文件:
mk_image.py -p -c <path_to_image_cfg_dir>/image_cfg.json -d <path_to_app_dir>
如果将 mk_image.py image_cfg.json app.bin 都放在一个目录,则命令为:mk_image.py -p -c image_cfg.json -d .
运行和烧录客制化程序
在本节中,选择任意一种方式运行生成的 app.aic 程序。
烧录到 Flash 中运行
-
自定义烧录
Boot ROM 升级模式不支持烧录 Flash。 如果不使用 Luban-Lite SDK 的 BootLoader 烧录方案,则需要自定义烧录功能。
开发者需要本节介绍如何自行实现一个自定义一个带烧录功能的程序,如 flashwriter.aic ,通过 USB/UART/SD 卡等方式运行后起来,然后将 app.aic 烧录到指定的存储介质中。
- 通过 USB/UART 烧录:
- 通过 USB/UART,使用 upgcmd.exe write 命令将
app.aic 先写入到一个预设的 SRAM
空间。在命令行中执行以下命令:
upgcmd.exe write /path/to/app.aic /path/to/sram_storage
-
下载运行 flashwriter.aic ,由 flashwriter.aic 从该位置 SRAM 存储中读取 app.aic 的数据,并写入将其烧录到 Flash。
- 通过 USB/UART,使用 upgcmd.exe write 命令将
app.aic 先写入到一个预设的 SRAM
空间。在命令行中执行以下命令:
-
通过 SD 卡烧录:
- 将 SD 卡插入开发板,并将 flashwriter.aic 烧录到 SD 卡的 FAT32 文件系统中。
-
启动开发板,使其从 SD 卡启动并运行 flashwriter.aic。
-
flashwriter.aic 程序从 SD 卡的文件系统中读取 app.aic 的数据,并写入将其烧录到 Flash。
烧录位置可能因存储介质类型而异:-
对于 SPINOR,只需将 app.aic 直接烧录到 Flash 的最开始位置即可,即 Flash 0 位置。
-
对于 SD/eMMC,开始处需要预留 17K Byte 的 GPT 分区头,因此从第 34 个 Sector 的位置烧录 app.aic。
对于 SPINAND,由于需要坏块管理等,处理比较复杂,建议使用 SDK 的 BootLoader 进行烧录,此处不进行描述。
- 通过 USB/UART 烧录:
-
使用 SDK 的 BootLoader 烧录
使用 SDK 的 BootLoader 烧录是一种较为简便的方法,参考下面的配置流程,可以将 app.aic 烧录到指定的分区。
参考下面的配置,可以完成将 app.aic 烧录到指定的分区。-
编译一个对应项目的 BootLoader。以 SPINOR 的方案为例,根据相近配置板子的项目,修改配置后,编译生成 BootLoader 程序。
例如 output/d13x_demo88-nor_baremetal_bootloader/images/d13x.bin
即为编译后的 BootLoader 程序,可重命名为 bootloader.bin。
对于没有 PSRAM 的项目,可以参考 G73x 的项目编译 BootLoader。
-
生成烧录镜像。需要准备下列工具和文件:
-
工具:
-
tools/scripts/mk_image.py/mk_image.exe
-
tools/scripts/gen_partition_table.py
-
tools/scripts/mk_private_resource.py
-
-
文件: 参考相近存储的 demo 板的配置,如 demo88-nor,如果没有 PSRAM,可参考 G73x 的对应文件
-
bsp/artinchip/sys/d13x/d13x.pbp
-
target/d13x/demo88-nor/pack/image_cfg.json
-
target/d13x/demo88-nor/pack/pbp_cfg.json
-
-
修改 image_cfg.json 配置文件,详情可查看image_cfg.json 参考配置。
-
将下列文件放到一个目录:
-
mk_image.py/mk_image.exe
-
gen_partition_table.py
-
mk_private_resource.py
-
d13x.pbp
-
image_cfg.json
-
pbp_cfg.json
-
app.bin
-
-
-
执行命令生成烧录镜像:
gen_partition_table.py -c image_cfg.json -o partition.h -j partition.json mk_private_resource.py -l pbp_cfg.json,partition.json pbp_cfg.bin mk_image.py -v -d . -c image_cfg.json
-
使用 AiBurn 或者执行下列 upgcmd.exe 进行烧录。AiBurn 烧录,与 SDK 镜像文件烧录方法一致。
upgcmd.exe image d13x_demo88-nor_v1.0.0.img
注意,上述配置下,烧录完成后,重启时 Boot ROM 直接运行 app.aic ,因此如果需要重新进入 Boot ROM 升级模式, 需要通过短接 Flash 引脚,让芯片读取 Flash 内容失败然后进入升级模式。
-
使用 USB/UART 工具下载运行
- 选择以下任意一种方式及相应操作:
-
使用 USB 线连接板子和电脑,电脑可识别设备
- 使用串口线,连接板子的 UART0
-
- 安装 AiBurn 工具,并且在安装过程中选择安装 USB 驱动。
- 使用 AiBurn 安装目录下的 upgcmd.exe 工具下载并运行
app.aic:使用以下任意方式运行的 app.aic 程序:注:
当 Flash 有合法的启动镜像时,上电芯片会优先从 Flash 启动,不会进入升级模式。
- USB
下载:
upgcmd.exe -l # 确认板子连接成功 upgcmd.exe write 0x30044000 app.aic # 将 app.aic 下载到 Load address 处 upgcmd.exe exec 0x30044000 # 跳转运行 app.aic
此时 Boot ROM 校验并且运行 app.aic 。
-
UART 下载:
upgcmd.exe -u COM3 -l # 确认板子连接成功,此处的 COM3 应根据实际情况做修改 upgcmd.exe -u COM3 write 0x30044000 app.aic # 将 app.aic 下载到 Load address 处 upgcmd.exe -u COM3 exec 0x30044000 # 跳转运行 app.aic
- USB
下载:
放到 SD 卡中运行
如果 SDMC1 对应的卡座上插入了 SD 卡,上电启动过程中,总是优先检查 SD 卡,因此将 app.aic 放到 SD 卡中总是会被执行。具体如下:
-
准备一张市面上常见的 SD 卡,即 TF 卡。
-
格式化为 FAT32/exFAT 文件系统,确保只有一个分区。
-
参照下面的格式写一个 bootcfg.txt 文件,并且将 bootcfg.txt 和 app.aic 一起复制到 SD 卡文件系统的根目录。
boot0=app.aic # 此处 boot0 是一个关键字,app.aic 可根据实际情况修改
注:bootcfg.txt 中如有换行符,请确保使用 UNIX 格式的换行符,即 ‘\n’,不能是 ‘\r\n’。
-
插卡到 SDMC1 对应的卡座,重启板子,即可运行 app.aic。
初始化并使用 PSRAM
对于合封 PSRAM 的芯片,如果需要使用 PSRAM,可以使用 PBP 程序对 PSRAM 进行初始化。
PBP 程序是 Boot ROM 运行的程序,设计为 Boot ROM 的扩展,用于做 DRAM/PSRAM 的初始化。 PBP 程序运行完之后,可以直接返回 Boot ROM 然后继续跳转执行用户的程序。
-
配置下列参数,完成 PSRAM 的初始化。
-
需要使用下列工具:
-
tools/scripts/mk_image.py
-
tools/scripts/mk_private_resource.py
-
-
需要使用下列文件:
-
bsp/artinchip/sys/d13x/d13x.pbp
-
target/d13x/demo88-nor/pack/pbp_cfg.json
-
-
- 配置启动镜像下列启动镜像 image_cfg.json 文件的配置,可供参考:
{ "pre-process": { // Pre-proccess to generate image components from raw data "aicimage": { // Create aic boot image "app.aic": { "loader": { "file": "app.bin", "load address": "0x30044000", "entry point": "0x30044100", // 256 byte aic header }, "resource": { "pbp": "d13x.pbp", "private": "pbp_cfg.bin", }, }, }, }, }
-
生成镜像
将上述文件放到一个目录:-
app.bin
-
d13x.pbp
-
pbp_cfg.json
-
mk_image.py
-
mk_private_resource.py
mk_private_resource.py -l pbp_cfg.json -o pbp_cfg.bin mk_image.py -p -c image_cfg.json -d .
此时生成的 app.aic 即包含了 PSRAM 初始化代码,并且在 app.aic 运行之前已经执行。
-
Boot ROM 直接加载的限制与注意事项
-
启动速度
Boot ROM 运行时:
-
CPU 仅跑在 24 MHz
-
没有使能 Cache
-
没有使能中断
因此如果 APP 较大,可能出现加载速度较慢的情况。
-
-
SPINAND/eMMC 加载的镜像大小
- SPINAND:APP 不能超过 2 个物理块的大小,如果超过,则应该使用 BootLoader
- eMMC :APP 不能超过 512K Byte,如果超过,则应该使用 BootLoader
image_cfg.json 参考配置
本配置为 SPINOR,使用 SDK 的 BootLoader 进行烧录的参考配置。
{ "spi-nor": { "size": "16m", // Size of SPI NOR "partitions": { "spl": { "size": "1m" }, }, }, "image": { "info": { // Header information about image "platform": "d13x", "product": "demo88-nor", "version": "1.0.0", "media": { "type": "spi-nor", "device_id": 0, } }, "updater": { // Image writer which is downloaded to RAM by USB "psram": { "file": "usbupg-psram-init.aic", "attr": ["required", "run"], "ram": "0x30044000" }, "spl": { "file": "bootloader.aic", "attr": ["required", "run"], "ram": "0x40100000" }, }, "target": { // Image components which will be burn to device's partitions "spl": { "file": "app.aic", "attr": ["mtd", "required"], "part": ["spl"] }, }, }, "pre-process": { // Pre-proccess to generate image components from raw data "aicimage": { // Create aic boot image "usbupg-psram-init.aic": { "head_ver": "0x00010001", "resource": { "private": "pbp_cfg.bin", "pbp": "d13x.pbp", }, }, "pbp_ext.aic": { "head_ver": "0x00010001", "resource": { "pbp": "d13x.pbp", "private": "pbp_cfg.bin", }, // combine to use with loader.aic "with_ext": "true", }, "loader.aic": { "head_ver": "0x00010001", "loader": { "file": "bootloader.bin", "load address": "0x40200000", "entry point": "0x40200100", // 256 byte aic header }, "resource": { "private": "pbp_cfg.bin", }, }, "app.aic": { "head_ver": "0x00010001", "loader": { "file": "app.bin", "load address": "0x40200000", "entry point": "0x40200100", // 256 byte aic header }, "resource": { "private": "pbp_cfg.bin", }, }, }, "concatenate": { // cat files in order "bootloader.aic": ["pbp_ext.aic", "loader.aic"], }, }, }