diff --git a/api/mraa/gpio.h b/api/mraa/gpio.h index 17274ee..b0580b1 100644 --- a/api/mraa/gpio.h +++ b/api/mraa/gpio.h @@ -92,6 +92,15 @@ typedef enum { MRAA_GPIO_ACTIVE_LOW = 1, /**< Resistive Low */ } mraa_gpio_input_mode_t; + +/** + * Gpio output driver modes + */ +typedef enum { + MRAA_GPIO_OPEN_DRAIN = 0, /**< Open Drain Configuration */ + MRAA_GPIO_PUSH_PULL = 1, /**< Push Pull Configuration */ +} mraa_gpio_out_driver_mode_t; + /** * Initialise gpio_context, based on board number * @@ -235,6 +244,14 @@ int mraa_gpio_get_pin_raw(mraa_gpio_context dev); */ mraa_result_t mraa_gpio_input_mode(mraa_gpio_context dev, mraa_gpio_input_mode_t); +/** + * Set Gpio output driver mode. This is not a standard feature, it needs custom implementation for each board + * + * @param dev The Gpio context + * @param mode Set output driver mode + * @return Result of operation + */ +mraa_result_t mraa_gpio_out_driver_mode(mraa_gpio_context dev, mraa_gpio_out_driver_mode_t mode); #ifdef __cplusplus } diff --git a/api/mraa/gpio.hpp b/api/mraa/gpio.hpp index dfec54e..a79a059 100644 --- a/api/mraa/gpio.hpp +++ b/api/mraa/gpio.hpp @@ -77,6 +77,14 @@ typedef enum { MODE_IN_ACTIVE_LOW = 1, /**< Resistive Low */ } InputMode; +/** + * Gpio output driver modes + */ +typedef enum { + MODE_OUT_OPEN_DRAIN = 0, /**< Open Drain Configuration */ + MODE_OUT_PUSH_PULL = 1, /**< Push Pull Configuration */ +} OutputMode; + /** * @brief API to General Purpose IO * @@ -336,6 +344,17 @@ class Gpio return (Result )mraa_gpio_input_mode(m_gpio, (mraa_gpio_input_mode_t) mode); } + /** + * Change Gpio output driver mode + * + * @param mode @param mode Set output driver mode + * @return Result of operation + */ + Result + outputMode(OutputMode mode) + { + return (Result) mraa_gpio_out_driver_mode(m_gpio, (mraa_gpio_out_driver_mode_t) mode); + } private: mraa_gpio_context m_gpio; diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index dbe471d..5cd9dc7 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -59,6 +59,7 @@ typedef struct { mraa_result_t (*gpio_wait_interrupt_replace) (mraa_gpio_context dev); mraa_result_t (*gpio_isr_replace) (mraa_gpio_context dev, mraa_gpio_edge_t mode, void (*fptr)(void*), void* args); mraa_result_t (*gpio_isr_exit_replace) (mraa_gpio_context dev); + mraa_result_t (*gpio_out_driver_mode_replace) (mraa_gpio_context dev, mraa_gpio_out_driver_mode_t mode); mraa_result_t (*i2c_init_pre) (unsigned int bus); mraa_result_t (*i2c_init_bus_replace) (mraa_i2c_context dev); diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index ca86e34..e24dba8 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -881,3 +881,20 @@ mraa_gpio_input_mode(mraa_gpio_context dev, mraa_gpio_input_mode_t mode) return MRAA_SUCCESS; } + + +mraa_result_t +mraa_gpio_out_driver_mode(mraa_gpio_context dev, mraa_gpio_out_driver_mode_t mode) +{ + if (dev == NULL) { + syslog(LOG_ERR, "gpio: write: context is invalid"); + return MRAA_ERROR_INVALID_HANDLE; + } + + if (IS_FUNC_DEFINED(dev, gpio_out_driver_mode_replace)) { + return dev->advance_func->gpio_out_driver_mode_replace(dev, mode); + } + else { + return MRAA_ERROR_FEATURE_NOT_SUPPORTED; + } +}