Edit online

客制化启动

Luban-Lite SDK 支持客制化启动方案,即在芯片上电后运行客制化开发的程序,而不是 Luban-Lite SDK 编译出来的程序。本节演示了如何让 CPU 上电立刻运行客制化的程序。

Edit online

生成客制化的 Boot ROM 启动程序

芯片在上电启动时,首先运行芯片内部的 Boot ROM 程序,Boot ROM 程序加载并运行下一级程序。

Boot ROM 加载的程序需要按照一定的格式打包才会被运行。具体的打包格式可参考用户手册的启动章节。制作客制化 BROM 启动程序时,需要做好相关的连接地址、内存空间分配等规划:
注: 关于启动镜像格式,可查看用户相关章节。
  • 配置启动镜像格式中的以下关键字段:

    • Loader binary data: 客制化程序存放的区域。

    • Load address: 启动镜像的加载地址。

    • Entry point: 客制化程序的程序入口地址,对应程序的链接地址。

  • 做好内存空间使用规划:
    • D13x SRAM 的开始地址为 0x30040000

    • SRAM 的最开始 16K Byte,Boot ROM 运行时在使用,因此启动镜像不能被加载到该区间。

    • 启动镜像头信息占用 256 字节,因此 Load addressEntry point之间至少预留 256 字节。

      启动镜像加载的内存地址,应该是 0x30044000 之后:

使用 Luban-Lite 中的 mk_image.exe 或 mk_image.py 工具,可以单独生成启动镜像。相关工具可从 Luban-Lite 的最新 SDK 获取。
  • tools/scripts/mk_image.exe

  • tools/scripts/mk_image.py

以下以 app.bin 应用为例,演示生成、烧录和启动镜像的详细流程。
  1. 参考下面的 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 区域,并且设置了加载地址和入口地址。

  2. 执行下列命令在当前目录生成 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 .
    
Edit online

运行和烧录客制化程序

在本节中,选择任意一种方式运行生成的 app.aic 程序。

Edit online

烧录到 Flash 中运行

  • 自定义烧录

    Boot ROM 升级模式不支持烧录 Flash。 如果不使用 Luban-Lite SDK 的 BootLoader 烧录方案,则需要自定义烧录功能。

    开发者需要本节介绍如何自行实现一个自定义一个带烧录功能的程序,如 flashwriter.aic ,通过 USB/UART/SD 卡等方式运行后起来,然后将 app.aic 烧录到指定的存储介质中。

    • 通过 USB/UART 烧录:
      1. 通过 USB/UART,使用 upgcmd.exe write 命令将 app.aic 先写入到一个预设的 SRAM 空间。在命令行中执行以下命令:
        upgcmd.exe write /path/to/app.aic /path/to/sram_storage
      2. 下载运行 flashwriter.aic ,由 flashwriter.aic 从该位置 SRAM 存储中读取 app.aic 的数据,并写入将其烧录到 Flash。

    • 通过 SD 卡烧录:
      1. 将 SD 卡插入开发板,并将 flashwriter.aic 烧录到 SD 卡的 FAT32 文件系统中。
      2. 启动开发板,使其从 SD 卡启动并运行 flashwriter.aic

      3. flashwriter.aic 程序从 SD 卡的文件系统中读取 app.aic 的数据,并写入将其烧录到 Flash。

      烧录位置可能因存储介质类型而异:
      • 对于 SPINOR,只需将 app.aic 直接烧录到 Flash 的最开始位置即可,即 Flash 0 位置。

      • 对于 SD/eMMC,开始处需要预留 17K Byte 的 GPT 分区头,因此从第 34 个 Sector 的位置烧录 app.aic

      对于 SPINAND,由于需要坏块管理等,处理比较复杂,建议使用 SDK 的 BootLoader 进行烧录,此处不进行描述。

  • 使用 SDK 的 BootLoader 烧录

    使用 SDK 的 BootLoader 烧录是一种较为简便的方法,参考下面的配置流程,可以将 app.aic 烧录到指定的分区。

    参考下面的配置,可以完成将 app.aic 烧录到指定的分区。
    1. 编译一个对应项目的 BootLoader。以 SPINOR 的方案为例,根据相近配置板子的项目,修改配置后,编译生成 BootLoader 程序。

      例如 output/d13x_demo88-nor_baremetal_bootloader/images/d13x.bin

      即为编译后的 BootLoader 程序,可重命名为 bootloader.bin

      对于没有 PSRAM 的项目,可以参考 G73x 的项目编译 BootLoader。

    2. 生成烧录镜像。需要准备下列工具和文件:

      • 工具:

        1. tools/scripts/mk_image.py/mk_image.exe

        2. tools/scripts/gen_partition_table.py

        3. tools/scripts/mk_private_resource.py

      • 文件: 参考相近存储的 demo 板的配置,如 demo88-nor,如果没有 PSRAM,可参考 G73x 的对应文件

        1. bsp/artinchip/sys/d13x/d13x.pbp

        2. target/d13x/demo88-nor/pack/image_cfg.json

        3. 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

    3. 执行命令生成烧录镜像:

      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
    4. 使用 AiBurn 或者执行下列 upgcmd.exe 进行烧录。AiBurn 烧录,与 SDK 镜像文件烧录方法一致。

      upgcmd.exe image  d13x_demo88-nor_v1.0.0.img

      注意,上述配置下,烧录完成后,重启时 Boot ROM 直接运行 app.aic ,因此如果需要重新进入 Boot ROM 升级模式, 需要通过短接 Flash 引脚,让芯片读取 Flash 内容失败然后进入升级模式。

Edit online

使用 USB/UART 工具下载运行

当 Flash 中没有可启动的镜像时,Boot ROM 会启动失败,自动进入 USB/UART 升级模式。遵照以下步骤,下载和运行客制化的启动镜像:
  1. 选择以下任意一种方式及相应操作:
    • 使用 USB 线连接板子和电脑,电脑可识别设备

    • 使用串口线,连接板子的 UART0
  2. 安装 AiBurn 工具,并且在安装过程中选择安装 USB 驱动。
  3. 使用 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
Edit online

放到 SD 卡中运行

如果 SDMC1 对应的卡座上插入了 SD 卡,上电启动过程中,总是优先检查 SD 卡,因此将 app.aic 放到 SD 卡中总是会被执行。具体如下:

  1. 准备一张市面上常见的 SD 卡,即 TF 卡。

  2. 格式化为 FAT32/exFAT 文件系统,确保只有一个分区。

  3. 参照下面的格式写一个 bootcfg.txt 文件,并且将 bootcfg.txt 和 app.aic 一起复制到 SD 卡文件系统的根目录。
    boot0=app.aic  # 此处 boot0 是一个关键字,app.aic 可根据实际情况修改
    
    注:

    bootcfg.txt 中如有换行符,请确保使用 UNIX 格式的换行符,即 ‘\n’,不能是 ‘\r\n’。

  4. 插卡到 SDMC1 对应的卡座,重启板子,即可运行 app.aic。

Edit online

初始化并使用 PSRAM

对于合封 PSRAM 的芯片,如果需要使用 PSRAM,可以使用 PBP 程序对 PSRAM 进行初始化。

PBP 程序是 Boot ROM 运行的程序,设计为 Boot ROM 的扩展,用于做 DRAM/PSRAM 的初始化。 PBP 程序运行完之后,可以直接返回 Boot ROM 然后继续跳转执行用户的程序。

当前 PBP 程序可以完成以下功能:
  1. 配置下列参数,完成 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

  2. 配置启动镜像
    下列启动镜像 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",
                    },
                },
            },
        },
    }
    
  3. 生成镜像

    将上述文件放到一个目录:
    • 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 运行之前已经执行。

Edit online

Boot ROM 直接加载的限制与注意事项

  1. 启动速度

    Boot ROM 运行时:

    • CPU 仅跑在 24 MHz

    • 没有使能 Cache

    • 没有使能中断

    因此如果 APP 较大,可能出现加载速度较慢的情况。

  2. SPINAND/eMMC 加载的镜像大小

    • SPINAND:APP 不能超过 2 个物理块的大小,如果超过,则应该使用 BootLoader
    • eMMC :APP 不能超过 512K Byte,如果超过,则应该使用 BootLoader
Edit online

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"],
        },
    },
}