From 06de47fd27cac8dc58a0529527c8dad3e1825197 Mon Sep 17 00:00:00 2001 From: Nascs Date: Tue, 2 Jan 2024 10:14:19 +0000 Subject: [PATCH] gpio: add pull up/down flags Signed-off-by: Nascs Co-authored-by: ZHANG Yuntian --- api/mraa/gpio.h | 1 + include/gpio/gpio_chardev.h | 3 +++ include/linux/gpio.h | 6 ++++++ src/gpio/gpio.c | 9 +++++++++ src/gpio/gpio_chardev.c | 18 ++++++++++++++++++ 5 files changed, 37 insertions(+) diff --git a/api/mraa/gpio.h b/api/mraa/gpio.h index ce48f820c..4ef6aebd4 100644 --- a/api/mraa/gpio.h +++ b/api/mraa/gpio.h @@ -67,6 +67,7 @@ typedef enum { MRAA_GPIOD_ACTIVE_LOW = 4, MRAA_GPIOD_OPEN_DRAIN = 5, MRAA_GPIOD_OPEN_SOURCE = 6, + MRAA_GPIOD_BIAS_DISABLE = 7, } mraa_gpio_mode_t; /** diff --git a/include/gpio/gpio_chardev.h b/include/gpio/gpio_chardev.h index 5f018ae52..7ddf9b683 100644 --- a/include/gpio/gpio_chardev.h +++ b/include/gpio/gpio_chardev.h @@ -46,6 +46,9 @@ mraa_boolean_t mraa_is_gpio_line_dir_out(mraa_gpiod_line_info *linfo); mraa_boolean_t mraa_is_gpio_line_active_low(mraa_gpiod_line_info *linfo); mraa_boolean_t mraa_is_gpio_line_open_drain(mraa_gpiod_line_info *linfo); mraa_boolean_t mraa_is_gpio_line_open_source(mraa_gpiod_line_info *linfo); +mraa_boolean_t mraa_is_gpio_line_bias_pull_up(mraa_gpiod_line_info *linfo); +mraa_boolean_t mraa_is_gpio_line_bias_pull_down(mraa_gpiod_line_info *linfo); +mraa_boolean_t mraa_is_gpio_line_bias_disable(mraa_gpiod_line_info *linfo); int mraa_get_number_of_gpio_chips(); int mraa_get_chip_infos(mraa_gpiod_chip_info*** cinfos); diff --git a/include/linux/gpio.h b/include/linux/gpio.h index 8451032c6..cb5ad75b9 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h @@ -21,6 +21,9 @@ struct gpiochip_info { #define GPIOLINE_FLAG_ACTIVE_LOW (1UL << 2) #define GPIOLINE_FLAG_OPEN_DRAIN (1UL << 3) #define GPIOLINE_FLAG_OPEN_SOURCE (1UL << 4) +#define GPIOLINE_FLAG_BIAS_PULL_UP (1UL << 5) +#define GPIOLINE_FLAG_BIAS_PULL_DOWN (1UL << 6) +#define GPIOLINE_FLAG_BIAS_DISABLE (1UL << 7) struct gpioline_info { __u32 line_offset; @@ -36,6 +39,9 @@ struct gpioline_info { #define GPIOHANDLE_REQUEST_ACTIVE_LOW (1UL << 2) #define GPIOHANDLE_REQUEST_OPEN_DRAIN (1UL << 3) #define GPIOHANDLE_REQUEST_OPEN_SOURCE (1UL << 4) +#define GPIOHANDLE_REQUEST_BIAS_PULL_UP (1UL << 5) +#define GPIOHANDLE_REQUEST_BIAS_PULL_DOWN (1UL << 6) +#define GPIOHANDLE_REQUEST_BIAS_DISABLE (1UL << 7) struct gpiohandle_request { __u32 lineoffsets[GPIOHANDLES_MAX]; diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index f13081f51..b54339b7a 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -1110,6 +1110,15 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode) case MRAA_GPIOD_OPEN_SOURCE: flags |= GPIOHANDLE_REQUEST_OPEN_SOURCE; break; + case MRAA_GPIO_PULLUP: + flags |= GPIOHANDLE_REQUEST_BIAS_PULL_UP; + break; + case MRAA_GPIO_PULLDOWN: + flags |= GPIOHANDLE_REQUEST_BIAS_PULL_DOWN; + break; + case MRAA_GPIOD_BIAS_DISABLE: + flags |= GPIOHANDLE_REQUEST_BIAS_DISABLE; + break; default: return MRAA_ERROR_FEATURE_NOT_IMPLEMENTED; } diff --git a/src/gpio/gpio_chardev.c b/src/gpio/gpio_chardev.c index 9f727de71..0d12b8abb 100644 --- a/src/gpio/gpio_chardev.c +++ b/src/gpio/gpio_chardev.c @@ -429,6 +429,24 @@ mraa_is_gpio_line_open_source(mraa_gpiod_line_info* linfo) return (linfo->flags & GPIOLINE_FLAG_OPEN_SOURCE); } +mraa_boolean_t +mraa_is_gpio_line_bias_pull_up(mraa_gpiod_line_info* linfo) +{ + return (linfo->flags & GPIOLINE_FLAG_BIAS_PULL_UP); +} + +mraa_boolean_t +mraa_is_gpio_line_bias_pull_down(mraa_gpiod_line_info* linfo) +{ + return (linfo->flags & GPIOLINE_FLAG_BIAS_PULL_DOWN); +} + +mraa_boolean_t +mraa_is_gpio_line_bias_disable(mraa_gpiod_line_info* linfo) +{ + return (linfo->flags & GPIOLINE_FLAG_BIAS_DISABLE); +} + static int dir_filter(const struct dirent* dir) {