/* * Copyright (c) 2019-2021, Erich Styger * All rights reserved. * * Driver for GPIO pins * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef McuGPIO_H_ #define McuGPIO_H_ #include #include #include "McuLib.h" #if McuLib_CONFIG_NXP_SDK_USED #include "fsl_gpio.h" #if McuLib_CONFIG_IS_KINETIS_KE #include "fsl_port.h" #elif McuLib_CONFIG_CPU_IS_IMXRT #include "fsl_iomuxc.h" #endif #elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX #include #elif McuLib_CONFIG_CPU_IS_STM32 #include "stm32f3xx_hal.h" #elif McuLib_CONFIG_CPU_IS_ESP32 #include "driver/gpio.h" #elif McuLib_CONFIG_CPU_IS_RPxxxx #include "hardware/gpio.h" #endif #include "McuLibconfig.h" #include "McuGPIOconfig.h" #include #ifdef __cplusplus extern "C" { #endif typedef enum McuGPIO_PullType { McuGPIO_PULL_DISABLE, McuGPIO_PULL_UP, McuGPIO_PULL_DOWN, } McuGPIO_PullType; typedef struct McuGPIO_Dummy_s { int dummy; } McuGPIO_Dummy_s; /*!< using a pointer to a struct instead a pointer to void for handle, used for handle type 'safety' only */ typedef McuGPIO_Dummy_s *McuGPIO_Handle_t; /*!< GPIO handle type */ typedef struct McuGPIO_HwPin_t { #if McuLib_CONFIG_NXP_SDK_USED && !McuLib_CONFIG_IS_KINETIS_KE GPIO_Type *gpio; /* pointer to GPIO */ #elif McuLib_CONFIG_CPU_IS_STM32 GPIO_TypeDef *gpio; #elif McuLib_CONFIG_SDK_VERSION_USED==McuLib_CONFIG_SDK_LINUX struct gpiod_chip *chip; /* must be retrieved once, e.g.e with gpiod_chip_open_by_name("gpiochip0") */ const char *name; /* assigned name for the pin */ #endif #if McuLib_CONFIG_CPU_IS_KINETIS PORT_Type *port; /* pointer to port, e.g. PORTA, for KE this is PORT */ #if McuLib_CONFIG_IS_KINETIS_KE port_type_t portType; /* e.g. kPORT_PTH */ gpio_port_num_t portNum; /* e.g. kGPIO_PORTH */ #endif #elif McuLib_CONFIG_CPU_IS_LPC && McuLib_CONFIG_CORTEX_M==0 uint32_t port; /* port number */ uint8_t iocon; /* I/O Connection index used for muxing, e.g. IOCON_INDEX_PIO0_0 */ #elif McuLib_CONFIG_CPU_IS_LPC uint32_t port; /* port number */ #elif McuLib_CONFIG_CPU_IS_MCX PORT_Type *port; /* e.g. PORT0 */ #elif McuLib_CONFIG_CPU_IS_IMXRT /* Information needed for IOMUXC_SetPinMux(), provided e.g. with IOMUXC_GPIO_AD_B0_09_GPIO1_IO09. * Set it e.g. with * McuGPIO_SetMux(&config.hw, IOMUXC_GPIO_AD_B0_09_GPIO1_IO09); */ struct { uint32_t muxRegister; /* pin mux register */ uint32_t muxMode; /* pin mux mode */ uint32_t inputRegister; /* select input register */ uint32_t inputDaisy; /* the input daisy */ uint32_t configRegister; /* the configuration register */ } mux; #endif #if McuLib_CONFIG_CPU_IS_ESP32 gpio_num_t pin; /* pin number, e.g. GPIO_NUM_10 */ #else uint32_t pin; /* pin number */ #endif McuGPIO_PullType pull; /* pull resistor configuration */ } McuGPIO_HwPin_t; typedef struct McuGPIO_Config_t { bool isInput; bool isHighOnInit; McuGPIO_HwPin_t hw; } McuGPIO_Config_t; #if McuLib_CONFIG_CPU_IS_IMXRT /*! * \brief Used to set the Muxing configuration. * Usage: McuGPIO_SetMux(&config.hw, IOMUXC_GPIO_AD_B0_09_GPIO1_IO09); * @param hw Pointer to hardware struct * @param muxRegister The muxing register * @param muxMode The muxing mode * @param inputRegister The input register, 0 for not used * @param inputDaisy The input daisy value * @param configRegister The configuration register */ void McuGPIO_SetMux(McuGPIO_HwPin_t *hw, uint32_t muxRegister, uint32_t muxMode, uint32_t inputRegister, uint32_t inputDaisy, uint32_t configRegister); #endif void McuGPIO_GetDefaultConfig(McuGPIO_Config_t *config); McuGPIO_Handle_t McuGPIO_InitGPIO(McuGPIO_Config_t *config); McuGPIO_Handle_t McuGPIO_DeinitGPIO(McuGPIO_Handle_t gpio); void McuGPIO_SetAsInput(McuGPIO_Handle_t gpio); void McuGPIO_SetAsOutput(McuGPIO_Handle_t gpio, bool setHigh); bool McuGPIO_IsInput(McuGPIO_Handle_t gpio); bool McuGPIO_IsOutput(McuGPIO_Handle_t gpio); void McuGPIO_SetLow(McuGPIO_Handle_t gpio); void McuGPIO_SetHigh(McuGPIO_Handle_t gpio); void McuGPIO_Toggle(McuGPIO_Handle_t gpio); bool McuGPIO_IsLow(McuGPIO_Handle_t gpio); bool McuGPIO_IsHigh(McuGPIO_Handle_t gpio); void McuGPIO_SetValue(McuGPIO_Handle_t gpio, bool val); bool McuGPIO_GetValue(McuGPIO_Handle_t gpio); void McuGPIO_GetPinStatusString(McuGPIO_Handle_t gpio, unsigned char *buf, size_t bufSize); void McuGPIO_SetPullResistor(McuGPIO_Handle_t gpio, McuGPIO_PullType pull); /* driver initialization */ void McuGPIO_Init(void); /* driver de-initialization */ void McuGPIO_Deinit(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* McuGPIO_H_ */