你好
我正在使用 frdm_rw612 板进行这个测试。我的集成开发环境是带有 MCUxpresso 插件的 vscode。我正试图将固件编译成"mcuboot ready" ,也就是说,我希望能用它进行 OTA。
首先,我按照以下教程进行了操作: https://community.nxp.com/t5/Zephyr-Project-Knowledge-Base/Zephyr-app-with-MCUboot-in-VS-Code/ta-p...
运行正常。当前的分区组织就是我在板中找到的 xp\frdm_rw612\frdm_rw612_common.dtsi 文件中:
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
/*
* Partition sizes must be aligned
* to the flash security sub-region size of 128KB.
*/
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x00000000 DT_SIZE_K(128)>;
};
slot0_partition: partition@20000 {
label = "image-0";
reg = <0x00020000 DT_SIZE_K(640)>;
};
slot0_ns_partition: partition@C0000 {
label = "image-0-non-secure";
reg = <0x000C0000 DT_SIZE_M(3)>;
};
slot1_partition: partition@3C0000 {
label = "image-1";
reg = <0x003C0000 DT_SIZE_K(640)>;
};
slot1_ns_partition: partition@460000 {
label = "image-1-non-secure";
reg = <0x00460000 DT_SIZE_M(3)>;
};
storage_partition: partition@760000 {
label = "storage";
reg = <0x00760000 (DT_SIZE_M(57) - DT_SIZE_K(384))>;
};
};据我所知,hello-world 示例非常小,可以放在很小(640kB)的安全分区中。
不幸的是,当我对当前固件(具有 Wifi、蓝牙等功能)进行同样的操作时,却无法编译,因为它说分区超载:
[...]/arm-zephyr-eabi/bin/ld.bfd.exe: zephyr\zephyr_pre0.elf section `rodata' will not fit in region `FLASH'
[...]/arm-zephyr-eabi/bin/ld.bfd.exe: region `FLASH' overflowed by 1682828 bytes总而言之
我可以编译和闪存 mcuboot。我还能正确闪存 hello-world 示例(我可以从 UART 看到它能正确加载 hello-world 应用程序)。另一方面,我无法编译我的"大" 固件。
如何生成一个具有最小安全分区的映像,该映像只能在主固件所在的非安全区域跳转?
我想保留您当前的分区结构,因为我将来会使用这个安全分区。
谢谢!
你好@_Arthur_,希望你一切都好。
如果您想重新调整分区大小,可以在覆盖文件中进行,就像您对分区所做的那样,但您应该保持结构不变,以便 MCUboot 能够在指定的分区中识别镜像。
此外,如果您希望使用共享的闪存分区,请考虑将其与 TF-M 堆栈一起使用,后者也使用 MCUboot 作为安全引导加载器,以在安全环境中验证和加载映像。
有关受保护存储的更多信息,请参阅 Zephyr 参考文档 “安全存储”。
我取得了一些进展。作为短期解决方案,我将 frdm_rw612_common.dtsi 文件中的 slotx_partition 与 slotx_ns_partition 反转,这样就可以编译并使用更大的安全分区。
如果我在覆盖文件中修改了这一点,就可以编译,但 mcuboot 无法在运行时跳转到图像。我想,当 mcuboot 生成时,它并没有使用我当前项目中的覆盖文件。
总之,我不太明白安全分区和非安全分区之间的区别。将整个固件放在安全分区中会有什么缺点吗?
我还在想如何将 PSA_protected_storage 添加到这个项目中。如果添加此功能,哪个分区将用于此功能?
你好,罗曼、
问题与您的示例相同,只要我的闪存大小超过 640kB(您的默认安全分区大小),编译时就会出现这个错误:
区域 “FLASH” 溢出 15872 字节
将 BT 和 UDP 支持添加到此 smp_svr 示例中,您将看到错误信息
因此,我之前提出的所有问题仍然有效,以便理解和解决我的问题:
如何生成一个具有最小安全分区的映像,该映像只能在主固件所在的非安全区域跳转?
如何生成同时处理这两个分区的固件?
使用 psa_protected_storage 时,加密数据存储在哪里?我想使用这项功能。
不过,我需要为文件自定义一个非易失性分区,是 common.dtsi 中分区表定义中的当前 storage_partition 吗?
你好@_Arthur_。
如果需要使用 MCUboot 进行 OTA,我建议使用"smp_svr" 样本,其主要目的是通过 MCUmgr 协议进行固件更新,并允许通过蓝牙、UDP、UART 等进行更新。此示例与 McuBoot 一起使用,检查是否有正确签名的二进制文件并将其更新到您的 MCU 中。
要测试该示例,您需要下载一个 McUmGR 客户端来进行固件更新,并先单独版本和刷新 McuBoot,然后版本并烧录 smp_svr 示例,并将所需的宏添加到 smp_svr 示例的 prj.conf 文件中(这将取决于您希望使用的 OTA 传输)。完成上述操作后,系统就可以与 MCUmgr 客户端正常通信,检查上传的图像列表并加载新图像。
要为 MCUboot 加载新的有效映像,我建议在要加载的样本的 prj.conf 文件中添加以下配置:
CONFIG_HEAP_MEM_POOL_SIZE=2048
只需构建样本,即可生成 MCUboot 有效签名映像:
CONFIG_MCUBOOT_SIGNATURE_KEY_FILE="
CONFIG_MCUBOOT_GENERATE_CONFIRMED_IMAGE=y
CONFIG_BOOTLOADER_MCUBOOT=y
请告诉我这是否适合您,是否符合您的要求。
我还下载了"psa_protected_storage" 样本,以便更好地理解 tfm 结构,但我还是不确定你是如何对镜像进行分区的。
例如,对于 psa_protected_storage,哪个分区用于存储加密数据?是在"storage_partition" 吗?
我在上面提到的帖子中提到了 fw_storage 分区。我没有这个分区,但我可以使用 Wifi。
最新文件在哪里?我并不想做什么花哨的事情,只想使用 mcuboot 进行 OTA,但我苦于找不到正确的文档来了解如何操作。
感谢您的帮助!
亚瑟
你好,罗曼、
说实话,我也不知道。正如我在第一个帖子中所说,我想遵循 frdm_rw612 分区分布,因为这似乎是推荐的方法。
今天我没有使用任何安全功能,因为它还只是一个原型,但我们很快就会开发生产版本,我不想今天做出的选择会在日后成为问题。
FRDM_RW612 有一个 640kB 的安全分区和一个 3MB 的非安全分区。
我目前的应用程序大小为 2.3MB(完全没有优化)。
如何生成同时处理这两个分区的固件?
你好@_Arthur_,希望你一切都好。
能否请您确认所需的分区分布?是一个小的非安全分区和一个大的安全分区,还是相反?此外,能否请您也分享一下您的应用规模?
在任何情况下,您都可以使用覆盖文件修改分区大小,同时注意考虑每个 128kB 大小分区的对齐方式。
亲爱的罗曼
你不回答我的问题,很难完全理解。
当您说"时,您应该保持"的结构,您的意思是先有安全分区,然后再有非安全分区?
我还在想如何将 PSA_protected_storage 添加到这个项目中。如果添加此功能,哪个分区将用于此功能?
如何生成一个具有最小安全分区的映像,该映像只能在主固件所在的非安全区域跳转?
如何生成同时处理这两个分区的固件?
你好,罗曼、
谢谢,我现在明白了。
这个链接是你们工程团队写的吗?https://community.nxp.com/t5/Wi-Fi-Bluetooth-802-15-4/Zephyr-MCUBoot-TFM-Demo-using-RW612/ta-p/20475...
我还需要这样修改 SDK 吗?因为我无法按照"Modify non-secure image" 部分的描述修改非安全图像。nxp_zephyr\ zephyr\ 中不存在 " 版本 " 文件夹
不过,在我的 frdm_rw612_rw612_ns.dts 文件中,有一行删除了 frdm_rw612_common.dtsi 中已配置的所有分区。这不符合保留分区结构的理念。
无论如何,如果我使用非安全板,它无法编译,因为我使用的是存储分区,而且它在 /delete-node/ 行中已经不存在了
&w25q512jvfiq {
/delete-node/ partitions;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
slot0_ns_partition: partition@080C0000 {
label = "image-0-non-secure";
reg = <0x080C0000 DT_SIZE_M(3)>;
};
/* This partition is reserved for connectivity firmwares storage
* and shouldn't be moved.
*/
fw_storage: partition@400000 {
label = "fw_storage";
reg = <0x400000 0x280000>;
read-only;
};
};
};当您说"开发必须在您自己的" 上进行时,您的意思是您不正式支持 TF-M?这就是为什么我们需要手动修改 SDK?
你好@_Arthur_。
是的,该指南由我们的工程团队编写,用于 Zephyr 4.0.0 版本、不过,正如您所提到的,在更高版本(目前为 4.2.0 和 4.3.0)中不需要本指南,因为指南中显示的 TFM 示例默认包含 BL2 集成(MCUboot 作为安全引导加载器)。因此,在 4.2.0 下行& 上行和 4.3.0 版本中已支持该功能。
希望这能解开你的疑惑。
你好,罗曼、
好吧,这有助于我更好地理解。
通过删除 frdm_rw612_rw612_ns.dts 文件中的这一点,我可以用 tfm 编译固件:
&w25q512jvfiq {
/delete-node/ partitions;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
slot0_ns_partition: partition@080C0000 {
label = "image-0-non-secure";
reg = <0x080C0000 DT_SIZE_M(3)>;
};
/* This partition is reserved for connectivity firmwares storage
* and shouldn't be moved.
*/
fw_storage: partition@400000 {
label = "fw_storage";
reg = <0x400000 0x280000>;
read-only;
};
};
};我不明白删除分区节点的目的是什么。
总之,如果我闪存"tfm_merged.hex" 、输出结果如下
[INF] Starting bootloader
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[INF] PSA Crypto init done, sig_type: EC-P256, using builtin keys
[INF] Image index: 1, Swap type: none
[INF] Image index: 0, Swap type: none
[INF] Bootloader chainload address offset: 0x20000
[INF] Image version: v0.0.0
[INF] Jumping to the first image slot
Booting TF-M v2.2.0+g9a6c6f958
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[Sec Thread] Secure image initializing!
[INF][PS] Encryption alg: 0x5500100
[INF][Crypto] Provision entropy seed...
[INF][Crypto] Provision entropy seed... complete.bl2 似乎可以正常启动,但随后什么也没发生。我的非安全固件无法启动。
我还尝试闪存文件 zephyr_ns_signed.hex,但结果是一样的。
我认为
你好@_Arthur_。
能否请你和我分享一下使用 TF-M 和 BL2 版本和刷新应用程序时要遵循的步骤?你在用 sysbuild 来版本 McuBoot 吗?
此外,这些分区的用途与您提到的一样,安全分区用于托管 TF-M 的安全服务,而非安全分区将用于您的非安全应用程序。
你好,罗曼、
使用 sysbuild 更糟糕。这就是我从我当前的项目(已经实现了许多功能,例如Wifi、蓝牙、以太网)中做的事情,该项目是根据一个hello_world的例子创建的(这意味着它既不使用mcuboot,或非使用分区)。
我在 prj.conf 中添加的内容
CONFIG_BUILD_WITH_TFM=y
CONFIG_WIFI_NXP=y
CONFIG_NXP_RW610=y
CONFIG_ETH_DRIVER=y
# stack size
CONFIG_SHELL_STACK_SIZE=6144
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4608
CONFIG_NET_TCP_WORKQ_STACK_SIZE=2048
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_IDLE_STACK_SIZE=1024我的控制台里有什么?
[INF] Starting bootloader
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[INF] PSA Crypto init done, sig_type: EC-P256, using builtin keys
[INF] Image index: 1, Swap type: none
[INF] Image index: 0, Swap type: none
[INF] Bootloader chainload address offset: 0x20000
[INF] Image version: v0.0.0
[INF] Jumping to the first image slot
Booting TF-M v2.2.0+g9a6c6f958
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[Sec Thread] Secure image initializing!
[INF][PS] Encryption alg: 0x5500100
[INF][Crypto] Provision entropy seed...
[INF][Crypto] Provision entropy seed... complete.我没有启用 sysbuild,因为根据输出结果,我已经有了引导加载程序。
您能告诉我我做错了什么吗?
非常感谢!
使用 sysbuild:
image.py: sign the payload
image.py: sign the payload
Usage: imgtool.py sign [OPTIONS] INFILE OUTFILE
Try 'imgtool.py sign -h' for help.
Error: Image size (0x1ed91c) + trailer (0x1b0) exceeds requested size 0xa0000
image.py: sign the payload
Batch file failed at line 12 with errorcode 2你好,罗曼、
您能告诉我我做错了什么吗?为了在本周发布固件,找到解决方案对我来说非常重要。
感谢您的帮助
你好@_Arthur_,很抱歉耽误了您的时间。
我试着用 TF-M 和 BL2 生成了一个基本固件,运行正常。我明白你为什么要从 frdm_rw612_rw612_ns.dts 文件中删除你提到的部分,但是这个步骤是必需的,因为这个叠加层应该设置 TF-M 在非安全的“版本”中使用的分区结构,删除它可能会生成不兼容的结构,而且你的应用程序可能无法加载到已知的 MCUboot 地址中。
能否与我分享您的项目生成的 dts 文件?或者是 dts 分区的截图?它应位于项目内的以下路径:debug/zephyr/zephyr.dts
感谢您的耐心等待。
你好,罗曼、
对不起,我还是有同样的问题:
1.我是否需要启用 sysbuild(并设置 SB_CONFIG_BOOTLOADER_MCUBOOT="y" )?
2.我添加到 prj.conf 中的内容是否正确?
3.一切编译完成后,我需要闪存什么?
你说我需要保留删除分区的节点。那么,在这种情况下,我的问题就来了:
在我当前的固件中,我使用的是 common.dtsi 中定义的 storage_partition。当我使用非安全配置时,由于删除了所有分区,storage_partition 不再被定义,因此我的代码无法编译。4.如何在这种非安全配置中使用 storage_partition?
您明确指出,我必须保持 common.dtsi 中定义的分区结构不变。5.因此,为什么 fw_storage 分区位于 0x400000?如果我查看 common.dtsi 结构,它位于 slot1_partition 中。
6.这个 fw_storage 分区到底是什么?"标准" 安全配置中为什么没有?
我知道您时间不多,请回答我的 6 个问题,这将有助于我更好地理解和自主。
如果你能分享一个分步的 TF-M 和 BL2 示例,使用 storage_partition 和 WiFi/BLE 连接来编译和刷新标准固件,那就太完美了。谢谢
PS:我没有分享我的 DTS 分区部分,因为它在当前状态下没有感知上的意义。
你好,罗曼、
我明天必须发布一个固件,能收到回复吗?还是你那边还没准备好,我需要找一个 B 计划?
感谢您的帮助!
亚瑟
你好@_Arthur_。
我需要启用 sysbuild(并设置 SB_CONFIG_BOOTLOADER_MCUBOOT= "y")还是不需要?
不,你不需要使用 sysbuild,因为 TF-M 版本系统默认包含 MCUboot。
我在 prj.conf 中添加的内容是否正确?
是的,作为观察结果," CONFIG_BUILD_WITH_TFM " 是在为非安全版本的板创建项目时默认设置的。
一切编译完成后,我需要闪存什么?
在 TF-M 版本 System Zephyr 文档的屏幕截图中,这取决于对每个生成文件的实用性的详细解释:
不过,考虑到首次使用的场合,您应该闪存 tfm_merged.hex 文件,其中包含 MCUboot 引导加载程序、TF-M 安全映像和非安全应用程序的合并文件。
。
如何在此非安全配置中使用存储分区?
预计用户将使用 TF-M 提供的安全存储服务,因为 TF-M 配置的闪存布局为该存储预留了空间。
。
这个 fw_storage 到底是什么?
fw_storage 分区用于存储 Wi-Fi、BLE 和 802.15.4 固件。
希望这些信息对您的发展有所帮助。感谢您的耐心等待。
你好@_Arthur_,希望你一切都好。
在回答您的问题时,预计 Wifi 固件会自动加载。不过,我正在内部检查这个问题。
感谢您的耐心等待。
你好,罗曼、
我尝试编译并闪存(tfm_merged.hex)为基本样本。如果我使用 zephyr/samples/hello_world,就会出现这种情况:
[INF] Starting bootloader
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[INF] PSA Crypto init done, sig_type: EC-P256, using builtin keys
[INF] Image index: 1, Swap type: none
[INF] Image index: 0, Swap type: none
[INF] Bootloader chainload address offset: 0x20000
[INF] Image version: v0.0.0
[INF] Jumping to the first image slot
Booting TF-M v2.2.0+g9a6c6f958
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[Sec Thread] Secure image initializing!
[INF][PS] Encryption alg: 0x5500100
[INF][Crypto] Provision entropy seed...
[INF][Crypto] Provision entropy seed... complete.
*** Booting Zephyr OS build nxp-v4.1.0-23883-g5fbcfde7cfc2 ***
Hello World! frdm_rw612/rw612/ns因此,一切似乎都按预期进行。
但是,如果我使用一个使用 WiFi 的示例,如 zephyr/samples/net/wifi/shell,那么我得到的输出与我的固件(使用 WiFi 和 BLE)相同:
[INF] Starting bootloader
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[INF] PSA Crypto init done, sig_type: EC-P256, using builtin keys
[INF] Image index: 1, Swap type: none
[INF] Image index: 0, Swap type: none
[INF] Bootloader chainload address offset: 0x20000
[INF] Image version: v0.0.0
[INF] Jumping to the first image slot
Booting TF-M v2.2.0+g9a6c6f958
[WRN] This device was provisioned with dummy keys. This device is NOT SECURE
[Sec Thread] Secure image initializing!
[INF][PS] Encryption alg: 0x5500100
[INF][Crypto] Provision entropy seed...
[INF][Crypto] Provision entropy seed... complete.因此,问题的根本原因来自 Wifi,可能与我提出的固件分区问题有关。能否分享一下编译 Wifi 和 tf-m 示例的步骤?
你好,罗曼、
感谢您的反馈。你没有回答关于分区结构的问题
5.因此,为什么 fw_storage 分区位于 0x400000?如果我查看 common.dtsi 结构,它位于 slot1_partition 中。
1.这个 fw_storage 似乎很重要,为什么"安全" 配置中从未提及?
2.要在该分区中填充必要的固件,我需要做什么特别的事情吗?
你好@_Arthur_。
由于正值假期,恐怕我无法给您一个预计的答复时间,不过,一旦有消息,我会通知您的。
谢谢。
你好,罗曼、
谢谢您的帮助。预计到达时间是几天还是几周?
你好@_Arthur_,谢谢你,祝你 2026 年快乐!
我仍在等待我的内部团队就此事做出答复,一旦得到答复,我会通知你们。
你好,罗曼、
祝您和恩智浦在 2026 年一切顺利
您有关于这个话题的任何消息吗?
谢谢!
亚瑟
你好@_Arthur_,我对此事的延误表示歉意。
关于你在使用 TF-M 从 Zephyr 构建 Wi-Fi Shell 示例时观察到的应用程序无法正确启动的行为,请尝试在 prj.conf 文件中添加以下设置。
# General
CONFIG_HEAP_MEM_POOL_SIZE=122880
# TF-M S
CONFIG_TFM_BL2=y
CONFIG_BUILD_WITH_TFM=y
CONFIG_TFM_PROFILE_TYPE_NOT_SET=y
# Update the flash base address of ns image
CONFIG_FLASH_BASE_ADDRESS=0x80C0000
# TF-M IPC
CONFIG_TFM_IPC=y
CONFIG_TFM_ISOLATION_LEVEL=2
# TF-M NS
CONFIG_HWINFO=y
# Networking (TF-M NS)
CONFIG_NETWORKING=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_TCP=y
CONFIG_DNS_RESOLVER=y
CONFIG_ETH_DRIVER=n
CONFIG_WIFI=y
# NXP Networking (TF-M NS)
CONFIG_WIFI_NXP=y
CONFIG_NXP_RW610=y
CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=20
CONFIG_NET_BUF_DATA_SIZE=1744
CONFIG_NET_SOCKETS_POLL_MAX=12
CONFIG_ZVFS_OPEN_MAX=30
CONFIG_PSA_CRYPTO_ENABLE_ALL=y
这些设置现在应该允许 shell 应用程序正常启动。不过,目前内部团队仍在检查一种行为,即当使用"wifi scan" 命令时,应用程序会进入硬故障状态。因此,请使用"nxp_wifi scan" 命令扫描附近的网络,而不是使用"wifi scan" 。不过,你仍然可以使用默认的"wifi connect..." 命令连接到网络,如下图所示:
如果这对你有用,请告诉我。