The emulated GPIO controller will aid in automated integration testing. Fixes #26477 Signed-off-by: Christopher Friedt <chrisfriedt@gmail.com>
133 lines
3.5 KiB
C
133 lines
3.5 KiB
C
/*
|
|
* Copyright (c) 2020 Friedt Professional Engineering Services, Inc
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Backend API for emulated GPIO
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_EMUL_H_
|
|
#define ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_EMUL_H_
|
|
|
|
#include <zephyr/types.h>
|
|
#include <drivers/gpio.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief Emulated GPIO backend API
|
|
* @defgroup gpio_emul Emulated GPIO
|
|
* @ingroup gpio_interface
|
|
* @{
|
|
*
|
|
* Behaviour of emulated GPIO is application-defined. As-such, each
|
|
* application may
|
|
*
|
|
* - define a Device Tree overlay file to indicate the number of GPIO
|
|
* controllers as well as the number of pins for each controller
|
|
* - register a callback with the GPIO controller using
|
|
* @ref gpio_add_callback to emulate "wiring"
|
|
* - asynchronously call @ref gpio_emul_input_set and / or
|
|
* @ref gpio_emul_input_set_masked in order to emulate GPIO events
|
|
*
|
|
* An example of an appropriate Device Tree overlay file is in
|
|
* tests/drivers/gpio/gpio_basic_api/boards/native_posix_64.overlay.
|
|
*
|
|
* An example of registering a callback to emulate "wiring" as well as
|
|
* an example of calling @ref gpio_emul_input_set is in the file
|
|
* tests/drivers/gpio/gpio_basic_api/src/main.c .
|
|
*/
|
|
|
|
/**
|
|
* @brief Modify the values of one or more emulated GPIO input @p pins
|
|
*
|
|
* @param port The emulated GPIO port
|
|
* @param pins The mask of pins that have changed
|
|
* @param values New values to assign to @p pins
|
|
*
|
|
* @return 0 on success
|
|
* @return -EINVAL if an invalid argument is provided
|
|
*/
|
|
int gpio_emul_input_set_masked(const struct device *port, gpio_port_pins_t pins,
|
|
gpio_port_value_t values);
|
|
|
|
/**
|
|
* @brief Modify the value of one emulated GPIO input @p pin
|
|
*
|
|
* @param port The emulated GPIO port
|
|
* @param pin The pin to modify
|
|
* @param value New values to assign to @p pin
|
|
*
|
|
* @return 0 on success
|
|
* @return -EINVAL if an invalid argument is provided
|
|
*/
|
|
static inline int gpio_emul_input_set(const struct device *port, gpio_pin_t pin,
|
|
int value)
|
|
{
|
|
return gpio_emul_input_set_masked(port, BIT(pin), value ? BIT(pin) : 0);
|
|
}
|
|
|
|
/**
|
|
* @brief Read the value of one or more emulated GPIO output @p pins
|
|
*
|
|
* @param port The emulated GPIO port
|
|
* @param pins The mask of pins that have changed
|
|
* @param values A pointer to where the value of @p pins will be stored
|
|
*
|
|
* @return 0 on success
|
|
* @return -EINVAL if an invalid argument is provided
|
|
*/
|
|
int gpio_emul_output_get_masked(const struct device *port, gpio_port_pins_t pins,
|
|
gpio_port_value_t *values);
|
|
|
|
/**
|
|
* @brief Read the value of one emulated GPIO output @p pin
|
|
*
|
|
* @param port The emulated GPIO port
|
|
* @param pin The pin to read
|
|
*
|
|
* @return 0 or 1 on success
|
|
* @return -EINVAL if an invalid argument is provided
|
|
*/
|
|
static inline int gpio_emul_output_get(const struct device *port, gpio_pin_t pin)
|
|
{
|
|
int ret;
|
|
gpio_port_value_t values;
|
|
|
|
ret = gpio_emul_output_get_masked(port, BIT(pin), &values);
|
|
if (ret == 0) {
|
|
ret = (values & BIT(pin)) ? 1 : 0;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* @brief Get @p flags for a given emulated GPIO @p pin
|
|
*
|
|
* For more information on available flags, see @ref gpio_interface.
|
|
*
|
|
* @param port The emulated GPIO port
|
|
* @param pin The pin to retrieve @p flags for
|
|
* @param flags a pointer to where the flags for @p pin will be stored
|
|
*
|
|
* @return 0 on success
|
|
* @return -EINVAL if an invalid argument is provided
|
|
*/
|
|
int gpio_emul_flags_get(const struct device *port, gpio_pin_t pin, gpio_flags_t *flags);
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_DRIVERS_GPIO_GPIO_EMUL_H_ */
|