From 7727a1a95dfc94e64680ba518f4645ef0e50b0fa Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 18 Jun 2026 18:12:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/FirmwareLoader.c | 64 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/Src/FirmwareLoader.c b/Src/FirmwareLoader.c index 461a393..3cb7283 100644 --- a/Src/FirmwareLoader.c +++ b/Src/FirmwareLoader.c @@ -129,6 +129,65 @@ uint32_t UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len) { return crc; } +#include "fc7xxx_driver_crc.h" + +/** + * @brief Hardware CRC-32 update function + * + * Configuration that works (Test 2): + * - Polynomial: 0x04C11DB7 (direct form) + * - Write data swap: BYTE_BIT (byte + bit reflection on input) + * - Read data swap: BYTE_BIT (byte + bit reflection on output) + * - Read data FXOR: FXOR (final XOR with 0xFFFFFFFF) + * + * This matches the software implementation that uses reflected polynomial 0xEDB88320. + * + * @param crc Initial CRC value (0xFFFFFFFF for new calculation) + * @param data Pointer to data buffer + * @param len Length of data in bytes + * @param update_func Callback for timeout (can be NULL) + * @param update_func_env Environment for callback + * @param timeout Timeout in milliseconds + * @return uint32_t Updated CRC value + */ +uint32_t UdsCrc32Update_Hardware(uint32_t crc, const uint8_t *data, uint32_t len) +{ + CRC_InitType tInitCfg = {0}; + uint32_t u32Result; + + /* Конфигурация из Test 2 */ + tInitCfg.u32Polynomial = 0x04C11DB7UL; /* Прямой полином */ + tInitCfg.u32SeedValue = crc; /* Начальное значение */ + tInitCfg.eBitWidth = CRC_BIT_32; /* 32-битный режим */ + tInitCfg.eWriteDataSwap = WRITE_DATASWAP_BIT_BYTE; /* Байтовый + битовый swap на входе */ + tInitCfg.eReadDataSwap = READ_DATASWAP_BIT_BYTE; /* Байтовый + битовый swap на выходе */ + tInitCfg.eReadDataFXOR = READ_DATA_FXOR; /* Финальная инверсия (XOR 0xFFFFFFFF) */ + + CRC_Init(CRC_INSTANCE, &tInitCfg); + + /* Обработка данных 32-битными словами для скорости */ + while (len >= 4) + { + uint32_t u32Word = *(const uint32_t*)data; + CRC_SetCalcData_U32(CRC_INSTANCE, u32Word); + + data += 4; + len -= 4; + } + + /* Обработка оставшихся байтов (0-3) */ + while (len--) + { + CRC_SetCalcData_U8(CRC_INSTANCE, *data++); + } + + /* Получаем результат (уже с FXOR) */ + u32Result = CRC_GetCrcResult(CRC_INSTANCE); + + return u32Result; +} + + /** * @brief Финальная инверсия CRC32 * @param crc Значение CRC перед финализацией @@ -142,8 +201,9 @@ uint32_t UdsCrc32Finalize(uint32_t crc) { bool FirmwareLoader_CheckBlock(tFirmwareLoader *env, tFirmwareBlock *block) { FirmwareLoader_LoadMetadata(env, block); - uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4); - calcCrc = UdsCrc32Finalize(calcCrc); +// uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4); +// calcCrc = UdsCrc32Finalize(calcCrc); + uint32_t calcCrc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4); if (calcCrc == *block->metadata.crc) { return true;