Расширяете ли SRecord для обработки crc32_mpeg2?
постановка задачи:
Я работаю с серией Kinetis L (ARM Cortex M0+), которая имеет специальный аппаратный модуль CRC. Методом проб и ошибок и использованием этого превосходного онлайн-калькулятора CRC я определил, что аппаратное обеспечение CRC настроено для вычисления CRC32_MPEG2.
Я хотел бы использовать srec_input (часть SRecord 1.64) для генерации CRC для файла.srec, результаты которого должны соответствовать CRC_MPEG2, вычисленному аппаратным обеспечением. Однако встроенные в srec алгоритмы CRC (CRC32 и STM32) не дают таких же результатов, как CRC_MPEG2.
вопрос:
Есть ли простой способ расширить srec для обработки CRC32_MPEG2? Моя текущая мысль состоит в том, чтобы разветвлять исходное дерево srec и расширять его, но похоже, что кто-то уже шел по этому пути.
Альтернативно, есть ли способ для srec вызвать внешнюю программу? (Я не видел ни одного после быстрого сканирования.) Это также может помочь.
некоторые детали
Параметры аппаратного алгоритма CRC32:
- Отраженный вход: нет
- Отражение на выходе: нет
- Полином: 0x4C11DB7
- Начальное семя: 0xFFFFFFFF
- Финальный XOR: 0x0
Чтобы проверить это, введите строку:
0x10 0xB5 0x06 0x4C 0x23 0x78 0x00 0x2B
0x07 0xD1 0x05 0x4B 0x00 0x2B 0x02 0xD0
должно привести к значению CRC32:
0x938F979A
что сгенерировало значение CRC в первую очередь?
В ответ на правильный вопрос Марка Адлера, микропрограмма использует библиотеку 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;
}
1 ответ
Похвалить Питера Миллера...
Оказывается, если вы предоставите достаточное количество фильтров для 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 дополняет их.