ADM/GW/RTD/src/Siul2_Dio_Ip.c
2024-08-08 10:00:15 +09:00

377 lines
15 KiB
C

/*==================================================================================================
* Project : RTD AUTOSAR 4.4
* Platform : CORTEXM
* Peripheral : SIUL2
* Dependencies : none
*
* Autosar Version : 4.4.0
* Autosar Revision : ASR_REL_4_4_REV_0000
* Autosar Conf.Variant :
* SW Version : 0.9.0
* Build Version : S32K3_RTD_0_9_0__ASR_REL_4_4_REV_0000_20210326
*
* (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.
==================================================================================================*/
/**
* @file Siul2_Dio_Ip.c
*
* @addtogroup DIO_IPL
* @{
*/
#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 "Siul2_Dio_Ip.h"
#if (STD_ON == SIUL2_DIO_IP_DEV_ERROR_DETECT)
#include "Devassert.h"
#endif /* (STD_ON == SIUL2_DIO_IP_DEV_ERROR_DETECT) */
/*==================================================================================================
* SOURCE FILE VERSION INFORMATION
==================================================================================================*/
/*
* @brief Parameters that shall be published within the driver header file and also in the
* module's description file
*/
#define SIUL2_DIO_IP_VENDOR_ID_C 43
#define SIUL2_DIO_IP_AR_RELEASE_MAJOR_VERSION_C 4
#define SIUL2_DIO_IP_AR_RELEASE_MINOR_VERSION_C 4
#define SIUL2_DIO_IP_AR_RELEASE_REVISION_VERSION_C 0
#define SIUL2_DIO_IP_SW_MAJOR_VERSION_C 0
#define SIUL2_DIO_IP_SW_MINOR_VERSION_C 9
#define SIUL2_DIO_IP_SW_PATCH_VERSION_C 0
/*==================================================================================================
* FILE VERSION CHECKS
==================================================================================================*/
/* Check if Siul2_Dio_Ip source file and Siul2_Dio_Ip header file are of the same vendor */
#if (SIUL2_DIO_IP_VENDOR_ID_C != SIUL2_DIO_IP_VENDOR_ID_H)
#error "Siul2_Dio_Ip.c and Siul2_Dio_Ip.h have different vendor ids"
#endif
/* Check if Siul2_Dio_Ip source file and Siul2_Dio_Ip header file are of the same Autosar version */
#if ((SIUL2_DIO_IP_AR_RELEASE_MAJOR_VERSION_C != SIUL2_DIO_IP_AR_RELEASE_MAJOR_VERSION_H) || \
(SIUL2_DIO_IP_AR_RELEASE_MINOR_VERSION_C != SIUL2_DIO_IP_AR_RELEASE_MINOR_VERSION_H) || \
(SIUL2_DIO_IP_AR_RELEASE_REVISION_VERSION_C != SIUL2_DIO_IP_AR_RELEASE_REVISION_VERSION_H) \
)
#error "AutoSar Version Numbers of Siul2_Dio_Ip.c and Siul2_Dio_Ip.h are different"
#endif
/* Check if Siul2_Dio_Ip source file and Siul2_Dio_Ip header file are of the same Software version */
#if ((SIUL2_DIO_IP_SW_MAJOR_VERSION_C != SIUL2_DIO_IP_SW_MAJOR_VERSION_H) || \
(SIUL2_DIO_IP_SW_MINOR_VERSION_C != SIUL2_DIO_IP_SW_MINOR_VERSION_H) || \
(SIUL2_DIO_IP_SW_PATCH_VERSION_C != SIUL2_DIO_IP_SW_PATCH_VERSION_H) \
)
#error "Software Version Numbers of Siul2_Dio_Ip.c and Siul2_Dio_Ip.h are different"
#endif
/*==================================================================================================
* LOCAL TYPEDEFS (STRUCTURES, UNIONS, ENUMS)
==================================================================================================*/
/*==================================================================================================
* LOCAL MACROS
==================================================================================================*/
#define SIUL2_NUM_OF_PIN_PORT 16u
/*==================================================================================================
* LOCAL CONSTANTS
==================================================================================================*/
/*==================================================================================================
* LOCAL VARIABLES
==================================================================================================*/
/*==================================================================================================
* GLOBAL CONSTANTS
==================================================================================================*/
/*==================================================================================================
* GLOBAL VARIABLES
==================================================================================================*/
#define DIO_START_SEC_VAR_INIT_32
#include "Dio_MemMap.h"
#if (STD_ON == DIO_VIRTWRAPPER_SUPPORT)
uint32 Siul2BaseAdresses[3] =
{
DIO_SIUL2_VIRTWRAPPER_PDAC0,
DIO_SIUL2_VIRTWRAPPER_PDAC1,
DIO_SIUL2_VIRTWRAPPER_PDAC2
};
#else
uint32 Siul2BaseAdresses[SIUL2_INSTANCE_COUNT] = SIUL2_BASE_ADDRS;
#endif
#define DIO_STOP_SEC_VAR_INIT_32
#include "Dio_MemMap.h"
/*==================================================================================================
* LOCAL FUNCTION PROTOTYPES
==================================================================================================*/
#define DIO_START_SEC_CODE
#include "Dio_MemMap.h"
static inline uint16 Siul2_Dio_Ip_REV_BIT_16(uint16 value);
/*==================================================================================================
* LOCAL FUNCTIONS
==================================================================================================*/
/* Reverse bit order in each halfword independently */
static inline uint16 Siul2_Dio_Ip_REV_BIT_16(uint16 value)
{
uint8 i;
uint16 ret = 0U;
for (i = 0U; i < 8U; i++)
{
ret |= (uint16)((((value >> i) & 1U) << (15U - i)) | (((value << i) & 0x8000U) >> (15U - i)));
}
return ret;
}
/*==================================================================================================
* GLOBAL FUNCTIONS
==================================================================================================*/
/**
*Function Name : Siul2_Dio_Ip_WritePin
* Description : This function writes the given pin from a port, with the given value
* ('0' represents LOW, '1' represents HIGH).
*
* @implements Siul2_Dio_Ip_WritePin_Activity
*/
void Siul2_Dio_Ip_WritePin(Siul2_Dio_Ip_GpioType * const base,
Siul2_Dio_Ip_PinsChannelType pin,
Siul2_Dio_Ip_PinsLevelType value)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
SIUL2_DIO_DEV_ASSERT((boolean)(pin < SIUL2_NUM_OF_PIN_PORT));
SIUL2_DIO_DEV_ASSERT((boolean)(value <= 1U));
Siul2_Dio_Ip_PinsChannelType pinsValues = (Siul2_Dio_Ip_PinsChannelType)base->PGPDO;
pinsValues &= (Siul2_Dio_Ip_PinsChannelType)(~((Siul2_Dio_Ip_PinsChannelType)1U << (15U - pin)));
pinsValues |= (Siul2_Dio_Ip_PinsChannelType)(((Siul2_Dio_Ip_PinsChannelType)value & 1U) << (15U - pin));
base->PGPDO = pinsValues;
}
/**
* Function Name : Siul2_Dio_Ip_WritePins
* Description : This function writes all pins configured as output with the values given in
* the parameter pins. '0' represents LOW, '1' represents HIGH.
*
* @implements Siul2_Dio_Ip_WritePins_Activity
*/
void Siul2_Dio_Ip_WritePins(Siul2_Dio_Ip_GpioType * const base,
Siul2_Dio_Ip_PinsChannelType pins)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
base->PGPDO = Siul2_Dio_Ip_REV_BIT_16(pins);
}
/**
* Function Name : Siul2_Dio_Ip_GetPinsOutput
* Description : This function returns the current output that is written to a port. Only pins
* that are configured as output will have meaningful values.
*
* @implements Siul2_Dio_Ip_GetPinsOutput_Activity
*/
Siul2_Dio_Ip_PinsChannelType Siul2_Dio_Ip_GetPinsOutput(const Siul2_Dio_Ip_GpioType * const base)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
Siul2_Dio_Ip_PinsChannelType returnValue = 0U;
returnValue = (Siul2_Dio_Ip_PinsChannelType)Siul2_Dio_Ip_REV_BIT_16(base->PGPDO);
return returnValue;
}
/**
* Function Name : Siul2_Dio_Ip_SetPins
* Description : This function configures output pins listed in parameter pins (bits that are
* '1') to have a value of 'set' (HIGH). Pins corresponding to '0' will be
* unaffected.
*
* @implements Siul2_Dio_Ip_SetPins_Activity
*/
void Siul2_Dio_Ip_SetPins(Siul2_Dio_Ip_GpioType * const base,
Siul2_Dio_Ip_PinsChannelType pins)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
base->PGPDO |= Siul2_Dio_Ip_REV_BIT_16(pins);
}
/**
* Function Name : Siul2_Dio_Ip_ClearPins
* Description : This function configures output pins listed in parameter pins (bits that are
* '1') to have a 'cleared' value (LOW). Pins corresponding to '0' will be
* unaffected.
*
* @implements Siul2_Dio_Ip_ClearPins_Activity
*/
void Siul2_Dio_Ip_ClearPins(Siul2_Dio_Ip_GpioType * const base,
Siul2_Dio_Ip_PinsChannelType pins)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
base->PGPDO &= (Siul2_Dio_Ip_PinsChannelType)(~Siul2_Dio_Ip_REV_BIT_16(pins));
}
/**
* Function Name : Siul2_Dio_Ip_TogglePins
* Description : This function toggles output pins listed in parameter pins (bits that are
* '1'). Pins corresponding to '0' will be unaffected.
*
* @implements Siul2_Dio_Ip_TogglePins_Activity
*/
void Siul2_Dio_Ip_TogglePins(Siul2_Dio_Ip_GpioType * const base,
Siul2_Dio_Ip_PinsChannelType pins)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
base->PGPDO ^= Siul2_Dio_Ip_REV_BIT_16(pins);
}
/**
* Function Name : Siul2_Dio_Ip_ReadPins
* Description : This function returns the current input values from a port. Only pins
* configured as input will have meaningful values.
*
* @implements Siul2_Dio_Ip_ReadPins_Activity
*/
Siul2_Dio_Ip_PinsChannelType Siul2_Dio_Ip_ReadPins(const Siul2_Dio_Ip_GpioType * const base)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
Siul2_Dio_Ip_PinsChannelType returnValue = 0U;
returnValue = (Siul2_Dio_Ip_PinsChannelType)Siul2_Dio_Ip_REV_BIT_16(base->PGPDI);
return returnValue;
}
/**
* Function Name : Siul2_Dio_Ip_ReadPin
* Description : This function returns the current input value of the given pin from port. Only pin
* configured as input will have meaningful value.
*
* @implements Siul2_Dio_Ip_ReadPin_Activity
*/
Siul2_Dio_Ip_PinsLevelType Siul2_Dio_Ip_ReadPin(const Siul2_Dio_Ip_GpioType * const base, Siul2_Dio_Ip_PinsChannelType pin)
{
SIUL2_DIO_DEV_ASSERT(base != NULL_PTR);
SIUL2_DIO_DEV_ASSERT((boolean)(pin < SIUL2_NUM_OF_PIN_PORT));
Siul2_Dio_Ip_PinsLevelType returnValue = 0U;
returnValue = (Siul2_Dio_Ip_PinsLevelType)((Siul2_Dio_Ip_REV_BIT_16(base->PGPDI) & ((Siul2_Dio_Ip_PinsChannelType)1U << pin)) >> pin);
return returnValue;
}
/**
* Function Name : Siul2_Dio_Ip_MaskedWritePins
* Description : This function writes the masked pins configured as output with the values given
* in the parameter pins. '0' represents LOW, '1' represents HIGH.
*
* @implements Siul2_Dio_Ip_MaskedWritePins_Activity
*/
void Siul2_Dio_Ip_MaskedWritePins(uint8 u8Siul2Instance, uint8 u8PortId, Siul2_Dio_Ip_PinsChannelType pins, Siul2_Dio_Ip_PinsChannelType mask)
{
SIUL2_Type * base = (SIUL2_Type *)Siul2BaseAdresses[u8Siul2Instance];
uint32 maskRev;
uint32 pinsRev;
maskRev = (uint32)(Siul2_Dio_Ip_REV_BIT_16(mask));
pinsRev = (uint32)(Siul2_Dio_Ip_REV_BIT_16(pins));
base->MPGPDO[u8PortId] = (maskRev << (uint32)16U) | pinsRev;
}
#if (STD_ON == DIO_VIRTWRAPPER_SUPPORT)
/**
* Function Name : Siul2_Dio_Ip_VirtWrapperMaskedWritePins
* Description : This function writes the masked pins configured as output with the values given
* in the parameter pins. '0' represents LOW, '1' represents HIGH.
*
*
*/
void Siul2_Dio_Ip_VirtWrapperMaskedWritePins(uint8 u8PdacIndex, uint8 u8PortId, Siul2_Dio_Ip_PinsChannelType pins, Siul2_Dio_Ip_PinsChannelType mask)
{
SIUL2_DIO_DEV_ASSERT(u8PdacIndex != 255);
uint32 maskRev;
uint32 pinsRev;
uint32 value;
/* Store the value of the mask */
maskRev = (uint32)(Siul2_Dio_Ip_REV_BIT_16(mask));
/* Store the value of MPPDO */
pinsRev = (uint32)(Siul2_Dio_Ip_REV_BIT_16(pins));
/* Place mask and MPPDO into MPGPDO register */
value = ((maskRev << (uint32)16U) | pinsRev);
(*(uint32*)(SIUL2_DIO_MPGPDO_ADDR32(u8PdacIndex,u8PortId))) = value;
}
#endif
/**
* Function Name : Siul2_Dio_Ip_ReadChannel
* Description : This function will returns the current value of a channel, just be used in IPW
*
* @implements None
*/
Siul2_Dio_Ip_PinsLevelType Siul2_Dio_Ip_ReadChannel(uint8 u8Siul2Instance, Siul2_Dio_Ip_PinsChannelType pin)
{
Siul2_Dio_Ip_PinsLevelType returnValue = 0U;
returnValue = (*(uint8*)(SIUL2_DIO_GPDI_ADDR32(u8Siul2Instance,pin))) & SIUL2_GPDI_MASK_U8;
return returnValue;
}
/**
* Function Name : Siul2_Dio_Ip_WriteChannel
* Description : This function will writes the logic level for a pin, just be used in IPW
*
* @implements None
*/
void Siul2_Dio_Ip_WriteChannel(uint8 u8Siul2Instance, Siul2_Dio_Ip_PinsChannelType pin, Siul2_Dio_Ip_PinsLevelType value)
{
*(uint8*)(SIUL2_DIO_GPDO_ADDR32(u8Siul2Instance,pin))=value;
}
#if (STD_ON == DIO_VIRTWRAPPER_SUPPORT)
/**
* Function Name : Siul2_Dio_Ip_VirtWrapperWriteChannel
* Description : This function will writes the logic level for a pin, just be used in IPW
*
* @implements None
*/
void Siul2_Dio_Ip_VirtWrapperWriteChannel(uint8 u8PdacIndex, Siul2_Dio_Ip_PinsChannelType pin, Siul2_Dio_Ip_PinsLevelType value)
{
SIUL2_DIO_DEV_ASSERT(u8PdacIndex != 255);
*(uint8*)(SIUL2_DIO_GPDO_ADDR32(u8PdacIndex,pin))=value;
}
#endif
#define DIO_STOP_SEC_CODE
#include "Dio_MemMap.h"
#ifdef __cplusplus
}
#endif
/** @} */
/******************************************************************************
* EOF
*****************************************************************************/