Обновление
This commit is contained in:
parent
9b194b5ffb
commit
14827084d1
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
uint32_t calcCrc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) block->address, *block->metadata.size);
|
|
||||||
calcCrc = UdsCrc32Finalize(calcCrc);
|
calcCrc = UdsCrc32Finalize(calcCrc);
|
||||||
|
|
||||||
if (calcCrc == *block->metadata.crc) {
|
if (calcCrc == *block->metadata.crc) {
|
||||||
return true;
|
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);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
Loading…
Reference in New Issue