您好,NXP团队,
我们正在为 S32K342 开发定制的固件空中升级 (FOTA) 解决方案,希望获得有关推荐的闪存架构和启动流程的指导。
MCU详情
设备:S32K342
PFlash:2 MB
银行 0:1 MB
银行 1:1 MB
DFlash:128 KB
当前状态
我们使用UART作为固件更新接口。
目前为止,我们已成功做到:
通过 UART 接收固件(.bin 文件)。
将完整的二进制文件存储到闪存中
确认接收到的图像已正确存储。
我们剩下的挑战是实现引导加载程序架构和应用程序切换机制。
我们希望就以下问题获得澄清:
1. 推荐的FOTA Flash布局
对于 S32K342 双镜像 FOTA 实现,推荐的内存布局是什么?
具体来说,我们想知道以下方面的推荐地点:
引导加载程序
应用插槽 A
应用插槽 B
元数据/启动标志
版本信息
CRC
回滚信息
提供一份包含地址的内存映射示例将非常有帮助。
2. 推荐的启动流程
请问有人能解释一下NXP推荐的完整启动顺序吗?
例如:
重置
引导加载程序启动
检查启动标志
选择活动应用程序
验证图像(CRC/签名)
跳转到应用程序
我们希望能得到流程图或对整个流程的解释。
3. 从引导加载程序跳转到应用程序
对于 S32K342,标准的 Cortex-M7 跳转序列是否足够?
例如:
从应用程序基地址读取 MSP
从基数 + 4 读取 Reset_Handler
设置 MSP
更新 VTOR
跳转到 Reset_Handler
在转移控制权之前,是否有任何 S32K342 特有的要求或初始化步骤?
4. 双应用图像
如果应用 A 和应用 B 位于不同的闪存地址:
每个应用程序都应该有自己的链接脚本吗?
或者,NXP 是否有推荐的构建双槽应用的方法?
5. 闪存库的使用
由于 S32K342 有两个 1 MB 的 PFlash 存储区:
推荐的方法是否是:
从 Bank 0 执行引导加载程序
将新固件编程到 Bank 1 中。
验证成功后切换执行
两个 PFlash 存储体之间是否存在读写限制或擦除/编程限制?
6. 元数据存储
理想的存储地点在哪里?
活动图像标志
图像有效性
Firmware version
CRC
回滚状态
这些物品应该存放在:
保留 PFlash
DFlash
另一个专用的区域?
7. 基于UART的FOTA
由于我们的更新接口是 UART,我们想知道推荐的工作流程。
以下流程是否正确?
个人电脑
│
UART
│
引导加载程序接收 .bin 文件
│
将固件存储到非活动闪存插槽中
│
验证CRC
│
更新启动元数据
│
RESET MCU
│
引导加载程序选择新映像
│
跳转至应用程序
或者恩智浦是否推荐其他方法?
8. AB_SWAP 与自定义引导加载程序
对于 S32K342 的生产 FOTA 而言,HSE AB_SWAP 是否是强制性的?
或者,具有双应用程序插槽的完全自定义引导加载程序也是一种受支持且常用的架构吗?
如果您有任何专门介绍 S32K342 FOTA、UART 固件更新或双映像引导加载程序的应用笔记、参考项目、引导加载程序示例或文档,我们将非常感谢您提供这些参考资料。
1.对于 S32K342,AB_SWAP 只有一种可能的设置。参见“3.5.3.2HSE固件参考手册中提供了“AB_SWAP”模式下闪存布局的图示,该手册可从“文档”->“安全文件”下载: https://www.nxp.com/products/S32K3
就您的情况而言,最方便、最常见的布局是:
必须安装 AB_SWAP 版本的 HSE 固件(交换是 HSE 的一项功能,没有 HSE 固件就无法执行此操作)。固件已安装到两个分区,并且如图所示,它占用了两个分区中最后的 176KB。
因为整个数据块都被交换了,所以两个数据块中必须有完全相同的引导加载程序副本。其余部分分配给申请。
代码始终从活动块运行,因此引导加载程序和所有应用程序都是针对活动块中的地址编译的。
当引导加载程序更新应用程序时,它会将应用程序编程为被动阻塞,因此在闪存编程期间不会出现边读边写的问题。应用程序编程完成后,即可触发 HSE_SRV_ID_ACTIVATE_PASSIVE_BLOCK HSE 服务。下次RESET后,分区将被交换,引导加载程序将像往常一样跳转到应用程序(跳转到当前活动块中的新应用程序)。
2. 流程取决于应用程序。在现代汽车应用中,简单的基于 CRC 的验证已不再被认为足够。软件的完整性和真实性通常通过安全启动机制来保证。在 S32K3 设备上,这是由硬件网络安全引擎 (HSE) 处理的,它会执行加密验证(例如)。基于签名)在启动过程中自主进行。预计量产汽车系统将利用这些硬件支持的网络安全功能,而不是仅仅依赖 CRC 验证。
我们提供安全启动应用笔记,其中包括演示项目。可从以下网址下载:
https://www.nxp.com/products/S32K3
应用笔记请点击此处查看:
文档 -> 安全文件 -> 安全启动应用笔记 v0.1.1.0(AN744511)
相关演示项目可在此处下载:
设计资源 -> 软件 -> 安全文件 -> SecureBootAppNoteDemo (SW745310)
您可以在 HSE 演示示例中找到其他安全启动示例:
https://www.nxp.com/webapp/Download?colCode=S32K3_HSE_DemoExamples
三种模式——高级安全启动、基本安全启动和 SHE 安全启动——都有相应的示例。建议启用高级安全启动。
请参阅所有项目中包含的 Readme.md 文件。
3. 是的,这是标准的跳转序列。强烈建议在跳转之前取消初始化引导加载程序初始化的所有资源。
4. 如上所述,代码始终从活动分区执行,因此应用程序始终使用相同的链接器文件。
5. 前面已经讨论过了。
6.这取决于用户。您可以将数据存储在应用程序映像后面,或者存储在数据闪存中。
7. 对于生产汽车用例而言,从数据传输的角度来看,所提出的流程总体上是正确的,但正如前面提到的,我不建议依赖 CRC 作为主要的验证机制。
在汽车应用中,接收到的图像通常会受到加密保护——例如,图像可能会被加密,并且其真实性/完整性会通过数字签名(而不仅仅是 CRC)来验证。
此外,在使用 HSE AB_SWAP 机制时,引导加载程序在 RESET 后不会简单地通过软件元数据选择新映像。新映像被编程到被动分区并成功验证后,应用程序/引导加载程序应调用 HSE 服务 HSE_SRV_ID_ACTIVATE_PASSIVE_BLOCK。这将激活被动块,因此RESET后设备将从新激活的分区启动。
8. HSE AB_SWAP 并非严格强制要求,但对于 S32K342 上的量产汽车 FOTA 解决方案,强烈建议使用。
如果没有 HSE 就实施 FOTA,那就意味着您没有利用 S32K3 平台的一个关键优势。这些设备的主要优点是内置支持 HSE 处理的 A/B 交换(分区重映射)。如果没有它,引导加载程序就必须手动管理一切。
具体而言,不包括 HSE AB_SWAP:
你需要自己实现一种机制来选择 A/B 图像。
您需要仔细管理地址空间,并将每个应用程序链接到不同的固定位置。
图像之间的切换不会由硬件自动处理,而完全由您的软件处理。
除了 HSE AB 交换功能之外,没有其他硬件支持的重映射机制可用。
此外,您还将失去与 AB_SWAP 集成的安全启动的简洁性和稳健性。借助 HSE,图像激活、验证和分区之间的切换以更加可控和高效的方式进行处理,符合汽车网络安全要求。
总之,虽然不考虑 HSE 也能做到这一点,但这会大大增加复杂性,并消除该平台的关键优势。
您可以查看“S32K3XX HSE 和 OTA 高级培训 [TR744101]”,该培训文档可从以下链接下载:文档 -> 安全文件: https://www.nxp.com/products/S32K3
问候,
卢卡斯