commit 92c11a7865bffcf928df668eefc91e4fa3c34389 Author: cfif Date: Mon Jun 2 14:32:56 2025 +0300 Init diff --git a/Inc/ComIntCmd/XFCPROT_FILE.h b/Inc/ComIntCmd/XFCPROT_FILE.h new file mode 100644 index 0000000..6518fc4 --- /dev/null +++ b/Inc/ComIntCmd/XFCPROT_FILE.h @@ -0,0 +1,25 @@ +// +// Created by xemon on 02.11.22. +// + +#ifndef UVEOS_ON_NATION_BOOTLOADER_FILE_H +#define UVEOS_ON_NATION_BOOTLOADER_FILE_H + +#include "XfcProtProcessorUtilDefines.h" +#include "FirmwareLoader.h" + +//typedef struct { +// uint32_t fw_current_offset; +// +//} tXfcProtFileContext; + +uint8_t XfcProtMethod_FileTable(tXfcArray *request, tXfcArray *response, void *args); + +uint8_t XfcProtMethod_FileInit(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env); + +uint8_t XfcProtMethod_FileWriteBlock(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env); + +uint8_t XfcProtMethod_FileDone(tXfcArray *request, tXfcArray *response, tFirmwareLoader *env); + + +#endif //UVEOS_ON_NATION_BOOTLOADER_FILE_H diff --git a/Src/ComIntCmd/FILE_TABLE.c b/Src/ComIntCmd/FILE_TABLE.c new file mode 100644 index 0000000..5dcb86a --- /dev/null +++ b/Src/ComIntCmd/FILE_TABLE.c @@ -0,0 +1,150 @@ +// +// 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; +} diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..891cf55 --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "Smart_Components_Aurus", + "repo": "XfcTransportProtocol" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file