blob: bbd05703601462480ebd799af79705afac62da2d [file] [log] [blame]
/*
* Copyright 2018-2019 NXP
* All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __HAL_GPIO_H__
#define __HAL_GPIO_H__
#if defined(FSL_RTOS_FREE_RTOS)
#include "FreeRTOS.h"
#endif
/*!
* @addtogroup GPIO_Adapter
* @{
*/
/*******************************************************************************
* Public macro
******************************************************************************/
/*! @brief Definition of GPIO adapter handle size. */
#define HAL_GPIO_HANDLE_SIZE (16U)
/*!
* @brief Defines the gpio handle
*
* This macro is used to define a 4 byte aligned gpio handle.
* Then use "(hal_gpio_handle_t)name" to get the gpio handle.
*
* The macro should be global and could be optional. You could also define gpio handle by yourself.
*
* This is an example,
* @code
* GPIO_HANDLE_DEFINE(gpioHandle);
* @endcode
*
* @param name The name string of the gpio handle.
*/
#define GPIO_HANDLE_DEFINE(name) uint32_t name[((HAL_GPIO_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]
/*! @brief Definition of GPIO adapter isr priority. */
#ifndef HAL_GPIO_ISR_PRIORITY
#if defined(__GIC_PRIO_BITS)
#define HAL_GPIO_ISR_PRIORITY (25U)
#else
#if defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
#define HAL_GPIO_ISR_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)
#else
/* The default value 3 is used to support different ARM Core, such as CM0P, CM4, CM7, and CM33, etc.
* The minimum number of priority bits implemented in the NVIC is 2 on these SOCs. The value of mininum
* priority is 3 (2^2 - 1). So, the default value is 3.
*/
#define HAL_GPIO_ISR_PRIORITY (3U)
#endif /* defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY) */
#endif /* defined(__GIC_PRIO_BITS) */
#endif /* HAL_GPIO_ISR_PRIORITY */
/*******************************************************************************
* Definitions
******************************************************************************/
/*! @brief The handle of GPIO adapter. */
typedef void *hal_gpio_handle_t;
/*! @brief The callback function of GPIO adapter. */
typedef void (*hal_gpio_callback_t)(void *param);
/*! @brief The interrupt trigger of GPIO adapter. */
typedef enum _hal_gpio_interrupt_trigger
{
kHAL_GpioInterruptDisable = 0x0U, /*!< Interrupt disable. */
kHAL_GpioInterruptLogicZero = 0x1U, /*!< Interrupt when logic zero. */
kHAL_GpioInterruptRisingEdge = 0x2U, /*!< Interrupt on rising edge. */
kHAL_GpioInterruptFallingEdge = 0x3U, /*!< Interrupt on falling edge. */
kHAL_GpioInterruptEitherEdge = 0x4U, /*!< Interrupt on either edge. */
kHAL_GpioInterruptLogicOne = 0x5U, /*!< Interrupt when logic one. */
} hal_gpio_interrupt_trigger_t;
/*! @brief The status of GPIO adapter. */
typedef enum _hal_gpio_status
{
kStatus_HAL_GpioSuccess = kStatus_Success, /*!< Success */
kStatus_HAL_GpioError = MAKE_STATUS(kStatusGroup_HAL_GPIO, 1), /*!< Failed */
kStatus_HAL_GpioLackSource = MAKE_STATUS(kStatusGroup_HAL_GPIO, 2), /*!< Lack of sources */
kStatus_HAL_GpioPinConflict = MAKE_STATUS(kStatusGroup_HAL_GPIO, 3), /*!< PIN conflict */
} hal_gpio_status_t;
/*! @brief The direction of GPIO adapter. */
typedef enum _hal_gpio_direction
{
kHAL_GpioDirectionOut = 0x00U, /*!< Out */
kHAL_GpioDirectionIn, /*!< In */
} hal_gpio_direction_t;
/*! @brief The pin config struct of GPIO adapter. */
typedef struct _hal_gpio_pin_config
{
hal_gpio_direction_t direction;
uint8_t port;
uint8_t pin;
uint8_t level;
} hal_gpio_pin_config_t;
/*******************************************************************************
* API
******************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus */
/*!
* @brief Initializes an GPIO instance with the GPIO handle and the user configuration structure.
*
* This function configures the GPIO module with user-defined settings. The user can configure the configuration
* structure. The parameter gpioHandle is a pointer to point to a memory space of size #HAL_GPIO_HANDLE_SIZE allocated
* by the caller. Example below shows how to use this API to configure the GPIO.
* @code
* GPIO_HANDLE_DEFINE(g_GpioHandle);
* hal_gpio_pin_config_t config;
* config.direction = kHAL_GpioDirectionOut;
* config.port = 0;
* config.pin = 0;
* config.level = 0;
* HAL_GpioInit((hal_gpio_handle_t)g_GpioHandle, &config);
* @endcode
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* You can define the handle in the following two ways:
* #GPIO_HANDLE_DEFINE(gpioHandle);
* or
* uint32_t gpioHandle[((HAL_GPIO_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];
* @param pinConfig Pointer to user-defined configuration structure.
* @retval kStatus_HAL_GpioError An error occurred while initializing the GPIO.
* @retval kStatus_HAL_GpioPinConflict The pair of the pin and port passed by pinConfig is initialized.
* @retval kStatus_HAL_GpioSuccess GPIO initialization succeed
*/
hal_gpio_status_t HAL_GpioInit(hal_gpio_handle_t gpioHandle, hal_gpio_pin_config_t *pinConfig);
/*!
* @brief Deinitializes a GPIO instance.
*
* This function disables the trigger mode.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @retval kStatus_HAL_GpioSuccess GPIO de-initialization succeed
*/
hal_gpio_status_t HAL_GpioDeinit(hal_gpio_handle_t gpioHandle);
/*!
* @brief Gets the pin voltage.
*
* This function gets the pin voltage. 0 - low level voltage, 1 - high level voltage.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @param pinState A pointer to save the pin state.
* @retval kStatus_HAL_GpioSuccess Get successfully.
*/
hal_gpio_status_t HAL_GpioGetInput(hal_gpio_handle_t gpioHandle, uint8_t *pinState);
/*!
* @brief Sets the pin voltage.
*
* This function sets the pin voltage. 0 - low level voltage, 1 - high level voltage.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @param pinState Pin state.
* @retval kStatus_HAL_GpioSuccess Set successfully.
*/
hal_gpio_status_t HAL_GpioSetOutput(hal_gpio_handle_t gpioHandle, uint8_t pinState);
/*!
* @brief Gets the pin interrupt trigger mode.
*
* This function gets the pin interrupt trigger mode. The trigger mode please refer to
* #hal_gpio_interrupt_trigger_t.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @param gpioTrigger A pointer to save the pin trigger mode value.
* @retval kStatus_HAL_GpioSuccess Get successfully.
* @retval kStatus_HAL_GpioError The pin is the ouput setting.
*/
hal_gpio_status_t HAL_GpioGetTriggerMode(hal_gpio_handle_t gpioHandle, hal_gpio_interrupt_trigger_t *gpioTrigger);
/*!
* @brief Sets the pin interrupt trigger mode.
*
* This function sets the pin interrupt trigger mode. The trigger mode please refer to
* #hal_gpio_interrupt_trigger_t.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @param gpioTrigger The pin trigger mode value.
* @retval kStatus_HAL_GpioSuccess Set successfully.
* @retval kStatus_HAL_GpioError The pin is the ouput setting.
*/
hal_gpio_status_t HAL_GpioSetTriggerMode(hal_gpio_handle_t gpioHandle, hal_gpio_interrupt_trigger_t gpioTrigger);
/*!
* @brief Installs a callback and callback parameter.
*
* This function is used to install the callback and callback parameter for GPIO module.
* When the pin state interrupt happened, the driver will notify the upper layer by the installed callback
* function. After the callback called, the GPIO pin state can be got by calling function #HAL_GpioGetInput.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @param callback The callback function.
* @param callbackParam The parameter of the callback function.
* @retval kStatus_HAL_GpioSuccess Successfully install the callback.
*/
hal_gpio_status_t HAL_GpioInstallCallback(hal_gpio_handle_t gpioHandle,
hal_gpio_callback_t callback,
void *callbackParam);
/*!
* @brief Enables or disables the GPIO wake-up feature.
*
* This function enables or disables the GPIO wake-up feature.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @param enable enable or disable (0 - disable, 1 - enable).
* @retval kStatus_HAL_GpioError An error occurred.
* @retval kStatus_HAL_GpioSuccess Set successfully.
*/
hal_gpio_status_t HAL_GpioWakeUpSetting(hal_gpio_handle_t gpioHandle, uint8_t enable);
/*!
* @brief Prepares to enter low power consumption.
*
* This function is used to prepare to enter low power consumption.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @retval kStatus_HAL_GpioSuccess Successful operation.
*/
hal_gpio_status_t HAL_GpioEnterLowpower(hal_gpio_handle_t gpioHandle);
/*!
* @brief Restores from low power consumption.
*
* This function is used to restore from low power consumption.
*
* @param gpioHandle GPIO handle pointer.
* The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.
* @retval kStatus_HAL_GpioSuccess Successful operation.
*/
hal_gpio_status_t HAL_GpioExitLowpower(hal_gpio_handle_t gpioHandle);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
/*! @}*/
#endif /* __HAL_GPIO_H__ */