Project

General

Profile

Actions

缺陷 #7

open
GL GL

ITE平台编译产物 BOOT 归属分离(外协单 OUT-1232 / 工单 ISS-3052)

缺陷 #7: ITE平台编译产物 BOOT 归属分离(外协单 OUT-1232 / 工单 ISS-3052)

Added by gensheng luo about 2 months ago. Updated about 2 months ago.

Status:
新建立
Priority:
普通
Assignee:
Start date:
Due date:
% Done:

0%

Estimated time:
问题类型:

Description

ITE 平台编译产物 BOOT 归属分离需求,已通过工程管理平台下发外协单(OUT-1232,关联工单 ISS-3052),需求说明同步如下,请评估处理。

一、需求背景
ITE 平台的备份升级方案在升级/恢复过程中会更新 BOOT 区。BOOT 是设备唯一启动入口,一旦在写入 BOOT 期间掉电,BOOT 区处于半写入状态,设备既不能启动主工程、也不能进入预留区备份恢复流程,直接成砖,且无任何软件手段可挽救。

目前 SDK 构建流程无法在一次编译中同时产出两类档案,开发同事只能人工分两次编译(先按「带 BOOT」配置编 ROM 烧录档,再改配置按「不带 BOOT」编 PKG OTA 档),完全依赖人工记忆与手工切换配置,容错率极低,存在版本不一致、误发布带 BOOT 的 OTA 档等真实风险。

二、请求 ITE 处理
请 ITE 平台方提供一个小补丁(构建/打包脚本层面即可,不要求改动运行时逻辑),使 SDK 一次编译同时产出两类档案,并由工具链强制固化其 BOOT 归属:

  1. 所有编译输出的 ROM 烧录档一律包含 BOOT;
  2. 所有编译输出的 PKG(OTA 升级档)一律不包含 BOOT;
  3. 上述规则由构建脚本固化,不再需要人工切换配置或编译两次;
  4. 若个别项目确需通过 OTA 更新 BOOT,请提供显式的、带命名区分和二次确认的独立开关,默认关闭,且不得与常规 PKG 共用同一文件名规则。

三、验收标准

  1. 单次执行标准编译命令后,输出目录中同时存在 ROM 烧录档与 PKG OTA 档,且二者源自同一份代码、同一次构建;
  2. ROM 烧录档包含 BOOT 区数据;
  3. PKG OTA 档不含任何 BOOT 区数据,OTA 全过程不会擦写 BOOT 分区;
  4. 用不含 BOOT 的 PKG 完成一次完整 OTA,前后 BOOT 区内容逐字节一致;
  5. 上述 OTA 任意时点断电(含写 Flash 中途),设备重新上电后仍能正常启动或进入备份恢复流程,不成砖;
  6. 用 ROM 烧录档烧录空片,设备可正常首次开机;
  7. 提供补丁说明、适用 SDK 版本与分支、集成步骤,以及 3代与 3.5代各自的验证记录。

四、请回复

  1. 需求是否可行及时间节点;
  2. 覆盖范围是否包含 3代(ITE9836 等)与 3.5代(ITE986X / ITE9868 等)全部平台;
  3. 如需我方补充信息,请一并告知。

Files

AL Updated by alex lo about 2 months ago Actions #1

已回覆內容如下

此需求了解後得知,在全部upgrade區域選項全開的狀態下,需要單獨打包僅有bootloader的ROM檔案,與不包含bootloader的PKG檔案。
因此新增了SPECIAL_OUTPUT的配置,附件檔案已達成上述目的,說明如下

SPECIAL_OUTPUT CFG 與 CMake 修改說明

日期:2026-09-16

1. 目的與適用環境

新增 SPECIAL_OUTPUT 配置,在主程式的 POST_BUILD 打包階段,額外產生僅含 bootloader 的 ROM 與不含 bootloader 的 PKG。原本完整 PKG 與 NOR ROM 繼續依原配置產生。

本文依 SDK 目前已整合的實作記錄,包含現有特殊輸出設定,以及本次補上的配置檢查、編譯依賴與金鑰傳遞。

SDK 根目錄:

SDK_V2.4.8.0\ite_sdk

編譯入口:

SDK_V2.4.8.0\ite_sdkbuild\openrtos\[Project_name]_all.cmd

2. 修改檔案

檔案(相對 SDK 根目錄) 修改內容
sdk/Kconfig 定義 SPECIAL_OUTPUT 開關、bootloader ROM 檔名與大小、不含 bootloader 的 PKG 檔名
sdk/build.cmake 保存 reservedargs、加入特殊輸出 POST_BUILD 命令、檢查必要配置、加入 bootloader 依賴

3. Kconfig 實際定義

位置:sdk/Kconfig 的 Upgrade 選單,緊接 NOR image filename 設定之後。

以下為目前檔案中的完整定義:

config SPECIAL_OUTPUT
    bool "Generate special output files"
    depends on (UPGRADE_BOOTLOADER || UPGRADE_IMAGE || UPGRADE_DATA)
    default n
    help
        Generate two extra files beside the normal upgrade package: a ROM
        file which holds the bootloader only, and a PKG file which holds
        everything but the bootloader. The normal package is not changed.
    help_cht
        額外產生兩個檔案:只含 bootloader 的 ROM 燒錄檔,以及不含 bootloader 的
        PKG 更新檔。原本的更新檔不受影響。
    help_chs
        额外产生两个文件:只含 bootloader 的 ROM 刻录档,以及不含 bootloader 的
        PKG 更新档。原本的更新档不受影响。

config SPECIAL_OUTPUT_BOOTLOADER_ROM_FILENAME
    string "Bootloader only ROM filename"
    depends on SPECIAL_OUTPUT
    default "ITE_BOOT.ROM"
    help
        The file name of the ROM image which holds the bootloader only.
    help_cht
        只含 bootloader 的 ROM 燒錄檔的檔案名稱。
    help_chs
        只含 bootloader 的 ROM 刻录档的文件名。

config SPECIAL_OUTPUT_BOOTLOADER_ROM_SIZE
    string "Bootloader only ROM size"
    depends on SPECIAL_OUTPUT
    default "0x300000"
    help
        The size of the ROM image which holds the bootloader only. It should
        cover the reserved area of the bootloader booting device.
    help_cht
        只含 bootloader 的 ROM 燒錄檔的檔案大小,需涵蓋 bootloader 開機裝置的保留區。
    help_chs
        只含 bootloader 的 ROM 刻录档的文件大小,需涵盖 bootloader 开机装置的保留区。

config SPECIAL_OUTPUT_PKG_FILENAME
    string "PKG filename without bootloader"
    depends on SPECIAL_OUTPUT
    default "ITE_APP.PKG"
    help
        The file name of the package file which does not hold the bootloader.
    help_cht
        不含 bootloader 的 PKG 更新檔的檔案名稱。
    help_chs
        不含 bootloader 的 PKG 更新档的文件名。

4. CMake 打包設計

4.1 三組參數的用途

參數 用途
${args} 主程式、其他已選取的非 bootloader 資料、保留區大小、分割區資料/容量、版本與旗標
${bootloader_args} bootloader 及配置所包含的 bootloader 相關 Raw Data
${reservedargs} 各裝置的保留區大小宣告,供 bootloader-only PKG 使用

原完整 PKG 使用 ${args} ${bootloader_args};特殊 PKG 僅使用 ${args},因此不用解析或裁切已產生的 PKG。

4.2 保存保留區宣告

在 # make pkg 區域初始化:

unset(args)
unset(packargs)
unset(pkgdsk)
unset(reservedargs)

各裝置既有的保留區判斷中,額外累積 reservedargs。NOR 範例如下:

if (DEFINED CFG_NOR_ENABLE AND DEFINED CFG_NOR_RESERVED_SIZE)
    set(args ${args} --unformatted-device 1 --unformatted-size ${CFG_NOR_RESERVED_SIZE})
    set(packargs ${packargs} --unformatted-device 1 --unformatted-size ${CFG_NOR_RESERVED_SIZE})
    set(reservedargs ${reservedargs} --unformatted-device 1 --unformatted-size ${CFG_NOR_RESERVED_SIZE})
endif()

NAND、SD0、SD1 分別使用 device type 0、2、3,在對應既有條件內加入相同形式的宣告。--unformatted-size 是儲存配置,不是要求覆寫整個保留區的 Raw Data。

4.3 特殊輸出完整程式碼

插入位置:正常 PKG 產生與列出內容之後、# Difference Upgrade 之前。此時 ${args} 已組合完成,尚未被後續映像處理分支改寫。

        # SPECIAL_OUTPUT: a ROM file holding the bootloader only, and a PKG
        # file holding everything but the bootloader. Both are generated
        # beside the normal package, which is left untouched.
        if (CFG_SPECIAL_OUTPUT AND NOT (${CMAKE_PROJECT_NAME} STREQUAL bootloader))
            if (NOT DEFINED bootloader_args)
                message(FATAL_ERROR "SPECIAL_OUTPUT requires bootloader upgrade data; enable BOOTLOADER_ENABLE and UPGRADE_BOOTLOADER")
            endif()
            if (NOT CFG_UPGRADE_IMAGE OR NOT CFG_UPGRADE_DATA)
                message(FATAL_ERROR "SPECIAL_OUTPUT requires UPGRADE_IMAGE and UPGRADE_DATA to retain the application and selected filesystem data")
            endif()
            if ("${CFG_SPECIAL_OUTPUT_PKG_FILENAME}" STREQUAL ""
                OR "${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_FILENAME}" STREQUAL ""
                OR "${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_SIZE}" STREQUAL "")
                message(FATAL_ERROR "SPECIAL_OUTPUT requires package filename, ROM filename and ROM size")
            endif()
            if ("${CFG_SPECIAL_OUTPUT_PKG_FILENAME}" STREQUAL "${CFG_UPGRADE_FILENAME}"
                OR "${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_FILENAME}" STREQUAL "${CFG_UPGRADE_NOR_IMAGE_FILENAME}"
                OR "${CFG_SPECIAL_OUTPUT_PKG_FILENAME}" STREQUAL "${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_FILENAME}"
                OR "${CFG_SPECIAL_OUTPUT_PKG_FILENAME}" STREQUAL "BOOTLOADER_ONLY.PKG"
                OR "${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_FILENAME}" STREQUAL "BOOTLOADER_ONLY.PKG")
                message(FATAL_ERROR "SPECIAL_OUTPUT filenames must be distinct from normal and intermediate outputs")
            endif()
            # The application POST_BUILD reads the bootloader output. Without
            # this dependency, a parallel build can package an older bootloader.
            if (NOT CFG_UPGRADE_BOOTLOADER_EXTERNAL_PROJECT)
                if (NOT TARGET bootloader)
                    message(FATAL_ERROR "SPECIAL_OUTPUT requires the internal bootloader target")
                endif()
                add_dependencies(${CMAKE_PROJECT_NAME} bootloader)
            endif()

            # ${args} carries image + data + reserved areas, but never the
            # bootloader, which is kept apart in ${bootloader_args}.
            add_custom_command(
                TARGET ${CMAKE_PROJECT_NAME}
                POST_BUILD
                COMMAND pkgtool
                ARGS -o ${CFG_SPECIAL_OUTPUT_PKG_FILENAME} ${args} --key ${CFG_UPGRADE_ENC_KEY}
                COMMAND pkgtool
                ARGS -l ${CFG_SPECIAL_OUTPUT_PKG_FILENAME} --key ${CFG_UPGRADE_ENC_KEY}
            )

            if (DEFINED bootloader_args)
                unset(special_output_rom_opt)

                if (DEFINED CFG_UPGRADE_BOOTLOADER_NAND)
                    set(special_output_rom_opt -r)
                elseif (DEFINED CFG_UPGRADE_BOOTLOADER_NOR)
                    set(special_output_rom_opt -n)
                elseif (DEFINED CFG_UPGRADE_BOOTLOADER_SD0)
                    set(special_output_rom_opt -w)
                elseif (DEFINED CFG_UPGRADE_BOOTLOADER_SD1)
                    set(special_output_rom_opt -x)
                endif()

                # pkgtool rejects raw data that has no reserved area declared
                # for its device, so ${reservedargs} has to travel with it.
                add_custom_command(
                    TARGET ${CMAKE_PROJECT_NAME}
                    POST_BUILD
                    COMMAND pkgtool
                    ARGS -o BOOTLOADER_ONLY.PKG ${reservedargs} ${bootloader_args} --key ${CFG_UPGRADE_ENC_KEY}
                    COMMAND pkgtool
                    ARGS -s ${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_SIZE} -o ${CFG_SPECIAL_OUTPUT_BOOTLOADER_ROM_FILENAME} ${special_output_rom_opt} BOOTLOADER_ONLY.PKG --key ${CFG_UPGRADE_ENC_KEY}
                )
            endif()
        endif()
Actions

Also available in: PDF Atom