diff --git a/Inc/FirmwareLoader.h b/Inc/FirmwareLoader.h index a7a6751..f35b9ed 100644 --- a/Inc/FirmwareLoader.h +++ b/Inc/FirmwareLoader.h @@ -9,15 +9,11 @@ #include "stdbool.h" #include "assert.h" -#define FIRMWARE_META_LENGTH (2048) +#define FIRMWARE_META_LENGTH (256) typedef struct { - uint32_t *size; uint32_t *crc; - - uint8_t *nameLength; - uint8_t *name; } tFirmwareLoaderMetaMap; typedef struct { diff --git a/Src/FirmwareLoader.c b/Src/FirmwareLoader.c index d4c1517..684dd3c 100644 --- a/Src/FirmwareLoader.c +++ b/Src/FirmwareLoader.c @@ -7,24 +7,18 @@ #include "stdint.h" #include "BootJump.h" -void FirmwareLoader_MapMetadata(tFirmwareBlock *block) { -// block->metadata.crc = (uint32_t *) (block->metadataMem + 0); - block->metadata.crc = (uint32_t *) (block->metadataMem + FIRMWARE_META_LENGTH - 4); - block->metadata.size = (uint32_t *) (block->metadataMem + 4); - - block->metadata.nameLength = (uint8_t *) (block->metadataMem + 8); - block->metadata.name = (uint8_t *) (block->metadataMem + 9); -} void FirmwareLoader_Init(tFirmwareLoader *env, uint32_t fwSize, uint32_t mainFwAddr, uint32_t updateFwAddr) { env->fwSize = fwSize; env->main.address = mainFwAddr; env->update.address = updateFwAddr; + env->metadataOffset = fwSize - FIRMWARE_META_LENGTH; - FirmwareLoader_MapMetadata(&env->main); - FirmwareLoader_MapMetadata(&env->update); + env->main.metadata.crc = (uint32_t *) (env->main.metadataMem + FIRMWARE_META_LENGTH - 4); + env->update.metadata.crc = (uint32_t *) (env->update.metadataMem + FIRMWARE_META_LENGTH - 4); + } void FirmwareLoader_LoadMetadata(tFirmwareLoader *env, tFirmwareBlock *block) { @@ -117,32 +111,23 @@ uint32_t UdsCrc32Finalize(uint32_t crc) { bool FirmwareLoader_CheckBlock(tFirmwareLoader *env, tFirmwareBlock *block) { FirmwareLoader_LoadMetadata(env, block); - if ((*block->metadata.size <= env->metadataOffset + FIRMWARE_META_LENGTH - 4) && (*block->metadata.size > 0)) { - - uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, *block->metadata.size); - calcCrc = UdsCrc32Finalize(calcCrc); - - if (calcCrc == *block->metadata.crc) { - return true; - } + uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4); + calcCrc = UdsCrc32Finalize(calcCrc); + if (calcCrc == *block->metadata.crc) { + return true; } + return false; } bool FirmwareLoader_IsUpdateAndMainAreDifferent(tFirmwareLoader *env) { - //meta data must be loaded first with FirmwareLoader_LoadMetadata - //метаданные должны быть подгружены заранее с использованием FirmwareLoader_LoadMetadata - - bool sameNames = - (*env->main.metadata.nameLength == *env->update.metadata.nameLength) && - memcmp(env->main.metadata.name, env->update.metadata.name, *env->update.metadata.nameLength) == 0; bool sameSrc = *env->main.metadata.crc == *env->update.metadata.crc; - return !sameSrc || !sameNames; + return !sameSrc; } bool FirmwareLoader_CheckUpdate(tFirmwareLoader *env) { @@ -171,7 +156,7 @@ bool FirmwareLoader_IsLoadUpdate(tFirmwareLoader *env) { bool FirmwareLoader_CheckAndUpdate(tFirmwareLoader *env) { //если обновление есть (оно валидно) и глная прошивка битая или отличаеться от обновления - if(FirmwareLoader_IsLoadUpdate(env)){ + if (FirmwareLoader_IsLoadUpdate(env)) { //то гурзим обновление в основню область памяти FirmwareLoader_CopyUpdateToMain(env); } @@ -200,6 +185,7 @@ static bool FirmwareLoader_DumpUpdateMetadata(tFirmwareLoader *env) { return FirmwareLoader_WriteUpdatePortion(env, env->metadataOffset, env->update.metadataMem, FIRMWARE_META_LENGTH); } +/* bool FirmwareLoader_PrepareNewUpdate( tFirmwareLoader *env, uint32_t size, uint32_t crc, uint8_t *name, uint8_t nameLen ) { @@ -214,4 +200,5 @@ bool FirmwareLoader_PrepareNewUpdate( memcpy(env->update.metadata.name, name, nameLen); return FirmwareLoader_DumpUpdateMetadata(env); -} \ No newline at end of file +} + */ \ No newline at end of file