问题陈述:
我正在使用具有专用 CRC 硬件模块的 Kinetis L 系列(ARM Cortex M0+)。通过反复试验并使用这个出色的在线 CRC 计算器,我确定 CRC 硬件配置为计算 CRC32_MPEG2。
我想使用srec_input(SRecord 1.64的一部分)为 .srec 文件生成 CRC,其结果必须与硬件计算的 CRC_MPEG2 匹配。但是,srec 的内置 CRC 算法(CRC32 和 STM32)不会生成与 CRC_MPEG2 相同的结果。
问题:
有没有一种直接的方法来扩展 srec 来处理 CRC32_MPEG2?我目前的想法是分叉 srec 源代码树并对其进行扩展,但似乎有人已经走上了这条路。
或者,有没有办法让 srec 调用外部程序?(快速扫描后我没有看到。)这也可以解决问题。
一些细节
硬件CRC32算法的参数为:
- 输入反射:否
- 输出反射:否
- 多项式:0x4C11DB7
- 初始种子:0xFFFFFFFF
- 最终异或:0x0
为了测试它,输入字符串:
0x10 0xB5 0x06 0x4C 0x23 0x78 0x00 0x2B
0x07 0xD1 0x05 0x4B 0x00 0x2B 0x02 0xD0
应该导致 CRC32 值:
0x938F979A
首先是什么产生了CRC值?
为回应 Mark Adler 提出的恰当问题,固件使用飞思卡尔 fsl_crc 库来计算 CRC。相关代码和参数(略有编辑)如下:
void crc32_update(crc32_data_t *crc32Config, const uint8_t *src, uint32_t lengthInBytes)
{
crc_config_t crcUserConfigPtr;
CRC_GetDefaultConfig(&crcUserConfigPtr);
crcUserConfigPtr.crcBits = kCrcBits32;
crcUserConfigPtr.seed = 0xffffffff;
crcUserConfigPtr.polynomial = 0x04c11db7U;
crcUserConfigPtr.complementChecksum = false;
crcUserConfigPtr.reflectIn = false;
crcUserConfigPtr.reflectOut = false;
CRC_Init(g_crcBase[0], &crcUserConfigPtr);
CRC_WriteData(g_crcBase[0], src, lengthInBytes);
crcUserConfigPtr.seed = CRC_Get32bitResult(g_crcBase[0]);
crc32Config->currentCrc = crcUserConfigPtr.seed;
crc32Config->byteCountCrc += lengthInBytes;
}