
fix Security breach found by Tencent Blade Team please refer to security advisory - CVE-2020-11068
192 lines
4.3 KiB
C
192 lines
4.3 KiB
C
/*!
|
|
* \file gpio.h
|
|
*
|
|
* \brief GPIO driver implementation
|
|
*
|
|
* \remark: Relies on the specific board GPIO implementation as well as on
|
|
* IO expander driver implementation if one is available on the target
|
|
* board.
|
|
*
|
|
* \copyright Revised BSD License, see section \ref LICENSE.
|
|
*
|
|
* \code
|
|
* ______ _
|
|
* / _____) _ | |
|
|
* ( (____ _____ ____ _| |_ _____ ____| |__
|
|
* \____ \| ___ | (_ _) ___ |/ ___) _ \
|
|
* _____) ) ____| | | || |_| ____( (___| | | |
|
|
* (______/|_____)_|_|_| \__)_____)\____)_| |_|
|
|
* (C)2013-2017 Semtech
|
|
*
|
|
* \endcode
|
|
*
|
|
* \author Miguel Luis ( Semtech )
|
|
*
|
|
* \author Gregory Cristian ( Semtech )
|
|
*/
|
|
#ifndef __GPIO_H__
|
|
#define __GPIO_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include "pinName-board.h"
|
|
#include "pinName-ioe.h"
|
|
|
|
/*!
|
|
* Board GPIO pin names
|
|
*/
|
|
typedef enum
|
|
{
|
|
MCU_PINS,
|
|
IOE_PINS,
|
|
|
|
// Not connected
|
|
NC = (int)0xFFFFFFFF
|
|
}PinNames;
|
|
|
|
/*!
|
|
* Operation Mode for the GPIO
|
|
*/
|
|
typedef enum
|
|
{
|
|
PIN_INPUT = 0,
|
|
PIN_OUTPUT,
|
|
PIN_ALTERNATE_FCT,
|
|
PIN_ANALOGIC
|
|
}PinModes;
|
|
|
|
/*!
|
|
* Add a pull-up, a pull-down or nothing on the GPIO line
|
|
*/
|
|
typedef enum
|
|
{
|
|
PIN_NO_PULL = 0,
|
|
PIN_PULL_UP,
|
|
PIN_PULL_DOWN
|
|
}PinTypes;
|
|
|
|
/*!
|
|
* Define the GPIO as Push-pull type or Open Drain
|
|
*/
|
|
typedef enum
|
|
{
|
|
PIN_PUSH_PULL = 0,
|
|
PIN_OPEN_DRAIN
|
|
}PinConfigs;
|
|
|
|
/*!
|
|
* Define the GPIO IRQ on a rising, falling or both edges
|
|
*/
|
|
typedef enum
|
|
{
|
|
NO_IRQ = 0,
|
|
IRQ_RISING_EDGE,
|
|
IRQ_FALLING_EDGE,
|
|
IRQ_RISING_FALLING_EDGE
|
|
}IrqModes;
|
|
|
|
/*!
|
|
* Define the IRQ priority on the GPIO
|
|
*/
|
|
typedef enum
|
|
{
|
|
IRQ_VERY_LOW_PRIORITY = 0,
|
|
IRQ_LOW_PRIORITY,
|
|
IRQ_MEDIUM_PRIORITY,
|
|
IRQ_HIGH_PRIORITY,
|
|
IRQ_VERY_HIGH_PRIORITY
|
|
}IrqPriorities;
|
|
|
|
/*!
|
|
* GPIO IRQ handler function prototype
|
|
*/
|
|
typedef void( GpioIrqHandler )( void* context );
|
|
|
|
/*!
|
|
* Structure for the GPIO
|
|
*/
|
|
typedef struct
|
|
{
|
|
PinNames pin;
|
|
uint16_t pinIndex;
|
|
void *port;
|
|
uint16_t portIndex;
|
|
PinTypes pull;
|
|
void* Context;
|
|
GpioIrqHandler* IrqHandler;
|
|
}Gpio_t;
|
|
|
|
/*!
|
|
* \brief Initializes the given GPIO object
|
|
*
|
|
* \param [IN] obj Pointer to the GPIO object
|
|
* \param [IN] pin Pin name ( please look in pinName-board.h file )
|
|
* \param [IN] mode Pin mode [PIN_INPUT, PIN_OUTPUT,
|
|
* PIN_ALTERNATE_FCT, PIN_ANALOGIC]
|
|
* \param [IN] config Pin config [PIN_PUSH_PULL, PIN_OPEN_DRAIN]
|
|
* \param [IN] type Pin type [PIN_NO_PULL, PIN_PULL_UP, PIN_PULL_DOWN]
|
|
* \param [IN] value Default output value at initialization
|
|
*/
|
|
void GpioInit( Gpio_t *obj, PinNames pin, PinModes mode, PinConfigs config, PinTypes type, uint32_t value );
|
|
|
|
/*!
|
|
* \brief Sets a user defined object pointer
|
|
*
|
|
* \param [IN] context User defined data object pointer to pass back
|
|
* on IRQ handler callback
|
|
*/
|
|
void GpioSetContext( Gpio_t *obj, void* context );
|
|
|
|
/*!
|
|
* \brief GPIO IRQ Initialization
|
|
*
|
|
* \param [IN] obj Pointer to the GPIO object
|
|
* \param [IN] irqMode IRQ mode [NO_IRQ, IRQ_RISING_EDGE,
|
|
* IRQ_FALLING_EDGE, IRQ_RISING_FALLING_EDGE]
|
|
* \param [IN] irqPriority IRQ priority [IRQ_VERY_LOW_PRIORITY, IRQ_LOW_PRIORITY
|
|
* IRQ_MEDIUM_PRIORITY, IRQ_HIGH_PRIORITY
|
|
* IRQ_VERY_HIGH_PRIORITY]
|
|
* \param [IN] irqHandler Callback function pointer
|
|
*/
|
|
void GpioSetInterrupt( Gpio_t *obj, IrqModes irqMode, IrqPriorities irqPriority, GpioIrqHandler *irqHandler );
|
|
|
|
/*!
|
|
* \brief Removes the interrupt from the object
|
|
*
|
|
* \param [IN] obj Pointer to the GPIO object
|
|
*/
|
|
void GpioRemoveInterrupt( Gpio_t *obj );
|
|
|
|
/*!
|
|
* \brief Writes the given value to the GPIO output
|
|
*
|
|
* \param [IN] obj Pointer to the GPIO object
|
|
* \param [IN] value New GPIO output value
|
|
*/
|
|
void GpioWrite( Gpio_t *obj, uint32_t value );
|
|
|
|
/*!
|
|
* \brief Toggle the value to the GPIO output
|
|
*
|
|
* \param [IN] obj Pointer to the GPIO object
|
|
*/
|
|
void GpioToggle( Gpio_t *obj );
|
|
|
|
/*!
|
|
* \brief Reads the current GPIO input value
|
|
*
|
|
* \param [IN] obj Pointer to the GPIO object
|
|
* \retval value Current GPIO input value
|
|
*/
|
|
uint32_t GpioRead( Gpio_t *obj );
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __GPIO_H__
|