From 44cfb4662f0bb5aa4437e52481d56f93ffd1f141 Mon Sep 17 00:00:00 2001 From: darya Date: Tue, 23 Jun 2026 14:08:31 +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=2023.06.2026?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanUds.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++------ CanUds.h | 7 ++++-- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/CanUds.c b/CanUds.c index ae7e922..22c277d 100644 --- a/CanUds.c +++ b/CanUds.c @@ -234,8 +234,6 @@ void SendUpdatePendingFlashClear(void *env) { } static void setDefaultSecurityAccess(tCanUds *env) { -// env->udsFirmwareStepsMain = UDS_Firmware_Step_None; -// env->udsFirmwareStepsCalib = UDS_Firmware_Step_None; env->SA.requestSequenceRequestSeed = false; env->SA.stateSecurityAccess = false; env->SA.counter_max_attempts_default = 0; @@ -887,8 +885,11 @@ static uint16_t CommunicationControl_28(tCanUds *env) { if (com->sub_function == UDS_sub_enableRxAndTx) { set_CCU_Mute(env->canSpamTransmitter, false); + set_DBG_CCU_Mute(env->canSpamDebugTransmitter, false); + } else { set_CCU_Mute(env->canSpamTransmitter, true); + set_DBG_CCU_Mute(env->canSpamDebugTransmitter, true); } env->dataResponse[0] = UDS_Communication_Control | 0b1000000; @@ -1063,7 +1064,7 @@ static uint16_t vUDS_routine_Erase_Memory(tCanUds *env, eUdsRoutineControlType u if ((result1) && (result2)) { env->dataResponse[4] = UDS_routine_RoutineStartStopSuccess; -// env->udsFirmwareStepsMain = UDS_Firmware_Step_EraseMemory; + env->udsFirmwareStepsMain = UDS_Firmware_Step_EraseMemory; return 4 + 1; } @@ -1078,7 +1079,7 @@ static uint16_t vUDS_routine_Erase_Memory(tCanUds *env, eUdsRoutineControlType u if (result1) { env->dataResponse[4] = UDS_routine_RoutineStartStopSuccess; -// env->udsFirmwareStepsCalib = UDS_Firmware_Step_EraseMemory; + env->udsFirmwareStepsCalib = UDS_Firmware_Step_EraseMemory; return 4 + 1; } @@ -1134,14 +1135,67 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType // return 4 + 1; // } + if (env->udsFirmwareStepsMain != UDS_Firmware_Step_EraseMemory) { + setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); + uint32_t size = SIZE_HEX_BlockMain / 4; + uint32_t adr_map = ADR_HEX_Mapped_BlockMain; + uint32_t adr_orig = ADR_HEX_BlockMain; + result = P_bInternalFlashPage_CopyRange(adr_map, adr_orig, size, NULL, NULL); + if (result == false) { + env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; + return 4 + 1; + } + + setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); + adr_map = ADR_HEX_Mapped_BlockMain + size; + adr_orig = ADR_HEX_BlockMain + size; + result = P_bInternalFlashPage_CopyRange(adr_map, adr_orig, size, NULL, NULL); + if (result == false) { + env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; + return 4 + 1; + } + + setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); + adr_map = ADR_HEX_Mapped_BlockMain + size; + adr_orig = ADR_HEX_BlockMain + size; + result = P_bInternalFlashPage_CopyRange(adr_map, adr_orig, size, NULL, NULL); + if (result == false) { + env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; + return 4 + 1; + } + + setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); + adr_map = ADR_HEX_Mapped_BlockMain + size; + adr_orig = ADR_HEX_BlockMain + size; + result = P_bInternalFlashPage_CopyRange(adr_map, adr_orig, size, NULL, NULL); + if (result == false) { + env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; + return 4 + 1; + } + + } + + if (env->udsFirmwareStepsCalib != UDS_Firmware_Step_EraseMemory) { + + setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); + result = P_bInternalFlashPage_CopyRange(ADR_HEX_Mapped_BlockCalib, ADR_HEX_BlockCalib, SIZE_HEX_BlockCalib, + NULL, NULL); + + if (result == false) { + env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; + + return 4 + 1; + } + + } setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); uint32_t crc32_calc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockMain, SIZE_HEX_BlockMain - 4, SendUpdatePendingCrc, env, 200); - uint32_t crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockMain + SIZE_HEX_BlockMain - 4)); + uint32_t crc32_file = (*(uint32_t * )(ADR_HEX_Mapped_BlockMain + SIZE_HEX_BlockMain - 4)); if (crc32_calc != crc32_file) { env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; @@ -1153,7 +1207,7 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType crc32_calc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockCalib, SIZE_HEX_BlockCalib - 4, SendUpdatePendingCrc, env, 200); - crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockCalib + SIZE_HEX_BlockCalib - 4)); + crc32_file = (*(uint32_t * )(ADR_HEX_Mapped_BlockCalib + SIZE_HEX_BlockCalib - 4)); if (crc32_calc != crc32_file) { env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; @@ -1179,7 +1233,7 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType return 4 + 1; } - size_t size = D_sInternalFlashPage_Write(0x04000000, 0, (uint8_t *) &NumberBank, 8); + size_t size = D_sInternalFlashPage_Write(0x04000000, 0, (uint8_t * ) & NumberBank, 8); if (size != 8) { env->dataResponse[4] = UDS_routine_RoutineStartStopFailure; @@ -1187,6 +1241,8 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType return 4 + 1; } + env->udsFirmwareStepsMain = UDS_Firmware_Step_None; + env->udsFirmwareStepsCalib = UDS_Firmware_Step_None; // env->udsFirmwareStepsMain = UDS_Firmware_Step_Dependancies; // env->udsFirmwareStepsCalib = UDS_Firmware_Step_Dependancies; @@ -1995,6 +2051,7 @@ void CanUds(tCanUds *env) { #endif setDefaultSecurityAccess(env); set_CCU_Mute(env->canSpamTransmitter, false); + set_DBG_CCU_Mute(env->canSpamDebugTransmitter, false); set_NoBitsDTC(env->Diagnostic, false); env->currentSession = UDS_session_defaultSession; statusData.Status_Active_Diagnostic_Session.Active_Diagnostic_Session = env->currentSession; @@ -2022,6 +2079,7 @@ void CanUds_Init( tSerialPortFrameIO *CanIO, tDeviceStorage *deviceStorage, tCanSpamTransmitter *canSpamTransmitter, + tCanSpamDebugTransmitter *canSpamDebugTransmitter, tAdc0Task *adcTask0, uds_clear_flash_func *clear_flash_func, uds_write_flash_func *write_flash_func, @@ -2034,6 +2092,7 @@ void CanUds_Init( env->adcTask0 = adcTask0; env->filterIdCount = 2; env->canSpamTransmitter = canSpamTransmitter; + env->canSpamDebugTransmitter = canSpamDebugTransmitter; env->clear_flash_func = clear_flash_func; env->write_flash_func = write_flash_func; diff --git a/CanUds.h b/CanUds.h index f87e54b..c72425c 100644 --- a/CanUds.h +++ b/CanUds.h @@ -9,6 +9,7 @@ #include "DeviceStorage.h" #include "DiagnosticTask.h" #include "CanSpamTransmitter.h" +#include "CanSpamDebugTransmitter.h" #include "AdcTasks.h" #define LOG_UDS 0 @@ -203,6 +204,7 @@ typedef struct { uint32_t currentSessionTesterPresentTimeout; tCanSpamTransmitter *canSpamTransmitter; + tCanSpamDebugTransmitter *canSpamDebugTransmitter; uint32_t randomSecuritySeed; @@ -222,8 +224,8 @@ typedef struct { uint32_t DownloadFirmwareSize; eUdsBlock udsBlock; -// eUdsFirmwareSteps udsFirmwareStepsMain; -// eUdsFirmwareSteps udsFirmwareStepsCalib; + eUdsFirmwareSteps udsFirmwareStepsMain; + eUdsFirmwareSteps udsFirmwareStepsCalib; uint32_t CurrentBlockAdr; uint32_t CurrentBlockSize; @@ -252,6 +254,7 @@ void CanUds_Init( tSerialPortFrameIO *CanIO, tDeviceStorage *deviceStorage, tCanSpamTransmitter *canSpamTransmitter, + tCanSpamDebugTransmitter *canSpamDebugTransmitter, tAdc0Task *adcTask0, uds_clear_flash_func *clear_flash_func, uds_write_flash_func *write_flash_func,