From fdef801256661f2ca1dc97a5a350db2d479ff6d3 Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 27 May 2026 14:13:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BB=D0=B0=D1=82=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20V2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanUds.c | 566 ++++++++++++++++++++++++++++--------------------------- CanUds.h | 20 +- 2 files changed, 305 insertions(+), 281 deletions(-) diff --git a/CanUds.c b/CanUds.c index a7442b4..18dc4ce 100644 --- a/CanUds.c +++ b/CanUds.c @@ -948,9 +948,10 @@ static uint16_t vUDS_check_Programming_Preconditions(tCanUds *env, eUdsRoutineCo 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) { @@ -1008,11 +1009,12 @@ static uint16_t vUDS_routine_Erase_Memory(tCanUds *env, eUdsRoutineControlType u env->udsBlock = UDS_BlockInit; - if (eraseMemory->memoryAddress == 0x01100000) { + + if (eraseMemory->memoryAddress == ADR_HEX_BlockMain) { env->udsBlock = UDS_BlockMain; - } else if (eraseMemory->memoryAddress == 0x011B0000) { + } else if (eraseMemory->memoryAddress == ADR_HEX_BlockCalib) { env->udsBlock = UDS_BlockCalib; - } else if (eraseMemory->memoryAddress == 0x011DEC00) { + } else if (eraseMemory->memoryAddress == ADR_HEX_BlockMeta) { env->udsBlock = UDS_BlockMeta; } @@ -1024,16 +1026,17 @@ static uint16_t vUDS_routine_Erase_Memory(tCanUds *env, eUdsRoutineControlType u bool result = false; + 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) { - 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) { - 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); @@ -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; } - if (com->memoryAddress == 0x010D0000) { + if (com->memoryAddress == ADR_HEX_BlockCalib) { env->udsBlock = UDS_BlockCalib; } - if (com->memoryAddress == 0x010FF800) { - env->udsBlock = UDS_BlockCalib; + if (com->memoryAddress == ADR_HEX_BlockMeta) { + env->udsBlock = UDS_BlockMeta; } - env->AdrFlash = com->memoryAddress + 0x0100000 - (128 * 1024); + env->AdrFlash = com->memoryAddress + 0x00100000 - (128 * 1024); env->SizeWriteFlash = 0; env->DownloadFirmwareSize = com->memorySize; - 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); } } 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); } @@ -1384,7 +1386,7 @@ static uint16_t RequestDownload_34(tCanUds *env) { 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); } @@ -1525,272 +1527,269 @@ static uint16_t RequestTransferExit_37(tCanUds *env) { // конец --------------------------- RequestTransferExit --------------------------------------------------------- -const eUds_com uds_com[256] = { - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {DiagnosticSessionControl_10, "DiagnosticSessionControl_10"}, - {ECUReset_11, "ECUReset_11"}, - {NULL, ""}, - {NULL, ""}, - {UDS_ClearDiagnosticInformation_14, "UDS_ClearDiagnosticInformation_14"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {UDS_ReadDTCInformation_19, "UDS_ReadDTCInformation_19"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {ReadDataByIdentifier_22, "ReadDataByIdentifier_22"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {SecurityAccess_27, "SecurityAccess_27"}, - {CommunicationControl_28, "CommunicationControl_28"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {WriteDataByIdentifier_2E, "WriteDataByIdentifier_2E"}, - {InputOutputControlByIdentifier_2F, "InputOutputControlByIdentifier_2F"}, - {NULL, ""}, - {Routine_Control_31, "Routine_Control_31"}, - {NULL, ""}, - {NULL, ""}, - {RequestDownload_34, "RequestDownload_34"}, - {NULL, ""}, - {TransferData_36, "TransferData_36"}, - {RequestTransferExit_37, "RequestTransferExit_37"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {TesterPresent_3E, "TesterPresent_3E"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {ControlDTCSetting_85, "ControlDTCSetting_85"}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""} +static const eUds_com uds_com[256] = { + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {DiagnosticSessionControl_10, "DiagnosticSessionControl_10", true}, + {ECUReset_11, "ECUReset_11", true}, + {NULL, "", false}, + {NULL, "", false}, + {UDS_ClearDiagnosticInformation_14, "UDS_ClearDiagnosticInformation_14", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {UDS_ReadDTCInformation_19, "UDS_ReadDTCInformation_19", true}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {ReadDataByIdentifier_22, "ReadDataByIdentifier_22", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {SecurityAccess_27, "SecurityAccess_27", true}, + {CommunicationControl_28, "CommunicationControl_28", true}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {WriteDataByIdentifier_2E, "WriteDataByIdentifier_2E", false}, + {InputOutputControlByIdentifier_2F, "InputOutputControlByIdentifier_2F", false}, + {NULL, "", false}, + {Routine_Control_31, "Routine_Control_31", true}, + {NULL, "", false}, + {NULL, "", false}, + {RequestDownload_34, "RequestDownload_34", false}, + {NULL, "", false}, + {TransferData_36, "TransferData_36", false}, + {RequestTransferExit_37, "RequestTransferExit_37", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {TesterPresent_3E, "TesterPresent_3E", true}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {ControlDTCSetting_85, "ControlDTCSetting_85", true}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false}, + {NULL, "", false} }; - void ReceivedTP_func(void *arg, tCanTP_data *data) { tCanUds *env = arg; env->data = data; 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 (LOG_UDS == 1) @@ -1800,12 +1799,21 @@ void ReceivedTP_func(void *arg, tCanTP_data *data) { uint8_t response_size = uds_com[com].func(env); if (response_size) { + + if (SPRMIB == 0) { #if (LOG_UDS == 1) - sendLogCanUdsHex(env, env->dataResponse, response_size); - LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s [%d] %s", uds_com[com].desc, response_size, env->hexString) + sendLogCanUdsHex(env, env->dataResponse, response_size); + LoggerFormatInfo(LOGGER, LOG_SIGN, "< %s [%d] %s", uds_com[com].desc, response_size, env->hexString) #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 { diff --git a/CanUds.h b/CanUds.h index 7b8cd2a..acf57f9 100644 --- a/CanUds.h +++ b/CanUds.h @@ -20,6 +20,18 @@ #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 @@ -123,11 +135,13 @@ typedef enum { UDS_routine_eComp_Initialize = 0xCF01 } eUdsRoutineModes; + typedef enum { - UDS_routine_RoutineStartStopSuccess = 0, - UDS_routine_RoutineStartStopFailure = 0xff + UDS_routine_RoutineStartStopSuccess = 0x00, + UDS_routine_RoutineStartStopFailure = 0x01 } eUdsRoutineStartStopRoutineResult; + typedef enum { UDS_routine_RoutineStop = 0, UDS_routine_RoutineRun = 1, @@ -212,9 +226,11 @@ typedef uint16_t (*uds_func_ptr)(tCanUds *env); typedef struct { uds_func_ptr func; char *desc; + bool hasSPRMIB; } eUds_com; + void CanUds_Init( tCanUds *env, tDiagnostic *Diagnostic,