/*==================================================================================================
* Project : RTD AUTOSAR 4.4
* Platform : CORTEXM
* Peripheral : Ftm_Srtc_Lptmr_LPit
* Dependencies : none
*
* Autosar Version : 4.4.0
* Autosar Revision : ASR_REL_4_4_REV_0000
* Autosar Conf.Variant :
* SW Version : 1.0.0
* Build Version : S32K1_RTD_1_0_0_HF01_D2109_ASR_REL_4_4_REV_0000_20210907
*
* (c) Copyright 2020-2021 NXP Semiconductors
* All Rights Reserved.
*
* NXP Confidential. This software is owned or controlled by NXP and may only be
* used strictly in accordance with the applicable license terms. By expressly
* accepting such terms or by downloading, installing, activating and/or otherwise
* using the software, you are agreeing that you have read, and that you agree to
* comply with and are bound by, such license terms. If you do not agree to be
* bound by the applicable license terms, then you may not retain, install,
* activate or otherwise use the software.
==================================================================================================*/

#ifndef GPT_H
#define GPT_H

/**
*   @file       Gpt.h
*
*   @addtogroup gpt Gpt Driver
*   @{
*/

#ifdef __cplusplus
extern "C"{
#endif

/*==================================================================================================
*                                        INCLUDE FILES
* 1) system and project includes
* 2) needed interfaces from external units
* 3) internal and external interfaces from this unit
==================================================================================================*/
#include "StandardTypes.h"
#include "Gpt_Ipw_Types.h"
#include "Gpt_Cfg.h"
#include "Gpt_EnvCfg.h"
#include "Mcal.h"
#if (GPT_WAKEUP_FUNCTIONALITY_API == STD_ON)
    #include "EcuM_Externals.h"
#endif

/*==================================================================================================
*                               SOURCE FILE VERSION INFORMATION
==================================================================================================*/
/**
* @internal
* @brief Defines used for file version checks
*/
#define GPT_VENDOR_ID                       43
#define GPT_MODULE_ID                       100
#define GPT_AR_RELEASE_MAJOR_VERSION        4
#define GPT_AR_RELEASE_MINOR_VERSION        4
#define GPT_AR_RELEASE_REVISION_VERSION     0
#define GPT_SW_MAJOR_VERSION                1
#define GPT_SW_MINOR_VERSION                0
#define GPT_SW_PATCH_VERSION                0

/*==================================================================================================
*                                     FILE VERSION CHECKS
==================================================================================================*/
/* Check if header file and Std_Types.h file are of the same Autosar version */
#ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
    #if ((GPT_AR_RELEASE_MAJOR_VERSION != STD_AR_RELEASE_MAJOR_VERSION) || \
         (GPT_AR_RELEASE_MINOR_VERSION != STD_AR_RELEASE_MINOR_VERSION))
    #error "AutoSar Version Numbers of Gpt.h and Std_Types.h are different"
    #endif
    /* Check if Gpt.h file and Mcal.h header file are of the same Autosar version */
    #if ((GPT_AR_RELEASE_MAJOR_VERSION    != MCAL_AR_RELEASE_MAJOR_VERSION) || \
         (GPT_AR_RELEASE_MINOR_VERSION    != MCAL_AR_RELEASE_MINOR_VERSION))
        #error "AutoSar Version Numbers of Gpt.h and Mcal.h are different"
    #endif
#endif
/* Check if header file and EcuM_Cbk.h file are of the same Autosar version */
#ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
    #if (GPT_WAKEUP_FUNCTIONALITY_API == STD_ON)
        #if ((GPT_AR_RELEASE_MAJOR_VERSION != ECUM_CBK_AR_RELEASE_MAJOR_VERSION) || \
             (GPT_AR_RELEASE_MINOR_VERSION != ECUM_CBK_AR_RELEASE_MINOR_VERSION) \
            )
            #error "AutoSar Version Numbers of Gpt.h and EcuM_Externals.h are different"
        #endif
    #endif
#endif

#if (GPT_VENDOR_ID != GPT_IPW_TYPES_VENDOR_ID)
    #error "Gpt.h and Gpt_Ipw_Types.h have different vendor ids"
#endif
/* Check if this header file and GPT IPW header file are of the same Autosar version */
#if ((GPT_AR_RELEASE_MAJOR_VERSION != GPT_IPW_TYPES_AR_RELEASE_MAJOR_VERSION) || \
     (GPT_AR_RELEASE_MINOR_VERSION != GPT_IPW_TYPES_AR_RELEASE_MINOR_VERSION) || \
     (GPT_AR_RELEASE_REVISION_VERSION != GPT_IPW_TYPES_AR_RELEASE_REVISION_VERSION) \
    )
    #error "AutoSar Version Numbers of Gpt.h and Gpt_Ipw_Types.h are different"
#endif
/* Check if this header file and GPT IPW header file are of the same Software version */
#if ((GPT_SW_MAJOR_VERSION != GPT_IPW_TYPES_SW_MAJOR_VERSION) || \
     (GPT_SW_MINOR_VERSION != GPT_IPW_TYPES_SW_MINOR_VERSION) || \
     (GPT_SW_PATCH_VERSION != GPT_IPW_TYPES_SW_PATCH_VERSION) \
    )
    #error "Software Version Numbers of Gpt.h and Gpt_Ipw_Types.h are different"
#endif

#if ( GPT_VENDOR_ID!= GPT_ENVCFG_VENDOR_ID)
    #error "Gpt.h and Gpt_EnvCfg.h have different vendor ids"
#endif
/* Check if the header files are of the same Autosar version */
#if ((GPT_AR_RELEASE_MAJOR_VERSION != GPT_ENVCFG_AR_RELEASE_MAJOR_VERSION) || \
     (GPT_AR_RELEASE_MINOR_VERSION != GPT_ENVCFG_AR_RELEASE_MINOR_VERSION) || \
     (GPT_AR_RELEASE_REVISION_VERSION != GPT_ENVCFG_AR_RELEASE_REVISION_VERSION) \
    )
    #error "AutoSar Version Numbers of Gpt.h and Gpt_EnvCfg.h are different"
#endif
/* Check if the header files are of the same Software version */
#if ((GPT_SW_MAJOR_VERSION != GPT_ENVCFG_SW_MAJOR_VERSION) || \
     (GPT_SW_MINOR_VERSION != GPT_ENVCFG_SW_MINOR_VERSION) || \
     (GPT_SW_PATCH_VERSION != GPT_ENVCFG_SW_PATCH_VERSION) \
    )
    #error "Software Version Numbers of Gpt.h and Gpt_EnvCfg.h are different"
#endif

#if ( GPT_VENDOR_ID!= GPT_VENDOR_ID_CFG)
    #error "Gpt.h and Gpt_Cfg.h have different vendor ids"
#endif
/* Check if the header files are of the same Autosar version */
#if ((GPT_AR_RELEASE_MAJOR_VERSION != GPT_AR_RELEASE_MAJOR_VERSION_CFG) || \
     (GPT_AR_RELEASE_MINOR_VERSION != GPT_AR_RELEASE_MINOR_VERSION_CFG) || \
     (GPT_AR_RELEASE_REVISION_VERSION != GPT_AR_RELEASE_REVISION_VERSION_CFG) \
    )
    #error "AutoSar Version Numbers of Gpt.h and Gpt_Cfg.h are different"
#endif
/* Check if the header files are of the same Software version */
#if ((GPT_SW_MAJOR_VERSION != GPT_SW_MAJOR_VERSION_CFG) || \
     (GPT_SW_MINOR_VERSION != GPT_SW_MINOR_VERSION_CFG) || \
     (GPT_SW_PATCH_VERSION != GPT_SW_PATCH_VERSION_CFG) \
    )
    #error "Software Version Numbers of Gpt.h and Gpt_Cfg.h are different"
#endif

/*==================================================================================================
*                                          CONSTANT-LIKE DEFINES
==================================================================================================*/

/*==================================================================================================
*                                      FUNCTION-LIKE DEFINES(MACROS)
==================================================================================================*/

/*==================================================================================================*/
/**
* @brief        Function Gpt_StartTimer is called when the driver is in sleep mode for a channel which is not wakeup enabled.
* @details      Errors and exceptions that will be detected by the GPT driver.
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#if(GPT_VALIDATE_STATE == STD_ON)
    #if(((GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_REPORT_WAKEUP_SOURCE == STD_ON)) || (GPT_CHANGE_NEXT_TIMEOUT_VALUE == STD_ON))
        #define GPT_E_INVALID_CALL    ((uint8)0xA0U)
    #endif
#endif

/**
* @brief        Function called without module initialization.
* @details      Errors and exceptions that will be detected by the GPT driver.
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#if((GPT_VALIDATE_CHANNEL_CALL == STD_ON) || (GPT_VALIDATE_GLOBAL_CALL == STD_ON))
    #define GPT_E_UNINIT        ((uint8)0x0AU)
#endif

/**
* @brief        Initialization called when already initialized.
* @details      Errors and exceptions that will be detected by the GPT driver.
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#if(GPT_VALIDATE_GLOBAL_CALL == STD_ON)
    #define GPT_E_ALREADY_INITIALIZED   ((uint8)0x0DU)
#endif

/**
* @brief        Function called for invalid channel.
* @details      Errors and exceptions that will be detected by the GPT driver.
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#define GPT_E_PARAM_CHANNEL ((uint8)0x14U)

/**
* @brief        Function called with parameter value out of range
* @details      Errors and exceptions that will be detected by the GPT driver
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#if (GPT_VALIDATE_PARAM == STD_ON)
    #define GPT_E_PARAM_VALUE   ((uint8)0x15U)
#endif

#if(((GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON) && (GPT_VALIDATE_PARAM == STD_ON)) ||\
    ((GPT_VERSION_INFO_API == STD_ON) && (GPT_DEV_ERROR_DETECT == STD_ON)))
/**
* @brief        Function called with NULL pointer
* @details      Errors and exceptions that will be detected by the GPT driver
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#define GPT_E_PARAM_POINTER  ((uint8)0x16U)
#endif

#if((GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON) && (GPT_VALIDATE_PARAM == STD_ON))
/**
* @brief        Function called with invalid the parameter in function Gpt_GetPredefTimerValue
* @details      Errors and exceptions that will be detected by the GPT driver
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#define GPT_E_PARAM_PREDEF_TIMER                  ((uint8)0x17)
#endif /* (GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON) && (GPT_VALIDATE_PARAM == STD_ON) */

/**
* @brief        Function called when timer channel is still running.
* @details      Errors and exceptions that will be detected by the GPT driver.
*
* @implements   Gpt_Det_ErrorCodes_define
*/
    #define GPT_E_BUSY          ((uint8)0x0BU)
#if(GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON)
/**
* @brief        Function called with invalid the parameter in function Gpt_GetPredefTimerValue
* @details      Errors and exceptions that will be detected by the GPT driver
*
* @implements   Gpt_Det_ErrorCodes_define
*/
    #define GPT_E_MODE                          ((uint8)0x0C)

#endif /* (GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON) */
/**
* @brief        Function called when a timeout is occurred.
* @details      Errors and exceptions that will be detected by the GPT driver.
*
* @implements   Gpt_Det_ErrorCodes_define
*/
    #define GPT_E_TIMEOUT         ((uint8)0x2BU)
/**
* @brief        Function called with invalid the parameter in function Gpt_Init
* @details      Errors and exceptions that will be detected by the GPT driver
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#if((GPT_VALIDATE_PARAM == STD_ON) && (GPT_DEV_ERROR_DETECT == STD_ON))
    #define GPT_E_INIT_FAILED                  ((uint8)0x0E)
#endif

/**
* @brief        API Gpt_SetClockMode service called with wrong parameter.
* @details      Parameters used when raising an error/exception
* @implements
*/
#if((GPT_SET_CLOCK_MODE == STD_ON) && (GPT_VALIDATE_PARAM == STD_ON))
    #define GPT_E_PARAM_CLOCK_MODE                    ((uint8)0x17U)
#endif

/**
* @brief        Function  called with invalid mode param.
* @details      Errors and exceptions that will be detected by the GPT driver
*
* @implements   Gpt_Det_ErrorCodes_define
*/
#if ((GPT_VALIDATE_PARAM == STD_ON) &&(GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_REPORT_WAKEUP_SOURCE == STD_ON))
    #define GPT_E_PARAM_MODE    ((uint8)0x1FU)
#endif

/**
* @brief function called for invalid channel on the current core
* @details Errors and exceptions that will be detected by the GPT driver
*
* @implements     Gpt_Det_ErrorCodes_define
*/
#define GPT_E_PARAM_CONFIG  ((uint8)0x18U)

/** API SERVICE IDs */

/**
* @brief        API service ID for Gpt_GetVersionInfo  function
* @details      Parameters used when raising an error/exception
*/
#if ((GPT_VERSION_INFO_API == STD_ON) && (GPT_DEV_ERROR_DETECT == STD_ON))
    #define GPT_GETVERSIONINFO_ID       ((uint8)0x00U)
#endif
/**
* @brief        API service ID for Gpt_Init function
* @details      Parameters used when raising an error/exception
*/
#if ((GPT_VALIDATE_GLOBAL_CALL == STD_ON) || ((GPT_VALIDATE_PARAM == STD_ON) && (GPT_DEV_ERROR_DETECT == STD_ON)))
    #define GPT_INIT_ID                 ((uint8)0x01U)
#endif

/**
* @brief        API service ID for Gpt_DeInit function
* @details      Parameters used when raising an error/exception
*/
#if (GPT_DEINIT_API == STD_ON)
        #define GPT_DEINIT_ID               ((uint8)0x02U)
#endif

/**
* @brief        API service ID for Gpt_GetTimeElapsed function
* @details      Parameters used when raising an error/exception
*/
#if ((GPT_TIME_ELAPSED_API == STD_ON) && (GPT_VALIDATE_CHANNEL_CALL == STD_ON))
    #define GPT_TIMEELAPSED_ID          ((uint8)0x03U)
#endif

/**
* @brief        API service ID for Gpt_GetTimeRemaining function
* @details      Parameters used when raising an error/exception
*/
#if ((GPT_TIME_REMAINING_API == STD_ON) && (GPT_VALIDATE_CHANNEL_CALL == STD_ON))
    #define GPT_TIMEREMAINING_ID        ((uint8)0x04U)
#endif

/**
* @brief        API service ID for Gpt_StartTimer function
* @details      Parameters used when raising an error/exception
*/
#define GPT_STARTTIMER_ID           ((uint8)0x05U)

/**
* @brief        API service ID for Gpt_StopTimer function
* @details      Parameters used when raising an error/exception
*/
#if(GPT_VALIDATE_CHANNEL_CALL == STD_ON)
    #define GPT_STOPTIMER_ID            ((uint8)0x06U)
#endif

#if((GPT_ENABLE_DISABLE_NOTIFICATION_API == STD_ON) && ((GPT_VALIDATE_CHANNEL_CALL == STD_ON) || (GPT_VALIDATE_PARAM == STD_ON)))
/**
* @brief        API service ID for Gpt_EnableNotification function
* @details      Parameters used when raising an error/exception
*/
#define GPT_ENABLENOTIFICATION_ID   ((uint8)0x07U)

/**
* @brief        API service ID for Gpt_DisableNotification function
* @details      Parameters used when raising an error/exception
*/
#define GPT_DISABLENOTIFICATION_ID  ((uint8)0x08U)
#endif

/**
* @brief        API service ID for Gpt_SetMode function
* @details      Parameters used when raising an error/exception
*/
#if(((GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_VALIDATE_GLOBAL_CALL == STD_ON)) ||\
    ((GPT_VALIDATE_PARAM == STD_ON) &&(GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_REPORT_WAKEUP_SOURCE == STD_ON)))
    #define GPT_SETMODE_ID              ((uint8)0x09U)
#endif

#if ((GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_REPORT_WAKEUP_SOURCE == STD_ON))

#if((GPT_VALIDATE_CHANNEL_CALL == STD_ON) || (GPT_VALIDATE_PARAM == STD_ON))
/**
* @brief        API service ID for Gpt_DisableWakeup function
* @details      Parameters used when raising an error/exception
*/
#define GPT_DISABLEWAKEUP_ID        ((uint8)0x0AU)

/**
* @brief        API service ID for Gpt_EnableWakeup function
* @details      Parameters used when raising an error/exception
*/
#define GPT_ENABLEWAKEUP_ID         ((uint8)0x0BU)
#endif

/**
* @brief        API service ID for Gpt_CheckWakeup function
* @details      Parameters used when raising an error/exception
*/
#if (GPT_VALIDATE_GLOBAL_CALL == STD_ON)
    #define GPT_CHECKWAKEUP_ID          ((uint8)0x0CU)
#endif
#endif /* ((GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_REPORT_WAKEUP_SOURCE == STD_ON)) */
/**
* @brief        API service ID for Gpt_ProcessCommonInterrupt generic ISR handler
* @details      Parameters used when raising an error/exception
*/
#define GPT_PROCESSCOMMONINTERRUPT_ID          ((uint8)0x11U)

/**
* @brief        API service ID for Gpt_ChangeNextTimeoutValue function
* @details      Parameters used when raising an error/exception
*/
#if (GPT_CHANGE_NEXT_TIMEOUT_VALUE == STD_ON)
        #define GPT_CHANGE_NEXT_TIMEOUT_VALUE_ID         ((uint8)0x0FU)
#endif

/**
* @brief        API service ID for Gpt_SetClockMode function
* @details      Parameters used when raising an error/exception
*/
#if((GPT_VALIDATE_GLOBAL_CALL == STD_ON) && (GPT_SET_CLOCK_MODE == STD_ON))
    #define GPT_SET_CLOCK_MODE_ID                       ((uint8)0x10U)
#endif

/**
* @brief        API service ID for Gpt_GetPredefTimerValue function
* @details      Parameters used when raising an error/exception
*/
#if(GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON)
    #define GPT_GET_PREDEF_TIMERVALUE_ID                ((uint8)0x0DU)
#endif

/**
* @brief        API service ID for Gpt_Channel_EnableChainMode function
* @details      Parameters used when raising an error/exception
*/
#if(GPT_CHAIN_MODE == STD_ON)
    #define GPT_ENABLE_CHAIN_MODE_ID               ((uint8)0x21U)
    #define GPT_DISABLE_CHAIN_MODE_ID              ((uint8)0x22U)
#endif

/**
* @brief Instance ID of this GPT driver.
*
*/
#define GPT_INSTANCE_ID   ((uint8)0U)

/*==================================================================================================
*                                             ENUMS
==================================================================================================*/
/**
* @brief   This enumerated type allows the selection of different power modes.
* @details Modes of the GPT driver.
*
* @implements Gpt_ModeType_enumeration
*/
typedef enum
{
    GPT_MODE_NORMAL = 0U,             /**< @brief GPT Normal operation mode of the GPT */
    GPT_MODE_SLEEP = 1U               /**< @brief GPT Sleep mode */
} Gpt_ModeType;

/**
* @brief    Gpt channel mode type. Indicates of whether the channel mode is "CONTINUOUS" or "ONE SHOT".
* @details  ChannelModeType of channel.
*/
typedef enum
{
    GPT_CH_MODE_CONTINUOUS = 0U,      /**< @brief GPT channel mode -  continuous mode */
    GPT_CH_MODE_ONESHOT    = 1U       /**< @brief GPT channel mode -  one-shot mode. */
} Gpt_ChannelModeType;

/**
* @brief    Prescaler type. Indicates of whether the clock channel mode is "GPT_NORMAL" or "GPT_ALTERNATE".
* @details  This enumeration specifies the possible types of prescalers used to configure base-clock timers
*/
#if (GPT_SET_CLOCK_MODE == STD_ON)
typedef enum
{
    GPT_CLOCKMODE_NORMAL    = 0x0U,  /**< @brief Selected value is the NORMAL configured prescaler */
    GPT_CLOCKMODE_ALTERNATE = 0x1U   /**< @brief Selected value is the ALTERNATE configured prescaler */
} Gpt_ClockModeType;
#endif /* GPT_SET_CLOCK_MODE */

/*==================================================================================================
*                                STRUCTURES AND OTHER TYPEDEFS
==================================================================================================*/
/**
* @internal
* @brief    Gpt channel ID data type
* @details  Gpt channel type
* @implements Gpt_ChannelType_typedef
*/
typedef uint8 Gpt_ChannelType;

/**
* @internal
* @brief    Used for reading and setting the timer value in number of ticks.
* @details  Gpt timeout value type
* @implements Gpt_ValueType_typedef
*/
typedef uint32 Gpt_ValueType;

/**
* @internal
* @brief    The callback notifications shall be configurable as pointers to
*           user defined functions within the configuration structure.
* @details  Gpt channel notification type.
*
*/
typedef void (*Gpt_NotificationType)(void);

/**
* @internal
* @brief    Gpt channel configuration type.
* @details  Configuration structure
*
*/
typedef struct
{
    /** @brief GPT ch WakeUp enable */
    boolean Gpt_bEnableWakeup;
    /** @brief Pointer to external callback */
    Gpt_NotificationType Gpt_pfNotification;

#if ((GPT_WAKEUP_FUNCTIONALITY_API == STD_ON) && (GPT_REPORT_WAKEUP_SOURCE == STD_ON))
    /** @brief EcuM wake up source Id */
    EcuM_WakeupSourceType Gpt_uWakeupSource;
#endif
    /** @brief Channel max tick value */
    Gpt_ValueType Gpt_uChannelTickValueMax;
    /** @brief GPT channel mode */
    Gpt_ChannelModeType Gpt_eChannelMode;
    /** @brief Hardware dependent channel configuration */
    Gpt_Ipw_HwChannelConfigType *Gpt_Ipw_HwChannelConfig;
} Gpt_ChannelConfigType;

/**
* @internal
* @brief        Gpt configuration type.
* @details      This is the type of the data structure including the configuration
*               set required for initializing the GPT driver.
*
* @implements   Gpt_ConfigType_structure
*/
typedef struct
{
    /** @brief Number of GPT channels (configured in tresos plugin builder) */
    Gpt_ChannelType              channelCount;
    /** @brief Pointer to the GPT channel configuration */
    const Gpt_ChannelConfigType        (*Gpt_pChannelConfig)[];
    /** @brief Number of GPT instances (configured in tresos plugin builder) */
    uint8 instanceCount;
    /** @brief Pointer to the GPT instance configuration */
    Gpt_Ipw_HwInstanceConfigType (*Gpt_Ipw_HwInstanceConfig)[];
#if(GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON)
    /** @brief Pointer to the GPT channel predef timer configuration */
    const Gpt_HwPredefChannelConfigType * const (*Gpt_pChannelPredefConfigType);
#endif
    /** @brief channel index in each partition map table*/
    const uint8                  (*u8GptChannelIdToIndexMap)[];
} Gpt_ConfigType;

/*==================================================================================================
*                                GLOBAL VARIABLE DECLARATIONS
==================================================================================================*/
#if (GPT_PRECOMPILE_SUPPORT == STD_OFF)
/**
* @internal
* @brief MemMap section
*/
#define GPT_START_SEC_CONFIG_DATA_UNSPECIFIED
#include "Gpt_MemMap.h"

#ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
 /* Check if header file and MemMap.h file are of the same Autosar version */
 #if ((GPT_AR_RELEASE_MAJOR_VERSION != GPT_MEMMAP_AR_RELEASE_MAJOR_VERSION) || \
      (GPT_AR_RELEASE_MINOR_VERSION != GPT_MEMMAP_AR_RELEASE_MINOR_VERSION))
     #error "AutoSar Version Numbers of Gpt.h and Gpt_MemMap.h are different"
 #endif
#endif

GPT_CONFIG_EXT

/**
* @internal
* @brief MemMap section
*/
#define GPT_STOP_SEC_CONFIG_DATA_UNSPECIFIED
#include "Gpt_MemMap.h"

#else

/**
* @internal
* @brief MemMap section
*/
#define GPT_START_SEC_CONFIG_DATA_UNSPECIFIED
#include "Gpt_MemMap.h"

#ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
 /* Check if header file and MemMap.h file are of the same Autosar version */
 #if ((GPT_AR_RELEASE_MAJOR_VERSION != GPT_MEMMAP_AR_RELEASE_MAJOR_VERSION) || \
      (GPT_AR_RELEASE_MINOR_VERSION != GPT_MEMMAP_AR_RELEASE_MINOR_VERSION))
     #error "AutoSar Version Numbers of Gpt.h and Gpt_MemMap.h are different"
 #endif
#endif
/* Extern declarations of GPT Pre compile configuration from Gpt_PBCfg.c */
#if (GPT_PRECOMPILE_SUPPORT == STD_ON)
    #if(GPT_MULTICORE_ENABLED == STD_ON)
extern const Gpt_ConfigType* const Gpt_Config[GPT_MAX_PARTITIONS];
    #else
extern const Gpt_ConfigType Gpt_Config;
    #endif
#endif

/**
* @internal
* @brief MemMap section
*/
#define GPT_STOP_SEC_CONFIG_DATA_UNSPECIFIED
#include "Gpt_MemMap.h"

#endif

/*==================================================================================================
*                                    FUNCTION PROTOTYPES
==================================================================================================*/
/**
* @internal
* @brief MemMap section
*/
#define GPT_START_SEC_CODE
#include "Gpt_MemMap.h"

/*================================================================================================*/
#if (GPT_VERSION_INFO_API == STD_ON)
/**
* @brief       This function returns the version information of this module.
* @details     This service returns the version information of this module. The version information
*              includes:
*                    - Module Id
*                    - Vendor Id
*                    - Vendor specific version numbers
*              If source code for caller and callee of this function is available this function should
*              be realized as a macro. The macro should be defined in the modules header file.
* @param[out]  versioninfo - pointer to location to store version info
*
* @return       void
* @api
*
* @pre          Gpt_Init must be called before.
* @implements   Gpt_GetVersionInfo_Activity
*/
void Gpt_GetVersionInfo(Std_VersionInfoType * VersionInfoPtr);
#endif

/*================================================================================================*/
/**
* @brief        GPT driver initialization function.
* @details      This service is a non reentrant function used for driver initialization.
*               The Initialization function shall initialize all relevant registers of
*               the configured hardware with the values of the structure referenced by the parameter ConfigPtr.
*               All time units used within the API services of the GPT driver shall be of the unit ticks.
*               This function shall only initialize the configured resources. Resources that are
*               not configured in the configuration file shall not be touched.
*               The following rules regarding initialization of controller registers shall apply
*               to the GPT Driver implementation:
*           [1] If the hardware allows for only one usage of the register, the driver
*               module implementing that functionality is responsible for initializing the register
*           [2] If the register can affect several hardware modules and if it is an IO register it
*               shall be initialized by the PORT driver
*           [3] If the register can affect several hardware modules and if it is not an IO register
*               it shall be initialized by the MCU driver
*           [4] One-time writable registers that require initialization directly after reset shall be
*               initialized by the startup code
*           [5] All other registers shall be initialized by the startup code
*
* @param[in]    configPtr    Pointer to a selected configuration structure
*
* @return       void
* @api
*
* @pre          The data structure including the configuration set required for initializing the GPT driver..
* @implements   Gpt_Init_Activity
*/
void Gpt_Init (const Gpt_ConfigType * configPtr);

/*================================================================================================*/
#if (GPT_DEINIT_API == STD_ON)
/**
* @brief        GPT driver de-initialization function.
* @details      Service for de initializing all hardware timer channels to their power on reset state.
*               The state of the peripheral after DeInit shall be the same as after power on reset.
*               The service influences only the peripherals, which are allocated by static
*               configuration and the runtime configuration set passed by the previous call of Gpt_Init()
*               The driver needs to be initialized before calling Gpt_DeInit(). Otherwise, the
*               function Gpt_DeInit shall raise the development error GPT_E_UNINIT and leave the desired
*               de initialization functionality without any action.
*
* @api
* @return       void
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_DeInit_Activity
*/
void Gpt_DeInit(void);
#endif

/*================================================================================================*/
#if (GPT_TIME_ELAPSED_API == STD_ON)
/**
* @brief        GPT driver function for fetching the elapsed timer value.
* @details      Service for querying the time already elapsed.
*               In one shot mode, this is the value relative to the point in time, the channel has been
*               started with Gpt_StartTimer (calculated by the normal operation function by subtracting
*               the current minus the initial timer value and returning the absolute value).
*               In continuous mode, the function returns the timer value relative to the last timeout or
*               the start of the channel.
*               All time units used within the API services of the GPT driver shall be of the unit ticks.
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*               To get times out of register values it is necessary to know the oscillator frequency, pre
*               prescalers and so on. Since these settings are made in MCU and(or) in other modules it is
*               not possible to calculate such times. Hence the conversions between time and ticks shall
*               be part of an upper layer.
*               The driver needs to be initialized before calling Gpt_GetTimeElapsed(). Otherwise, the
*               function shall raise the development error GPT_E_UNINIT and return 0.
*
* @param[in]    channel - channel id
*
* @return       Gpt_ValueType - Elapsed Time in number of ticks
*
* @api
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_GetTimeElapsed_Activity
*/
Gpt_ValueType Gpt_GetTimeElapsed(Gpt_ChannelType channel);
#endif

/*================================================================================================*/
#if (GPT_TIME_REMAINING_API == STD_ON)
/**
* @brief        GPT driver function for fetching the remaining timer value.
* @details      This function returns the timer value remaining until the next timeout period will
*               expire (calculated by the normal operation function by subtracting the timeout minus
*               the current timer value and returning the absolute value)
*               All time units used within the API services of the GPT driver shall be of the unit ticks.
*               Usage of re-entrant capability is only allowed if the callers take care that there is no
*               simultaneous usage of the same channel.
*               To get times out of register values it is necessary to know the oscillator frequency,
*               pre-scalers and so on. Since these settings are made in MCU and(or) in other modules it is
*               not possible to calculate such times. Hence the conversions between time and ticks shall
*               be part of an upper layer.
*               The driver needs to be initialized before calling Gpt_GetTimeRemaining(). Otherwise, the
*               function shall raise the development error GPT_E_UNINIT and return 0.
*
*
* @param[in]    channel - channel id
*
* @return       Gpt_ValueType - Returns the time remaining until the target time is reached in number of ticks.
*
* @api
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_GetTimeRemaining_Activity
*/
Gpt_ValueType Gpt_GetTimeRemaining(Gpt_ChannelType channel);
#endif
/*================================================================================================*/
/**
* @brief        GPT driver function for starting a timer channel.
* @details      The function Gpt_StartTimer shall start the selected timer channel with a defined
*               time-out period.
*               The function Gpt_StartTimer shall invoke the configured notification for that channel
*               (see also GPT292) after the time-out period referenced via the parameter value (if
*               enabled).
*               All time units used within the API services of the GPT driver shall be of the unit ticks.
*               In production mode no error is generated. The rational is that it adds no
*               additional functionality to the driver. In this case the timer will be restarted with the
*               time-out value, given as a parameter to the service.
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*               To get times out of register values it is necessary to know the oscillator
*               frequency, pre-scalers and so on. Since these settings are made in MCU and(or) in other
*               modules it is not possible to calculate such times. Hence the conversions between time
*               and ticks shall be part of an upper layer.
*               The driver needs to be initialized before calling Gpt_StartTimer(). Otherwise, the
*               function Gpt_StartTimer shall raise the development error GPT_E_UNINIT.
*
* @param[in]    channel channel id
* @param[in]    value   time-out period (in number of ticks) after a notification or a wakeup event shall occur.
*
* @return       void
* @api
* @pre          The driver needs to be initialized.
* @implements   Gpt_StartTimer_Activity
*/
void Gpt_StartTimer(Gpt_ChannelType channel,Gpt_ValueType value);

/*================================================================================================*/
/**
* @brief        GPT driver function for stopping a timer channel.
* @details      Service for stopping the selected timer channel
*               Stopping a timer channel, not been started before will not return a development error
*               Timer channels configured in one shot mode are stopped automatically, when the
*               time-out period has expired.
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*               The driver needs to be initialized before calling Gpt_StopTimer(). Otherwise,
*               the function shall raise the development error GPT_E_UNINIT.
*
* @param[in]    channel   channel id
* @return       void
*
* @api
* @pre          The driver needs to be initialized. Gpt_StartTimer must be called before.
* @implements   Gpt_StopTimer_Activity
*/
void Gpt_StopTimer(Gpt_ChannelType channel);

/*================================================================================================*/
#if (GPT_ENABLE_DISABLE_NOTIFICATION_API == STD_ON)
/**
* @brief        GPT driver function for enabling the notification for a timer channel.
* @details      Service for enabling the notification for a channel during runtime.
*               This function can be called, while the timer is already running.
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*               The driver needs to be initialized before calling Gpt_EnableNotification(). Otherwise,
*               the function Gpt_EnableNotification shall raise the development error GPT_E_UNINIT.
*
* @param[in]    channel     channel id
* @return       void
* @api
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_EnableNotification_Activity
*/
void Gpt_EnableNotification(Gpt_ChannelType channel);
/*================================================================================================*/
/**
* @brief        GPT driver function for disabling the notification for a timer channel.
* @details      Service for disabling the notification for a channel during runtime.
*               This function can be called, while the timer is already running
*               When disabled, no notification will be sent. When re-enabled again, the user
*               will not be notified of events, occurred while notifications have been disabled.
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*               The driver needs to be initialized before calling Gpt_DisableNotification().
*               Otherwise, the function shall raise the development error GPT_E_UNINIT.
*
* @param[in]    channel        channel id
* @return       void
* @api
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_DisableNotification_Activity
*/
void Gpt_DisableNotification(Gpt_ChannelType channel);
#endif

#if (GPT_WAKEUP_FUNCTIONALITY_API == STD_ON)
/*================================================================================================*/
/**
* @brief        GPT driver function for setting the operation mode.
* @details      Service for GPT mode selection. This service shall set the operation mode to the given
*               mode parameter .
*               When sleep mode is requested, the ECU State Manager calls Gpt_SetMode with mode
*               parameter "GPT_MODE_SLEEP" and prepares the GPT for sleep mode. The MCU Driver is then
*               putting the controller into SLEEP mode
*               The driver needs to be initialized before calling Gpt_SetMode(). Otherwise, the
*               function Gpt_SetMode shall raise the development error GPT_E_UNINIT.
*
* @param[in]    eMode        operation mode :
*                           - GPT_MODE_NORMAL: Normal operation mode of the GPT driver.
*                           - GPT_MODE_SLEEP: Sleep mode of the GPT driver (wakeup capable)
* @return       void
* @api
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_SetMode_Activity
*/
void Gpt_SetMode(Gpt_ModeType eMode);
/*================================================================================================*/
/**
* @brief        GPT driver function for disabling the wakeup interrupt invocation for a timer channel.
* @details      This service shall disable the wakeup interrupt invocation of a single GPT
*               channel.
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*               The driver needs to be initialized before calling Gpt_DisableWakeup(). Otherwise, the
*               function Gpt_DisableWakeup shall raise the development error GPT_E_UNINIT.
*
* @param[in]    channel        channel id
* @return       void
* @api
*
* @pre          The driver needs to be initialized.
* @implements   Gpt_DisableWakeup_Activity
*/
void Gpt_DisableWakeup(Gpt_ChannelType channel);

/*================================================================================================*/
/**
* @brief        GPT driver function for enabling the wakeup interrupt invocation for a timer channel.
* @details      This service shall re-enable the wakeup interrupt invocation of a single GPT
*               channel.
*               If supported by hardware and enabled, an internal hardware timer can serve as a
*               wakeup source
*               Usage of re-entrant capability is only allowed if the callers take care that
*               there is no simultaneous usage of the same channel.
*
* @param[in]    channel        channel id
* @return       void
* @api
*
* @pre          The driver needs to be initialized. The channel must be configured as wakeup capable.
* @implements   Gpt_EnableWakeup_Activity
*/
void Gpt_EnableWakeup(Gpt_ChannelType channel);

/*================================================================================================*/
/**
* @brief        GPT driver function for checking if a wakeup capable GPT channel is the source for a
*               wakeup event.
* @details      Checks if a wakeup capable GPT channel is the source for a wakeup event and calls the ECU
*               state manager service EcuM_SetWakeupEvent in case of a valid GPT channel wakeup event.
*               The driver needs to be initialized before calling Gpt_CheckWakeup(). Otherwise, the
*               function Gpt_CheckWakeup shall raise the development error GPT_E_UNINIT.
*
* @param[in]    wakeupSource        wakeup source
* @return       void
* @api
*
* @pre          The driver needs to be initialized. The channel must be configured as wakeup capable.
* @implements   Gpt_CheckWakeup_Activity
*/
void Gpt_CheckWakeup(EcuM_WakeupSourceType wakeupSource);
#endif

/*================================================================================================*/
#if (GPT_CHANGE_NEXT_TIMEOUT_VALUE == STD_ON)
/**
* @brief        The function changes the time out period value of the requested running channel.
* @details      The function changes the time out period (in number of ticks) of the channel is
*               running which will be used after the first compare matching.
*               This is a non-autosar function.
* @param[in]    channel        channel id
* @param[in]    value          time out period (in number of ticks) after a notification shall occur
* @return       void
* @pre          Gpt_Init and Gpt_StartTimer must be called before.
* @implements
*/
void Gpt_ChangeNextTimeoutValue
(
    Gpt_ChannelType channel,
    Gpt_ValueType value
);
#endif

/*================================================================================================*/
#if (GPT_SET_CLOCK_MODE == STD_ON)
/**
* @brief        This function changes the channel pre scaler.
* @details      This function sets all channels pre scalers based on the input mode.
*
* @param[in]    eClkMode   pre scaler setting ( NORMAL or ALTERNATE )
* @return       void
* @pre          Gpt_Init must be called before.
*
*
*
* @implements   Gpt_SetClockMode_Activity
*/
void Gpt_SetClockMode(Gpt_ClockModeType eClkMode);
#endif

/*================================================================================================*/
#if (GPT_CHAIN_MODE == STD_ON)
/**
* @brief        The function enables the chain functionality for timer.
* @details      The function enables the chain functionality for timer. Timer will be chained with timer n-1.
                Channel 0 cannot be chained.
*               This is a non-autosar function.
* @param[in]    channel        channel id
* @return       void
* @pre          Gpt_Init must be called before.
*
* @implements   Gpt_Channel_EnableChainMode_Activity
*/
void Gpt_Channel_EnableChainMode(Gpt_ChannelType channel);

/*================================================================================================*/
/**
* @brief        The function disables the chain functionality for timer.
* @details      The function disables the chain functionality for timer. Timer will not be chained with timer n-1.
                Channel 0 cannot be chained or unchained.
*               This is a non-autosar function.
* @param[in]    channel        channel id
* @return       void
* @pre          Gpt_Init must be called before.
*
* @implements   Gpt_Channel_DisableChainMode_Activity
*/
void Gpt_Channel_DisableChainMode(Gpt_ChannelType channel);
#endif

/*================================================================================================*/
#if(GPT_PREDEFTIMER_FUNCTIONALITY_API == STD_ON)
/**
* @brief        Provides the current value of the given predefined free-running timer
* @details      This function provides the current value of the given predefined free-running timer.
*
* @param[in]    PredefTimer: Gpt_PredefTimerType ( GPT_PREDEF_TIMER_1US_16BIT,
*                                               GPT_PREDEF_TIMER_1US_24BIT,
*                                               GPT_PREDEF_TIMER_1US_32BIT
*                                               GPT_PREDEF_TIMER_100US_32BIT)
* @param[out]   TimeValuePtr: Pointer to time value destination data in RAM
* @pre          Gpt_Init must be called before.
* @return       returnValue  - E_OK: no error has been detected.
*                            - E_NOT_OK: aborted due to errors.
*
*
* @implements   Gpt_GetPredefTimerValue_Activity
*/
Std_ReturnType Gpt_GetPredefTimerValue
(
    Gpt_PredefTimerType PredefTimer,
    uint32 * TimeValuePtr
);
#endif

/**
* @internal
* @brief MemMap section
*/
#define GPT_STOP_SEC_CODE
#include "Gpt_MemMap.h"

#ifdef __cplusplus
}
#endif
/** @} */
#endif /* GPT_H */
