72 lines
2.1 KiB
C
72 lines
2.1 KiB
C
//
|
|
// Created by cfif on 24.06.2024.
|
|
//
|
|
#include "ext_telematica.h"
|
|
//#include "FirmwareMetadataSection.h"
|
|
#include "string.h"
|
|
#include "ld_adr.h"
|
|
|
|
tMmaTeleAdr EXT_ENV_ADR_TELE;
|
|
|
|
|
|
bool loadMetaTelematica() {
|
|
tMetaSectionData *metaSectionData;
|
|
|
|
uint32_t offsetMeta = 0x08000000 + BOOT_AREA_LENGTH + FIRMWARE_MAIN_AREA_LENGTH + FIRMWARE_MAIN_UPDATE_AREA_LENGTH +
|
|
FIRMWARE_TELE_AREA_LENGTH - 256;
|
|
uint32_t offsetTele = 0x08000000 + BOOT_AREA_LENGTH + FIRMWARE_MAIN_AREA_LENGTH + FIRMWARE_MAIN_UPDATE_AREA_LENGTH;
|
|
|
|
|
|
uint32_t pos = offsetMeta;
|
|
uint32_t offsetMetaCrc = (*(uint32_t *) pos);
|
|
pos += 4;
|
|
uint32_t offsetMetaSize = (*(uint32_t *) (pos));
|
|
pos += 4;
|
|
|
|
|
|
EXT_ENV_ADR_TELE.FW_NAME.length = (*(uint8_t *) (pos));
|
|
pos += 1;
|
|
|
|
if (EXT_ENV_ADR_TELE.FW_NAME.length > 32) {
|
|
EXT_ENV_ADR_TELE.FW_NAME.length = 0;
|
|
return false;
|
|
}
|
|
|
|
memcpy(EXT_ENV_ADR_TELE.FW_NAME.data, (uint8_t *) (pos), EXT_ENV_ADR_TELE.FW_NAME.length);
|
|
pos += EXT_ENV_ADR_TELE.FW_NAME.length;
|
|
|
|
|
|
EXT_ENV_ADR_TELE.HW_NAME.length = (*(uint8_t *) (pos));
|
|
pos += 1;
|
|
|
|
if (EXT_ENV_ADR_TELE.HW_NAME.length > 32) {
|
|
EXT_ENV_ADR_TELE.HW_NAME.length = 0;
|
|
return false;
|
|
}
|
|
|
|
memcpy(EXT_ENV_ADR_TELE.HW_NAME.data, (uint8_t *) (pos), EXT_ENV_ADR_TELE.HW_NAME.length);
|
|
pos += EXT_ENV_ADR_TELE.HW_NAME.length;
|
|
|
|
|
|
uint32_t crc32 = 0;
|
|
for (uint32_t i = 0; i < FIRMWARE_TELE_AREA_LENGTH - 256; ++i) {
|
|
crc32 += ((uint8_t *) offsetTele)[i];
|
|
}
|
|
|
|
if (offsetMetaSize != FIRMWARE_TELE_AREA_LENGTH - 256)
|
|
return false;
|
|
|
|
if ((crc32 != offsetMetaCrc) && (offsetMetaCrc != 0))
|
|
return false;
|
|
|
|
uint32_t offset =
|
|
offsetMeta + sizeof(offsetMetaCrc) + sizeof(offsetMetaSize) + 1 + EXT_ENV_ADR_TELE.FW_NAME.length + 1 + EXT_ENV_ADR_TELE.HW_NAME.length;
|
|
|
|
metaSectionData = (tMetaSectionData *) offset;
|
|
|
|
EXT_ENV_ADR_TELE.META_EXT_ENV_TELE = metaSectionData->meta_ext_env_tele;
|
|
EXT_ENV_ADR_TELE.tele_func = (p_tele_func) metaSectionData->meta_tele_func;
|
|
|
|
|
|
return true;
|
|
} |