Обновление

This commit is contained in:
cfif 2026-06-18 18:12:37 +03:00
parent 087d974bf2
commit 7727a1a95d
1 changed files with 62 additions and 2 deletions

View File

@ -129,6 +129,65 @@ uint32_t UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len) {
return crc; 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 * @brief Финальная инверсия CRC32
* @param crc Значение CRC перед финализацией * @param crc Значение CRC перед финализацией
@ -142,8 +201,9 @@ uint32_t UdsCrc32Finalize(uint32_t crc) {
bool FirmwareLoader_CheckBlock(tFirmwareLoader *env, tFirmwareBlock *block) { bool FirmwareLoader_CheckBlock(tFirmwareLoader *env, tFirmwareBlock *block) {
FirmwareLoader_LoadMetadata(env, block); FirmwareLoader_LoadMetadata(env, block);
uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4); // uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4);
calcCrc = UdsCrc32Finalize(calcCrc); // calcCrc = UdsCrc32Finalize(calcCrc);
uint32_t calcCrc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4);
if (calcCrc == *block->metadata.crc) { if (calcCrc == *block->metadata.crc) {
return true; return true;