Files
MSE-SoftwEng/pico-sensor/McuLib/src/McuGPIO.h
2025-05-06 13:07:01 +00:00

146 lines
4.6 KiB
C

/*
* 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 <stdint.h>
#include <stddef.h>
#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 <gpiod.h>
#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 <stdbool.h>
#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_ */