// // Created by zemon on 28.05.2022. // #ifndef TERMINAL_MOTO_0_0_1_UPDATE_FIRMWARE_H #define TERMINAL_MOTO_0_0_1_UPDATE_FIRMWARE_H #include "stdint.h" #include "stdbool.h" #include "assert.h" #define FIRMWARE_META_LENGTH (0x100) typedef struct { uint32_t *size; uint32_t *crc; uint8_t *nameLength; uint8_t *name; } tFirmwareMetaMap; typedef struct { uint32_t address; uint8_t metadataMem[FIRMWARE_META_LENGTH]; tFirmwareMetaMap metadata; } tFirmwareBlock; typedef struct { tFirmwareBlock main; tFirmwareBlock update; uint32_t fwSize; uint32_t metadataOffset; } tFirmwareLoader; void FirmwareLoader_Init(tFirmwareLoader *env, uint32_t fwSize, uint32_t mainFwAddr, uint32_t updateFwAddr); bool FirmwareLoader_CheckUpdate(tFirmwareLoader *env); bool FirmwareLoader_IsLoadUpdate(tFirmwareLoader *env); bool FirmwareLoader_CheckAndUpdate(tFirmwareLoader *env); bool FirmwareLoader_PrepareNewUpdate(tFirmwareLoader *env, uint32_t size, uint32_t crc, uint8_t *name, uint8_t nameLen); bool FirmwareLoader_WriteUpdatePortion(tFirmwareLoader *env, uint32_t offset, uint8_t *data, uint16_t dataSize); void FirmwareLoader_RunFirmware(tFirmwareLoader *env); bool FirmwareLoader_CheckBlock(tFirmwareLoader *env, tFirmwareBlock *block); bool FirmwareLoader_ClearUpdateFlash(tFirmwareLoader *env); void FirmwareLoader_LoadMetadata(tFirmwareLoader *env, tFirmwareBlock *block); bool FirmwareLoader_IsUpdateAndMainAreDifferent(tFirmwareLoader *env); #endif //TERMINAL_MOTO_0_0_1_UPDATE_FIRMWARE_H