// // 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; }