151 lines
4.1 KiB
C
151 lines
4.1 KiB
C
//
|
|
// 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;
|
|
}
|