From 56a11363dea6e5dc4b35cbdf99b174389c08750f Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Mon, 18 Jan 2021 07:11:20 +0100 Subject: [PATCH] gpio: chardev: Add helper to retrieve gpiochip and line offset by line name This makes the retrieval robust against chips being reordered during boot. The results can be used to fill out mraa_pin_t while initializing a board. Signed-off-by: Jan Kiszka --- include/gpio/gpio_chardev.h | 2 ++ src/gpio/gpio_chardev.c | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/gpio/gpio_chardev.h b/include/gpio/gpio_chardev.h index 6e29c42..dc3d02f 100644 --- a/include/gpio/gpio_chardev.h +++ b/include/gpio/gpio_chardev.h @@ -49,6 +49,8 @@ mraa_boolean_t mraa_is_gpio_line_open_source(mraa_gpiod_line_info *linfo); int mraa_get_number_of_gpio_chips(); int mraa_get_chip_infos(mraa_gpiod_chip_info*** cinfos); +int mraa_find_gpio_line_by_name(const char *name, unsigned *chip_number, unsigned *line_number); + /* Multiple gpio support. */ typedef struct _gpio_group* mraa_gpiod_group_t; diff --git a/src/gpio/gpio_chardev.c b/src/gpio/gpio_chardev.c index 260a2ea..b9edbfd 100644 --- a/src/gpio/gpio_chardev.c +++ b/src/gpio/gpio_chardev.c @@ -444,3 +444,47 @@ mraa_get_chip_infos(mraa_gpiod_chip_info*** cinfos) return num_chips; } + +#ifndef GPIO_MAX_NAME_SIZE +#define GPIO_MAX_NAME_SIZE 32 +#endif + +int +mraa_find_gpio_line_by_name(const char *name, unsigned *chip_number, unsigned *line_number) +{ + mraa_gpiod_chip_info **cinfos; + mraa_gpiod_chip_info *cinfo; + mraa_gpiod_line_info *linfo; + int num_chips, i; + + num_chips = mraa_get_chip_infos(&cinfos); + if (num_chips < 0) { + return -1; + } + + for_each_gpio_chip(cinfo, cinfos, num_chips) { + for (i = 0; i < cinfo->chip_info.lines; i++) { + linfo = mraa_get_line_info_by_chip_name(cinfo->chip_info.name, i); + + if (!strncmp(linfo->name, name, GPIO_MAX_NAME_SIZE)) { + if (chip_number) { + /* idx is coming from `for_each_gpio_chip` definition */ + *chip_number = idx; + } + + if (line_number) { + *line_number = linfo->line_offset; + } + + free(linfo); + free(cinfos); + return 0; + } + + free(linfo); + } + } + + free(cinfos); + return -1; +}