扩展 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算法参数为:
- 反映的输入:否
- 反映的输出:否
- 多项式:0x4C11DB7
- 初始种子:0xFFFFFFFF
- 最终异或:0x0
为了测试它,输入字符串:
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 补码。
问题陈述:
我正在使用具有专用 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算法参数为:
- 反映的输入:否
- 反映的输出:否
- 多项式:0x4C11DB7
- 初始种子:0xFFFFFFFF
- 最终异或:0x0
为了测试它,输入字符串:
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 补码。