Обновление платы на V2

This commit is contained in:
cfif 2026-05-27 14:13:15 +03:00
parent d0d5208822
commit fdef801256
2 changed files with 305 additions and 281 deletions

566
CanUds.c
View File

@ -948,9 +948,10 @@ static uint16_t vUDS_check_Programming_Preconditions(tCanUds *env, eUdsRoutineCo
return 0xFF00 | UDS_error_sub_functionNotSupported; return 0xFF00 | UDS_error_sub_functionNotSupported;
} }
env->dataResponse[4] = UDS_routine_RoutineStartStopSuccess; // env->dataResponse[4] = UDS_routine_RoutineStartStopSuccess;
// return 4 + 1;
return 4;
return 4 + 1;
} }
static uint16_t vUDS_routine_VIN_learn(tCanUds *env, eUdsRoutineControlType udsRoutineControlType) { static uint16_t vUDS_routine_VIN_learn(tCanUds *env, eUdsRoutineControlType udsRoutineControlType) {
@ -1008,11 +1009,12 @@ static uint16_t vUDS_routine_Erase_Memory(tCanUds *env, eUdsRoutineControlType u
env->udsBlock = UDS_BlockInit; env->udsBlock = UDS_BlockInit;
if (eraseMemory->memoryAddress == 0x01100000) {
if (eraseMemory->memoryAddress == ADR_HEX_BlockMain) {
env->udsBlock = UDS_BlockMain; env->udsBlock = UDS_BlockMain;
} else if (eraseMemory->memoryAddress == 0x011B0000) { } else if (eraseMemory->memoryAddress == ADR_HEX_BlockCalib) {
env->udsBlock = UDS_BlockCalib; env->udsBlock = UDS_BlockCalib;
} else if (eraseMemory->memoryAddress == 0x011DEC00) { } else if (eraseMemory->memoryAddress == ADR_HEX_BlockMeta) {
env->udsBlock = UDS_BlockMeta; env->udsBlock = UDS_BlockMeta;
} }
@ -1024,16 +1026,17 @@ static uint16_t vUDS_routine_Erase_Memory(tCanUds *env, eUdsRoutineControlType u
bool result = false; bool result = false;
if (env->udsBlock == UDS_BlockMain) { if (env->udsBlock == UDS_BlockMain) {
result = env->clear_flash_func(0x01100000, 704 * 1024); result = env->clear_flash_func(ADR_HEX_Mapped_BlockMain, SIZE_HEX_BlockMain);
} }
if (env->udsBlock == UDS_BlockCalib) { if (env->udsBlock == UDS_BlockCalib) {
result = env->clear_flash_func(0x011B0000, 192 * 1024 - 2048); result = env->clear_flash_func(ADR_HEX_Mapped_BlockCalib, SIZE_HEX_BlockCalib);
} }
if (env->udsBlock == UDS_BlockMeta) { if (env->udsBlock == UDS_BlockMeta) {
result = env->clear_flash_func(0x011DF800, 2048); result = env->clear_flash_func(ADR_HEX_Mapped_BlockMeta, SIZE_HEX_BlockMeta);
} }
// bool result = FLASHDRIVER_FlashEraseBlock(FLASH_BLOCK_SELECT1); // bool result = FLASHDRIVER_FlashEraseBlock(FLASH_BLOCK_SELECT1);
@ -1350,33 +1353,32 @@ static uint16_t RequestDownload_34(tCanUds *env) {
} }
if (com->memoryAddress == 0x01020000) { if (com->memoryAddress == ADR_HEX_BlockMain) {
env->udsBlock = UDS_BlockMain; env->udsBlock = UDS_BlockMain;
} }
if (com->memoryAddress == 0x010D0000) { if (com->memoryAddress == ADR_HEX_BlockCalib) {
env->udsBlock = UDS_BlockCalib; env->udsBlock = UDS_BlockCalib;
} }
if (com->memoryAddress == 0x010FF800) { if (com->memoryAddress == ADR_HEX_BlockMeta) {
env->udsBlock = UDS_BlockCalib; env->udsBlock = UDS_BlockMeta;
} }
env->AdrFlash = com->memoryAddress + 0x0100000 - (128 * 1024); env->AdrFlash = com->memoryAddress + 0x00100000 - (128 * 1024);
env->SizeWriteFlash = 0; env->SizeWriteFlash = 0;
env->DownloadFirmwareSize = com->memorySize; env->DownloadFirmwareSize = com->memorySize;
if (env->udsBlock == UDS_BlockMain) { if (env->udsBlock == UDS_BlockMain) {
if ((com->memoryAddress != 0x01020000) && (com->memorySize > (704 * 1024))) { if (com->memorySize > SIZE_HEX_BlockMain) {
return setResponseError(env, UDS_RequestDownload, UDS_error_requestOutOfRange); return setResponseError(env, UDS_RequestDownload, UDS_error_requestOutOfRange);
} }
} }
if (env->udsBlock == UDS_BlockCalib) { if (env->udsBlock == UDS_BlockCalib) {
if ((com->memoryAddress != 0x010D0000) || (com->memorySize > (192 * 1024 - 2048))){ if (com->memorySize > SIZE_HEX_BlockCalib) {
return setResponseError(env, UDS_RequestDownload, UDS_error_requestOutOfRange); return setResponseError(env, UDS_RequestDownload, UDS_error_requestOutOfRange);
} }
@ -1384,7 +1386,7 @@ static uint16_t RequestDownload_34(tCanUds *env) {
if (env->udsBlock == UDS_BlockMeta) { if (env->udsBlock == UDS_BlockMeta) {
if ((com->memoryAddress != 0x010FF800) || (com->memorySize > (2 * 1024))) { if (com->memorySize > SIZE_HEX_BlockMeta) {
return setResponseError(env, UDS_RequestDownload, UDS_error_requestOutOfRange); return setResponseError(env, UDS_RequestDownload, UDS_error_requestOutOfRange);
} }
@ -1525,272 +1527,269 @@ static uint16_t RequestTransferExit_37(tCanUds *env) {
// конец --------------------------- RequestTransferExit --------------------------------------------------------- // конец --------------------------- RequestTransferExit ---------------------------------------------------------
const eUds_com uds_com[256] = { static const eUds_com uds_com[256] = {
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{DiagnosticSessionControl_10, "DiagnosticSessionControl_10"}, {DiagnosticSessionControl_10, "DiagnosticSessionControl_10", true},
{ECUReset_11, "ECUReset_11"}, {ECUReset_11, "ECUReset_11", true},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{UDS_ClearDiagnosticInformation_14, "UDS_ClearDiagnosticInformation_14"}, {UDS_ClearDiagnosticInformation_14, "UDS_ClearDiagnosticInformation_14", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{UDS_ReadDTCInformation_19, "UDS_ReadDTCInformation_19"}, {UDS_ReadDTCInformation_19, "UDS_ReadDTCInformation_19", true},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{ReadDataByIdentifier_22, "ReadDataByIdentifier_22"}, {ReadDataByIdentifier_22, "ReadDataByIdentifier_22", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{SecurityAccess_27, "SecurityAccess_27"}, {SecurityAccess_27, "SecurityAccess_27", true},
{CommunicationControl_28, "CommunicationControl_28"}, {CommunicationControl_28, "CommunicationControl_28", true},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{WriteDataByIdentifier_2E, "WriteDataByIdentifier_2E"}, {WriteDataByIdentifier_2E, "WriteDataByIdentifier_2E", false},
{InputOutputControlByIdentifier_2F, "InputOutputControlByIdentifier_2F"}, {InputOutputControlByIdentifier_2F, "InputOutputControlByIdentifier_2F", false},
{NULL, ""}, {NULL, "", false},
{Routine_Control_31, "Routine_Control_31"}, {Routine_Control_31, "Routine_Control_31", true},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{RequestDownload_34, "RequestDownload_34"}, {RequestDownload_34, "RequestDownload_34", false},
{NULL, ""}, {NULL, "", false},
{TransferData_36, "TransferData_36"}, {TransferData_36, "TransferData_36", false},
{RequestTransferExit_37, "RequestTransferExit_37"}, {RequestTransferExit_37, "RequestTransferExit_37", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{TesterPresent_3E, "TesterPresent_3E"}, {TesterPresent_3E, "TesterPresent_3E", true},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{ControlDTCSetting_85, "ControlDTCSetting_85"}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {ControlDTCSetting_85, "ControlDTCSetting_85", true},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false},
{NULL, ""}, {NULL, "", false}
{NULL, ""},
{NULL, ""},
{NULL, ""},
{NULL, ""},
{NULL, ""},
{NULL, ""},
{NULL, ""},
{NULL, ""},
{NULL, ""}
}; };
void ReceivedTP_func(void *arg, tCanTP_data *data) { void ReceivedTP_func(void *arg, tCanTP_data *data) {
tCanUds *env = arg; tCanUds *env = arg;
env->data = data; env->data = data;
uint8_t com = env->data->data[0]; uint8_t com = env->data->data[0];
uint8_t SPRMIB = 0;
if (uds_com[com].hasSPRMIB) { // Подавление ответа
SPRMIB = env->data->data[1] & 0x80;
env->data->data[1] &= 0x7F;
}
if (uds_com[com].func != NULL) { if (uds_com[com].func != NULL) {
#if (LOG_UDS == 1) #if (LOG_UDS == 1)
@ -1800,12 +1799,21 @@ void ReceivedTP_func(void *arg, tCanTP_data *data) {
uint8_t response_size = uds_com[com].func(env); uint8_t response_size = uds_com[com].func(env);
if (response_size) { if (response_size) {
if (SPRMIB == 0) {
#if (LOG_UDS == 1) #if (LOG_UDS == 1)
sendLogCanUdsHex(env, env->dataResponse, response_size); sendLogCanUdsHex(env, env->dataResponse, response_size);
LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s [%d] %s", uds_com[com].desc, response_size, env->hexString) LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s [%d] %s", uds_com[com].desc, response_size, env->hexString)
#endif #endif
CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->dataResponse,
response_size, PROTOCOL_CAN_ADR_UDS, WAIT_FRAME_WRITE); CanSerialPortFrameTpTransmit(&env->canSerialPortFrameTp, env->dataResponse,
response_size, PROTOCOL_CAN_ADR_UDS, WAIT_FRAME_WRITE);
} else {
#if (LOG_UDS == 1)
sendLogCanUdsHex(env, env->dataResponse, response_size);
LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s Response suppression", uds_com[com].desc)
#endif
}
} }
} else { } else {

View File

@ -20,6 +20,18 @@
#define timeout_session_S3_Server 5000 #define timeout_session_S3_Server 5000
#define ADR_HEX_BlockMain 0x01020000
#define ADR_HEX_BlockCalib 0x010D0000
#define ADR_HEX_BlockMeta 0x010FF800
#define ADR_HEX_Mapped_BlockMain 0x01100000
#define ADR_HEX_Mapped_BlockCalib 0x011B0000
#define ADR_HEX_Mapped_BlockMeta 0x011DF800
#define SIZE_HEX_BlockMain (704 * 1024)
#define SIZE_HEX_BlockCalib (190 * 1024)
#define SIZE_HEX_BlockMeta (2 * 1024)
#define LEN_DEBUG_UDS_BUFF 128 #define LEN_DEBUG_UDS_BUFF 128
@ -123,11 +135,13 @@ typedef enum {
UDS_routine_eComp_Initialize = 0xCF01 UDS_routine_eComp_Initialize = 0xCF01
} eUdsRoutineModes; } eUdsRoutineModes;
typedef enum { typedef enum {
UDS_routine_RoutineStartStopSuccess = 0, UDS_routine_RoutineStartStopSuccess = 0x00,
UDS_routine_RoutineStartStopFailure = 0xff UDS_routine_RoutineStartStopFailure = 0x01
} eUdsRoutineStartStopRoutineResult; } eUdsRoutineStartStopRoutineResult;
typedef enum { typedef enum {
UDS_routine_RoutineStop = 0, UDS_routine_RoutineStop = 0,
UDS_routine_RoutineRun = 1, UDS_routine_RoutineRun = 1,
@ -212,9 +226,11 @@ typedef uint16_t (*uds_func_ptr)(tCanUds *env);
typedef struct { typedef struct {
uds_func_ptr func; uds_func_ptr func;
char *desc; char *desc;
bool hasSPRMIB;
} eUds_com; } eUds_com;
void CanUds_Init( void CanUds_Init(
tCanUds *env, tCanUds *env,
tDiagnostic *Diagnostic, tDiagnostic *Diagnostic,