缺陷 #7
openITE平台编译产物 BOOT 归属分离(外协单 OUT-1232 / 工单 ISS-3052)
0%
Description
ITE 平台编译产物 BOOT 归属分离需求,已通过工程管理平台下发外协单(OUT-1232,关联工单 ISS-3052),需求说明同步如下,请评估处理。
一、需求背景
ITE 平台的备份升级方案在升级/恢复过程中会更新 BOOT 区。BOOT 是设备唯一启动入口,一旦在写入 BOOT 期间掉电,BOOT 区处于半写入状态,设备既不能启动主工程、也不能进入预留区备份恢复流程,直接成砖,且无任何软件手段可挽救。
目前 SDK 构建流程无法在一次编译中同时产出两类档案,开发同事只能人工分两次编译(先按「带 BOOT」配置编 ROM 烧录档,再改配置按「不带 BOOT」编 PKG OTA 档),完全依赖人工记忆与手工切换配置,容错率极低,存在版本不一致、误发布带 BOOT 的 OTA 档等真实风险。
二、请求 ITE 处理
请 ITE 平台方提供一个小补丁(构建/打包脚本层面即可,不要求改动运行时逻辑),使 SDK 一次编译同时产出两类档案,并由工具链强制固化其 BOOT 归属:
- 所有编译输出的 ROM 烧录档一律包含 BOOT;
- 所有编译输出的 PKG(OTA 升级档)一律不包含 BOOT;
- 上述规则由构建脚本固化,不再需要人工切换配置或编译两次;
- 若个别项目确需通过 OTA 更新 BOOT,请提供显式的、带命名区分和二次确认的独立开关,默认关闭,且不得与常规 PKG 共用同一文件名规则。
三、验收标准
- 单次执行标准编译命令后,输出目录中同时存在 ROM 烧录档与 PKG OTA 档,且二者源自同一份代码、同一次构建;
- ROM 烧录档包含 BOOT 区数据;
- PKG OTA 档不含任何 BOOT 区数据,OTA 全过程不会擦写 BOOT 分区;
- 用不含 BOOT 的 PKG 完成一次完整 OTA,前后 BOOT 区内容逐字节一致;
- 上述 OTA 任意时点断电(含写 Flash 中途),设备重新上电后仍能正常启动或进入备份恢复流程,不成砖;
- 用 ROM 烧录档烧录空片,设备可正常首次开机;
- 提供补丁说明、适用 SDK 版本与分支、集成步骤,以及 3代与 3.5代各自的验证记录。
四、请回复
- 需求是否可行及时间节点;
- 覆盖范围是否包含 3代(ITE9836 等)与 3.5代(ITE986X / ITE9868 等)全部平台;
- 如需我方补充信息,请一并告知。
Files
AL Updated by alex lo about 2 months ago
- File RE_ 【健创电子】催办:ITE平台编译产物 BOOT 归属分离(外协单 OUT-1232 _ 工单 ISS-3052).msg RE_ 【健创电子】催办:ITE平台编译产物 BOOT 归属分离(外协单 OUT-1232 _ 工单 ISS-3052).msg added
已回覆內容如下
此需求了解後得知,在全部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 根目錄:
編譯入口:
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 區域初始化:
各裝置既有的保留區判斷中,額外累積 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()