gantt
title MCUBootUtility Release Plan
dateFormat YYYY-MM-DD
section Formal Release
v1.0.0 :a1, 2018-08-27, 2018-12-28
v1.1.0 :a2, 2018-12-29, 2019-01-29
v1.2.0 :a3, 2019-01-30, 2019-04-16
v1.3.0 :a4, 2019-04-17, 2019-04-29
v1.4.0 :a5, 2019-04-30, 2019-05-09
v2.0.0 :a6, 2019-05-10, 2019-07-19
v2.1.0 :a7, 2019-07-20, 2019-12-03
v2.2.0 :a8, 2019-12-04, 2019-12-13
v2.3.0 :a9, 2019-12-14, 2020-05-28
v2.4.0 :a10, 2020-08-20, 2020-10-20
v3.0.0 :a11, 2020-10-21, 2021-01-10
v3.1.0 :a12, 2021-01-11, 2021-01-13
v3.2.0 :a13, 2021-01-16, 2021-03-17
v3.3.0 :a14, 2021-03-18, 2021-05-20
v3.4.0 :a15, 2021-08-03, 2021-09-27
v3.5.0 :a16, 2021-09-28, 2022-03-19
v4.0.0 :a17, 2022-03-20, 2023-01-06
v4.1.0 :a18, 2023-01-07, 2023-03-02
v5.0.0 :a19, 2023-04-07, 2023-05-23
v5.1.0 :a20, 2023-05-24, 2023-05-25
v5.2.0 :a21, 2023-05-26, 2023-07-07
v5.3.0 :a22, 2023-07-15, 2023-09-14
v6.0.0 :a23, 2023-09-15, 2023-11-03
v6.1.0 :a24, 2023-11-04, 2023-12-19
v6.2.0 :a25, 2023-12-20, 2024-03-26
v6.3.0 :a26, 2024-03-27, 2024-09-20
v6.4.0 :a27, 2024-09-21, 2025-03-07
v6.5.0 :a28, 2025-03-08, 2026-03-07
English | 中文
对于MCUBootUtility,MCUBootFlasher(RT-Flash)工具,有任何使用上的问题,可以在《痞子衡嵌入式》博客下留言,也可以扫码加入QQ交流群。
NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP MCU里BootROM功能相对应,目前主要支持i.MXRT、LPC、Kinetis系列MCU芯片,与NXP官方的标准安全加密配套工具集(OpenSSL, CST, sdphost, blhost, elftosb, BD, MfgTool2)相比,NXP-MCUBootUtility是一个真正的一站式工具,一个工具包含NXP官方所有加密配套工具的功能,并且是全图形用户界面操作。借助于NXP-MCUBootUtility,你可以轻松上手NXP MCU安全加密启动。
NXP-MCUBootUtility主要功能如下:
- 支持UART和USB-HID两种串行下载方式(COM端口/USB设备自动识别)
- 支持五种常用格式(elf/axf/srec/hex/bin)源image文件输入并检查其链接地址的合法性
- 支持将裸源image文件自动转换成i.MXRT能启动的Bootable image
- 支持下载Bootable image进外部启动设备
- 支持外部启动设备的任意读/写/擦操作(即通用Flash编程器)
- 支持获取并解析ROM启动日志
- 支持i.MXRTyyyy全系列MCU,包含i.MXRT1011、i.MXRT1015、i.MXRT1021、i.MXRT1024 SIP、i.MXRT1042、i.MXRT105x、i.MXRT106x、i.MXRT1064 SIP、i.MXRT116x、i.MXRT117x、i.MXRT118x
- 源image文件既可以是裸源image文件,也可以是含启动文件头的bootable image文件
- 支持将裸源image文件自动转换成MfgTool和RT-Flash工具能下载的.sb格式文件
- 支持下载Bootable image进主动启动设备 - FlexSPI接口NOR Flash
- 支持下载Bootable image进主动启动设备 - FlexSPI接口NAND Flash
- 支持下载Bootable image进主动启动设备 - SEMC接口NAND Flash
- 支持下载Bootable image进主动启动设备 - SEMC接口NOR Flash
- 支持下载Bootable image进主动启动设备 - uSDHC接口SD/eMMC卡
- 支持下载Bootable image进备份启动设备 - LPSPI接口NOR/EEPROM Flash
- 支持DCD配置功能,可用于加载image进SDRAM执行
- 支持XMCD配置功能,可用于加载image进FlexSPI RAM/SEMC SDRAM执行
- 支持用于开发阶段的非安全加密启动(未签名加密)
- 支持基于HAB实现的安全加密启动(单签名,签名和加密),证书自动备份
- 支持基于BEE实现的安全加密启动(唯一SNVS key,用户自定义key)
- 支持基于OTFAD实现的安全加密启动(唯一SNVS key,用户自定义key)
- 支持MCU芯片内部eFuse的回读和烧写操作(即专用eFuse烧写器)
- 支持MCU芯片内部FlexRAM的读/写/执行操作(即专用FlexRAM编程器,可用于ISP启动)
- 支持从外部启动设备回读Bootable image,并对其组成部分(NFCB/DBBT/FDCB/EKIB/EPRDB/IVT/Boot Data/DCD/XMCD/Image/CSF/DEK KeyBlob)进行标注
- 支持i.MXRTxxx全系列MCU,包含i.MXRT5xx、i.MXRT6xx、RW61x、i.MXRT7xx
- 支持下载Bootable image进主动启动设备 - FlexSPI/QuadSPI接口NOR Flash
- 支持下载Bootable image进主动启动设备 - uSDHC接口SD/eMMC卡
- 支持下载Bootable image进备份启动设备 - Flexcomm SPI接口NOR Flash
- 支持用于开发阶段的非安全加密启动(未签名,CRC校验)
- 支持MCU芯片内部OTP的回读和烧写操作(即专用OTP烧写器)
- 支持MCU芯片内部SRAM的读/写/执行操作(即专用SRAM编程器,可用于ISP启动)
- 支持从外部启动设备回读Bootable image,并对其组成部分(OTFAD KeyBlob/FDCB/KeyStore/Image)进行标注
- 支持LPC5500系列MCU,包含LPC550x/S0x、LPC551x/S1x、LPC552x/S2x、LPC55S6x、LPC553x/S3x
- 支持下载Bootable image进内部C040HD Flash
- 支持用于开发阶段的非安全加密启动(未签名)
- 支持第二代Kinetis系列MCU(含BootROM即可,如MKL03Z,MK8xF等)
- 支持下载Bootable image进内部FTFx Flash
- 支持用于开发阶段的非安全加密启动(未签名)
- 支持MCX系列MCU,包含MCXN54x、MCXN94x
- 支持下载Bootable image进内部C040HD Flash
- 支持用于开发阶段的非安全加密启动(未签名)
NXP-MCUBootUtility完全基于Python语言开发,并且源代码全部开源,其具体开发环境为Python 2.7.15 (32bit)、wxPython 4.0.3、pySerial 3.4、pywinusb 0.4.2、bincopy 15.0.0、PyAudio 0.2.11、PyInstaller 3.3.1(或更高)。
- 源代码: https://github.com/JayHeng/NXP-MCUBootUtility
- 问题反馈: https://www.cnblogs.com/henjay724/p/10159925.html
NXP-MCUBootUtility在发布时借助PyInstaller将所有的Python依赖全部打包进一个可执行文件(\NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe),因此如果不是对NXP-MCUBootUtility的二次开发,你不需要安装任何Python软件及相关库。
Note1: 使用NXP-MCUBootUtility之前必须先从NXP官网下载 HAB Code Signing Tool工具,并将其解压放在\NXP-MCUBootUtility\tools\cst\目录下,并且需要修改代码使能AES功能重新生成\NXP-MCUBootUtility\tools\cst\mingw32\bin\cst.exe,否则HAB签名以及加密相关功能无法使用。具体步骤可以参考这篇博客 《开启NXP-MCUBootUtility工具的HAB加密功能 - cst.exe》。
Note2: 使用NXP-MCUBootUtility之前必须编译\NXP-MCUBootUtility\tools\image_enc\code下面的源文件生成image_enc.exe,并将其放置在\NXP-MCUBootUtility\tools\image_enc\win,否则BEE/OTFAD加密相关功能无法使用。具体步骤可以参考这篇博客 《开启NXP-MCUBootUtility工具的BEE/OTFAD加密功能 - image_enc.exe》
Note3: 源代码包里的NXP-MCUBootUtility.exe是在Windows 10 x64环境下打包的,也仅在该环境下测试过,如果因系统原因无法直接使用,你需要先安装 Python2.7.15 x86版本 (安装完成后确认\Python27\, \Python27\Scripts\目录被添加到系统环境变量Path里),然后在\NXP-MCUBootUtility\env\目录下点击do_setup_by_pip.bat安装开发NXP-MCUBootUtility所依赖的Python库,最后点击do_pack_by_pyinstaller.bat重新生成NXP-MCUBootUtility.exe可执行文件。
Note4: 必须使用Python2 x86版本去打包NXP-MCUBootUtility,因为NXP-MCUBootUtility使用了pywinusb库,该库在Python2 x64版本下无法用PyInstaller打包,pywinusb作者没有计划修复该问题。
Note5: 改变芯片工作频率的代码不能被加密,如果你的代码有使用到 BOARD_BootClockRUN 或 其他改变芯片工作频率的函数,你应该把那些代码放到非加密的区域。
NXP-MCUBootUtility是一个是纯绿色免安装的工具,下载了源代码包之后,直接双击\NXP-MCUBootUtility\bin\NXP-MCUBootUtility.exe即可使用。使用NXP-MCUBootUtility没有任何软件依赖,不需要额外安装任何软件。
在NXP-MCUBootUtility.exe图形界面显示之前,会首先弹出一个控制台窗口,该控制台会伴随着NXP-MCUBootUtility.exe图形界面一起工作,很多图形界面的操作都会在控制台窗口看到对应的底层命令执行,保留控制台主要是为了便于定位NXP-MCUBootUtility.exe的问题,目前NXP-MCUBootUtility尚处于早期阶段,等后期软件成熟会考虑移除控制台。
NXP-MCUBootUtility软件目录组织如下:
\NXP-MCUBootUtility
\apps --放置NXP官方评估板示例image文件
\bin --放置NXP-MCUBootUtility可执行文件及用户配置文件
\doc --放置NXP官方安全启动相关的参考文档
\env --放置用于安装NXP-MCUBootUtility开发环境以及打包脚本
\gen --放置NXP-MCUBootUtility使用过程中生成的临时文件
\bd_file --根据配置动态生成的BD文件
\bee_crypto --BEE加密过程中生成的文件
\bootable_image --生成的bootable image文件
\dcd_file --生成的DCD数据文件
\fdcb_file --生成的FDCB配置文件
\hab_cert --HAB签名过程中生成的文件
\hab_crypto --HAB加密过程中生成的文件
\json_file --根据配置动态生成的JSON文件
\cmdlog_file --保存软件操作记录日志
\btlog_file --软件运行过程中获取到的临时ROM日志文件
\otfad_crypto --OTFAD加密过程中生成的文件
\sb_image --生成的.sb格式文件
\user_file --软件运行过程中缓存的临时文件
\gui --放置开发NXP-MCUBootUtility UI构建工程文件
\img --放置NXP-MCUBootUtility使用过程中需加载的图片
\src --放置开发NXP-MCUBootUtility的所有Python源代码文件
\tools --放置NXP-MCUBootUtility使用过程中需调用的外部程序
\blhost --与Flashloader通信的上位机命令行工具
\cst --HAB加密的配套命令行工具
\elftosb --生成bootable image的命令行工具
\ide_utils --各IDE提供的image格式转换工具
\image_enc --BEE加密的配套命令行工具
\imgutil --生成DCD数据的命令行工具
\openssl --生成证书和秘钥的标准工具
\sdphost --与ROM通信的上位机命令行工具
下图为NXP-MCUBootUtility工具的主界面,界面主要由六部分组成,各部分功能如下:

- 【Menu Bar】:功能菜单栏,提供软件通用设置。
- 【Target Setup】:目标设备设置栏,提供MCU Device和Boot Device配置选项。
- 【Port Setup】:串行接口设置栏,选择用于连接MCU Device的接口。
- 【Device Status】:目标设备状态信息栏,当连接上目标设备之后,用于显示目标设备的状态。
- 【Secure Boot Action】:安全加密启动主界面,提供对目标设备做安全加密启动的所有操作。
- 【Log Info】:操作日志栏,记录软件操作日志。
在使用NXP-MCUBootUtility工具前主要有两个准备工作:一、准备好i.MXRT硬件板以及串行下载连接线(USB/UART);二、准备好用于下载进Flash的源image文件。
关于串行下载线连接,需要查看i.MXRT参考手册System Boot章节,确保连接的UART/USB引脚是BootROM指定的。
关于源image文件准备,NXP-MCUBootUtility工具能够识别五种常见格式(elf/axf/srec/hex/bin)的image,源image既可以包含i.MXRT加载启动头(IVT, BootData等),也可以不包含这些i.MXRT加载启动头。如果源image中不包含这些启动头,NXP-MCUBootUtility会自动添加文件头。
以NXP官方SDK为例进一步讲解源image文件的生成,注册并登录NXP官网,来到 MCUXpresso SDK Builder 页面,选择合适的MCU芯片以及IDE(以RT1060芯片,IAR IDE为例)并点击Download SDK后便可得到SDK_2.4.0_EVK-MIMXRT1060.zip。
使用IAR打开SDK包里的\boards\evkmimxrt1060\demo_apps\led_blinky\iar\led_blinky.eww示例应用:

led_blinky应用其实包含了三个工程(ram/flexspi_nor/sdram),分别对应三个不同的linker文件(.icf),其中ram工程生成的image即是所谓的Non-XIP image,flexspi_nor工程生成的image即是所谓的XIP image。
默认情况下,ram工程和flexspi_nor工程生成的image文件是无法直接为NXP-MCUBootUtility所用的,需要做一些小小的改变。
ram工程需要修改linker文件如下:(推荐从0x3000开始链接中断向量表,中断向量表前面预留一段内存用于放置i.MXRT加载启动所需的文件头)。
define symbol m_interrupts_start = 0x00003000; // 0x00000000
define symbol m_interrupts_end = 0x000033FF; // 0x000003FF
define symbol m_text_start = 0x00003400; // 0x00000400
define symbol m_text_end = 0x0001FFFF;
define symbol m_data_start = 0x20000000;
define symbol m_data_end = 0x2001FFFF;
define symbol m_data2_start = 0x20200000;
define symbol m_data2_end = 0x202BFFFF;
flexspi_nor工程需要修改工程配置选项里的Defined symbols如下:(将XIP_BOOT_HEADER_ENABLE设为0,即不需要生成包含i.MXRT加载启动文件头的image; 如果保持XIP_BOOT_HEADER_ENABLE为1不变,那么生成的可执行image文件会包含i.MXRT加载启动文件头)。
关于串行下载线连接,需要查看i.MXRT参考手册Non-Secure Boot ROM章节,确保连接的UART/USB引脚是BootROM指定的。
关于源image文件准备,NXP-MCUBootUtility工具能够识别五种常见格式(elf/axf/srec/hex/bin)的image,源image既可以是已填充好boot image header(imageLength, imageLoadAddress等)的app,也可以不填充boot image header。如果源image中不包含boot image header,NXP-MCUBootUtility会自动添加。
如果只是为了快速验证NXP-MCUBootUtility工具,在NXP-MCUBootUtility\apps文件夹下默认存放了全系列恩智浦官方i.MXRT评估板的led_blinky应用的image文件。
在使用NXP-MCUBootUtility时首先需要配置目标设备,目标设备包括MCU Device和Boot Device。以NXP官方开发板EVK-MIMXRT1060为例,该开发板主芯片为i.MXRT1062DVL6A,所以【MCU Device】应设为i.MXRT106x。且以最常用的FlexSPI NOR启动为例,【Boot Device】设为FLEXSPI NOR,开发板上对应的外部存储芯片为IS25WP064AJBLE,其是一颗常用的四线QSPI NOR Flash,我们需要在软件里进一步配置该Boot Device,单击【Boot Device Configuration】按钮可弹出如下新的配置页面:

在弹出的名为FlexSPI NOR Device Configuration页面里可以看到很多描述Multi-IO SPI NOR Flash特性的选项,比如Device Type、Query Pads等,这些选项都需要被正确地设置,以与开发板上的外部存储芯片相匹配。
除此以外,页面上还有一个名为【Use Typical Device Model】的选项,NXP-MCUBootUtility软件预先定义了一些常用的Multi-IO SPI NOR Flash型号模型,如果开发板上的外部存储芯片恰好在软件预定义的型号列表里,那么你可以直接在【Use Typical Device Model】选择对应型号,而不必在Nor Option里逐一配置。
EVK-MIMXRT1060开发板上的IS25WP064AJBLE芯片属于ISSI - IS25LP064A大类,因此我们只需要在【Use Typical Device Model】选择ISSI - IS25LP064A并点击【Ok】即完成了目标设备的设置。
设置好目标设备之后,下一步便是连接目标设备,以USB-HID接口连接为例,给EVK-MIMXRT1060板子供电,并用USB Cable将PC与J9口连接起来,如果一切正常,应该可以在设备管理器找到vid,pid为0x1fc9,0x0135(不同RT芯片,USB ID可能不同)的HID-compliant vendor-defined device设备被枚举。如果没有发现该HID设备,请仔细检查板子SW7拨码开关是否将Boot Mode设为2'b01即Serial Downloader模式。

确认HID设备存在之后,在【Port Setup】选中USB-HID,然后直接点击【Connect to ROM】按钮,此时软件便会自动完成目标设备连接全过程(使用sdphost连接ROM,获取一些MCU内部寄存器信息,使用sdphost加载Flashloader并跳转过去,使用blhost连接Flashloader,获取一些eFuse信息,使用blhost去配置boot device并获取boot device meomry信息),这个过程需要大概5s的时间,如果目标设备连接正常,你可以看到指示灯变蓝,并且【Connect to ROM】按钮标签变为【Reset Device】。如果目标设备连接失败,指示灯会变红,并且【Connect to ROM】按钮标签变为【Reconnect】。
![NXP-MCUBootUtility_connectedToDevice_e](https://raw.githubusercontent.com/JayHeng/pzhmcu-picture/master/cnblogs/nxpSecBoot_v1
$ claude mcp add NXP-MCUBootUtility \
-- python -m otcore.mcp_server <graph>