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; +}