/*********************************************************************************************************************** * FILE DESCRIPTION * ------------------------------------------------------------------------------------------------------------------*/ /** \file * \brief Diagnostic services supported in boot mode * Declaration of functions, variables and constants * * -------------------------------------------------------------------------------------------------------------------- * COPYRIGHT * -------------------------------------------------------------------------------------------------------------------- * \par Copyright * \verbatim * Copyright (c) 2026 by Vector Informatik GmbH. All rights reserved. * * This software is copyright protected and proprietary to Vector Informatik GmbH. * Vector Informatik GmbH grants to you only those rights as set out in the license conditions. * All other rights remain with Vector Informatik GmbH. * \endverbatim */ /**********************************************************************************************************************/ /*********************************************************************************************************************** * REVISION HISTORY * -------------------------------------------------------------------------------------------------------------------- * Version Date Author Change Id Description * -------------------------------------------------------------------------------------------------------------------- * 05.00.00 2022-08-15 vistmo FBL-5514 Support Additional OTA functionality * ESCAN00112435 No changes * ESCAN00112575 No changes * 05.01.00 2022-10-04 jschmitding FBL-5917 Make FBL SWDL 008 Compliant * ESCAN00113919 No changes * 05.01.01 2022-10-17 fmenke ESCAN00112879 No changes * 05.01.02 2023-01-13 fmenke ESCAN00112890 No changes * ESCAN00113612 No changes * 05.02.00 2023-02-09 vistmo ESCAN00112972 No changes * ESCAN00113292 No changes * ESCAN00113835 No changes * ESCAN00113843 No changes * ESCAN00113764 RID 7013 (token download) is always supported * FBL-6438 No changes * 05.02.01 2023-05-11 fmenke ESCAN00113831 No changes * 05.03.00 2023-07-24 fmenke FBL-7335 No changes * 05.03.01 2023-08-31 lhopfhauer ESCAN00115494 Bootloader does not enter programming session when * started from application * 05.03.02 2024-07-16 erizk ESCAN00117344 Compiler error: FblRealTimeSupportVoid undefined, assuming * extern returning int * 05.03.03 2025-02-06 virchl ESCAN00118587 No changes * 05.04.00 2025-02-28 jjohnson FBL-10065 Support App Signing Specification 2.1.3 * 05.04.01 2025-06-10 jostravsky ESCAN00120315 No changes * 05.04.02 2025-07-08 visarcmijo ESCAN00119833 No changes * 05.05.00 2025-09-01 fmenke FBL-11218 Add support for NXP DSP firmware update * ESCAN00120917 No changes * 05.06.00 2025-10-28 mpatil FBL-11690 No changes * 05.07.00 2026-01-13 dganesh FBL-12162 No changes **********************************************************************************************************************/ #ifndef FBL_DIAG_H #define FBL_DIAG_H /*********************************************************************************************************************** * VERSION **********************************************************************************************************************/ /* ##V_CFG_MANAGEMENT ##CQProject : FblDiag_14229_Ford CQComponent : Implementation */ #define FBLDIAG_14229_FORD_VERSION 0x0507u #define FBLDIAG_14229_FORD_RELEASE_VERSION 0x00u /*********************************************************************************************************************** * INCLUDES **********************************************************************************************************************/ /*********************************************************************************************************************** * DEFINES **********************************************************************************************************************/ #ifndef kDiagCallCycle # define kDiagCallCycle TpCallCycle /* Same call cycle as TP */ #endif #define kDiagPutResponse ((vuint8) 0x01u) /* -- Defines of diag services -- */ #define kDiagSidDiagnosticSessionControl ((vuint8) 0x10u) #define kDiagSidEcuReset ((vuint8) 0x11u) #define kDiagSidReadDataByIdentifier ((vuint8) 0x22u) #define kDiagSidSecurityAccess ((vuint8) 0x27u) #define kDiagSidWriteDataByIdentifier ((vuint8) 0x2Eu) #define kDiagSidRoutineControl ((vuint8) 0x31u) #define kDiagSidRequestDownload ((vuint8) 0x34u) #define kDiagSidRequestUpload ((vuint8) 0x35u) #define kDiagSidTransferData ((vuint8) 0x36u) #define kDiagSidRequestTransferExit ((vuint8) 0x37u) #define kDiagSidTesterPresent ((vuint8) 0x3Eu) /* -- Defines for address and length format identifier -- */ /* Not more than 4 byte addresses and lengths can be handled */ #if defined( FBL_DIAG_ENABLE_FIXED_TRANSFER_ALFI ) #define kDiagSubMinLengthFormat ((vuint8) 0x04u) #else #define kDiagSubMinLengthFormat ((vuint8) 0x01u) #endif #define kDiagSubMaxLengthFormat ((vuint8) 0x04u) /* Includes memory identifier */ #if defined( FBL_DIAG_ENABLE_FIXED_TRANSFER_ALFI ) #define kDiagSubMinAddrFormat ((vuint8) 0x04u) #else #define kDiagSubMinAddrFormat ((vuint8) 0x02u) #endif #define kDiagSubMaxAddrFormat ((vuint8) 0x04u) #define kDiagSubMemType ((vuint8) 0x00u) #define kDiagSubFlashDrvMemType ((vuint8) 0x02u) #define kDiagSubNoEncryption ((vuint8) 0x00u) #define kDiagSubNoCompression ((vuint8) 0x00u) #define kDiagSubNoDataProcessing ((vuint8) ((kDiagSubNoCompression << 4u) | kDiagSubNoEncryption)) #define kDiagSubDefaultCompression ((vuint8) 0x01u) /* -- Defines of diag subservices -- */ #define kDiagSuppressPosRspMsgIndicationBit ((vuint8) 0x80u) /* DiagnosticSessionControl */ #define kDiagSubDefaultSession ((vuint8) 0x01u) #define kDiagSubProgrammingSession ((vuint8) 0x02u) /* ECUReset */ #define kDiagSubHardReset ((vuint8) 0x01u) /* TesterPresent */ #define kDiagSubZeroSubFunction ((vuint8) 0x00u) /* RoutineControl request, routineControlType */ #define kDiagSubStartRoutine ((vuint8) 0x01u) #define kDiagSubStopRoutine ((vuint8) 0x02u) #define kDiagSubRequestRoutineResults ((vuint8) 0x03u) /* RoutineControl response, RoutineType (Ford specific) */ #define kDiagSubRoutineType1_Sync ((vuint8) 0x01u) #define kDiagSubRoutineType2_AsyncFiniteNoStop ((vuint8) 0x02u) #define kDiagSubRoutineType3_AsyncFiniteOrStop ((vuint8) 0x03u) /* RoutineControl response, RoutineStatus (Ford specific) */ #define kDiagSubRoutineStatusCompleted ((vuint8) 0x00u) #define kDiagSubRoutineStatusAborted ((vuint8) 0x01u) #define kDiagSubRoutineStatusActive ((vuint8) 0x02u) #define kDiagSubRoutineApplInvalid ((vuint8) 0x01u) #define kDiagSubRoutineApplValid ((vuint8) 0x02u) /* RoutineControl, RoutineIdentifier */ #define kDiagRoutineIdEraseMemory ((vuint16) 0xFF00u) #define kDiagRoutineIdCheckProgDep ((vuint16) 0xFF01u) #define kDiagRoutineIdActivateSbl ((vuint16) 0x0301u) #define kDiagRoutineIdCheckValidApp ((vuint16) 0x0304u) #if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC ) # if defined( FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING ) # define kDiagRoutineIdTokenDownload ((vuint16) 0x7013u) # endif #endif #define kDiagRoutineIdUpdateSecBytes ((vuint16) 0x0305u) /* -- Response Identifier -- */ /* Negative response SID */ #define kDiagRidNegativeResponse ((vuint8) 0x7Fu) /* Data identifier for ReadDataByIdentifier service */ #if !defined( kDiagDataIdActiveDiagnosticSession ) # define kDiagDataIdActiveDiagnosticSession ((vuint16) 0xD100u) #endif #define kDiagDataIdSwdlVersion ((vuint16) 0xF162u) #if defined( FBL_DIAG_ENABLE_DID_CURRENT_DIAG_APP ) # if !defined( kDiagDataIdBootloaderCurrentDiagnosticApp ) # define kDiagDataIdBootloaderCurrentDiagnosticApp ((vuint16) 0xD021u) # endif #endif #if !defined( kDiagSwdlVersion ) # define kDiagSwdlVersion ((vuint8) 0x08u) #endif /* -- Negative Response Codes -- */ #define kDiagErrorNone ((vuint8) 0x00u) #define kDiagNrcGeneralReject ((vuint8) 0x10u) #define kDiagNrcServiceNotSupported ((vuint8) 0x11u) #define kDiagNrcSubFunctionNotSupported ((vuint8) 0x12u) #define kDiagNrcIncorrectMessageLengthOrInvalidFormat ((vuint8) 0x13u) #define kDiagNrcResponseTooLong ((vuint8) 0x14u) #define kDiagNrcBusyRepeatRequest ((vuint8) 0x21u) #define kDiagNrcConditionsNotCorrect ((vuint8) 0x22u) #define kDiagNrcRequestSequenceError ((vuint8) 0x24u) #define kDiagNrcRequestOutOfRange ((vuint8) 0x31u) #define kDiagNrcSecurityAccessDenied ((vuint8) 0x33u) #define kDiagNrcInvalidKey ((vuint8) 0x35u) #define kDiagNrcExceedNumberOfAttempts ((vuint8) 0x36u) #define kDiagNrcRequiredTimeDelayNotExpired ((vuint8) 0x37u) #define kDiagNrcUploadDownloadNotAccepted ((vuint8) 0x70u) #define kDiagNrcTransferDataSuspended ((vuint8) 0x71u) #define kDiagNrcGeneralProgrammingFailure ((vuint8) 0x72u) #define kDiagNrcWrongBlockSequenceCounter ((vuint8) 0x73u) #define kDiagNrcRcrResponsePending ((vuint8) 0x78u) #define kDiagNrcSubfunctionNotSupportedInActiveSession ((vuint8) 0x7Eu) #define kDiagNrcServiceNotSupportedInActiveSession ((vuint8) 0x7Fu) #define kDiagNrcNoResponse ((vuint8) 0xFFu) /* Length (number of bytes) of the maxNumberOfBlockLength parameter in the RequestDownload/-Upload response */ #define kDiagMaxNumberOfBlockLengthLength ((vuint8) 0x02u) /* Maximum supported DID requests */ #if !defined( FBL_MAX_DID_COUNT ) # define FBL_MAX_DID_COUNT 5u #endif /* -- Macros for diag exceptions -- */ #define DiagSetError(errorNo) (diagErrorCode = (errorNo)) #define DiagClrError() (diagErrorCode = kDiagErrorNone) #define DiagGetError() (diagErrorCode) #define DiagNRCGeneralReject() DiagSetError(kDiagNrcGeneralReject) #define DiagNRCServiceNotSupported() DiagSetError(kDiagNrcServiceNotSupported) #define DiagNRCSubFunctionNotSupported() DiagSetError(kDiagNrcSubFunctionNotSupported) #define DiagNRCIncorrectMessageLengthOrInvalidFormat() DiagSetError(kDiagNrcIncorrectMessageLengthOrInvalidFormat) #define DiagNRCResponseTooLong() DiagSetError(kDiagNrcResponseTooLong) #define DiagNRCBusyRepeatRequest() DiagSetError(kDiagNrcBusyRepeatRequest) #define DiagNRCConditionsNotCorrect() DiagSetError(kDiagNrcConditionsNotCorrect) #define DiagNRCRequestSequenceError() DiagSetError(kDiagNrcRequestSequenceError) #define DiagNRCRequestOutOfRange() DiagSetError(kDiagNrcRequestOutOfRange) #define DiagNRCSecurityAccessDenied() DiagSetError(kDiagNrcSecurityAccessDenied) #define DiagNRCInvalidKey() DiagSetError(kDiagNrcInvalidKey) #define DiagNRCExceedNumberOfAttempts() DiagSetError(kDiagNrcExceedNumberOfAttempts) #define DiagNRCRequiredTimeDelayNotExpired() DiagSetError(kDiagNrcRequiredTimeDelayNotExpired) #define DiagNRCUploadDownloadNotAccepted() DiagSetError(kDiagNrcUploadDownloadNotAccepted) #define DiagNRCTransferDataSuspended() DiagSetError(kDiagNrcTransferDataSuspended) #define DiagNRCGeneralProgrammingFailure() DiagSetError(kDiagNrcGeneralProgrammingFailure) #define DiagNRCWrongBlockSequenceCounter() DiagSetError(kDiagNrcWrongBlockSequenceCounter) #define DiagNRCRcrResponsePending() DiagSetError(kDiagNrcRcrResponsePending) #define DiagNRCSubfunctionNotSupportedInActiveSession() DiagSetError(kDiagNrcSubfunctionNotSupportedInActiveSession) #define DiagNRCServiceNotSupportedInActiveSession() DiagSetError(kDiagNrcServiceNotSupportedInActiveSession) /* Defines for length of service request parameters */ #define kDiagRqlDiagnosticSessionControlParameter ((tCwDataLengthType) 0x00u) #define kDiagRqlSecurityAccessSeedParameter ((tCwDataLengthType) 0x00u) #define kDiagRqlSecurityAccessKeyParameter (kSecKeyLength) #define kDiagRqlRcActivateSblMemoryAddress ((tCwDataLengthType) 0x04u) #define kDiagRqlRcEraseMemoryMemoryId ((tCwDataLengthType) 0x00u) #define kDiagRqlRcEraseMemoryAddress ((tCwDataLengthType) 0x04u) #define kDiagRqlRcEraseMemoryLength ((tCwDataLengthType) 0x04u) #define kDiagRqlRcCheckProgDepMemoryAddress ((tCwDataLengthType) 0x04u) #define kDiagRqlRcCheckProgDepMemorySize ((tCwDataLengthType) 0x04u) #define kDiagRqlRcUpdateSecBytesSecLevel ((tCwDataLengthType) 0x01u) #define kDiagRqlRcUpdateSecBytesSecBytes ((tCwDataLengthType) 0x01u) /* Defines for length of service requests (excluding service ID) */ #define kDiagRqlSubfunctionService ((tCwDataLengthType) 0x01u) #define kDiagRqlDiagnosticSessionControl ((tCwDataLengthType) (0x01u+kDiagRqlDiagnosticSessionControlParameter)) #define kDiagRqlEcuReset ((tCwDataLengthType) 0x01u) #define kDiagRqlSecurityAccessSeed ((tCwDataLengthType) (0x01u+kDiagRqlSecurityAccessSeedParameter)) #define kDiagRqlSecurityAccessKey ((tCwDataLengthType) (0x01u+kDiagRqlSecurityAccessKeyParameter)) #define kDiagRqlMinReadDataByIdentifier ((tCwDataLengthType) 0x02u) #define kDiagRqlMaxReadDataByIdentifier ((tCwDataLengthType) ((FBL_MAX_DID_COUNT) * 2u)) #define kDiagRqlWriteDataByIdentifier ((tCwDataLengthType) 0x03u) /* DID + at least one additional data byte */ #define kDiagRqlRoutineControl ((tCwDataLengthType) 0x03u) #define kDiagRqlRcEraseMemory ((tCwDataLengthType) (kDiagRqlRoutineControl+kDiagRqlRcEraseMemoryMemoryId+kDiagRqlRcEraseMemoryAddress+kDiagRqlRcEraseMemoryLength)) #define kDiagRqlRcCheckProgDep ((tCwDataLengthType) (kDiagRqlRoutineControl+kDiagRqlRcCheckProgDepMemoryAddress+kDiagRqlRcCheckProgDepMemorySize)) #define kDiagRqlRcActivateSbl ((tCwDataLengthType) (kDiagRqlRoutineControl+kDiagRqlRcActivateSblMemoryAddress)) #define kDiagRqlRcCheckValidApp ((tCwDataLengthType) (kDiagRqlRoutineControl)) #if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC ) # if defined( FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING ) # define kDiagRqlRcTokenDownloadMin ((tCwDataLengthType) (kDiagRqlRoutineControl + FBL_DIAG_TOKEN_MIN_SIZE)) # define kDiagRqlRcTokenDownloadMax ((tCwDataLengthType) (kDiagRqlRoutineControl + FBL_DIAG_TOKEN_MAX_SIZE)) # endif #endif #define kDiagRqlRcUpdateSecBytes ((tCwDataLengthType) (kDiagRqlRoutineControl+kDiagRqlRcUpdateSecBytesSecLevel+kSecSecretKeyLength)) #define kDiagRqlRequestDownload ((tCwDataLengthType) 0x02u) #define kDiagRqlRequestUpload ((tCwDataLengthType) 0x02u) #define kDiagRqlTransferDataDownload ((tCwDataLengthType) 0x02u) /* + Download data, at least one data byte mandatory */ #define kDiagRqlTransferDataUpload ((tCwDataLengthType) 0x01u) /* Block sequence counter only, data in response message */ #define kDiagRqlRequestTransferExit ((tCwDataLengthType) 0x00u) #define kDiagRqlTesterPresent ((tCwDataLengthType) 0x01u) /* Defines for length of service response parameters */ #define kDiagRslEcuResetParameter ((tCwDataLengthType) 0x00u) #define kDiagRslDiagnosticSessionControlParameter ((tCwDataLengthType) 0x04u) #define kDiagRslSecurityAccessSeedParameter (kSecSeedLength) #define kDiagRslSecurityAccessKeyParameter ((tCwDataLengthType) 0x00u) #define kDiagRslRcEraseMemoryParameter ((tCwDataLengthType) 0x01u) #define kDiagRslRcCheckProgDepParameter ((tCwDataLengthType) 0x03u) #define kDiagRslRcActivateSblParameter ((tCwDataLengthType) 0x01u) #define kDiagRslRcCheckValidAppParameter ((tCwDataLengthType) 0x02u) #if defined( FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING ) # define kDiagRslRcTokenDownloadParameter ((tCwDataLengthType) 0x01u) #endif #define kDiagRslRcUpdateSecBytesParameter ((tCwDataLengthType) 0x01u) #define kDiagRslTransferDataParameter ((tCwDataLengthType) 0x00u) #define kDiagRslRequestTransferExitParameter ((tCwDataLengthType) (kSecCrcLength)) /* Defines for length of service responses (excluding service ID) */ #define kDiagRslDiagnosticSessionControl ((tCwDataLengthType) (0x01u+kDiagRslDiagnosticSessionControlParameter)) #define kDiagRslEcuReset ((tCwDataLengthType) (0x01u+kDiagRslEcuResetParameter)) #define kDiagRslSecurityAccessSeed ((tCwDataLengthType) (0x01u+kDiagRslSecurityAccessSeedParameter)) #define kDiagRslSecurityAccessKey ((tCwDataLengthType) (0x01u+kDiagRslSecurityAccessKeyParameter)) #define kDiagRslReadDataByIdentifier ((tCwDataLengthType) 0x02u) #define kDiagRslWriteDataByIdentifier ((tCwDataLengthType) 0x02u) #define kDiagRslRcEraseMemory ((tCwDataLengthType) (0x03u+kDiagRslRcEraseMemoryParameter)) #define kDiagRslRcCheckProgDep ((tCwDataLengthType) (0x03u+kDiagRslRcCheckProgDepParameter)) #define kDiagRslRcActivateSbl ((tCwDataLengthType) (0x03u+kDiagRslRcActivateSblParameter)) #define kDiagRslRcCheckValidApp ((tCwDataLengthType) (0x03u+kDiagRslRcCheckValidAppParameter)) #if defined( FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING ) # define kDiagRslRcTokenDownload ((tCwDataLengthType) (0x03u+kDiagRslRcTokenDownloadParameter)) #endif #define kDiagRslRcUpdateSecBytes ((tCwDataLengthType) (0x03u+kDiagRslRcUpdateSecBytesParameter)) #define kDiagRslRequestDownload ((tCwDataLengthType) 0x01u) /* + maxNumberOfBlockLength */ #define kDiagRslRequestUpload ((tCwDataLengthType) 0x01u) /* + maxNumberOfBlockLength */ #define kDiagRslTransferData ((tCwDataLengthType) (0x01u+kDiagRslTransferDataParameter)) #define kDiagRslRequestTransferExit ((tCwDataLengthType) (0x00u+kDiagRslRequestTransferExitParameter)) #define kDiagRslTesterPresent ((tCwDataLengthType) 0x01u) /* Diagnostic service format definitions */ #define kDiagFmtSequenceCnt ((tCwDataLengthType) (kDiagFmtServiceId+0x01u)) /* Position of sequence counter */ #define kDiagFmtDataOffset ((tCwDataLengthType) (kDiagFmtSequenceCnt+0x01u)) /* Offset to download data in TransferData frame */ #define kDiagFmtSeedKeyStart ((tCwDataLengthType) (kDiagFmtSubparam+0x01u)) /* Start index of seed/key value */ #define kDiagFmtAddrOffset ((tCwDataLengthType) 0x03u) #define kDiagFmtFormatOffset ((tCwDataLengthType) 0x02u) #define kDiagFmtServiceId ((tCwDataLengthType) 0x00u) #define kDiagFmtSubparam ((tCwDataLengthType) (kDiagFmtServiceId+0x01u)) #define kDiagFmtRoutineIdHigh ((tCwDataLengthType) (kDiagFmtServiceId+0x01u)) #define kDiagFmtRoutineIdLow ((tCwDataLengthType) (kDiagFmtRoutineIdHigh+0x01u)) #define kDiagFmtRoutineIdPar ((tCwDataLengthType) (kDiagFmtRoutineIdLow+0x01u)) #define kDiagFmtRoutineIdDataRecord ((tCwDataLengthType) (kDiagFmtRoutineIdPar+0x01u)) #define kDiagFmtSubRoutineIdHigh ((tCwDataLengthType) (kDiagFmtSubparam+0x01u)) #define kDiagFmtSubRoutineIdLow ((tCwDataLengthType) (kDiagFmtSubRoutineIdHigh+0x01u)) #define kDiagFmtSubRoutineIdPar ((tCwDataLengthType) (kDiagFmtSubRoutineIdLow+0x01u)) #define kDiagFmtSubRoutineIdDataRecord ((tCwDataLengthType) (kDiagFmtSubRoutineIdPar+0x01u)) #define kDiagFmtSubRoutineEraseMemoryAddress ((tCwDataLengthType) (kDiagFmtSubRoutineIdPar)) #define kDiagFmtSubRoutineEraseMemorySize ((tCwDataLengthType) (kDiagFmtSubRoutineEraseMemoryAddress+kDiagRqlRcEraseMemoryAddress)) #define kDiagFmtSubRoutineCheckMemoryAddress ((tCwDataLengthType) (kDiagFmtSubRoutineIdPar)) #define kDiagFmtSubRoutineCheckMemorySize ((tCwDataLengthType) (kDiagFmtSubRoutineCheckMemoryAddress+kDiagRqlRcCheckProgDepMemoryAddress)) #define kDiagFmtSubRoutineInfo ((tCwDataLengthType) (kDiagFmtSubRoutineIdPar)) #define kDiagFmtSubRoutineCheckValidAppStatus ((tCwDataLengthType) (kDiagFmtSubRoutineInfo+0x01u)) #define kDiagFmtSubRoutineCrcHigh ((tCwDataLengthType) (kDiagFmtSubRoutineInfo+0x01u)) #define kDiagFmtSubRoutineCrcLow ((tCwDataLengthType) (kDiagFmtSubRoutineCrcHigh+0x01u)) #define kDiagFmtSubRoutineUpdateSecBytesLevel ((tCwDataLengthType) (kDiagFmtSubRoutineIdPar)) #define kDiagFmtSubRoutineUpdateSecBytesValue ((tCwDataLengthType) (kDiagFmtSubRoutineUpdateSecBytesLevel+kDiagRqlRcUpdateSecBytesSecLevel)) #define kDiagFmtNegResponse ((tCwDataLengthType) (kDiagFmtSubparam+0x01u)) /* Position of negative response code */ #define kDiagFmtLengthMask ((vuint8) 0xF0u) #define kDiagFmtAddrMask ((vuint8) 0x0Fu) #define kDiagFmtEncryptionMask ((vuint8) 0x0Fu) #define kDiagFmtCompressionMask ((vuint8) 0xF0u) #define kDiagFmtMaxBlockLengthHigh ((vuint8) (kDiagFmtSubparam+0x01u)) #define kDiagFmtMaxBlockLengthLow ((vuint8) (kDiagFmtMaxBlockLengthHigh+0x01u)) #define kDiagFmtDataIdHigh ((vuint8) (kDiagFmtSubparam)) #define kDiagFmtDataIdLow ((vuint8) (kDiagFmtDataIdHigh+0x01u)) #define kDiagFmtDataIdDataRecord ((vuint8) (kDiagFmtDataIdLow+0x01u)) #define kDiagFmtDataIdActiveDiagnosticSessionSize ((vuint8) 0x01u) #define kDiagFmtDataIdSwdlVersionSize ((vuint8) 0x01u) #if defined( FBL_DIAG_ENABLE_DID_CURRENT_DIAG_APP ) # define kDiagFmtDataIdBootloaderCurrentDiagAppSize ((vuint8) 0x01u) #endif #define kDiagFmtDataIdSize ((vuint8) 0x02u) #define kDiagFmtTransferDataUploadRetryBackupSize ((vuint8) 0x05u) /* Diagnostic session timing */ #define kDiagSessionTimingP2 ((vuint16) (kFblDiagTimeP2 * FBL_REPEAT_CALL_CYCLE)) #define kDiagSessionTimingP2Star ((vuint16) ((vuint32)(kFblDiagTimeP2Star * FBL_REPEAT_CALL_CYCLE) / 10u)) /* Macros for P2 timeout */ #define GetP2Timeout() (P2Timeout) #define SetP2Timeout(val) (P2Timeout = (((val) > 0x01u) ? ((val) / 0x02u) : 0x01u)) #define ClrP2Timeout() (P2Timeout = 0x00u) /* State machine states */ #if defined( FBL_DIAG_ENABLE_ENUMS_IDX ) enum { kDiagStateIdxSessionDefault ,kDiagStateIdxSessionProgramming ,kDiagStateIdxSecurityKey01 ,kDiagStateIdxSecurityAccess01 ,kDiagStateIdxFunctionalRequest ,kDiagStateIdxTransferDataAllowed ,kDiagStateIdxTransferDataSucceeded #if defined( FBL_DIAG_ENABLE_UPLOAD ) ,kDiagStateIdxTransferDataUpload #endif ,kDiagStateIdxFirstDownloadReq ,kDiagStateIdxSuppressPosRspMsg /* States below are not relevant for service dispatching */ ,kDiagStateIdxServiceInProgress ,kDiagStateIdxTpConfirmationFlag ,kDiagStateIdxDiagIndication ,kDiagStateIdxResponseProcessing ,kDiagStateIdxRcrRpInProgress ,kDiagStateIdxMemDriverInitialized ,kDiagStateIdxEraseMemorySucceeded ,kDiagStateIdxWaitForRcrRpConf ,kDiagStateIdxWaitEcuReset ,kDiagStateIdxResetMsgConfirmed ,kDiagStateIdxEcuResetFctFinished ,kDiagStateIdxDiagBufferLocked #if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC ) ,kDiagStateIdxDiagDevelopmentKey #endif ,kDiagStateIdxProcessingDone ,kDiagStateIdxLockedByInit /*----------------------*/ , kDiagNumberOfStates }; #else # define kDiagStateIdxSessionDefault (0u) # define kDiagStateIdxSessionProgramming (kDiagStateIdxSessionDefault + 1u) # define kDiagStateIdxSecurityKey01 (kDiagStateIdxSessionProgramming + 1u) # define kDiagStateIdxSecurityAccess01 (kDiagStateIdxSecurityKey01 + 1u) # define kDiagStateIdxFunctionalRequest (kDiagStateIdxSecurityAccess01 + 1u) # define kDiagStateIdxTransferDataAllowed (kDiagStateIdxFunctionalRequest + 1u) # define kDiagStateIdxTransferDataSucceeded (kDiagStateIdxTransferDataAllowed + 1u) # if defined( FBL_DIAG_ENABLE_UPLOAD ) # define kDiagStateIdxTransferDataUpload (kDiagStateIdxTransferDataSucceeded + 1u) # define kDiagStateIdxFirstDownloadReq (kDiagStateIdxTransferDataUpload + 1u) # else # define kDiagStateIdxFirstDownloadReq (kDiagStateIdxTransferDataSucceeded + 1u) # endif /* FBL_DIAG_ENABLE_UPLOAD */ # define kDiagStateIdxSuppressPosRspMsg (kDiagStateIdxFirstDownloadReq + 1u) /*----------------------*/ # define kDiagNumberOfDispatchStates (kDiagStateIdxSuppressPosRspMsg + 1u) /*----------------------*/ /* States below are not relevant for service dispatching */ # define kDiagStateIdxServiceInProgress (kDiagStateIdxSuppressPosRspMsg + 1u) # define kDiagStateIdxTpConfirmationFlag (kDiagStateIdxServiceInProgress + 1u) # define kDiagStateIdxDiagIndication (kDiagStateIdxTpConfirmationFlag + 1u) # define kDiagStateIdxResponseProcessing (kDiagStateIdxDiagIndication + 1u) # define kDiagStateIdxRcrRpInProgress (kDiagStateIdxResponseProcessing + 1u) # define kDiagStateIdxMemDriverInitialized (kDiagStateIdxRcrRpInProgress + 1u) # define kDiagStateIdxEraseMemorySucceeded (kDiagStateIdxMemDriverInitialized + 1u) # define kDiagStateIdxWaitForRcrRpConf (kDiagStateIdxEraseMemorySucceeded + 1u) # define kDiagStateIdxWaitEcuReset (kDiagStateIdxWaitForRcrRpConf + 1u) # define kDiagStateIdxResetMsgConfirmed (kDiagStateIdxWaitEcuReset + 1u) # define kDiagStateIdxEcuResetFctFinished (kDiagStateIdxResetMsgConfirmed + 1u) # define kDiagStateIdxDiagBufferLocked (kDiagStateIdxEcuResetFctFinished + 1u) # define kDiagStateIdxDiagDevelopmentKey (kDiagStateIdxDiagBufferLocked + 1u) # define kDiagStateIdxProcessingDone (kDiagStateIdxDiagDevelopmentKey + 1u) # define kDiagStateIdxLockedByInit (kDiagStateIdxProcessingDone + 1u) # define kDiagStateDisableFlashDriverDeinit (kDiagStateIdxLockedByInit + 1u) # define kDiagStateEcuResetReasonSwupUpdate (kDiagStateDisableFlashDriverDeinit + 1u) /*----------------------*/ # define kDiagNumberOfStates (kDiagStateEcuResetReasonSwupUpdate + 1u) /*----------------------*/ #endif /* State array settings */ #define STATE_BITS FBL_STATE_BITS #if ( STATE_BITS == 32u ) typedef vuint32 tStateBitmap; #define kDiagStateMaskNone (tStateBitmap)(0x00000000uL) #define kDiagStateMaskAll (tStateBitmap)(0xFFFFFFFFuL) #endif #if ( STATE_BITS == 16u ) typedef vuint16 tStateBitmap; #define kDiagStateMaskNone (tStateBitmap)(0x0000uL) #define kDiagStateMaskAll (tStateBitmap)(0xFFFFuL) #endif #if ( STATE_BITS == 8u ) typedef vuint8 tStateBitmap; #define kDiagStateMaskNone (tStateBitmap)(0x00uL) #define kDiagStateMaskAll (tStateBitmap)(0xFFuL) #endif #if defined( FBL_DIAG_ENABLE_ENUMS_IDX ) /* Size of service state array This has to be set manually, because the state enum constants can not be evaluated at preprocess time */ # if ( STATE_BITS == 32u ) # define STATECHECK_ARRAYSIZE (0x01u) # endif # if ( STATE_BITS == 16u ) # define STATECHECK_ARRAYSIZE (0x01u) # endif # if ( STATE_BITS == 8u ) # define STATECHECK_ARRAYSIZE (0x02u) # endif #else # define STATECHECK_ARRAYSIZE (((kDiagNumberOfDispatchStates - 1u) / STATE_BITS) + 1u) #endif #if !defined( STATECHECK_ARRAYSIZE ) # error "Invalid STATE_BITS value" #endif /* State mask build macros */ #define STATE_MASK(bit) ((tStateBitmap)(1uL << ((bit) % STATE_BITS))) #define STATE_MULTIMASK(min, max) ((((kDiagStateMaskAll) >> ((min) % STATE_BITS)) << ((min) % STATE_BITS)) ^ (((kDiagStateMaskAll) >> (((max) + 1u) % STATE_BITS)) << (((max) + 1u) % STATE_BITS))) #define STATE_MASKLONG(bit) (1uL << (bit)) #define STATE_MULTIMASKLONG(min, max) ((((~0uL) >> (min)) << (min)) ^ (((max) < (STATE_BITS - 1u)) ? (((~0uL) >> ((max) + 1u)) << ((max) + 1u)) : 0uL)) #define STATE_INDEX(bit) ((bit) / STATE_BITS) #define STATE_SET(arr, bit) ((arr)[STATE_INDEX(bit)] |= STATE_MASK(bit)) #define STATE_CLR(arr, bit) ((arr)[STATE_INDEX(bit)] &= FblInvertBits(STATE_MASK(bit), tStateBitmap)) #define STATE_MULTICLR(arr, min, max) ((arr)[STATE_INDEX(min)] &= FblInvertBits(STATE_MULTIMASK((min), (max)), tStateBitmap)) #define STATE_TEST(arr, bit) (((arr)[STATE_INDEX(bit)] & STATE_MASK(bit)) == STATE_MASK(bit)) /* State access macros */ #define GetDiagState(state) STATE_TEST(fblStates, (state)) #define GetDiagDefaultDiagSession() GetDiagState(kDiagStateIdxSessionDefault) #define GetDiagProgrammingSession() GetDiagState(kDiagStateIdxSessionProgramming) #define GetResponseProcessing() GetDiagState(kDiagStateIdxResponseProcessing) #define GetRcrRpInProgress() GetDiagState(kDiagStateIdxRcrRpInProgress) #define GetMemDriverInitialized() GetDiagState(kDiagStateIdxMemDriverInitialized) #define GetServiceInProgress() GetDiagState(kDiagStateIdxServiceInProgress) #define GetWaitEcuReset() GetDiagState(kDiagStateIdxWaitEcuReset) #define GetDiagBufferLocked() GetDiagState(kDiagStateIdxDiagBufferLocked) /* Flash driver restore handling */ #if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC ) # define GetDiagDevelopmentKey() GetDiagState(kDiagStateIdxDiagDevelopmentKey) #endif #define GetCurrentSecLvl() diagCurrentSecLvl #if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC ) # if defined( FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING ) /* Macros and defines for token handling */ # define FBL_DIAG_TOKEN_MIN_SIZE 80u /* Used for mode 0 token without signature */ # define FBL_DIAG_TOKEN_MAX_SIZE 1891u /* Used for mode 5 token */ /* Compatibility define */ # define FBL_DIAG_TOKEN_SIZE FBL_DIAG_TOKEN_MAX_SIZE /* Defines for enabling Ford key handling */ # if defined (FBL_DIAG_SINGLE_KEY) # define FBL_DIAG_ENABLE_PRODKEY_UPDATE # define FBL_DIAG_ENABLE_DEVKEY_UPDATE # define FBL_DIAG_ENABLE_DEVKEY # endif # endif /* FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING */ #endif /* SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC */ /* Compatibility defines */ #define FblDiagGetDefaultSession() GetDiagDefaultSession() #define FblDiagGetProgrammingSession() GetDiagProgrammingSession() #define FblDiagGetExtendedSession() GetDiagExtendedSession() #define FblDiagGetBufferLocked() GetDiagBufferLocked() #define FblDiagGetRcrRpInProgress() GetRcrRpInProgress() #define FblDiagGetMemDriverInitialized() GetMemDriverInitialized() #if defined( FBL_ENABLE_SEC_ADDITIONAL_LEVELS ) # define GetRequestedSeedLength() kDiagSecAccessParams[diagRequestedSecLvlIdx].seedLength # define GetRequestedKeyLength() kDiagSecAccessParams[diagRequestedSecLvlIdx].keyLength #else # define GetRequestedSeedLength() kSecSeedLength # define GetRequestedKeyLength() kSecKeyLength #endif #if defined( FBL_ENABLE_DEBUG_STATUS ) /* Error codes for error status reporting */ # define FBL_ERR_NONE ((vuint8) 0x00u) # define FBL_ERR_FLASH_ERASE_ERROR ((vuint8) 0x10u) # define FBL_ERR_FLASH_PROG_ERROR ((vuint8) 0x11u) # define FBL_ERR_FLASH_PROG_CONDITIONS ((vuint8) 0x12u) # define FBL_ERR_APPL_OVERLAPPING ((vuint8) 0x20u) # define FBL_ERR_APPL_NOT_ALIGNED ((vuint8) 0x21u) # define FBL_ERR_TOO_MANY_SEGMENTS_IN_MODULE ((vuint8) 0x22u) # define FBL_ERR_NO_MEMORY_REGION_FOUND ((vuint8) 0x23u) # define FBL_ERR_SEED_GENERATION_FAILED ((vuint8) 0x24u) # define FBL_ERR_GAP_FILL ((vuint8) 0x25u) # define FBL_ERR_VERIFICATION ((vuint8) 0x26u) # define FBL_ERR_FLASHCODE_INIT_FAILED ((vuint8) 0x30u) # define FBL_ERR_FLASHCODE_EXCEEDS_MEMORY ((vuint8) 0x31u) # define FBL_ERR_FLASHCODE_NOT_ACCEPTED ((vuint8) 0x32u) # define FBL_ERR_LBT_MISSING_INVALID_FORMAT ((vuint8) 0x40u) # define FBL_ERR_LBT_ADDR_MISMATCH ((vuint8) 0x41u) # define FBL_ERR_LBT_BLOCK_INDEX_EXCEEDED ((vuint8) 0x42u) # define FBL_ERR_LBT_NOT_REPROGRAMMABLE ((vuint8) 0x43u) # define FBL_ERR_LBT_BLOCK_INDEX_ILLEGAL ((vuint8) 0x44u) # define FBL_ERR_DATA_OVERFLOW ((vuint8) 0x50u) /* Macros for error status reporting */ # define FblErrStatSetSId(id) (errStatLastServiceId = (id)) # define FblErrStatSetState(state) (errStatFblStates = (state)) # define FblErrStatSetFlashDrvError(error) (errStatFlashDrvErrorCode = (error)) # define FblErrStatSetFlashDrvVersion() {\ errStatFlashDrvVersion[0] = flashCode[0];\ errStatFlashDrvVersion[1] = flashCode[1];\ errStatFlashDrvVersion[2] = flashCode[3];\ } # define FblErrStatSetError(error) (errStatErrorCode = (error)) # define FblErrStatSetBlockNr(blockNumber) (errStatDescriptor.blockNr = (blockNumber)) # define FblErrStatSetAddress(address) (errStatDescriptor.blockStartAddress = (address)) #else # define FblErrStatSetSId(id) # define FblErrStatSetState(state) # define FblErrStatSetFlashDrvError(error) # define FblErrStatSetFlashDrvVersion() # define FblErrStatSetError(error) # define FblErrStatSetBlockNr(blockNr) # define FblErrStatSetAddress(address) #endif #define DIAG_CALL_CYCLE kDiagCallCycle #if !defined( TESTER_PRESENT_TIMEOUT ) #define TESTER_PRESENT_TIMEOUT ((vuint32) 5000u) #endif #if !defined( TESTER_PRESENT_TIMEOUT_LONG ) #define TESTER_PRESENT_TIMEOUT_LONG ((vuint32) 30000u) #endif #define TimeoutTesterValue() testerPresentTimeout #define DecTimeoutTesterValue() (testerPresentTimeout--) #define ResetTesterTimeout() (testerPresentTimeout = (vuint16)(TESTER_PRESENT_TIMEOUT/DIAG_CALL_CYCLE)) #define InitTesterTimeoutLong() (testerPresentTimeout = (vuint16)(TESTER_PRESENT_TIMEOUT_LONG/DIAG_CALL_CYCLE)) #define StopTesterTimeout() (testerPresentTimeout = 0) /* Parameter to the function FblDiagEcuReset() */ #define kDiagResetNoResponse ((vuint8) 0x00u) #define kDiagResetPutResponse ((vuint8) 0x01u) #define kDiagResetStayInBoot ((vuint8) 0x02u) /* Macros for access of reset options */ #define GetResetOptionPutResponse(var) (((var) & kDiagResetPutResponse) == kDiagResetPutResponse) #define GetResetOptionStayInBoot(var) (((var) & kDiagResetStayInBoot) == kDiagResetStayInBoot) /* Parameters for busy response handling function */ #define kNotForceSendResponsePending ((vuint8) 0x00u) #define kForceSendResponsePending ((vuint8) 0x01u) #define DiagProcessingDone(len) DiagResponseProcessor(len) #define DiagSetNoResponse() (diagResponseFlag = 0) /* Error state function, removed if not defined */ #if !defined( FblErrStatSetAddress ) # define FblErrStatSetAddress(address) #endif #if !defined( FblErrStatSetError ) # define FblErrStatSetError(errNo) #endif #if !defined( FblErrStatSetSId ) # define FblErrStatSetSId(SId) #endif /* Security levels */ #define kDiagSecLevelNone ((vuint8) 0x00u) #define kDiagSecLevelFlash ((vuint8) 0x01u) /* Macros for security access */ #define kDiagNrOfSecurityLevels (0x01u) #if !defined( kDiagSubSecTypeMask ) # define kDiagSubSecTypeMask ((vuint8) 0x7Fu) #endif #if !defined( kDiagSubRequestSeed ) # define kDiagSubRequestSeed ((vuint8) 0x01u) #endif #if !defined( kDiagSubSendKey ) # define kDiagSubSendKey ((vuint8) 0x02u) #endif /* Map length defines used by fbl_diag to SecModHis */ #if !defined( kSecSeedLength ) # define kSecSeedLength (SEC_SEED_LENGTH) #endif #if !defined( kSecKeyLength ) # define kSecKeyLength (SEC_KEY_LENGTH) #endif #if !defined( kSecSecretKeyLength ) # define kSecSecretKeyLength (SEC_SECRET_KEY_LENGTH) #endif #if !defined( kSecCrcLength ) # define kSecCrcLength (SEC_SIZE_CHECKSUM_CRC) #endif /* Access macros for user diagnostic call-backs */ #define DiagPutResponseSId(a) (DiagBuffer[0] = (a)) #define DiagGetRequestSId() (DiagBuffer[0]) /* Read memory function for flash driver validation */ #define FblReadRam FblReadBlock /* Internal segment size as used by the diagnostic layer */ #if !defined( FBL_DIAG_SEGMENT_SIZE ) # define FBL_DIAG_SEGMENT_SIZE (FBL_MAX_SEGMENT_SIZE) #endif /* Special values for indices into logical block table */ #define kBlockNrInvalid 0xFFu /* Access macros for combined memory identifier/address type */ #define FblDiagGetMemId(var) #define FblDiagGetMemAddr(var) ((var)) #define FblDiagSetMemId(var, value) #define FblDiagSetMemAddr(var, value) ((var) = (value)) #define FblDiagAddMemAddr(var, value) ((var) += (value)) #if defined( FBL_ENABLE_DATA_PROCESSING ) /* Extract encryption/compression mode from the data format identifier */ #define FblDiagGetEncryptionMode(dfi) ((vuint8)((dfi) & kDiagFmtEncryptionMask)) #define FblDiagGetCompressionMode(dfi) ((vuint8)(((dfi) & kDiagFmtCompressionMask) >> 4)) #endif /* FBL_ENABLE_DATA_PROCESSING */ #if defined( FBL_ENABLE_SLEEPMODE ) /* Sleep mode handling */ # define kFblSleepDelayTime ((vuint32)(FBL_SLEEP_TIME / FBL_REPEAT_CALL_CYCLE)) # define FblSleepCounterClear() (sleepCounter = 0x00u) # define FblSleepCounterReload() (sleepCounter = kFblSleepDelayTime) # define FblDecSleepCounter() (sleepCounter--) # define FblGetSleepCounter() ((vuint32) sleepCounter) #endif /* PRQA L:TAG_FblDiag_3453_2 */ /* Minimum length of address parameter to Check Programming Dependencies */ #define kDiagCheckProgDepAdressMinLength 0x80u /*********************************************************************************************************************** * TYPEDEFS **********************************************************************************************************************/ /* Security access levels */ typedef struct tagSecurityLevel { vuint8 accessType; vuint8 stateIdxKey; vuint8 stateIdxAccess; } tSecurityLevel; #if defined( FBL_ENABLE_SEC_ADDITIONAL_LEVELS ) typedef struct tagDiagSecAccessParams { vuint8 secLevel; /** Security Level = sub function parameter of seed request */ vuint16 seedLength; /** Size of seed parameter */ vuint16 keyLength; /** Size of key parameter */ } tDiagSecAccessParams; #endif /* FBL_ENABLE_SEC_ADDITIONAL_LEVELS */ /* Combined data type for memory identifier and address */ typedef tFblAddress tFblDiagAddr; /* Logical block state definition */ typedef enum { kBlockState_Init, kBlockState_Erased, kBlockState_Verified } tBlockState; /* Header with runtime information about logical block */ typedef struct { tBlockState state; vuint8 nrOfSegments; vuint8 segmentIdx[SWM_DATA_MAX_NOAR]; } tBlockHeader; /** Structure for address and length information of segments */ typedef struct { tFblAddress targetAddress; tFblLength length; vuint8 checksum[SEC_VERIFY_CLASS_DDD_VERIFY_SIZE]; } tDiagSegmentInfo; /** Segment data structure */ typedef struct { vuint8 nrOfSegments; tDiagSegmentInfo segmentInfo[SWM_DATA_MAX_NOAR]; } tDiagSegmentList; #if ( SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC ) # if defined( FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING ) /* Return values for token handling */ typedef enum { kTokenHdlrOk = 0, kTokenHdlrProtocolFailed = 1, kTokenHdlrSyncPKeyValFailed = 2, kTokenHdlrFesnFailed = 3, kTokenHdlrTimeTokenFailed = 4, # if defined (FBL_DIAG_SINGLE_KEY) kTokenHdlrKeyChangeFailed = 5, # endif kTokenHdlrSignatureFailed = 6, kTokenHdlrTokenApplPassed = 7, kTokenHdlrTokenSignFailed = 8, kTokenHdlrInternalFailed = 9 } tTokenHdlResult; typedef enum { FBL_DIAG_SRVMSGID_NOTSTORED = 0, FBL_DIAG_SRVMSGID_STORED = 1 } tFblDiagSrvMsgIdStoreStatus; # endif /* FBL_ENABLE_TOKEN_DOWNLOAD_HANDLING */ #endif /* SEC_SECURITY_CLASS_VERIFY == SEC_CLASS_CCC */ /*********************************************************************************************************************** * PROTOTYPES **********************************************************************************************************************/ #define FBLDIAG_START_SEC_CODE #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ void FblDiagTimerTask( void ); void FblDiagStateTask( void ); vuint8 FblRealTimeSupport( void ); void FblRealTimeSupportVoid( void ); void FblDiagPostInit( void ); void FblDiagEcuReset(vuint8 resetOptions, vuint8 responseFlag); void FblDiagInitPowerOn( void ); void FblDiagInit( void ); vuint8 FblDiagGetLastErasedBlock( void ); void FblDiagSetLastErasedBlock( vuint8 blockNr ); void DiagResponseProcessor( tCwDataLengthType dataLength ); #define FBLDIAG_STOP_SEC_CODE #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ #define FBLDIAG_RAMCODE_START_SEC_CODE #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ void DiagExRCRResponsePending( vuint8 forceSend ); void FblDiagTxErrorIndication( vuint8 cwMsgType ); void FblDiagRxIndication( V_MEMRAM1 vuint8 V_MEMRAM2 V_MEMRAM3 * pbDiagBuffer, tCwDataLengthType rxDataLength ); void FblDiagTxConfirmation( vuint8 cwMsgType ); vuint8* FblDiagRxGetPhysBuffer( tCwDataLengthType rxDataLength ); vuint8* FblDiagRxGetFuncBuffer( tCwDataLengthType rxDataLength ); void FblDiagRxStartIndication( void ); void FblDiagRxErrorIndication( void ); #define FBLDIAG_RAMCODE_STOP_SEC_CODE #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ #define FBLDIAG_START_SEC_CODE #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ vuint8 FblDiagCheckStartMsg(const V_MEMRAM1 vuint8 V_MEMRAM2 V_MEMRAM3 *pData, vuintx length); vuint8 FblDiagGetSegmentList(vuint8 blockIdx, V_MEMRAM1 tDiagSegmentList V_MEMRAM2 V_MEMRAM3 * blockSegList); /* Response suppression (exported for user service/routine functions) */ void CheckSuppressPosRspMsgIndication( V_MEMRAM1 vuint8 V_MEMRAM2 V_MEMRAM3 *subparam ); tFblResult FblDiagMemPreWrite( void ); tFblResult FblDiagMemPostWrite( void ); #define FBLDIAG_STOP_SEC_CODE #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ /*********************************************************************************************************************** * GLOBAL DATA **********************************************************************************************************************/ #define FBLDIAG_START_SEC_VAR #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ /* -- 14229 based -- */ V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 V_MEMRAM3 * V_MEMRAM1 V_MEMRAM2 DiagBuffer; V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 diagErrorCode; V_MEMRAM0 extern V_MEMRAM1 tCwDataLengthType V_MEMRAM2 DiagDataLength; V_MEMRAM0 extern V_MEMRAM1_NEAR vuint16 V_MEMRAM2_NEAR P2Timeout; V_MEMRAM0 extern V_MEMRAM1_NEAR vuint16 V_MEMRAM2_NEAR testerPresentTimeout; V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 diagResponseFlag; V_MEMRAM0 extern V_MEMRAM1_NEAR vuint8 V_MEMRAM2_NEAR diagServiceCurrent; V_MEMRAM0 extern V_MEMRAM1_NEAR tStateBitmap V_MEMRAM2_NEAR fblStates[STATE_INDEX(kDiagNumberOfStates - 1u) + 1u]; V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 diagCurrentSecLvl; #define FBLDIAG_STOP_SEC_VAR #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ #if defined( FBL_ENABLE_SEC_ADDITIONAL_LEVELS ) #define FBLDIAG_START_SEC_CONST #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ V_MEMROM0 extern V_MEMROM1 tDiagSecAccessParams V_MEMROM2 kDiagSecAccessParams[]; #define FBLDIAG_STOP_SEC_CONST #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ #define FBLDIAG_START_SEC_VAR #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 diagRequestedSecLvlIdx; #define FBLDIAG_STOP_SEC_VAR #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ #endif #define FBLDIAG_START_SEC_VAR #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ #if defined( FBL_ENABLE_DEBUG_STATUS ) /* Variables for error status reporting */ V_MEMRAM0 extern V_MEMRAM1 vuint16 V_MEMRAM2 errStatErrorCode; V_MEMRAM0 extern V_MEMRAM1 vuint16 V_MEMRAM2 errStatFblStates; V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 errStatLastServiceId; V_MEMRAM0 extern V_MEMRAM1 vuint8 V_MEMRAM2 errStatFlashDrvVersion[3]; V_MEMRAM0 extern V_MEMRAM1 vuint16 V_MEMRAM2 errStatFlashDrvErrorCode; V_MEMRAM0 extern V_MEMRAM1 tBlockDescriptor V_MEMRAM2 errStatDescriptor; #endif #if defined( FBL_ENABLE_SLEEPMODE ) V_MEMRAM0 extern V_MEMRAM1 vuint32 V_MEMRAM2 sleepCounter; #endif #define FBLDIAG_STOP_SEC_VAR #include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */ /*********************************************************************************************************************** * CONFIGURATION CHECKS **********************************************************************************************************************/ #if ( kFblOk != 0x00 ) # error "Error in fbl_def.h: use kFblOk as 0x00" #endif #if !( defined( FBL_ENABLE_SYSTEM_CHECK ) || defined( FBL_DISABLE_SYSTEM_CHECK ) ) # error "Error in fbl_cfg.h: Usage of system check not defined" #endif #if !( defined( FBL_ENABLE_APPL_TASK ) || defined( FBL_DISABLE_APPL_TASK ) ) # error "Error in fbl_cfg.h: Usage of application task function not defined" #endif #if !( defined( FBL_ENABLE_USERSUBFUNCTION ) || defined( FBL_DISABLE_USERSUBFUNCTION ) ) # error "Error in fbl_cfg.h: Usage of diag user-subfunction call not defined" #endif #if !( defined( FBL_ENABLE_ENCRYPTION_MODE ) || defined( FBL_DISABLE_ENCRYPTION_MODE ) ) # error "Error in fbl_cfg.h: Usage of decryption interface not defined" #endif #if !( defined( FBL_WATCHDOG_ON ) || defined( FBL_WATCHDOG_OFF ) ) # error "Error in fbl_cfg.h: Usage of watchdog support not defined" #endif #if defined( FBL_WATCHDOG_ON ) && !defined( FBL_WATCHDOG_TIME ) # error "Error in fbl_cfg.h: Watchdog trigger period not defined" #endif #if !( defined( FBL_ENABLE_FBL_START ) || defined( FBL_DISABLE_FBL_START ) ) # error "Error in fbl_cfg.h: Usage of FblStart function not defined" #endif #if !defined( SWM_DATA_MAX_NOAR ) # error "Error in fbl_cfg.h: Number of supported download segments (SWM_DATA_MAX_NOAR) not defined" #endif #if !defined( FBL_HEADER_ADDRESS ) # error "Error in fbl_cfg.h: Start address of bootblock header not defined" #endif #if !defined( FBL_DIAG_BUFFER_LENGTH ) # error "Error in fbl_cfg.h: FBL_DIAG_BUFFER_LENGTH not defined" #endif #if ( FBL_DIAG_BUFFER_LENGTH < (FBL_DIAG_SEGMENT_SIZE+0x01u) ) # error "Error in fbl_cfg.h: DiagBuffer size too small - modify FBL_DIAG_BUFFER_LENGTH" #endif # if ( FBL_DIAG_BUFFER_LENGTH > 4095u ) # error "Error in fbl_cfg.h: DiagBuffer size larger than supported by TP" # endif # if ( FBL_DIAG_BUFFER_LENGTH != kFblTpBufferSize ) # error "Error in fbl_cfg.h: Inconsistent configuration of diag buffer size (see ftp_cfg.h)" # endif #if !defined( FBL_DIAG_TIME_P3MAX ) # error "Error in fbl_cfg.h: P2Star time not defined" #endif #if !defined( FLASH_SIZE ) # error "Error in fbl_cfg.h: Size of flash code buffer not defined" #endif #if !defined( FBL_MAX_SEGMENT_SIZE ) # error "Error in fbl_mio.h: Maximum device segment size not defined" #endif #if defined( FBL_ENABLE_DATA_PROCESSING ) ||\ defined( FBL_ENABLE_UNALIGNED_DATA_TRANSFER ) # if defined( FBL_ENABLE_COMPRESSION_MODE ) && !defined( FBL_ENABLE_PROCESSED_DATA_LENGTH ) /* Ford specific: tester/download tool transmits always the compressed data length */ # error "Error in fbl_cfg.h: Support for compressed data length not activated" # endif #endif #if defined( FBL_ENABLE_COMPRESSION_MODE ) && !defined( FBL_ENABLE_DATA_PROCESSING ) # error "Error in fbl_cfg.h: Compression/Encryption Mode requires the data processing interface" #endif #if defined( FBL_ENABLE_PRESENCE_PATTERN ) && !defined( FBL_ENABLE_USE_LOGICAL_BLOCKS ) # error "Error in fbl_cfg.h: Presence pattern implementation requires the usage of logical blocks" #endif #if !defined( FBL_ENABLE_SEED_KEY_MODULE ) && ( FBL_PROJECT_STATE != FBL_INTEGRATION ) # error "Error in fbl_cfg.h: Usage of seed/key module is mandatory for production ECUs" #endif #if ((FBL_MAX_DID_COUNT < 1) || (FBL_MAX_DID_COUNT > 255)) # error "Error in fbl_cfg.h: Unsupported value for maximum amount of read DIDs" #endif #if (SEC_SECURITY_CLASS != SEC_CLASS_CCC) && (SEC_SECURITY_CLASS != SEC_CLASS_DDD) # error "Error in SecM_cfg.h: Unsupported security class selected" #endif #if !defined( FBL_MTAB_SBL_BLOCK_NUMBER ) # error "Error in fbl_mtab.h: Logical block for SBL not defined or wrong name (required: SBL)" #endif /* Warn if legacy configuration switches are used */ #if defined( FBL_ENABLE_DIAG_SESSION_PARAMETERS ) || \ defined( FBL_ENABLE_FIXED_TRANSFER_ALFI ) || \ defined( FBL_ENABLE_UPLOAD ) || \ defined( FBL_ENABLE_WRITE_DATA_BY_IDENTIFIER ) # error "Error in fbl_cfg.h: Legacy configuration switches detected. Please update GenTool/PreConfig!" #endif #endif /* FBL_DIAG_H */ /*********************************************************************************************************************** * END OF FILE: FBL_DIAG.H **********************************************************************************************************************/