Обновление
This commit is contained in:
parent
9b194b5ffb
commit
14827084d1
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
*/
|
||||
Loading…
Reference in New Issue