mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-17 19:08:09 +08:00
680 lines
26 KiB
C
680 lines
26 KiB
C
|
/*
|
||
|
* Copyright (c) 2015, Freescale Semiconductor, Inc.
|
||
|
* Copyright 2016-2022 NXP
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
#ifndef FSL_PORT_H_
|
||
|
#define FSL_PORT_H_
|
||
|
|
||
|
#include "fsl_common.h"
|
||
|
|
||
|
/*!
|
||
|
* @addtogroup port
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Definitions
|
||
|
******************************************************************************/
|
||
|
|
||
|
/* Component ID definition, used by tools. */
|
||
|
#ifndef FSL_COMPONENT_ID
|
||
|
#define FSL_COMPONENT_ID "platform.drivers.port"
|
||
|
#endif
|
||
|
|
||
|
/*! @name Driver version */
|
||
|
/*@{*/
|
||
|
/*! @brief PORT driver version. */
|
||
|
#define FSL_PORT_DRIVER_VERSION (MAKE_VERSION(2, 4, 1))
|
||
|
/*@}*/
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_PULL_ENABLE) && FSL_FEATURE_PORT_HAS_PULL_ENABLE
|
||
|
/*! @brief Internal resistor pull feature selection */
|
||
|
enum _port_pull
|
||
|
{
|
||
|
kPORT_PullDisable = 0U, /*!< Internal pull-up/down resistor is disabled. */
|
||
|
kPORT_PullDown = 2U, /*!< Internal pull-down resistor is enabled. */
|
||
|
kPORT_PullUp = 3U, /*!< Internal pull-up resistor is enabled. */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_PULL_ENABLE */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE
|
||
|
/*! @brief Internal resistor pull value selection */
|
||
|
enum _port_pull_value
|
||
|
{
|
||
|
kPORT_LowPullResistor = 0U, /*!< Low internal pull resistor value is selected. */
|
||
|
kPORT_HighPullResistor = 1U, /*!< High internal pull resistor value is selected. */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_SLEW_RATE) && FSL_FEATURE_PORT_HAS_SLEW_RATE
|
||
|
/*! @brief Slew rate selection */
|
||
|
enum _port_slew_rate
|
||
|
{
|
||
|
kPORT_FastSlewRate = 0U, /*!< Fast slew rate is configured. */
|
||
|
kPORT_SlowSlewRate = 1U, /*!< Slow slew rate is configured. */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_SLEW_RATE */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN
|
||
|
/*! @brief Open Drain feature enable/disable */
|
||
|
enum _port_open_drain_enable
|
||
|
{
|
||
|
kPORT_OpenDrainDisable = 0U, /*!< Open drain output is disabled. */
|
||
|
kPORT_OpenDrainEnable = 1U, /*!< Open drain output is enabled. */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_OPEN_DRAIN */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_PASSIVE_FILTER) && FSL_FEATURE_PORT_HAS_PASSIVE_FILTER
|
||
|
/*! @brief Passive filter feature enable/disable */
|
||
|
enum _port_passive_filter_enable
|
||
|
{
|
||
|
kPORT_PassiveFilterDisable = 0U, /*!< Passive input filter is disabled. */
|
||
|
kPORT_PassiveFilterEnable = 1U, /*!< Passive input filter is enabled. */
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH
|
||
|
/*! @brief Configures the drive strength. */
|
||
|
enum _port_drive_strength
|
||
|
{
|
||
|
kPORT_LowDriveStrength = 0U, /*!< Low-drive strength is configured. */
|
||
|
kPORT_HighDriveStrength = 1U, /*!< High-drive strength is configured. */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1
|
||
|
/*! @brief Configures the drive strength1. */
|
||
|
enum _port_drive_strength1
|
||
|
{
|
||
|
kPORT_NormalDriveStrength = 0U, /*!< Normal drive strength */
|
||
|
kPORT_DoubleDriveStrength = 1U, /*!< Double drive strength */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_INPUT_BUFFER) && FSL_FEATURE_PORT_HAS_INPUT_BUFFER
|
||
|
/*! @brief input buffer disable/enable. */
|
||
|
enum _port_input_buffer
|
||
|
{
|
||
|
kPORT_InputBufferDisable = 0U, /*!< Digital input is disabled */
|
||
|
kPORT_InputBufferEnable = 1U, /*!< Digital input is enabled */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_INPUT_BUFFER */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_INVERT_INPUT) && FSL_FEATURE_PORT_HAS_INVERT_INPUT
|
||
|
/*! @brief Digital input is not inverted or it is inverted. */
|
||
|
enum _port_invet_input
|
||
|
{
|
||
|
kPORT_InputNormal = 0U, /*!< Digital input is not inverted */
|
||
|
kPORT_InputInvert = 1U, /*!< Digital input is inverted */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_INVERT_INPUT */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK) && FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK
|
||
|
/*! @brief Unlock/lock the pin control register field[15:0] */
|
||
|
enum _port_lock_register
|
||
|
{
|
||
|
kPORT_UnlockRegister = 0U, /*!< Pin Control Register fields [15:0] are not locked. */
|
||
|
kPORT_LockRegister = 1U, /*!< Pin Control Register fields [15:0] are locked. */
|
||
|
};
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && FSL_FEATURE_PORT_PCR_MUX_WIDTH
|
||
|
/*! @brief Pin mux selection */
|
||
|
typedef enum _port_mux
|
||
|
{
|
||
|
kPORT_PinDisabledOrAnalog = 0U, /*!< Corresponding pin is disabled, but is used as an analog pin. */
|
||
|
kPORT_MuxAsGpio = 1U, /*!< Corresponding pin is configured as GPIO. */
|
||
|
kPORT_MuxAlt0 = 0U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt1 = 1U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt2 = 2U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt3 = 3U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt4 = 4U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt5 = 5U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt6 = 6U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt7 = 7U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt8 = 8U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt9 = 9U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt10 = 10U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt11 = 11U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt12 = 12U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt13 = 13U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt14 = 14U, /*!< Chip-specific */
|
||
|
kPORT_MuxAlt15 = 15U, /*!< Chip-specific */
|
||
|
} port_mux_t;
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_MUX_WIDTH */
|
||
|
|
||
|
#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
|
||
|
/*! @brief Configures the interrupt generation condition. */
|
||
|
typedef enum _port_interrupt
|
||
|
{
|
||
|
kPORT_InterruptOrDMADisabled = 0x0U, /*!< Interrupt/DMA request is disabled. */
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DMA_REQUEST) && FSL_FEATURE_PORT_HAS_DMA_REQUEST || defined(DOXYGEN_OUTPUT)
|
||
|
kPORT_DMARisingEdge = 0x1U, /*!< DMA request on rising edge. */
|
||
|
kPORT_DMAFallingEdge = 0x2U, /*!< DMA request on falling edge. */
|
||
|
kPORT_DMAEitherEdge = 0x3U, /*!< DMA request on either edge. */
|
||
|
#endif
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_IRQC_FLAG) && FSL_FEATURE_PORT_HAS_IRQC_FLAG || defined(DOXYGEN_OUTPUT)
|
||
|
kPORT_FlagRisingEdge = 0x05U, /*!< Flag sets on rising edge. */
|
||
|
kPORT_FlagFallingEdge = 0x06U, /*!< Flag sets on falling edge. */
|
||
|
kPORT_FlagEitherEdge = 0x07U, /*!< Flag sets on either edge. */
|
||
|
#endif
|
||
|
kPORT_InterruptLogicZero = 0x8U, /*!< Interrupt when logic zero. */
|
||
|
kPORT_InterruptRisingEdge = 0x9U, /*!< Interrupt on rising edge. */
|
||
|
kPORT_InterruptFallingEdge = 0xAU, /*!< Interrupt on falling edge. */
|
||
|
kPORT_InterruptEitherEdge = 0xBU, /*!< Interrupt on either edge. */
|
||
|
kPORT_InterruptLogicOne = 0xCU, /*!< Interrupt when logic one. */
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_IRQC_TRIGGER) && FSL_FEATURE_PORT_HAS_IRQC_TRIGGER || defined(DOXYGEN_OUTPUT)
|
||
|
kPORT_ActiveHighTriggerOutputEnable = 0xDU, /*!< Enable active high-trigger output. */
|
||
|
kPORT_ActiveLowTriggerOutputEnable = 0xEU, /*!< Enable active low-trigger output. */
|
||
|
#endif
|
||
|
} port_interrupt_t;
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DIGITAL_FILTER) && FSL_FEATURE_PORT_HAS_DIGITAL_FILTER
|
||
|
/*! @brief Digital filter clock source selection */
|
||
|
typedef enum _port_digital_filter_clock_source
|
||
|
{
|
||
|
kPORT_BusClock = 0U, /*!< Digital filters are clocked by the bus clock. */
|
||
|
kPORT_LpoClock = 1U, /*!< Digital filters are clocked by the 1 kHz LPO clock. */
|
||
|
} port_digital_filter_clock_source_t;
|
||
|
|
||
|
/*! @brief PORT digital filter feature configuration definition */
|
||
|
typedef struct _port_digital_filter_config
|
||
|
{
|
||
|
uint32_t digitalFilterWidth; /*!< Set digital filter width */
|
||
|
port_digital_filter_clock_source_t clockSource; /*!< Set digital filter clockSource */
|
||
|
} port_digital_filter_config_t;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_DIGITAL_FILTER */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && FSL_FEATURE_PORT_PCR_MUX_WIDTH
|
||
|
/*! @brief PORT pin configuration structure */
|
||
|
typedef struct _port_pin_config
|
||
|
{
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_PULL_ENABLE) && FSL_FEATURE_PORT_HAS_PULL_ENABLE
|
||
|
uint16_t pullSelect : 2; /*!< No-pull/pull-down/pull-up select */
|
||
|
#else
|
||
|
uint16_t : 2;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_PULL_ENABLE */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE
|
||
|
uint16_t pullValueSelect : 1; /*!< Pull value select */
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_SLEW_RATE) && FSL_FEATURE_PORT_HAS_SLEW_RATE
|
||
|
uint16_t slewRate : 1; /*!< Fast/slow slew rate Configure */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_SLEW_RATE */
|
||
|
|
||
|
#if !(defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE)
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_PASSIVE_FILTER) && FSL_FEATURE_PORT_HAS_PASSIVE_FILTER
|
||
|
uint16_t passiveFilterEnable : 1; /*!< Passive filter enable/disable */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_PASSIVE_FILTER */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN
|
||
|
uint16_t openDrainEnable : 1; /*!< Open drain enable/disable */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_OPEN_DRAIN */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH
|
||
|
uint16_t driveStrength : 1; /*!< Fast/slow drive strength configure */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1
|
||
|
uint16_t driveStrength1 : 1; /*!< Normal/Double drive strength enable/disable */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1 */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && (FSL_FEATURE_PORT_PCR_MUX_WIDTH == 3)
|
||
|
uint16_t mux : 3; /*!< Pin mux Configure */
|
||
|
uint16_t : 1;
|
||
|
#elif defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && (FSL_FEATURE_PORT_PCR_MUX_WIDTH == 4)
|
||
|
uint16_t mux : 4; /*!< Pin mux Configure */
|
||
|
#else
|
||
|
uint16_t : 4;
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_INPUT_BUFFER) && FSL_FEATURE_PORT_HAS_INPUT_BUFFER
|
||
|
uint16_t inputBuffer : 1; /*!< Input Buffer Configure */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_INPUT_BUFFER */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_INVERT_INPUT) && FSL_FEATURE_PORT_HAS_INVERT_INPUT
|
||
|
uint16_t invertInput : 1; /*!< Invert Input Configure */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_INVERT_INPUT */
|
||
|
|
||
|
uint16_t : 1;
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK) && FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK
|
||
|
uint16_t lockRegister : 1; /*!< Lock/unlock the PCR field[15:0] */
|
||
|
#else
|
||
|
uint16_t : 1;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK */
|
||
|
} port_pin_config_t;
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_MUX_WIDTH */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER
|
||
|
/*! @brief PORT version information. */
|
||
|
typedef struct _port_version_info
|
||
|
{
|
||
|
uint16_t feature; /*!< Feature Specification Number. */
|
||
|
uint8_t minor; /*!< Minor Version Number. */
|
||
|
uint8_t major; /*!< Major Version Number. */
|
||
|
} port_version_info_t;
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE) && FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE
|
||
|
/*! @brief PORT voltage range. */
|
||
|
typedef enum _port_voltage_range
|
||
|
{
|
||
|
kPORT_VoltageRange1Dot71V_3Dot6V = 0x0U, /*!< Port voltage range is 1.71 V - 3.6 V. */
|
||
|
kPORT_VoltageRange2Dot70V_3Dot6V = 0x1U, /*!< Port voltage range is 2.70 V - 3.6 V. */
|
||
|
} port_voltage_range_t;
|
||
|
#endif /* FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE */
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* API
|
||
|
******************************************************************************/
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_MUX_WIDTH) && FSL_FEATURE_PORT_PCR_MUX_WIDTH
|
||
|
/*! @name Configuration */
|
||
|
/*@{*/
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER) && FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER
|
||
|
/*!
|
||
|
* @brief Get PORT version information.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @param info PORT version information
|
||
|
*/
|
||
|
static inline void PORT_GetVersionInfo(PORT_Type *base, port_version_info_t *info)
|
||
|
{
|
||
|
uint32_t verid = base->VERID;
|
||
|
info->feature = (uint16_t)verid;
|
||
|
info->minor = (uint8_t)(verid >> PORT_VERID_MINOR_SHIFT);
|
||
|
info->major = (uint8_t)(verid >> PORT_VERID_MAJOR_SHIFT);
|
||
|
}
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_VERSION_INFO_REGISTER */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE) && FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE
|
||
|
/*!
|
||
|
* @brief Get PORT version information.
|
||
|
*
|
||
|
* @note : PORTA_CONFIG[RANGE] controls the voltage ranges of Port A, B, and C. Read or write PORTB_CONFIG[RANGE] and
|
||
|
* PORTC_CONFIG[RANGE] does not take effect.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @param range port voltage range
|
||
|
*/
|
||
|
static inline void PORT_SecletPortVoltageRange(PORT_Type *base, port_voltage_range_t range)
|
||
|
{
|
||
|
base->CONFIG = (uint32_t)range;
|
||
|
}
|
||
|
#endif /* FSL_FEATURE_PORT_SUPPORT_DIFFERENT_VOLTAGE_RANGE */
|
||
|
|
||
|
/*!
|
||
|
* @brief Sets the port PCR register.
|
||
|
*
|
||
|
* This is an example to define an input pin or output pin PCR configuration.
|
||
|
* @code
|
||
|
* // Define a digital input pin PCR configuration
|
||
|
* port_pin_config_t config = {
|
||
|
* kPORT_PullUp,
|
||
|
* kPORT_FastSlewRate,
|
||
|
* kPORT_PassiveFilterDisable,
|
||
|
* kPORT_OpenDrainDisable,
|
||
|
* kPORT_LowDriveStrength,
|
||
|
* kPORT_MuxAsGpio,
|
||
|
* kPORT_UnLockRegister,
|
||
|
* };
|
||
|
* @endcode
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param pin PORT pin number.
|
||
|
* @param config PORT PCR register configuration structure.
|
||
|
*/
|
||
|
static inline void PORT_SetPinConfig(PORT_Type *base, uint32_t pin, const port_pin_config_t *config)
|
||
|
{
|
||
|
assert(config);
|
||
|
uint32_t addr = (uint32_t)&base->PCR[pin];
|
||
|
*(volatile uint16_t *)(addr) = *((const uint16_t *)(const void *)config);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Sets the port PCR register for multiple pins.
|
||
|
*
|
||
|
* This is an example to define input pins or output pins PCR configuration.
|
||
|
* @code
|
||
|
* Define a digital input pin PCR configuration
|
||
|
* port_pin_config_t config = {
|
||
|
* kPORT_PullUp ,
|
||
|
* kPORT_PullEnable,
|
||
|
* kPORT_FastSlewRate,
|
||
|
* kPORT_PassiveFilterDisable,
|
||
|
* kPORT_OpenDrainDisable,
|
||
|
* kPORT_LowDriveStrength,
|
||
|
* kPORT_MuxAsGpio,
|
||
|
* kPORT_UnlockRegister,
|
||
|
* };
|
||
|
* @endcode
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param mask PORT pin number macro.
|
||
|
* @param config PORT PCR register configuration structure.
|
||
|
*/
|
||
|
static inline void PORT_SetMultiplePinsConfig(PORT_Type *base, uint32_t mask, const port_pin_config_t *config)
|
||
|
{
|
||
|
assert(config);
|
||
|
|
||
|
uint16_t pcrl = *((const uint16_t *)(const void *)config);
|
||
|
|
||
|
if (0U != (mask & 0xffffU))
|
||
|
{
|
||
|
base->GPCLR = ((mask & 0xffffU) << 16) | pcrl;
|
||
|
}
|
||
|
if (0U != (mask >> 16))
|
||
|
{
|
||
|
base->GPCHR = (mask & 0xffff0000U) | pcrl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_MULTIPLE_IRQ_CONFIG) && FSL_FEATURE_PORT_HAS_MULTIPLE_IRQ_CONFIG
|
||
|
/*!
|
||
|
* @brief Sets the port interrupt configuration in PCR register for multiple pins.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param mask PORT pin number macro.
|
||
|
* @param config PORT pin interrupt configuration.
|
||
|
* - #kPORT_InterruptOrDMADisabled: Interrupt/DMA request disabled.
|
||
|
* - #kPORT_DMARisingEdge : DMA request on rising edge(if the DMA requests exit).
|
||
|
* - #kPORT_DMAFallingEdge: DMA request on falling edge(if the DMA requests exit).
|
||
|
* - #kPORT_DMAEitherEdge : DMA request on either edge(if the DMA requests exit).
|
||
|
* - #kPORT_FlagRisingEdge : Flag sets on rising edge(if the Flag states exit).
|
||
|
* - #kPORT_FlagFallingEdge : Flag sets on falling edge(if the Flag states exit).
|
||
|
* - #kPORT_FlagEitherEdge : Flag sets on either edge(if the Flag states exit).
|
||
|
* - #kPORT_InterruptLogicZero : Interrupt when logic zero.
|
||
|
* - #kPORT_InterruptRisingEdge : Interrupt on rising edge.
|
||
|
* - #kPORT_InterruptFallingEdge: Interrupt on falling edge.
|
||
|
* - #kPORT_InterruptEitherEdge : Interrupt on either edge.
|
||
|
* - #kPORT_InterruptLogicOne : Interrupt when logic one.
|
||
|
* - #kPORT_ActiveHighTriggerOutputEnable : Enable active high-trigger output (if the trigger states exit).
|
||
|
* - #kPORT_ActiveLowTriggerOutputEnable : Enable active low-trigger output (if the trigger states exit)..
|
||
|
*/
|
||
|
static inline void PORT_SetMultipleInterruptPinsConfig(PORT_Type *base, uint32_t mask, port_interrupt_t config)
|
||
|
{
|
||
|
assert(config);
|
||
|
|
||
|
if (0U != ((uint32_t)mask & 0xffffU))
|
||
|
{
|
||
|
base->GICLR = ((uint32_t)config << 16U) | ((uint32_t)mask & 0xffffU);
|
||
|
}
|
||
|
mask = mask >> 16;
|
||
|
if (0U != mask)
|
||
|
{
|
||
|
base->GICHR = ((uint32_t)config << 16U) | ((uint32_t)mask & 0xffffU);
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/*!
|
||
|
* @brief Configures the pin muxing.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param pin PORT pin number.
|
||
|
* @param mux pin muxing slot selection.
|
||
|
* - #kPORT_PinDisabledOrAnalog: Pin disabled or work in analog function.
|
||
|
* - #kPORT_MuxAsGpio : Set as GPIO.
|
||
|
* - #kPORT_MuxAlt2 : chip-specific.
|
||
|
* - #kPORT_MuxAlt3 : chip-specific.
|
||
|
* - #kPORT_MuxAlt4 : chip-specific.
|
||
|
* - #kPORT_MuxAlt5 : chip-specific.
|
||
|
* - #kPORT_MuxAlt6 : chip-specific.
|
||
|
* - #kPORT_MuxAlt7 : chip-specific.
|
||
|
* @note : This function is NOT recommended to use together with the PORT_SetPinsConfig, because
|
||
|
* the PORT_SetPinsConfig need to configure the pin mux anyway (Otherwise the pin mux is
|
||
|
* reset to zero : kPORT_PinDisabledOrAnalog).
|
||
|
* This function is recommended to use to reset the pin mux
|
||
|
*
|
||
|
*/
|
||
|
static inline void PORT_SetPinMux(PORT_Type *base, uint32_t pin, port_mux_t mux)
|
||
|
{
|
||
|
base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(mux);
|
||
|
}
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_MUX_WIDTH */
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DIGITAL_FILTER) && FSL_FEATURE_PORT_HAS_DIGITAL_FILTER
|
||
|
|
||
|
/*!
|
||
|
* @brief Enables the digital filter in one port, each bit of the 32-bit register represents one pin.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param mask PORT pin number macro.
|
||
|
* @param enable PORT digital filter configuration.
|
||
|
*/
|
||
|
static inline void PORT_EnablePinsDigitalFilter(PORT_Type *base, uint32_t mask, bool enable)
|
||
|
{
|
||
|
if (enable == true)
|
||
|
{
|
||
|
base->DFER |= mask;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
base->DFER &= ~mask;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Sets the digital filter in one port, each bit of the 32-bit register represents one pin.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param config PORT digital filter configuration structure.
|
||
|
*/
|
||
|
static inline void PORT_SetDigitalFilterConfig(PORT_Type *base, const port_digital_filter_config_t *config)
|
||
|
{
|
||
|
assert(config);
|
||
|
|
||
|
base->DFCR = PORT_DFCR_CS(config->clockSource);
|
||
|
base->DFWR = PORT_DFWR_FILT(config->digitalFilterWidth);
|
||
|
}
|
||
|
|
||
|
#endif /* FSL_FEATURE_PORT_HAS_DIGITAL_FILTER */
|
||
|
/*@}*/
|
||
|
|
||
|
/*! @name Interrupt */
|
||
|
/*@{*/
|
||
|
|
||
|
#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
|
||
|
/*!
|
||
|
* @brief Configures the port pin interrupt/DMA request.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param pin PORT pin number.
|
||
|
* @param config PORT pin interrupt configuration.
|
||
|
* - #kPORT_InterruptOrDMADisabled: Interrupt/DMA request disabled.
|
||
|
* - #kPORT_DMARisingEdge : DMA request on rising edge(if the DMA requests exit).
|
||
|
* - #kPORT_DMAFallingEdge: DMA request on falling edge(if the DMA requests exit).
|
||
|
* - #kPORT_DMAEitherEdge : DMA request on either edge(if the DMA requests exit).
|
||
|
* - #kPORT_FlagRisingEdge : Flag sets on rising edge(if the Flag states exit).
|
||
|
* - #kPORT_FlagFallingEdge : Flag sets on falling edge(if the Flag states exit).
|
||
|
* - #kPORT_FlagEitherEdge : Flag sets on either edge(if the Flag states exit).
|
||
|
* - #kPORT_InterruptLogicZero : Interrupt when logic zero.
|
||
|
* - #kPORT_InterruptRisingEdge : Interrupt on rising edge.
|
||
|
* - #kPORT_InterruptFallingEdge: Interrupt on falling edge.
|
||
|
* - #kPORT_InterruptEitherEdge : Interrupt on either edge.
|
||
|
* - #kPORT_InterruptLogicOne : Interrupt when logic one.
|
||
|
* - #kPORT_ActiveHighTriggerOutputEnable : Enable active high-trigger output (if the trigger states exit).
|
||
|
* - #kPORT_ActiveLowTriggerOutputEnable : Enable active low-trigger output (if the trigger states exit).
|
||
|
*/
|
||
|
static inline void PORT_SetPinInterruptConfig(PORT_Type *base, uint32_t pin, port_interrupt_t config)
|
||
|
{
|
||
|
base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_IRQC_MASK) | PORT_PCR_IRQC(config);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH
|
||
|
/*!
|
||
|
* @brief Configures the port pin drive strength.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param pin PORT pin number.
|
||
|
* @param strength PORT pin drive strength
|
||
|
* - #kPORT_LowDriveStrength = 0U - Low-drive strength is configured.
|
||
|
* - #kPORT_HighDriveStrength = 1U - High-drive strength is configured.
|
||
|
*/
|
||
|
static inline void PORT_SetPinDriveStrength(PORT_Type *base, uint32_t pin, uint8_t strength)
|
||
|
{
|
||
|
base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_DSE_MASK) | PORT_PCR_DSE(strength);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1) && FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH1
|
||
|
/*!
|
||
|
* @brief Enables the port pin double drive strength.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param pin PORT pin number.
|
||
|
* @param enable PORT pin drive strength configuration.
|
||
|
*/
|
||
|
static inline void PORT_EnablePinDoubleDriveStrength(PORT_Type *base, uint32_t pin, bool enable)
|
||
|
{
|
||
|
base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_DSE1_MASK) | PORT_PCR_DSE1(enable);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE) && FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE
|
||
|
/*!
|
||
|
* @brief Configures the port pin pull value.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param pin PORT pin number.
|
||
|
* @param value PORT pin pull value
|
||
|
* - #kPORT_LowPullResistor = 0U - Low internal pull resistor value is selected.
|
||
|
* - #kPORT_HighPullResistor = 1U - High internal pull resistor value is selected.
|
||
|
*/
|
||
|
static inline void PORT_SetPinPullValue(PORT_Type *base, uint32_t pin, uint8_t value)
|
||
|
{
|
||
|
base->PCR[pin] = (base->PCR[pin] & ~PORT_PCR_PV_MASK) | PORT_PCR_PV(value);
|
||
|
}
|
||
|
#endif /* FSL_FEATURE_PORT_PCR_HAS_PULL_VALUE */
|
||
|
|
||
|
#if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT)
|
||
|
/*!
|
||
|
* @brief Reads the whole port status flag.
|
||
|
*
|
||
|
* If a pin is configured to generate the DMA request, the corresponding flag
|
||
|
* is cleared automatically at the completion of the requested DMA transfer.
|
||
|
* Otherwise, the flag remains set until a logic one is written to that flag.
|
||
|
* If configured for a level sensitive interrupt that remains asserted, the flag
|
||
|
* is set again immediately.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @return Current port interrupt status flags, for example, 0x00010001 means the
|
||
|
* pin 0 and 16 have the interrupt.
|
||
|
*/
|
||
|
static inline uint32_t PORT_GetPinsInterruptFlags(PORT_Type *base)
|
||
|
{
|
||
|
return base->ISFR;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Clears the multiple pin interrupt status flag.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer.
|
||
|
* @param mask PORT pin number macro.
|
||
|
*/
|
||
|
static inline void PORT_ClearPinsInterruptFlags(PORT_Type *base, uint32_t mask)
|
||
|
{
|
||
|
base->ISFR = mask;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#if defined(FSL_FEATURE_PORT_SUPPORT_EFT) && FSL_FEATURE_PORT_SUPPORT_EFT
|
||
|
/*!
|
||
|
* @brief Get EFT detect flags.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @return EFT detect flags
|
||
|
*/
|
||
|
static inline uint32_t PORT_GetEFTDetectFlags(PORT_Type *base)
|
||
|
{
|
||
|
return base->EDFR;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Enable EFT detect interrupts.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @param interrupt EFT detect interrupt
|
||
|
*/
|
||
|
static inline void PORT_EnableEFTDetectInterrupts(PORT_Type *base, uint32_t interrupt)
|
||
|
{
|
||
|
base->EDIER |= interrupt;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Disable EFT detect interrupts.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @param interrupt EFT detect interrupt
|
||
|
*/
|
||
|
static inline void PORT_DisableEFTDetectInterrupts(PORT_Type *base, uint32_t interrupt)
|
||
|
{
|
||
|
base->EDIER &= ~interrupt;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Clear all low EFT detector.
|
||
|
*
|
||
|
* @note : Port B and Port C pins share the same EFT detector clear control from PORTC_EDCR register. Any write to the
|
||
|
* PORTB_EDCR does not take effect.
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @param interrupt EFT detect interrupt
|
||
|
*/
|
||
|
static inline void PORT_ClearAllLowEFTDetectors(PORT_Type *base)
|
||
|
{
|
||
|
base->EDCR |= PORT_EDCR_EDLC_MASK;
|
||
|
base->EDCR &= ~PORT_EDCR_EDLC_MASK;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* @brief Clear all high EFT detector.
|
||
|
*
|
||
|
* @param base PORT peripheral base pointer
|
||
|
* @param interrupt EFT detect interrupt
|
||
|
*/
|
||
|
static inline void PORT_ClearAllHighEFTDetectors(PORT_Type *base)
|
||
|
{
|
||
|
base->EDCR |= PORT_EDCR_EDHC_MASK;
|
||
|
base->EDCR &= ~PORT_EDCR_EDHC_MASK;
|
||
|
}
|
||
|
#endif /* FSL_FEATURE_PORT_SUPPORT_EFT */
|
||
|
|
||
|
/*@}*/
|
||
|
|
||
|
#if defined(__cplusplus)
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/*! @}*/
|
||
|
|
||
|
#endif /* FSL_PORT_H_ */
|