Allow users to get the values of gpios by passing the gpio name. The gpipchip is not specified, instead it is discovered using the same method as gpiofind. $ gpioget --by-name switch-state 1 $ gpioget --by-name led-fault led-identify led-attention 1 0 1 Signed-off-by: Joel Stanley <joel@xxxxxxxxx> --- tools/gpioget.c | 57 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/tools/gpioget.c b/tools/gpioget.c index 51cecb6a18a9..9d2c82b0d64b 100644 --- a/tools/gpioget.c +++ b/tools/gpioget.c @@ -15,15 +15,18 @@ static const struct option longopts[] = { { "active-low", no_argument, NULL, 'l' }, { "dir-as-is", no_argument, NULL, 'n' }, { "bias", required_argument, NULL, 'B' }, + { "by-name", no_argument, NULL, 'N' }, { GETOPT_NULL_LONGOPT }, }; -static const char *const shortopts = "+hvlnB:"; +static const char *const shortopts = "+hvlnB:N"; static void print_help(void) { printf("Usage: %s [OPTIONS] <chip name/number> <offset 1> <offset 2> ...\n", get_progname()); + printf(" %s [OPTIONS] -L <line name1> <line name2> ...\n", + get_progname()); printf("\n"); printf("Read line value(s) from a GPIO chip\n"); printf("\n"); @@ -34,6 +37,7 @@ static void print_help(void) printf(" -n, --dir-as-is:\tdon't force-reconfigure line direction\n"); printf(" -B, --bias=[as-is|disable|pull-down|pull-up] (defaults to 'as-is'):\n"); printf(" set the line bias\n"); + printf(" -N, --by-name:\tget line by name. All lines must be from the same gpiochip\n"); printf("\n"); print_bias_help(); } @@ -46,7 +50,8 @@ int main(int argc, char **argv) unsigned int *offsets, i, num_lines; struct gpiod_line_bulk *lines; struct gpiod_chip *chip; - char *device, *end; + bool by_name = false; + char *end; for (;;) { optc = getopt_long(argc, argv, shortopts, longopts, &opti); @@ -69,6 +74,9 @@ int main(int argc, char **argv) case 'B': flags |= bias_flags(optarg); break; + case 'N': + by_name = true; + break; case '?': die("try %s --help", get_progname()); default: @@ -79,30 +87,47 @@ int main(int argc, char **argv) argc -= optind; argv += optind; - if (argc < 1) - die("gpiochip must be specified"); + if (by_name) { + if (argc < 1) + die("at least one line name must be specified"); + + /* line0 line1 ... lineN */ + num_lines = argc; - if (argc < 2) - die("at least one GPIO line offset must be specified"); + chip = chip_by_line_name(argv[0]); + if (!chip) + die("unable to find gpiochip"); + } else { + /* gpiochip offset0 offset1 ... offsetN */ + if (argc < 1) + die("gpiochip must be specified"); - device = argv[0]; - num_lines = argc - 1; + if (argc < 2) + die("at least one GPIO line offset must be specified"); + + chip = chip_open_lookup(argv[0]); + if (!chip) + die_perror("unable to open %s", argv[0]); + + argv++; + num_lines = argc - 1; + } values = malloc(sizeof(*values) * num_lines); offsets = malloc(sizeof(*offsets) * num_lines); if (!values || !offsets) die("out of memory"); - for (i = 0; i < num_lines; i++) { - offsets[i] = strtoul(argv[i + 1], &end, 10); - if (*end != '\0' || offsets[i] > INT_MAX) - die("invalid GPIO offset: %s", argv[i + 1]); + if (by_name) { + line_names_to_offsets(chip, argv, offsets, NULL, num_lines); + } else { + for (i = 0; i < num_lines; i++) { + offsets[i] = strtoul(argv[i], &end, 10); + if (*end != '\0' || offsets[i] > INT_MAX) + die("invalid GPIO offset: %s", argv[i]); + } } - chip = chip_open_lookup(device); - if (!chip) - die_perror("unable to open %s", device); - lines = gpiod_chip_get_lines(chip, offsets, num_lines); if (!lines) die_perror("unable to retrieve GPIO lines from chip"); -- 2.34.1