2.2 使能CRC32校验的条件
当 App 默认中断向量表里 offset 0x24 处的 imageType[7:0] 类型为 0x02 或者 0x05,且 offset 0x20 处的 imageLength 不为 0 时,CRC32 校验的功能就会被使能。BootROM 在做 CRC32 计算时主要有如下两个注意事项:
- Note 1: 指定的CRC计算范围如果包含crcChecksum这4bytes的话,在计算CRC时会自动跳过这4bytes。Note 2: 指定的CRC计算长度如果不是4字节对齐,CRC数据计算到最后会自动补0对齐。
2.3 具体CRC32算法选项
关于 CRC32 算法的具体实现有很多分支,BootROM 中使用的比较主流的 MPEG2 分支,其在计算 image 具体 CRC 时主要借助了芯片内部的 CRC 模块(这个模块也常见于恩智浦 LPC 系列芯片上),这个 CRC 模块支持三种固定的 CRC 算法多项式(多项式系数不是可自由配置的),BootROM 用得就是最后一个模式选项 CRC-32:
BootROM 中对 CRC 模块的配置代码如下:
#include "fsl_crc.h"void crc32_init(void){ crc_config_t crcUserConfigPtr; CRC_GetDefaultConfig(&crcUserConfigPtr); crcUserConfigPtr.seed = 0xffffffffU; crcUserConfigPtr.polynomial = kCRC_Polynomial_CRC_32; crcUserConfigPtr.reverseIn = false; crcUserConfigPtr.reverseOut = false; crcUserConfigPtr.complementIn = false; crcUserConfigPtr.complementOut = false;} 2.4 利用工具自动添加CRC校验参数
对 CRC32 校验启动的原理了解差不多了,我们现在在 MIMXRT595-EVK 开发板上实测一下,跟前面测试一样,先使用 \SDK_2.10.1_EVK-MIMXRT595\boards\evkmimxrt595\driver_examples\gpio\led_output\iar\flash_debug 例程生成两个闪灯间隔时间不同的程序镜像文件:image 0 - gpio_led_output_delay200ms.bin 和 image 1 - gpio_led_output_delay2s.bin。
然后借助 MCUBootUtility 工具(需要 v3.5.0 版本及以上),在 Secure Boot Type 里选择 Plain CRC Image Boot,点击 All-In-One 下载按钮(两个文件分别做两次同样的下载流程),工具会自动在 image 相应地方填充进所需的 CRC32 参数并下载进 Flash。
这时候在工具通用编程器模式(Boot Device Memory)里我们再读回 image 保存就可以得到两个含 CRC32 校验的程序镜像文件 image 0 - gpio_led_output_delay200ms_crc.bin 和 image 1 - gpio_led_output_delay2s_crc.bin。
以 image 0 为例,根据 0x08001020 处的 imageLength 信息显示,image 0 App 本身长度为 0x36e8 字节,而 App 起始偏移是 0x1000,所以我们直接是从偏移 0 地址处开始读回 0x46e8 字节作为 gpio_led_output_delay200ms_crc.bin 文件数据。此外 image 0 的 CRC32 校验值已经填好了,是 0x4d8957d8。
|