OpenRTX/openrtx/include/peripherals/gpio.h

247 wiersze
7.5 KiB
C
Czysty Zwykły widok Historia

2020-10-01 07:42:24 +00:00
/***************************************************************************
* Copyright (C) 2020 - 2024 by Silvano Seva IU2KWO *
2020-10-01 07:42:24 +00:00
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#ifndef GPIO_H
#define GPIO_H
#include <stdint.h>
#include <stdbool.h>
#include <gpio-native.h>
2020-10-01 07:42:24 +00:00
#ifdef __cplusplus
extern "C" {
#endif
2020-10-01 07:42:24 +00:00
/**
* This file provides the common interface for gpio management. Two interfaces
* are available:
*
* 1) gpioDev interface, designed to be common to all the architectures and
* devices but, due to this, slow.
* 2) gpio interface, available only for MCUs, dependent on the underlying
* architecture and device and faster than gpioDev.
*
* MCU gpio interface consists of the following functions, which have to be
* defined in gpio-native.h:
*
* void gpio_setMode(void *port, const uint8_t pin, const uint16_t mode);
* void gpio_setPin(void *port, const uint8_t pin);
* void gpio_clearPin(void *port, const uint8_t pin);
* uint8_t gpio_readPin(const void *port, const uint8_t pin);
*
* Usage and parameters are identical to their gpioDev counterparts.
*/
/**
* gpio functional modes.
* For more details see the documentation of the gpio peripheral.
2020-10-01 07:42:24 +00:00
*/
enum Mode
{
INPUT = 0, ///< Input, floating
INPUT_PULL_UP = 1, ///< Input, with pull-up
INPUT_PULL_DOWN = 2, ///< Input, with pull-down
ANALOG = 3, ///< Analog
OUTPUT = 4, ///< Output, push pull
OPEN_DRAIN = 5, ///< Output, open drain
OPEN_DRAIN_PU = 6, ///< Output, open drain with pull-up
ALTERNATE = 7, ///< Alternate function
ALTERNATE_OD = 8, ///< Alternate function, open drain
ALTERNATE_OD_PU = 9 ///< Alternate function, open drain with pull-up
};
/**
* Helper macro to set gpio alternate function number.
*/
#define ALTERNATE_FUNC(x) (x << 8)
struct gpioDev;
/**
* Gpio device driver API.
*/
struct gpioApi
{
/**
* Configure gpio pin functional mode.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
* @param mode: bit 7:0 set gpio functional mode, bit 15:8 manage gpio alternate
* function mapping.
* @return zero on success, a negative error code otherwise.
*/
int (*mode)(const struct gpioDev *dev, const uint8_t pin, const uint16_t mode);
/**
* Set gpio pin to logic high level.
* NOTE: this function does not guarantee that the operation is performed atomically.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
*/
void (*set)(const struct gpioDev *dev, const uint8_t pin);
/**
* Set gpio pin to logic low level.
* NOTE: this function does not guarantee that the operation is performed atomically.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
*/
void (*clear)(const struct gpioDev *dev, const uint8_t pin);
/**
* Read gpio pin's logic level.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
* @return true if pin is at high logic level, 0 if pin is at low logic level.
*/
bool (*read)(const struct gpioDev *dev, const uint8_t pin);
};
/**
* Gpio device descriptor.
*/
struct gpioDev
{
const struct gpioApi *api; ///< Pointer to device driver API
const void *priv; ///< Pointer to device data
};
/**
* Gpio pin descriptor, general form.
*/
struct gpioPin
{
const struct gpioDev *port; ///< Pointer to the gpio device
const uint8_t pin; ///< Gpio pin number
2020-10-01 07:42:24 +00:00
};
/**
* Gpio pin descriptor, for native MCU gpios.
2020-10-01 07:42:24 +00:00
*/
struct gpio
2020-10-01 07:42:24 +00:00
{
const void *port; ///< Pointer to gpio port
const uint8_t pin; ///< Gpio pin number
2020-10-01 07:42:24 +00:00
};
/**
* Configure gpio pin functional mode.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
* @param mode: bit 7:0 set gpio functional mode, bit 15:8 manage gpio alternate
* function mapping.
* @return zero on success, a negative error code otherwise.
2020-10-01 07:42:24 +00:00
*/
static inline int gpioDev_setMode(const struct gpioDev *port, const uint8_t pin,
const uint16_t mode)
{
return port->api->mode(port, pin, mode);
}
2020-10-01 07:42:24 +00:00
/**
* Set gpio pin to logic high level.
* NOTE: this function does not guarantee that the operation is performed atomically.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
2020-10-01 07:42:24 +00:00
*/
static inline void gpioDev_set(const struct gpioDev *port, const uint8_t pin)
{
port->api->set(port, pin);
}
/**
* Set gpio pin to logic low level.
* NOTE: this function does not guarantee that the operation is performed atomically.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
*/
static inline void gpioDev_clear(const struct gpioDev *port, const uint8_t pin)
{
port->api->clear(port, pin);
}
2020-10-01 07:42:24 +00:00
/**
* Read gpio pin's logic level.
*
* @param port: device handling the gpio port.
* @param pin: gpio pin number.
* @return true if pin is at high logic level, 0 if pin is at low logic level.
2020-10-01 07:42:24 +00:00
*/
static inline bool gpioDev_read(const struct gpioDev *port, const uint8_t pin)
{
return port->api->read(port, pin);
}
2020-10-01 07:42:24 +00:00
/**
* Configure gpio pin functional mode.
*
* @param gpio: pointer to GPIO pin descriptor.
* @param mode: bit 7:0 set gpio functional mode, bit 15:8 manage gpio alternate
* function mapping.
* @return zero on success, a negative error code otherwise.
2020-10-01 07:42:24 +00:00
*/
static inline int gpioPin_setMode(const struct gpioPin *gpio, const uint16_t mode)
{
return gpio->port->api->mode(gpio->port, gpio->pin, mode);
}
2020-10-01 07:42:24 +00:00
/**
* Set gpio pin to logic high level.
* NOTE: this function does not guarantee that the operation is performed atomically.
*
* @param gpio: pointer to GPIO pin descriptor.
2020-10-01 07:42:24 +00:00
*/
static inline void gpioPin_set(const struct gpioPin *gpio)
{
gpio->port->api->set(gpio->port, gpio->pin);
}
2020-10-01 07:42:24 +00:00
/**
* Set gpio pin to logic low level.
* NOTE: this function does not guarantee that the operation is performed atomically.
*
* @param gpio: pointer to GPIO pin descriptor.
2020-10-01 07:42:24 +00:00
*/
static inline void gpioPin_clear(const struct gpioPin *gpio)
{
gpio->port->api->clear(gpio->port, gpio->pin);
}
2020-10-01 07:42:24 +00:00
/**
* Read gpio pin's logic level.
*
* @param gpio: pointer to GPIO pin descriptor.
* @return true if pin is at high logic level, 0 if pin is at low logic level.
2020-10-01 07:42:24 +00:00
*/
static inline bool gpioPin_read(const struct gpioPin *gpio)
{
return gpio->port->api->read(gpio->port, gpio->pin);
}
2020-10-01 07:42:24 +00:00
#ifdef __cplusplus
}
#endif
2020-10-01 07:42:24 +00:00
#endif /* GPIO_H */