/*! * \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 #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__