Обновление

This commit is contained in:
cfif 2026-05-28 12:35:21 +03:00
parent 9b194b5ffb
commit 14827084d1
2 changed files with 15 additions and 32 deletions

View File

@ -9,15 +9,11 @@
#include "stdbool.h" #include "stdbool.h"
#include "assert.h" #include "assert.h"
#define FIRMWARE_META_LENGTH (2048) #define FIRMWARE_META_LENGTH (256)
typedef struct { typedef struct {
uint32_t *size;
uint32_t *crc; uint32_t *crc;
uint8_t *nameLength;
uint8_t *name;
} tFirmwareLoaderMetaMap; } tFirmwareLoaderMetaMap;
typedef struct { typedef struct {

View File

@ -7,24 +7,18 @@
#include "stdint.h" #include "stdint.h"
#include "BootJump.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) { void FirmwareLoader_Init(tFirmwareLoader *env, uint32_t fwSize, uint32_t mainFwAddr, uint32_t updateFwAddr) {
env->fwSize = fwSize; env->fwSize = fwSize;
env->main.address = mainFwAddr; env->main.address = mainFwAddr;
env->update.address = updateFwAddr; env->update.address = updateFwAddr;
env->metadataOffset = fwSize - FIRMWARE_META_LENGTH; env->metadataOffset = fwSize - FIRMWARE_META_LENGTH;
FirmwareLoader_MapMetadata(&env->main); env->main.metadata.crc = (uint32_t *) (env->main.metadataMem + FIRMWARE_META_LENGTH - 4);
FirmwareLoader_MapMetadata(&env->update); env->update.metadata.crc = (uint32_t *) (env->update.metadataMem + FIRMWARE_META_LENGTH - 4);
} }
void FirmwareLoader_LoadMetadata(tFirmwareLoader *env, tFirmwareBlock *block) { void FirmwareLoader_LoadMetadata(tFirmwareLoader *env, tFirmwareBlock *block) {
@ -117,32 +111,23 @@ 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);
if ((*block->metadata.size <= env->metadataOffset + FIRMWARE_META_LENGTH - 4) && (*block->metadata.size > 0)) { uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, env->fwSize - 4);
calcCrc = UdsCrc32Finalize(calcCrc);
uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, *block->metadata.size);
calcCrc = UdsCrc32Finalize(calcCrc);
if (calcCrc == *block->metadata.crc) {
return true;
}
if (calcCrc == *block->metadata.crc) {
return true;
} }
return false; return false;
} }
bool FirmwareLoader_IsUpdateAndMainAreDifferent(tFirmwareLoader *env) { 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; bool sameSrc = *env->main.metadata.crc == *env->update.metadata.crc;
return !sameSrc || !sameNames; return !sameSrc;
} }
bool FirmwareLoader_CheckUpdate(tFirmwareLoader *env) { bool FirmwareLoader_CheckUpdate(tFirmwareLoader *env) {
@ -171,7 +156,7 @@ bool FirmwareLoader_IsLoadUpdate(tFirmwareLoader *env) {
bool FirmwareLoader_CheckAndUpdate(tFirmwareLoader *env) { bool FirmwareLoader_CheckAndUpdate(tFirmwareLoader *env) {
//если обновление есть (оно валидно) и глная прошивка битая или отличаеться от обновления //если обновление есть (оно валидно) и глная прошивка битая или отличаеться от обновления
if(FirmwareLoader_IsLoadUpdate(env)){ if (FirmwareLoader_IsLoadUpdate(env)) {
//то гурзим обновление в основню область памяти //то гурзим обновление в основню область памяти
FirmwareLoader_CopyUpdateToMain(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); return FirmwareLoader_WriteUpdatePortion(env, env->metadataOffset, env->update.metadataMem, FIRMWARE_META_LENGTH);
} }
/*
bool FirmwareLoader_PrepareNewUpdate( bool FirmwareLoader_PrepareNewUpdate(
tFirmwareLoader *env, uint32_t size, uint32_t crc, uint8_t *name, uint8_t nameLen tFirmwareLoader *env, uint32_t size, uint32_t crc, uint8_t *name, uint8_t nameLen
) { ) {
@ -215,3 +201,4 @@ bool FirmwareLoader_PrepareNewUpdate(
return FirmwareLoader_DumpUpdateMetadata(env); return FirmwareLoader_DumpUpdateMetadata(env);
} }
*/