FLEX-FORD-OBC-BM/Source/bsw/Fbl/fbl_diag.h

1047 lines
53 KiB
C
Raw Permalink Normal View History

2026-03-19 11:49:16 +01:00
/***********************************************************************************************************************
* 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
**********************************************************************************************************************/