gpioinfo shows most settings for each GPIO line, but currently misses edge detection and debouncing. * If edge detection is enabled, report it as an additional flag * If debouncing is enabled, report the duration Signed-off-by: Ben Hutchings <ben.hutchings@xxxxxxx> --- tools/gpioinfo.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tools/gpioinfo.c b/tools/gpioinfo.c index cd2b9e4..ed0018c 100644 --- a/tools/gpioinfo.c +++ b/tools/gpioinfo.c @@ -44,6 +44,21 @@ static bool line_drive_is_open_source(struct gpiod_line_info *info) return gpiod_line_info_get_drive(info) == GPIOD_LINE_DRIVE_OPEN_SOURCE; } +static bool edge_detection_is_rising(struct gpiod_line_info *info) +{ + return gpiod_line_info_get_edge_detection(info) == GPIOD_LINE_EDGE_RISING; +} + +static bool edge_detection_is_falling(struct gpiod_line_info *info) +{ + return gpiod_line_info_get_edge_detection(info) == GPIOD_LINE_EDGE_FALLING; +} + +static bool edge_detection_is_both(struct gpiod_line_info *info) +{ + return gpiod_line_info_get_edge_detection(info) == GPIOD_LINE_EDGE_BOTH; +} + static const struct flag flags[] = { { .name = "used", @@ -69,6 +84,18 @@ static const struct flag flags[] = { .name = "bias-disabled", .is_set = line_bias_is_disabled, }, + { + .name = "edge-rising", + .is_set = edge_detection_is_rising, + }, + { + .name = "edge-failling", + .is_set = edge_detection_is_falling, + }, + { + .name = "edge-both", + .is_set = edge_detection_is_both, + }, }; static const struct option longopts[] = { @@ -129,6 +156,7 @@ static void list_lines(struct gpiod_chip *chip) const char *name, *consumer; unsigned int i, offset; int direction; + unsigned long debounce_period; printf("%s - %u lines:\n", gpiod_chip_get_name(chip), gpiod_chip_get_num_lines(chip)); @@ -142,6 +170,8 @@ static void list_lines(struct gpiod_chip *chip) consumer = gpiod_line_info_get_consumer(info); direction = gpiod_line_info_get_direction(info); active_low = gpiod_line_info_is_active_low(info); + debounce_period = gpiod_line_info_is_debounced(info) ? + gpiod_line_info_get_debounce_period(info) : 0; of = false; @@ -166,6 +196,9 @@ static void list_lines(struct gpiod_chip *chip) prinfo(&of, 13, "%s ", active_low ? "active-low" : "active-high"); + if (debounce_period) + printf("debounce=%lu ", debounce_period); + flag_printed = false; for (i = 0; i < ARRAY_SIZE(flags); i++) { if (flags[i].is_set(info)) { -- 2.20.1