This commit is contained in:
cfif 2025-06-02 14:32:56 +03:00
commit 92c11a7865
3 changed files with 192 additions and 0 deletions

View File

@ -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

150
Src/ComIntCmd/FILE_TABLE.c Normal file
View File

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

17
modular.json Normal file
View File

@ -0,0 +1,17 @@
{
"dep": [
{
"type": "git",
"provider": "Smart_Components_Aurus",
"repo": "XfcTransportProtocol"
}
],
"cmake": {
"inc_dirs": [
"Inc"
],
"srcs": [
"Src/**.c"
]
}
}