/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
/**
* @addtogroup GPIO
* @{
*
* @brief Provides standard general-purpose input/output (GPIO) interfaces for driver development.
*
* You can use this module to perform operations on a GPIO pin, including setting the input/output direction,
* reading/writing the level value, and setting the interrupt service routine (ISR) function.
*
* @since 1.0
*/
/**
* @file gpio_if.h
*
* @brief Declares the standard GPIO interface functions.
*
* @since 1.0
*/
#ifndef GPIO_IF_H
#define GPIO_IF_H
#include "platform_if.h"
#include "osal_irq.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
/**
* @brief Enumerates GPIO level values.
*
* @since 1.0
*/
enum GpioValue {
GPIO_VAL_LOW = 0, /**< Low GPIO level */
GPIO_VAL_HIGH = 1, /**< High GPIO level */
GPIO_VAL_ERR, /**< Invalid GPIO level */
};
/**
* @brief Enumerates GPIO directions.
*
* @since 1.0
*/
enum GpioDirType {
GPIO_DIR_IN = 0, /**< Input direction */
GPIO_DIR_OUT = 1, /**< Output direction */
GPIO_DIR_ERR, /**< Invalid direction */
};
/**
* @brief Enumerates GPIO irq types.
*
* @since 1.0
*/
enum GpioIrqType {
/** Trigger is not set */
GPIO_IRQ_TRIGGER_NONE = OSAL_IRQF_TRIGGER_NONE,
/** Rising edge triggered */
GPIO_IRQ_TRIGGER_RISING = OSAL_IRQF_TRIGGER_RISING,
/** Falling edge triggered */
GPIO_IRQ_TRIGGER_FALLING = OSAL_IRQF_TRIGGER_FALLING,
/** High-level triggered */
GPIO_IRQ_TRIGGER_HIGH = OSAL_IRQF_TRIGGER_HIGH,
/** Low-level triggered */
GPIO_IRQ_TRIGGER_LOW = OSAL_IRQF_TRIGGER_LOW,
/** execute interrupt service routine in thread context */
GPIO_IRQ_USING_THREAD = (0x1 << 8),
};
/**
* @brief Defines the function type of a GPIO interrupt service routine (ISR).
*
* This function is used when you call {@link GpioSetIrq} to register the ISR for a GPIO pin.
*
* @param gpio Indicates the GPIO number of the ISR.
* @param data Indicates the pointer to the private data passed to this ISR (The data is specified when the ISR
* is registered).
*
* @return Returns 0 if the ISR function type is successfully defined; returns a negative value otherwise.
* @see GpioSetIrq
* @since 1.0
*/
typedef int32_t (*GpioIrqFunc)(uint16_t gpio, void *data);
/**
* @brief Reads the level value of a GPIO pin.
*
* Before using this function, you need to call {@link GpioSetDir} to set the GPIO pin direction to input.
*
* @param gpio Indicates the GPIO pin number.
* @param val Indicates the pointer to the read level value. For details, see {@link GpioValue}.
*
* @return Returns 0 if the GPIO pin level value is successfully read; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioRead(uint16_t gpio, uint16_t *val);
/**
* @brief Writes the level value for a GPIO pin.
*
* Before using this function, you need to call {@link GpioSetDir} to set the GPIO pin direction to output.
*
* @param gpio Indicates the GPIO pin number.
* @param val Indicates the level value to be written. For details, see {@link GpioValue}.
*
* @return Returns 0 if the GPIO pin level value is successfully written; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioWrite(uint16_t gpio, uint16_t val);
/**
* @brief Sets the input/output direction for a GPIO pin.
*
* Generally, you can set the direction to input when external level signals need to be read, and set the
* direction to output when the level signals need to be sent externally.
*
* @param gpio Indicates the GPIO pin number.
* @param dir Indicates the direction to set. For details, see {@link GpioDirType}.
*
* @return Returns 0 if the GPIO pin direction is successfully set; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioSetDir(uint16_t gpio, uint16_t dir);
/**
* @brief Obtains the input/output direction of a GPIO pin.
*
* @param gpio Indicates the GPIO pin number.
* @param dir Indicates the pointer to the obtained input/output direction. For details, see {@link GpioDirType}.
*
* @return Returns 0 if the GPIO pin direction is successfully obtained; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioGetDir(uint16_t gpio, uint16_t *dir);
/**
* @brief Sets the ISR function for a GPIO pin.
*
* Before using a GPIO pin as an interrupt, you must call this function to set an ISR function for this GPIO pin,
* including the ISR parameters and the interrupt trigger mode.
* After the setting is successful, you also need to call {@link GpioEnableIrq} to enable the interrupt, so that
* the ISR function can respond correctly.
*
* @param gpio Indicates the GPIO pin number.
* @param mode Indicates the interrupt trigger mode. For details, see {@link OSAL_IRQF_TRIGGER_RISING}.
* @param func Indicates the ISR function to set, which is specified by {@link GpioIrqFunc}.
* @param arg Indicates the pointer to the parameters passed to the ISR function.
*
* @return Returns 0 if the ISR function of the GPIO pin is successfully set; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg);
/**
* @brief Cancels the setting of the ISR function for a GPIO pin.
*
* If you do not need the GPIO pin as an interrupt, call this function to cancel the ISR function set via
* {@link GpioSetIrq}. Since this ISR function is no longer valid, you are advised to use {@link GpioDisableIrq} to
* disable the GPIO pin interrupt.
*
* @param gpio Indicates the GPIO pin number.
* @param arg Indicates the pointer to the parameters passed to the ISR function.
*
* @return Returns 0 if the ISR function of the GPIO pin is successfully cancelled; returns a negative value
* otherwise.
* @since 1.0
*/
int32_t GpioUnsetIrq(uint16_t gpio, void *arg);
/**
* @brief Enables a GPIO pin interrupt.
*
* Before enabling the interrupt, you must call {@link GpioSetIrq} to set the ISR function for the GPIO pin.
*
* @param gpio Indicates the GPIO pin number.
*
* @return Returns 0 if the GPIO pin interrupt is successfully enabled; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioEnableIrq(uint16_t gpio);
/**
* @brief Disables a GPIO pin interrupt.
*
* You can call this function when you need to temporarily mask a GPIO pin interrupt or cancel an ISR function.
*
* @param gpio Indicates the GPIO pin number.
*
* @return Returns 0 if the GPIO pin interrupt is successfully disabled; returns a negative value otherwise.
* @since 1.0
*/
int32_t GpioDisableIrq(uint16_t gpio);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* GPIO_IF_H */
/** @} */