SMART_COMPONENTS_EXTERNAL_T.../ext_telematica.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;
}