// // Created by cfif on 04.10.2022. // #include "ComIntCmd/XFCPROT_FILE.h" #include "InternalFlashPage.h" #include "FirmwareLoader.h" #include "BaseTypes/Strings.h" #include "string.h" #include "ext_telematica.h" #include "ld_adr.h" extern uint8_t findDelimiter(tString32 *address, char ch); uint8_t XfcProtMethod_FileTable(tXfcArray *request, tXfcArray *response, void *args) { uint8_t file_name_len = sizeof("FIRMWARE") - 1; uint8_t count = 1; XFC_CMD_TX_ADD_RAW(count); XFC_CMD_TX_ADD_RAW(file_name_len); XFC_CMD_TX_ADD_STR("FIRMWARE"); return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; } uint8_t XfcProtMethod_FileInit(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env) { uint8_t fileNameLen; uint8_t fileName[32]; XFC_CMD_RX_GET_RAW(fileNameLen) XFC_CMD_RX_GET_ARR(fileName, fileNameLen) uint32_t size = 0; uint32_t crc = 0; uint8_t descriptionLen = 0; uint8_t description[64]; XFC_CMD_RX_GET_RAW(size) XFC_CMD_RX_GET_RAW(crc) XFC_CMD_RX_GET_RAW(descriptionLen) XFC_CMD_RX_GET_ARR(description, descriptionLen) env->metadataOffset = size - FIRMWARE_META_LENGTH; *env->update.metadata.crc = crc; *env->update.metadata.size = size - FIRMWARE_META_LENGTH; *env->update.metadata.nameLength = descriptionLen; memcpy(env->update.metadata.name, description, descriptionLen); bool result = false; EXT_ENV_TELE.store.AdditionalSettings->REGION_SIZE_UPDATE = 0; EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper); if (osMutexAcquire(EXT_ENV_TELE.store.accessDumper, 2000) == osOK) { result = FirmwareLoader_ClearUpdateFlash(env); osMutexRelease(EXT_ENV_TELE.store.accessDumper); } else { asm("nop"); } if (result) { return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; } return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; } uint8_t XfcProtMethod_FileWriteBlock(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env) { uint32_t offset; uint16_t blockSize; XFC_CMD_RX_GET_RAW(offset) XFC_CMD_RX_GET_RAW(blockSize) uint32_t data_in_rx = XfcArrayGetDataSize(request); if (data_in_rx != blockSize) { return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; } uint8_t *inMemBlock = request->data + request->begin; bool result = false; if (osMutexAcquire(EXT_ENV_TELE.store.accessDumper, 2000) == osOK) { result = FirmwareLoader_WriteUpdatePortion(env, offset, inMemBlock, blockSize); osMutexRelease(EXT_ENV_TELE.store.accessDumper); } else { asm("nop"); } if (result) { return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; } return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; } uint8_t XfcProtMethod_FileDone(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env) { // NVIC_SystemReset(); if (!FirmwareLoader_CheckUpdate(env)) { return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; } tString32 FW_NAME; FW_NAME.length = *env->update.metadata.nameLength; if (FW_NAME.length > 32) { FW_NAME.length = 0; } else { memcpy(FW_NAME.data, env->update.metadata.name, FW_NAME.length); } uint8_t posDel = findDelimiter(&FW_NAME, '_') + 1; if (memcmp(&FW_NAME.data[posDel], "TELE", 4) == 0) { EXT_ENV_TELE.store.AdditionalSettings->REGION_SIZE_UPDATE = FIRMWARE_TELE_AREA_LENGTH; EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper); } else if (memcmp(&FW_NAME.data[posDel], "UVEOS", 5) == 0) { EXT_ENV_TELE.store.AdditionalSettings->REGION_SIZE_UPDATE = FIRMWARE_MAIN_AREA_LENGTH; EraGlonassUveosDumper_ForceDump(EXT_ENV_TELE.store.uveosDumper); } else { return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; } // if (!FirmwareLoader_CheckAndUpdate(env)) { // return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_EXECUTION_ERROR; // } NVIC_SystemReset(); // FirmwareLoader_RunFirmware(env); return XFC_TRANSPORT_PROTOCOL_RESPONSE_RESULT_OK; }