扩展 SRecord 以处理 crc32_mpeg2?

Extending SRecord to handle crc32_mpeg2?

问题陈述:

我正在使用具有专用 CRC 硬件模块的 Kinetis L 系列 (ARM Cortex M0+)。通过反复试验并使用 this excellent online CRC calculator,我确定 CRC 硬件配置为计算 CRC32_MPEG2。

我想使用 srec_input (a part of SRecord 1.64) 为 .srec 文件生成 CRC,其结果必须与硬件计算的 CRC_MPEG2 匹配。但是,srec 的内置 CRC 算法(CRC32 和 STM32)不会生成与 CRC_MPEG2.

相同的结果

问题:

有没有直接的方法来扩展 srec 来处理 CRC32_MPEG2?我目前的想法是分叉 srec 源代码树并扩展它,但似乎有人已经走上了这条路。

或者,srec有没有办法调用外部程序? (快速扫描后我没有看到。)这也可以解决问题。

一些细节

硬件CRC32算法参数为:

为了测试它,输入字符串:

0x10 0xB5 0x06 0x4C 0x23 0x78 0x00 0x2B 
0x07 0xD1 0x05 0x4B 0x00 0x2B 0x02 0xD0

应该得到 CRC32 值:

0x938F979A

首先是什么生成了 CRC 值?

为了回答 Mark Adler 提出的恰当问题,固件使用 Freescale 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;
}

彼得·米勒值得表扬...

事实证明,如果您为 srec_cat 提供足够的过滤器,您可以让它做任何事情! :) 其实下面的参数是正确的校验和:

$ srec_cat test.srec -Bit_Reverse -CRC32LE 0x1000 -Bit_Reverse -XOR 0xff -crop 0x1000 0x1004 -Output -HEX_DUMP
00001000: 93 8F 97 9A                                      #....

换句话说,对进入 CRC32 算法的位进行位反转,在出路时对它们进行位反转,并用 1 补码。