HPMicro Manufacturing Tool 使用命令行实现镜像编辑以及批量编辑的功能

镜像编辑助手是 HPMicro_Manufacturing_Tool 的重要功能,您可以使用镜像编辑来得到不同类型的镜像,同时工具也支持对镜像进行签名和加密等操作。在 v0.5.0 版本中,新增了通过命令行模式进行镜像编辑的操作,这给用户在脚本化以及自动化编辑固件提供了可行性。下面我们一起来看看如何通过命令来实现镜像编辑的功能。

1. 镜像编辑入口

在 v0.5.0 之前版本的 HPMicro Manufacturing Tool 中,想要编辑镜像的话需要通过镜像编辑助手来进行操作。镜像编辑助手的入口一共有三处。

  1. 通过 hpm_manufacturing_gui 连接芯片后,点击菜单栏视图窗口中直接选择镜像编辑窗口打开镜像编辑功能,如下图所示:

    镜像编辑菜单栏入口

  2. 通过 hpm_manufacturing_gui 连接芯片后,直接在镜像编辑标签页点击编辑按钮打开镜像编辑功能,如下图所示:

    镜像编辑编辑按钮入口

  3. 直接在安装包目录双击运行 hpm_image_helper 程序,该程序为镜像编辑独立程序,如下图所示:

    镜像编辑根目录入口

    运行后首先会弹出 SoC 选择框,选择您对应的芯片类型后,点击确定便可以打开镜像编辑助手功能。

2. 命令行模式下使用镜像编辑

在 v0.5.0 版本中,新增了通过命令行来操作编辑镜像的命令,我们先来查看帮助看一下命令的传参方式:

命令行帮助文档

典型的镜像编辑命令为:

hpm_manufacturing_tool.exe -i -r "create-image imageutil.json"

其中,-i 参数代表要切换为镜像编辑模式,是必须的参数,当使用该参数时,会忽略除 -r 之外的其它参数如 -p, -u 等。
-r 参数后面输入要执行的命令,在镜像编辑模式中,v0.5.0 版本只支持 create-image 单条命令。 create-image 命令后的参数为镜像配置文件路径,支持相对路径和绝对路径, 上例中 imageutil.json 即为镜像编辑配置文件,数据格式为 json 类型。

命令操作比较简单,但问题是如何生成用户需要的 json 配置文件呢?

3. 镜像编辑配置文件生成方式

其实,hpm_image_helper 工具在编辑镜像时,最终生成镜像时依赖的也是一份 json 文件,我们可以先用镜像助手进行编辑,然后点击生成按钮,当生成镜像成功后,查看工具根目录,可以发现多了一个 imageutil.json 文件,该文件就是上次执行镜像编辑时使用的 json 配置文件,如下图所示:

imageutil.json

该文件同时适用于命令行模式。因此,您可以先通过镜像编辑工具先生成所需配置的镜像,这样就可以直接获得命令行模式所需的镜像编辑配置文件
我们优先建议您使用工具获取配置文件。当然,您也可以完全手动编写该配置文件,配置文件各个参数请参考下一节。

4. 配置文件格式说明

下面是一份包含了两个固件,二级签名以及加密的 json 配置文件:

{
    "boot_image": {
        "firmware_info": [
            {
                "binary_path": "C:/rgb_led_hpm6200evk_flash_xip_debug/output/demo.bin",
                "entry_point": "0x80003000",
                "fw_type": "application",
                "hash_type": "sha256",
                "is_encrypted": false,
                "load_addr": "0x80003000",
                "offset": "0x2000"
            },
            {
                "binary_path": "C:/rgb_led_hpm6200evk_ram_release/output/demo.bin",
                "entry_point": "0",
                "fw_type": "application",
                "hash_type": "sha256",
                "is_encrypted": false,
                "load_addr": "0",
                "offset": "auto"
            }
        ],
        "header": {
            "fuse_version": 0,
            "offset": "0x0c00",
            "signature_type": "ecdsa_p256",
            "srk_index": 0,
            "srk_revoke_mask": 0,
            "srk_set": "oem",
            "sw_version": 0
        },
        "signing_info": {
            "root_key_list": [
                "C:/HPMicro_Manufacturing_Tool_v0.5.0/tools/signing_tool/certs/20241216174123/crts/SRK0_sha256_prime256v1_v3_ca_crt.pem",
                "C:/HPMicro_Manufacturing_Tool_v0.5.0/tools/signing_tool/certs/20241216174123/crts/SRK1_sha256_prime256v1_v3_ca_crt.pem",
                "C:/HPMicro_Manufacturing_Tool_v0.5.0/tools/signing_tool/certs/20241216174123/crts/SRK2_sha256_prime256v1_v3_ca_crt.pem",
                "C:/HPMicro_Manufacturing_Tool_v0.5.0/tools/signing_tool/certs/20241216174123/crts/SRK3_sha256_prime256v1_v3_ca_crt.pem"
            ],
            "signing_key_path": "C:/HPMicro_Manufacturing_Tool_v0.5.0/tools/signing_tool/certs/20241216174123/crts/SGK0_1_sha256_prime256v1_v3_usr_crt.pem"
        }
    },
    "exip_image_info": {
        "kek": "c30d7bcf0d8bb5b749faa68bc50c3c24",
        "mem_base_addr": "0x80000000",
        "regions": [
            [
                "0x80003000",
                "0x1000",
                "cbac47cee6d8f4155a80b2e468bf8e83",
                "28c928a85be8e87b"
            ],
            [
                "0x80004000",
                "0x1000",
                "1bae82417869d3cac8652eb2c8571b81"
            ]
        ]
    },
    "flash_cfg": {
        "cfg_option": [
            "0xfcf90001",
            "0x00000007",
            "0x00000000",
            "0x00000000"
        ],
        "offset": "0x0000"
    },
    "output_path": "C:/final-img.bin"
}

我们可以先看一下最外层的结构,如下图所示:

imageutil

json 配置最外层一共有四个配置:

  • boot_image: 里面是整个固件容器的信息,包括固件容器头信息,固件信息(数组格式),签名信息;
    • header: 固件容器头信息,比较关键的为固件容器头偏移地址 offset
    • firmware_info: 固件信息数组,需要注意的是该结构为数组,第一个对象为固件0 信息,第二个对象为固件1 信息,其中:
      • offset - 定义固件相对于启动镜像头部的偏移大小,支持“auto”和固定偏移两类设置
      • fw_type - 定义固件的类型,对于可执行固件,该值固定为 application
      • load_addr - 定义固件的执行地址
      • entry_point - 定义固件的应用程序入口点
      • binary_path - 指定固件的路径
    • signing_info: 签名信息,包括了四个一级证书路径以及如果有二级证书的话二级证书路径 signing_key_path
  • exip_image_info: 为加密信息,里面包括了具体的 EXIP KEK 等加密配置;
    • kek: EXIP KEK 的值;
    • mem_base_addr: FLASH加密基地址;
    • regions:加密区域,数组格式,每个区域也为数组格式,四个数据,分别代表 起始地址,长度,AES KEY, NONCE,其中后两个可以忽略;
  • flash_cfg: 如果最终生成镜像为FLASH镜像,那么会包括这部分代表 FLASH 配置信息,如果是 RAM 镜像或自定义数据则没有此部分;
    • cfg_option: FLASH Word 配置,数组类型,一共四个;
    • offset: FLASH 头相距容器头的偏移地址;
  • output_path: 最终生成的镜像路径;

您可以按照以上格式构建自己的镜像配置文件,然后通过命令行来编辑镜像;

4. 批量镜像编辑功能实现方式

批量镜像编辑功能的主要作用是可以方便地对多份镜像执行相同的编辑(如签名,加密等)。批量编辑的前提是大部分的镜像编辑参数保持不变,仅修改输入输出路径就可以完成编辑。目前 v0.5.0 版本不管是界面工具还是命令行程序均未提供批量编辑镜像功能,但是您可以通过命令行模式来自行构建脚本实现批量镜像编辑的功能。实现方式如下:

  1. 首先您需要构建一份镜像编辑的配置文件,即命令行中要使用的 imageutil.json。优先推荐您使用镜像编辑工具来生成该配置;
  2. 使用脚本(如python等)编辑该 json 配置文件,需要修改的地方有两处:
    • output_path: 最终生成的镜像路径,您需要通过脚本动态地修改该路径确保每次生成的镜像文件被正确地保存;
    • binary_path: 输入的固件0 路径,在 firmware_info 数组中,第一个对象的 binary_path 即为要输入的固件路径,您需要通过脚本动态地修改该路径确保每次命令运行都能获取到要编辑的镜像路径;

通过脚本动态地修改配置文件后再调用命令行来处理镜像编辑,即可完成批量镜像编辑功能。

0
0
发表回复 0

Your email address will not be published. Required fields are marked *