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,