From: Kent Gibson <warthog618@gmail.com>
To: linux-gpio@vger.kernel.org, brgl@bgdev.pl
Cc: Kent Gibson <warthog618@gmail.com>
Subject: [libgpiod v2][PATCH v4 1/5] tools: remove old code to simplify review
Date: Mon, 14 Nov 2022 12:00:58 +0800 [thread overview]
Message-ID: <20221114040102.66031-2-warthog618@gmail.com> (raw)
In-Reply-To: <20221114040102.66031-1-warthog618@gmail.com>
Remove functions that are so heavily modified in the subsequent patch
that they are effectively complete re-writes, so the old code just
obfuscates the new.
The gpiofind tool is removed completely, as its functionality is
absorbed into the other tools.
Signed-off-by: Kent Gibson <warthog618@gmail.com>
---
man/Makefile.am | 2 +-
tools/.gitignore | 1 -
tools/Makefile.am | 4 +-
tools/gpio-tools-test.bats | 893 -------------------------------------
tools/gpiodetect.c | 79 ----
tools/gpiofind.c | 93 ----
tools/gpioget.c | 153 -------
tools/gpioinfo.c | 240 ----------
tools/gpiomon.c | 314 -------------
tools/gpioset.c | 330 --------------
tools/tools-common.c | 81 ----
11 files changed, 2 insertions(+), 2188 deletions(-)
delete mode 100644 tools/gpiofind.c
diff --git a/man/Makefile.am b/man/Makefile.am
index 4d2c29b..8d1d9b3 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -3,7 +3,7 @@
if WITH_MANPAGES
-dist_man1_MANS = gpiodetect.man gpioinfo.man gpioget.man gpioset.man gpiofind.man gpiomon.man
+dist_man1_MANS = gpiodetect.man gpioinfo.man gpioget.man gpioset.man gpiomon.man
%.man: $(top_builddir)/tools/$(*F)
help2man $(top_builddir)/tools/$(*F) --include=$(srcdir)/template --output=$(builddir)/$@ --no-info
diff --git a/tools/.gitignore b/tools/.gitignore
index 0d53de9..d6b2f44 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -6,4 +6,3 @@ gpioinfo
gpioget
gpioset
gpiomon
-gpiofind
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 4a13266..fc074b9 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -9,7 +9,7 @@ libtools_common_la_SOURCES = tools-common.c tools-common.h
LDADD = libtools-common.la $(top_builddir)/lib/libgpiod.la
-bin_PROGRAMS = gpiodetect gpioinfo gpioget gpioset gpiomon gpiofind
+bin_PROGRAMS = gpiodetect gpioinfo gpioget gpioset gpiomon
gpiodetect_SOURCES = gpiodetect.c
@@ -21,8 +21,6 @@ gpioset_SOURCES = gpioset.c
gpiomon_SOURCES = gpiomon.c
-gpiofind_SOURCES = gpiofind.c
-
EXTRA_DIST = gpio-tools-test gpio-tools-test.bats
if WITH_TESTS
diff --git a/tools/gpio-tools-test.bats b/tools/gpio-tools-test.bats
index a259eae..d200df1 100755
--- a/tools/gpio-tools-test.bats
+++ b/tools/gpio-tools-test.bats
@@ -220,896 +220,3 @@ teardown() {
gpiosim_cleanup
}
-#
-# gpiodetect test cases
-#
-
-@test "gpiodetect: list chips" {
- gpiosim_chip sim0 num_lines=4
- gpiosim_chip sim1 num_lines=8
- gpiosim_chip sim2 num_lines=16
-
- run_tool gpiodetect
-
- test "$status" -eq 0
- output_contains_line "$(gpiosim_chip_name sim0) [$(gpiosim_dev_name sim0)-node0] (4 lines)"
- output_contains_line "$(gpiosim_chip_name sim1) [$(gpiosim_dev_name sim1)-node0] (8 lines)"
- output_contains_line "$(gpiosim_chip_name sim2) [$(gpiosim_dev_name sim2)-node0] (16 lines)"
-}
-
-@test "gpiodetect: invalid args" {
- run_tool gpiodetect unimplemented-arg
- test "$status" -eq 1
-}
-
-#
-# gpioinfo test cases
-#
-
-@test "gpioinfo: dump all chips" {
- gpiosim_chip sim0 num_lines=4
- gpiosim_chip sim1 num_lines=8
-
- run_tool gpioinfo
-
- test "$status" -eq 0
- output_contains_line "$(gpiosim_chip_name sim0) - 4 lines:"
- output_contains_line "$(gpiosim_chip_name sim1) - 8 lines:"
-
- output_regex_match "\\s+line\\s+0:\\s+unnamed\\s+unused\\s+input\\s+active-high"
- output_regex_match "\\s+line\\s+7:\\s+unnamed\\s+unused\\s+input\\s+active-high"
-}
-
-@test "gpioinfo: dump all chips with one line exported" {
- gpiosim_chip sim0 num_lines=4
- gpiosim_chip sim1 num_lines=8
-
- coproc_run_tool gpioset --mode=signal --active-low "$(gpiosim_chip_name sim1)" 7=1
-
- run_tool gpioinfo
-
- test "$status" -eq 0
- output_contains_line "$(gpiosim_chip_name sim0) - 4 lines:"
- output_contains_line "$(gpiosim_chip_name sim1) - 8 lines:"
- output_regex_match "\\s+line\\s+0:\\s+unnamed\\s+unused\\s+input\\s+active-high"
- output_regex_match "\\s+line\\s+7:\\s+unnamed\\s+\\\"gpioset\\\"\\s+output\\s+active-low"
-
- coproc_tool_kill
- coproc_tool_wait
-}
-
-@test "gpioinfo: dump one chip" {
- gpiosim_chip sim0 num_lines=8
- gpiosim_chip sim1 num_lines=4
-
- run_tool gpioinfo "$(gpiosim_chip_name sim1)"
-
- test "$status" -eq 0
- assert_fail output_contains_line "$(gpiosim_chip_name sim0) - 8 lines:"
- output_contains_line "$(gpiosim_chip_name sim1) - 4 lines:"
- output_regex_match "\\s+line\\s+0:\\s+unnamed\\s+unused\\s+input\\s+active-high"
- assert_fail output_regex_match "\\s+line\\s+7:\\s+unnamed\\s+unused\\s+input\\s+active-high"
-}
-
-@test "gpioinfo: dump all but one chip" {
- gpiosim_chip sim0 num_lines=4
- gpiosim_chip sim1 num_lines=4
- gpiosim_chip sim2 num_lines=8
- gpiosim_chip sim3 num_lines=4
-
- run_tool gpioinfo "$(gpiosim_chip_name sim0)" \
- "$(gpiosim_chip_name sim1)" "$(gpiosim_chip_name sim3)"
-
- test "$status" -eq 0
- output_contains_line "$(gpiosim_chip_name sim0) - 4 lines:"
- output_contains_line "$(gpiosim_chip_name sim1) - 4 lines:"
- assert_fail output_contains_line "$(gpiosim_chip_name sim2) - 8 lines:"
- output_contains_line "$(gpiosim_chip_name sim3) - 4 lines:"
- output_regex_match "\\s+line\\s+0:\\s+unnamed\\s+unused\\s+input\\s+active-high"
- assert_fail output_regex_match "\\s+line\\s+7:\\s+unnamed\\s+unused\\s+input\\s+active-high"
-}
-
-@test "gpioinfo: inexistent chip" {
- run_tool gpioinfo "inexistent"
-
- test "$status" -eq 1
-}
-
-#
-# gpiofind test cases
-#
-
-@test "gpiofind: line found" {
- gpiosim_chip sim0 num_lines=4 line_name=1:foo line_name=3:bar
- gpiosim_chip sim1 num_lines=8 line_name=0:baz line_name=4:xyz line_name=7:foobar
- gpiosim_chip sim2 num_lines=16
-
- run_tool gpiofind foobar
-
- test "$status" -eq "0"
- test "$output" = "$(gpiosim_chip_name sim1) 7"
-}
-
-@test "gpiofind: line not found" {
- gpiosim_chip sim0 num_lines=4
- gpiosim_chip sim1 num_lines=8
- gpiosim_chip sim2 num_lines=16
-
- run_tool gpiofind nonexistent-line
-
- test "$status" -eq "1"
-}
-
-@test "gpiofind: invalid args" {
- run_tool gpiodetect unimplemented-arg
- test "$status" -eq 1
-}
-
-#
-# gpioget test cases
-#
-
-@test "gpioget: read all lines" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 5 pull-up
- gpiosim_set_pull sim0 7 pull-up
-
- run_tool gpioget "$(gpiosim_chip_name sim0)" 0 1 2 3 4 5 6 7
-
- test "$status" -eq "0"
- test "$output" = "0 0 1 1 0 1 0 1"
-}
-
-@test "gpioget: read all lines (active-low)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 5 pull-up
- gpiosim_set_pull sim0 7 pull-up
-
- run_tool gpioget --active-low "$(gpiosim_chip_name sim0)" 0 1 2 3 4 5 6 7
-
- test "$status" -eq "0"
- test "$output" = "1 1 0 0 1 0 1 0"
-}
-
-@test "gpioget: read all lines (pull-up)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 5 pull-up
- gpiosim_set_pull sim0 7 pull-up
-
- run_tool gpioget --bias=pull-up "$(gpiosim_chip_name sim0)" 0 1 2 3 4 5 6 7
-
- test "$status" -eq "0"
- test "$output" = "1 1 1 1 1 1 1 1"
-}
-
-@test "gpioget: read all lines (pull-down)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 5 pull-up
- gpiosim_set_pull sim0 7 pull-up
-
- run_tool gpioget --bias=pull-down "$(gpiosim_chip_name sim0)" 0 1 2 3 4 5 6 7
-
- test "$status" -eq "0"
- test "$output" = "0 0 0 0 0 0 0 0"
-}
-
-@test "gpioget: read some lines" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 1 pull-up
- gpiosim_set_pull sim0 4 pull-up
- gpiosim_set_pull sim0 6 pull-up
-
- run_tool gpioget "$(gpiosim_chip_name sim0)" 0 1 4 6
-
- test "$status" -eq "0"
- test "$output" = "0 1 1 1"
-}
-
-@test "gpioget: no arguments" {
- run_tool gpioget
-
- test "$status" -eq "1"
- output_regex_match ".*gpiochip must be specified"
-}
-
-@test "gpioget: no lines specified" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioget "$(gpiosim_chip_name sim0)"
-
- test "$status" -eq "1"
- output_regex_match ".*at least one GPIO line offset must be specified"
-}
-
-@test "gpioget: too many lines specified" {
- gpiosim_chip sim0 num_lines=4
-
- run_tool gpioget "$(gpiosim_chip_name sim0)" 0 1 2 3 4
-
- test "$status" -eq "1"
- output_regex_match ".*unable to request lines.*"
-}
-
-@test "gpioget: same line twice" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioget "$(gpiosim_chip_name sim0)" 0 0
-
- test "$status" -eq "1"
- output_regex_match ".*offsets must be unique"
-}
-
-@test "gpioget: invalid bias" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioget --bias=bad "$(gpiosim_chip_name sim0)" 0 1
-
- test "$status" -eq "1"
- output_regex_match ".*invalid bias.*"
-}
-
-#
-# gpioset test cases
-#
-
-@test "gpioset: set lines and wait for SIGTERM" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpioset --mode=signal "$(gpiosim_chip_name sim0)" \
- 0=0 1=0 2=1 3=1 4=1 5=1 6=0 7=1
-
- gpiosim_check_value sim0 0 0
- gpiosim_check_value sim0 1 0
- gpiosim_check_value sim0 2 1
- gpiosim_check_value sim0 3 1
- gpiosim_check_value sim0 4 1
- gpiosim_check_value sim0 5 1
- gpiosim_check_value sim0 6 0
- gpiosim_check_value sim0 7 1
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set lines and wait for SIGTERM (active-low)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpioset --active-low --mode=signal "$(gpiosim_chip_name sim0)" \
- 0=0 1=0 2=1 3=1 4=1 5=1 6=0 7=1
-
- gpiosim_check_value sim0 0 1
- gpiosim_check_value sim0 1 1
- gpiosim_check_value sim0 2 0
- gpiosim_check_value sim0 3 0
- gpiosim_check_value sim0 4 0
- gpiosim_check_value sim0 5 0
- gpiosim_check_value sim0 6 1
- gpiosim_check_value sim0 7 0
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set lines and wait for SIGTERM (push-pull)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpioset --drive=push-pull --mode=signal "$(gpiosim_chip_name sim0)" \
- 0=0 1=0 2=1 3=1 4=1 5=1 6=0 7=1
-
- gpiosim_check_value sim0 0 0
- gpiosim_check_value sim0 1 0
- gpiosim_check_value sim0 2 1
- gpiosim_check_value sim0 3 1
- gpiosim_check_value sim0 4 1
- gpiosim_check_value sim0 5 1
- gpiosim_check_value sim0 6 0
- gpiosim_check_value sim0 7 1
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set lines and wait for SIGTERM (open-drain)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 5 pull-up
- gpiosim_set_pull sim0 7 pull-up
-
- coproc_run_tool gpioset --drive=open-drain --mode=signal "$(gpiosim_chip_name sim0)" \
- 0=0 1=0 2=1 3=1 4=1 5=1 6=0 7=1
-
- gpiosim_check_value sim0 0 0
- gpiosim_check_value sim0 1 0
- gpiosim_check_value sim0 2 1
- gpiosim_check_value sim0 3 1
- gpiosim_check_value sim0 4 0
- gpiosim_check_value sim0 5 1
- gpiosim_check_value sim0 6 0
- gpiosim_check_value sim0 7 1
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set lines and wait for SIGTERM (open-source)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 5 pull-up
- gpiosim_set_pull sim0 7 pull-up
-
- coproc_run_tool gpioset --drive=open-source --mode=signal "$(gpiosim_chip_name sim0)" \
- 0=0 1=0 2=1 3=0 4=1 5=1 6=0 7=1
-
- gpiosim_check_value sim0 0 0
- gpiosim_check_value sim0 1 0
- gpiosim_check_value sim0 2 1
- gpiosim_check_value sim0 3 1
- gpiosim_check_value sim0 4 1
- gpiosim_check_value sim0 5 1
- gpiosim_check_value sim0 6 0
- gpiosim_check_value sim0 7 1
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set some lines and wait for ENTER" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpioset --mode=wait "$(gpiosim_chip_name sim0)" \
- 1=0 2=1 5=1 6=0 7=1
-
- gpiosim_check_value sim0 1 0
- gpiosim_check_value sim0 2 1
- gpiosim_check_value sim0 5 1
- gpiosim_check_value sim0 6 0
- gpiosim_check_value sim0 7 1
-
- coproc_tool_stdin_write ""
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set some lines and wait for SIGINT" {
- gpiosim_chip sim0 num_lines=4
-
- coproc_run_tool gpioset --mode=signal "$(gpiosim_chip_name sim0)" 0=1
-
- gpiosim_check_value sim0 0 1
-
- coproc_tool_kill -SIGINT
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: set some lines and wait with --mode=time" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpioset --mode=time --sec=1 --usec=200000 \
- "$(gpiosim_chip_name sim0)" 0=1 5=0 7=1
-
- gpiosim_check_value sim0 0 1
- gpiosim_check_value sim0 5 0
- gpiosim_check_value sim0 7 1
-
- coproc_tool_wait
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: no arguments" {
- run_tool gpioset
-
- test "$status" -eq "1"
- output_regex_match ".*gpiochip must be specified"
-}
-
-@test "gpioset: no lines specified" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset "$(gpiosim_chip_name sim1)"
-
- test "$status" -eq "1"
- output_regex_match ".*at least one GPIO line offset to value mapping must be specified"
-}
-
-@test "gpioset: too many lines specified" {
- gpiosim_chip sim0 num_lines=4
-
- run_tool gpioset "$(gpiosim_chip_name sim0)" 0=1 1=1 2=1 3=1 4=1 5=1
-
- test "$status" -eq "1"
- output_regex_match ".*unable to request lines.*"
-}
-
-@test "gpioset: use --sec without --mode=time" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset --mode=exit --sec=1 "$(gpiosim_chip_name sim0)" 0=1
-
- test "$status" -eq "1"
- output_regex_match ".*can't specify wait time in this mode"
-}
-
-@test "gpioset: use --usec without --mode=time" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset --mode=exit --usec=1 "$(gpiosim_chip_name sim1)" 0=1
-
- test "$status" -eq "1"
- output_regex_match ".*can't specify wait time in this mode"
-}
-
-@test "gpioset: default mode" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset "$(gpiosim_chip_name sim0)" 0=1
-
- test "$status" -eq "0"
-}
-
-@test "gpioset: invalid mapping" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset "$(gpiosim_chip_name sim1)" 0=c
-
- test "$status" -eq "1"
- output_regex_match ".*invalid offset<->value mapping"
-}
-
-@test "gpioset: invalid value" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset "$(gpiosim_chip_name sim1)" 0=3
-
- test "$status" -eq "1"
- output_regex_match ".*value must be 0 or 1"
-}
-
-@test "gpioset: invalid offset" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset "$(gpiosim_chip_name sim1)" 4000000000=0
-
- test "$status" -eq "1"
- output_regex_match ".*invalid offset"
-}
-
-@test "gpioset: invalid bias" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset --bias=bad "$(gpiosim_chip_name sim1)" 0=1 1=1
-
- test "$status" -eq "1"
- output_regex_match ".*invalid bias.*"
-}
-
-@test "gpioset: invalid drive" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset --drive=bad "$(gpiosim_chip_name sim1)" 0=1 1=1
-
- test "$status" -eq "1"
- output_regex_match ".*invalid drive.*"
-}
-
-@test "gpioset: daemonize in invalid mode" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset --background "$(gpiosim_chip_name sim1)" 0=1
-
- test "$status" -eq "1"
- output_regex_match ".*can't daemonize in this mode"
-}
-
-@test "gpioset: same line twice" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpioset "$(gpiosim_chip_name sim0)" 0=1 0=1
-
- test "$status" -eq "1"
- output_regex_match ".*offsets must be unique"
-}
-
-#
-# gpiomon test cases
-#
-
-@test "gpiomon: single rising edge event" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --rising-edge "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event:\\s+RISING\\s+EDGE\\s+offset:\\s+4\\s+timestamp:\\s+\[\s*[0-9]+\.[0-9]+\]"
-}
-
-@test "gpiomon: single falling edge event" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --falling-edge "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- gpiosim_set_pull sim0 4 pull-down
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event:\\s+FALLING\\s+EDGE\\s+offset:\\s+4\\s+timestamp:\\s+\[\s*[0-9]+\.[0-9]+\]"
-}
-
-@test "gpiomon: single falling edge event (pull-up)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 4 pull-down
-
- coproc_run_tool gpiomon --bias=pull-up "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-down
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event:\\s+FALLING\\s+EDGE\\s+offset:\\s+4\\s+timestamp:\\s+\[\s*[0-9]+\.[0-9]+\]"
-}
-
-@test "gpiomon: single rising edge event (pull-down)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 4 pull-up
-
- coproc_run_tool gpiomon --bias=pull-down "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event:\\s+RISING\\s+EDGE\\s+offset:\\s+4\\s+timestamp:\\s+\[\s*[0-9]+\.[0-9]+\]"
-}
-
-@test "gpiomon: single rising edge event (active-low)" {
- gpiosim_chip sim0 num_lines=8
-
- gpiosim_set_pull sim0 4 pull-up
-
- coproc_run_tool gpiomon --rising-edge --active-low "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-down
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event:\\s+RISING\\s+EDGE\\s+offset:\\s+4\\s+timestamp:\\s+\[\s*[0-9]+\.[0-9]+\]"
-}
-
-@test "gpiomon: single rising edge event (silent mode)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --rising-edge --silent "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test -z "$output"
-}
-
-@test "gpiomon: four alternating events" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --num-events=4 "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
- gpiosim_set_pull sim0 4 pull-down
- sleep 0.2
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
- gpiosim_set_pull sim0 4 pull-down
- sleep 0.2
-
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event\\:\\s+FALLING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[\s*[0-9]+\\.[0-9]+\\]"
- output_regex_match \
-"event\\:\\s+RISING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[\s*[0-9]+\\.[0-9]+\\]"
-}
-
-@test "gpiomon: exit after SIGINT" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "$(gpiosim_chip_name sim0)" 4
-
- coproc_tool_kill -SIGINT
- coproc_tool_wait
-
- test "$status" -eq "0"
- test -z "$output"
-}
-
-@test "gpiomon: exit after SIGTERM" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "$(gpiosim_chip_name sim0)" 4
-
- coproc_tool_kill -SIGTERM
- coproc_tool_wait
-
- test "$status" -eq "0"
- test -z "$output"
-}
-
-@test "gpiomon: both event flags" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --falling-edge --rising-edge "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
- gpiosim_set_pull sim0 4 pull-down
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match \
-"event\\:\\s+FALLING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[\s*[0-9]+\\.[0-9]+\\]"
- output_regex_match \
-"event\\:\\s+RISING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[\s*[0-9]+\\.[0-9]+\\]"
-}
-
-@test "gpiomon: watch multiple lines" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --format=%o "$(gpiosim_chip_name sim0)" 1 2 3 4 5
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 3 pull-up
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "${lines[0]}" = "2"
- test "${lines[1]}" = "3"
- test "${lines[2]}" = "4"
-}
-
-@test "gpiomon: watch multiple lines (lines in mixed-up order)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon --format=%o "$(gpiosim_chip_name sim0)" 5 2 7 1 6
-
- gpiosim_set_pull sim0 2 pull-up
- gpiosim_set_pull sim0 1 pull-up
- gpiosim_set_pull sim0 6 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "${lines[0]}" = "2"
- test "${lines[1]}" = "1"
- test "${lines[2]}" = "6"
-}
-
-@test "gpiomon: same line twice" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpiomon "$(gpiosim_chip_name sim0)" 0 0
-
- test "$status" -eq "1"
- output_regex_match ".*offsets must be unique"
-}
-
-@test "gpiomon: no arguments" {
- run_tool gpiomon
-
- test "$status" -eq "1"
- output_regex_match ".*gpiochip must be specified"
-}
-
-@test "gpiomon: line not specified" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpiomon "$(gpiosim_chip_name sim0)"
-
- test "$status" -eq "1"
- output_regex_match ".*GPIO line offset must be specified"
-}
-
-@test "gpiomon: line out of range" {
- gpiosim_chip sim0 num_lines=4
-
- run_tool gpiomon "$(gpiosim_chip_name sim0)" 5
-
- test "$status" -eq "1"
- output_regex_match ".*unable to request lines"
-}
-
-@test "gpiomon: invalid bias" {
- gpiosim_chip sim0 num_lines=8
-
- run_tool gpiomon --bias=bad "$(gpiosim_chip_name sim0)" 0 1
-
- test "$status" -eq "1"
- output_regex_match ".*invalid bias.*"
-}
-
-@test "gpiomon: custom format (event type + offset)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%e %o" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "1 4"
-}
-
-@test "gpiomon: custom format (event type + offset joined)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%e%o" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "14"
-}
-
-@test "gpiomon: custom format (timestamp)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%e %o %s.%n" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- output_regex_match "1 4 [0-9]+\\.[0-9]+"
-}
-
-@test "gpiomon: custom format (double percent sign)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%%" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "%"
-}
-
-@test "gpiomon: custom format (double percent sign + event type specifier)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%%e" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "%e"
-}
-
-@test "gpiomon: custom format (single percent sign)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "%"
-}
-
-@test "gpiomon: custom format (single percent sign between other characters)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=foo % bar" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "foo % bar"
-}
-
-@test "gpiomon: custom format (unknown specifier)" {
- gpiosim_chip sim0 num_lines=8
-
- coproc_run_tool gpiomon "--format=%x" "$(gpiosim_chip_name sim0)" 4
-
- gpiosim_set_pull sim0 4 pull-up
- sleep 0.2
-
- coproc_tool_kill
- coproc_tool_wait
-
- test "$status" -eq "0"
- test "$output" = "%x"
-}
diff --git a/tools/gpiodetect.c b/tools/gpiodetect.c
index 8f6e8b3..30bde32 100644
--- a/tools/gpiodetect.c
+++ b/tools/gpiodetect.c
@@ -11,82 +11,3 @@
#include "tools-common.h"
-static const struct option longopts[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { GETOPT_NULL_LONGOPT },
-};
-
-static const char *const shortopts = "+hv";
-
-static void print_help(void)
-{
- printf("Usage: %s [OPTIONS]\n", get_progname());
- printf("\n");
- printf("List all GPIO chips, print their labels and number of GPIO lines.\n");
- printf("\n");
- printf("Options:\n");
- printf(" -h, --help:\t\tdisplay this message and exit\n");
- printf(" -v, --version:\tdisplay the version and exit\n");
-}
-
-int main(int argc, char **argv)
-{
- int optc, opti, num_chips, i;
- struct gpiod_chip *chip;
- struct gpiod_chip_info *info;
- struct dirent **entries;
-
- for (;;) {
- optc = getopt_long(argc, argv, shortopts, longopts, &opti);
- if (optc < 0)
- break;
-
- switch (optc) {
- case 'h':
- print_help();
- return EXIT_SUCCESS;
- case 'v':
- print_version();
- return EXIT_SUCCESS;
- case '?':
- die("try %s --help", get_progname());
- default:
- abort();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc > 0)
- die("unrecognized argument: %s", argv[0]);
-
- num_chips = scandir("/dev/", &entries, chip_dir_filter, alphasort);
- if (num_chips < 0)
- die_perror("unable to scan /dev");
-
- for (i = 0; i < num_chips; i++) {
- chip = chip_open_by_name(entries[i]->d_name);
- if (!chip)
- die_perror("unable to open %s", entries[i]->d_name);
-
- info = gpiod_chip_get_info(chip);
- if (!info)
- die_perror("unable to get info for %s", entries[i]->d_name);
-
-
- printf("%s [%s] (%zu lines)\n",
- gpiod_chip_info_get_name(info),
- gpiod_chip_info_get_label(info),
- gpiod_chip_info_get_num_lines(info));
-
- gpiod_chip_info_free(info);
- gpiod_chip_close(chip);
- free(entries[i]);
- }
-
- free(entries);
-
- return EXIT_SUCCESS;
-}
diff --git a/tools/gpiofind.c b/tools/gpiofind.c
deleted file mode 100644
index 03b15c9..0000000
--- a/tools/gpiofind.c
+++ /dev/null
@@ -1,93 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-// SPDX-FileCopyrightText: 2017-2021 Bartosz Golaszewski <bartekgola@gmail.com>
-
-#include <dirent.h>
-#include <errno.h>
-#include <getopt.h>
-#include <gpiod.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "tools-common.h"
-
-static const struct option longopts[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { GETOPT_NULL_LONGOPT },
-};
-
-static const char *const shortopts = "+hv";
-
-static void print_help(void)
-{
- printf("Usage: %s [OPTIONS] <name>\n", get_progname());
- printf("\n");
- printf("Find a GPIO line by name. The output of this command can be used as input for gpioget/set.\n");
- printf("\n");
- printf("Options:\n");
- printf(" -h, --help:\t\tdisplay this message and exit\n");
- printf(" -v, --version:\tdisplay the version and exit\n");
-}
-
-int main(int argc, char **argv)
-{
- int i, num_chips, optc, opti, offset;
- struct gpiod_chip *chip;
- struct gpiod_chip_info *info;
- struct dirent **entries;
-
- for (;;) {
- optc = getopt_long(argc, argv, shortopts, longopts, &opti);
- if (optc < 0)
- break;
-
- switch (optc) {
- case 'h':
- print_help();
- return EXIT_SUCCESS;
- case 'v':
- print_version();
- return EXIT_SUCCESS;
- case '?':
- die("try %s --help", get_progname());
- default:
- abort();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc != 1)
- die("exactly one GPIO line name must be specified");
-
- num_chips = scandir("/dev/", &entries, chip_dir_filter, alphasort);
- if (num_chips < 0)
- die_perror("unable to scan /dev");
-
- for (i = 0; i < num_chips; i++) {
- chip = chip_open_by_name(entries[i]->d_name);
- if (!chip) {
- if (errno == EACCES)
- continue;
-
- die_perror("unable to open %s", entries[i]->d_name);
- }
-
- offset = gpiod_chip_get_line_offset_from_name(chip, argv[0]);
- if (offset >= 0) {
- info = gpiod_chip_get_info(chip);
- if (!info)
- die_perror("unable to get info for %s", entries[i]->d_name);
-
- printf("%s %u\n",
- gpiod_chip_info_get_name(info), offset);
- gpiod_chip_info_free(info);
- gpiod_chip_close(chip);
- return EXIT_SUCCESS;
- }
- }
-
- return EXIT_FAILURE;
-}
diff --git a/tools/gpioget.c b/tools/gpioget.c
index b68212d..1b3e666 100644
--- a/tools/gpioget.c
+++ b/tools/gpioget.c
@@ -10,156 +10,3 @@
#include "tools-common.h"
-static const struct option longopts[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { "active-low", no_argument, NULL, 'l' },
- { "dir-as-is", no_argument, NULL, 'n' },
- { "bias", required_argument, NULL, 'B' },
- { GETOPT_NULL_LONGOPT },
-};
-
-static const char *const shortopts = "+hvlnB:";
-
-static void print_help(void)
-{
- printf("Usage: %s [OPTIONS] <chip name/number> <offset 1> <offset 2> ...\n",
- get_progname());
- printf("\n");
- printf("Read line value(s) from a GPIO chip\n");
- printf("\n");
- printf("Options:\n");
- printf(" -h, --help:\t\tdisplay this message and exit\n");
- printf(" -v, --version:\tdisplay the version and exit\n");
- printf(" -l, --active-low:\tset the line active state to low\n");
- 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");
- print_bias_help();
-}
-
-int main(int argc, char **argv)
-{
- int direction = GPIOD_LINE_DIRECTION_INPUT;
- int optc, opti, bias = 0, ret, *values;
- struct gpiod_line_settings *settings;
- struct gpiod_request_config *req_cfg;
- struct gpiod_line_request *request;
- struct gpiod_line_config *line_cfg;
- struct gpiod_chip *chip;
- bool active_low = false;
- unsigned int *offsets;
- size_t i, num_lines;
- char *device, *end;
-
- for (;;) {
- optc = getopt_long(argc, argv, shortopts, longopts, &opti);
- if (optc < 0)
- break;
-
- switch (optc) {
- case 'h':
- print_help();
- return EXIT_SUCCESS;
- case 'v':
- print_version();
- return EXIT_SUCCESS;
- case 'l':
- active_low = true;
- break;
- case 'n':
- direction = GPIOD_LINE_DIRECTION_AS_IS;
- break;
- case 'B':
- bias = parse_bias(optarg);
- break;
- case '?':
- die("try %s --help", get_progname());
- default:
- abort();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc < 1)
- die("gpiochip must be specified");
-
- if (argc < 2)
- die("at least one GPIO line offset must be specified");
-
- device = argv[0];
- num_lines = argc - 1;
-
- offsets = calloc(num_lines, sizeof(*offsets));
- values = calloc(num_lines, sizeof(*values));
- if (!offsets || ! values)
- 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 (has_duplicate_offsets(num_lines, offsets))
- die("offsets must be unique");
-
- chip = chip_open_lookup(device);
- if (!chip)
- die_perror("unable to open %s", device);
-
- settings = gpiod_line_settings_new();
- if (!settings)
- die_perror("unable to allocate line settings");
-
- gpiod_line_settings_set_direction(settings, direction);
-
- if (bias)
- gpiod_line_settings_set_bias(settings, bias);
-
- if (active_low)
- gpiod_line_settings_set_active_low(settings, active_low);
-
- req_cfg = gpiod_request_config_new();
- if (!req_cfg)
- die_perror("unable to allocate the request config structure");
-
- gpiod_request_config_set_consumer(req_cfg, "gpioget");
-
- line_cfg = gpiod_line_config_new();
- if (!line_cfg)
- die_perror("unable to allocate the line config structure");
-
- ret = gpiod_line_config_add_line_settings(line_cfg, offsets,
- num_lines, settings);
- if (ret)
- die_perror("unable to add line settings");
-
- request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
- if (!request)
- die_perror("unable to request lines");
-
- ret = gpiod_line_request_get_values(request, values);
- if (ret)
- die_perror("unable to read GPIO line values");
-
- for (i = 0; i < num_lines; i++) {
- printf("%d", values[i]);
- if (i != num_lines - 1)
- printf(" ");
- }
- printf("\n");
-
- gpiod_line_request_release(request);
- gpiod_request_config_free(req_cfg);
- gpiod_line_config_free(line_cfg);
- gpiod_line_settings_free(settings);
- gpiod_chip_close(chip);
- free(offsets);
- free(values);
-
- return EXIT_SUCCESS;
-}
diff --git a/tools/gpioinfo.c b/tools/gpioinfo.c
index fbe2a13..ae368fa 100644
--- a/tools/gpioinfo.c
+++ b/tools/gpioinfo.c
@@ -12,243 +12,3 @@
#include "tools-common.h"
-typedef bool (*is_set_func)(struct gpiod_line_info *);
-
-struct flag {
- const char *name;
- is_set_func is_set;
-};
-
-static bool line_bias_is_pullup(struct gpiod_line_info *info)
-{
- return gpiod_line_info_get_bias(info) == GPIOD_LINE_BIAS_PULL_UP;
-}
-
-static bool line_bias_is_pulldown(struct gpiod_line_info *info)
-{
- return gpiod_line_info_get_bias(info) == GPIOD_LINE_BIAS_PULL_DOWN;
-}
-
-static bool line_bias_is_disabled(struct gpiod_line_info *info)
-{
- return gpiod_line_info_get_bias(info) == GPIOD_LINE_BIAS_DISABLED;
-}
-
-static bool line_drive_is_open_drain(struct gpiod_line_info *info)
-{
- return gpiod_line_info_get_drive(info) == GPIOD_LINE_DRIVE_OPEN_DRAIN;
-}
-
-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 const struct flag flags[] = {
- {
- .name = "used",
- .is_set = gpiod_line_info_is_used,
- },
- {
- .name = "open-drain",
- .is_set = line_drive_is_open_drain,
- },
- {
- .name = "open-source",
- .is_set = line_drive_is_open_source,
- },
- {
- .name = "pull-up",
- .is_set = line_bias_is_pullup,
- },
- {
- .name = "pull-down",
- .is_set = line_bias_is_pulldown,
- },
- {
- .name = "bias-disabled",
- .is_set = line_bias_is_disabled,
- },
-};
-
-static const struct option longopts[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { GETOPT_NULL_LONGOPT },
-};
-
-static const char *const shortopts = "+hv";
-
-static void print_help(void)
-{
- printf("Usage: %s [OPTIONS] <gpiochip1> ...\n", get_progname());
- printf("\n");
- printf("Print information about all lines of the specified GPIO chip(s) (or all gpiochips if none are specified).\n");
- printf("\n");
- printf("Options:\n");
- printf(" -h, --help:\t\tdisplay this message and exit\n");
- printf(" -v, --version:\tdisplay the version and exit\n");
-}
-
-static PRINTF(3, 4) void prinfo(bool *of,
- unsigned int prlen, const char *fmt, ...)
-{
- char *buf, *buffmt = NULL;
- size_t len;
- va_list va;
- int rv;
-
- va_start(va, fmt);
- rv = vasprintf(&buf, fmt, va);
- va_end(va);
- if (rv < 0)
- die("vasprintf: %s\n", strerror(errno));
-
- len = strlen(buf) - 1;
-
- if (len >= prlen || *of) {
- *of = true;
- printf("%s", buf);
- } else {
- rv = asprintf(&buffmt, "%%%us", prlen);
- if (rv < 0)
- die("asprintf: %s\n", strerror(errno));
-
- printf(buffmt, buf);
- }
-
- free(buf);
- if (fmt)
- free(buffmt);
-}
-
-static void list_lines(struct gpiod_chip *chip)
-{
- bool flag_printed, of, active_low;
- struct gpiod_chip_info *chip_info;
- struct gpiod_line_info *info;
- const char *name, *consumer;
- size_t i, offset, num_lines;
- int direction;
-
- chip_info = gpiod_chip_get_info(chip);
- if (!chip_info)
- die_perror("unable to retrieve the chip info from chip");
-
- num_lines = gpiod_chip_info_get_num_lines(chip_info);
- printf("%s - %zu lines:\n",
- gpiod_chip_info_get_name(chip_info), num_lines);
-
- for (offset = 0; offset < num_lines; offset++) {
- info = gpiod_chip_get_line_info(chip, offset);
- if (!info)
- die_perror("unable to retrieve the line info from chip");
- name = gpiod_line_info_get_name(info);
- consumer = gpiod_line_info_get_consumer(info);
- direction = gpiod_line_info_get_direction(info);
- active_low = gpiod_line_info_is_active_low(info);
-
- of = false;
-
- printf("\tline ");
- prinfo(&of, 3, "%zu", offset);
- printf(": ");
-
- name ? prinfo(&of, 12, "\"%s\"", name)
- : prinfo(&of, 12, "unnamed");
- printf(" ");
-
- if (!gpiod_line_info_is_used(info))
- prinfo(&of, 12, "unused");
- else
- consumer ? prinfo(&of, 12, "\"%s\"", consumer)
- : prinfo(&of, 12, "kernel");
-
- printf(" ");
-
- prinfo(&of, 8, "%s ", direction == GPIOD_LINE_DIRECTION_INPUT
- ? "input" : "output");
- prinfo(&of, 13, "%s ",
- active_low ? "active-low" : "active-high");
-
- flag_printed = false;
- for (i = 0; i < ARRAY_SIZE(flags); i++) {
- if (flags[i].is_set(info)) {
- if (flag_printed)
- printf(" ");
- else
- printf("[");
- printf("%s", flags[i].name);
- flag_printed = true;
- }
- }
- if (flag_printed)
- printf("]");
-
- printf("\n");
-
- gpiod_line_info_free(info);
- }
- gpiod_chip_info_free(chip_info);
-}
-
-int main(int argc, char **argv)
-{
- int num_chips, i, optc, opti;
- struct gpiod_chip *chip;
- struct dirent **entries;
-
- for (;;) {
- optc = getopt_long(argc, argv, shortopts, longopts, &opti);
- if (optc < 0)
- break;
-
- switch (optc) {
- case 'h':
- print_help();
- return EXIT_SUCCESS;
- case 'v':
- print_version();
- return EXIT_SUCCESS;
- case '?':
- die("try %s --help", get_progname());
- default:
- abort();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc == 0) {
- num_chips = scandir("/dev/", &entries,
- chip_dir_filter, alphasort);
- if (num_chips < 0)
- die_perror("unable to scan /dev");
-
- for (i = 0; i < num_chips; i++) {
- chip = chip_open_by_name(entries[i]->d_name);
- if (!chip)
- die_perror("unable to open %s",
- entries[i]->d_name);
-
- list_lines(chip);
-
- gpiod_chip_close(chip);
- free(entries[i]);
- }
- free(entries);
- } else {
- for (i = 0; i < argc; i++) {
- chip = chip_open_lookup(argv[i]);
- if (!chip)
- die_perror("looking up chip %s", argv[i]);
-
- list_lines(chip);
-
- gpiod_chip_close(chip);
- }
- }
-
- return EXIT_SUCCESS;
-}
diff --git a/tools/gpiomon.c b/tools/gpiomon.c
index dff12ea..6fa19b6 100644
--- a/tools/gpiomon.c
+++ b/tools/gpiomon.c
@@ -17,317 +17,3 @@
#define EVENT_BUF_SIZE 32
-static const struct option longopts[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { "active-low", no_argument, NULL, 'l' },
- { "bias", required_argument, NULL, 'B' },
- { "num-events", required_argument, NULL, 'n' },
- { "silent", no_argument, NULL, 's' },
- { "rising-edge", no_argument, NULL, 'r' },
- { "falling-edge", no_argument, NULL, 'f' },
- { "line-buffered", no_argument, NULL, 'b' },
- { "format", required_argument, NULL, 'F' },
- { GETOPT_NULL_LONGOPT },
-};
-
-static const char *const shortopts = "+hvlB:n:srfbF:";
-
-static void print_help(void)
-{
- printf("Usage: %s [OPTIONS] <chip name/number> <offset 1> <offset 2> ...\n",
- get_progname());
- printf("\n");
- printf("Wait for events on GPIO lines and print them to standard output\n");
- printf("\n");
- printf("Options:\n");
- printf(" -h, --help:\t\tdisplay this message and exit\n");
- printf(" -v, --version:\tdisplay the version and exit\n");
- printf(" -l, --active-low:\tset the line active state to low\n");
- printf(" -B, --bias=[as-is|disable|pull-down|pull-up] (defaults to 'as-is'):\n");
- printf(" set the line bias\n");
- printf(" -n, --num-events=NUM:\texit after processing NUM events\n");
- printf(" -s, --silent:\t\tdon't print event info\n");
- printf(" -r, --rising-edge:\tonly process rising edge events\n");
- printf(" -f, --falling-edge:\tonly process falling edge events\n");
- printf(" -b, --line-buffered:\tset standard output as line buffered\n");
- printf(" -F, --format=FMT\tspecify custom output format\n");
- printf("\n");
- print_bias_help();
- printf("\n");
- printf("Format specifiers:\n");
- printf(" %%o: GPIO line offset\n");
- printf(" %%e: event type (0 - falling edge, 1 rising edge)\n");
- printf(" %%s: seconds part of the event timestamp\n");
- printf(" %%n: nanoseconds part of the event timestamp\n");
-}
-
-struct mon_ctx {
- unsigned int offset;
- bool silent;
- char *fmt;
-};
-
-static void event_print_custom(unsigned int offset, uint64_t timeout,
- int event_type, struct mon_ctx *ctx)
-{
- char *prev, *curr, fmt;
-
- for (prev = curr = ctx->fmt;;) {
- curr = strchr(curr, '%');
- if (!curr) {
- fputs(prev, stdout);
- break;
- }
-
- if (prev != curr)
- fwrite(prev, curr - prev, 1, stdout);
-
- fmt = *(curr + 1);
-
- switch (fmt) {
- case 'o':
- printf("%u", offset);
- break;
- case 'e':
- if (event_type == GPIOD_EDGE_EVENT_RISING_EDGE)
- fputc('1', stdout);
- else
- fputc('0', stdout);
- break;
- case 's':
- printf("%"PRIu64, timeout / 1000000000);
- break;
- case 'n':
- printf("%"PRIu64, timeout % 1000000000);
- break;
- case '%':
- fputc('%', stdout);
- break;
- case '\0':
- fputc('%', stdout);
- goto end;
- default:
- fwrite(curr, 2, 1, stdout);
- break;
- }
-
- curr += 2;
- prev = curr;
- }
-
-end:
- fputc('\n', stdout);
-}
-
-static void event_print_human_readable(unsigned int offset,
- uint64_t timeout, int event_type)
-{
- char *evname;
-
- if (event_type == GPIOD_EDGE_EVENT_RISING_EDGE)
- evname = " RISING EDGE";
- else
- evname = "FALLING EDGE";
-
- printf("event: %s offset: %u timestamp: [%8"PRIu64".%09"PRIu64"]\n",
- evname, offset, timeout / 1000000000, timeout % 1000000000);
-}
-
-static void handle_event(unsigned int line_offset, unsigned int event_type,
- uint64_t timestamp, struct mon_ctx *ctx)
-{
- if (!ctx->silent) {
- if (ctx->fmt)
- event_print_custom(line_offset, timestamp,
- event_type, ctx);
- else
- event_print_human_readable(line_offset,
- timestamp, event_type);
- }
-}
-
-static void handle_signal(int signum UNUSED)
-{
- exit(EXIT_SUCCESS);
-}
-
-int main(int argc, char **argv)
-{
- bool watch_rising = false, watch_falling = false, active_low = false;
- size_t num_lines = 0, events_wanted = 0, events_done = 0;
- struct gpiod_edge_event_buffer *event_buffer;
- int optc, opti, ret, i, edge, bias = 0;
- uint64_t timeout = 10 * 1000000000LLU;
- struct gpiod_line_settings *settings;
- struct gpiod_request_config *req_cfg;
- struct gpiod_line_request *request;
- struct gpiod_line_config *line_cfg;
- unsigned int offsets[64], offset;
- struct gpiod_edge_event *event;
- struct gpiod_chip *chip;
- struct mon_ctx ctx;
- char *end;
-
- /*
- * FIXME: use signalfd once the API has been converted to using a single file
- * descriptor as provided by uAPI v2.
- */
- signal(SIGINT, handle_signal);
- signal(SIGTERM, handle_signal);
-
- memset(&ctx, 0, sizeof(ctx));
-
- for (;;) {
- optc = getopt_long(argc, argv, shortopts, longopts, &opti);
- if (optc < 0)
- break;
-
- switch (optc) {
- case 'h':
- print_help();
- return EXIT_SUCCESS;
- case 'v':
- print_version();
- return EXIT_SUCCESS;
- case 'l':
- active_low = true;
- break;
- case 'B':
- bias = parse_bias(optarg);
- break;
- case 'n':
- events_wanted = strtoul(optarg, &end, 10);
- if (*end != '\0')
- die("invalid number: %s", optarg);
- break;
- case 's':
- ctx.silent = true;
- break;
- case 'r':
- watch_rising = true;
- break;
- case 'f':
- watch_falling = true;
- break;
- case 'b':
- setlinebuf(stdout);
- break;
- case 'F':
- ctx.fmt = optarg;
- break;
- case '?':
- die("try %s --help", get_progname());
- default:
- abort();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (watch_rising && !watch_falling)
- edge = GPIOD_LINE_EDGE_RISING;
- else if (watch_falling && !watch_rising)
- edge = GPIOD_LINE_EDGE_FALLING;
- else
- edge = GPIOD_LINE_EDGE_BOTH;
-
- if (argc < 1)
- die("gpiochip must be specified");
-
- if (argc < 2)
- die("at least one GPIO line offset must be specified");
-
- if (argc > 65)
- die("too many offsets given");
-
- for (i = 1; i < argc; i++) {
- offset = strtoul(argv[i], &end, 10);
- if (*end != '\0' || offset > INT_MAX)
- die("invalid GPIO offset: %s", argv[i]);
-
- offsets[i - 1] = offset;
- num_lines++;
- }
-
- if (has_duplicate_offsets(num_lines, offsets))
- die("offsets must be unique");
-
- chip = chip_open_lookup(argv[0]);
- if (!chip)
- die_perror("unable to open %s", argv[0]);
-
- settings = gpiod_line_settings_new();
- if (!settings)
- die_perror("unable to allocate line settings");
-
- if (bias)
- gpiod_line_settings_set_bias(settings, bias);
- if (active_low)
- gpiod_line_settings_set_active_low(settings, active_low);
- gpiod_line_settings_set_edge_detection(settings, edge);
-
- req_cfg = gpiod_request_config_new();
- if (!req_cfg)
- die_perror("unable to allocate the request config structure");
-
- gpiod_request_config_set_consumer(req_cfg, "gpiomon");
-
- line_cfg = gpiod_line_config_new();
- if (!line_cfg)
- die_perror("unable to allocate the line config structure");
-
- ret = gpiod_line_config_add_line_settings(line_cfg, offsets,
- num_lines, settings);
- if (ret)
- die_perror("unable to add line settings");
-
- request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
- if (!request)
- die_perror("unable to request lines");
-
- event_buffer = gpiod_edge_event_buffer_new(EVENT_BUF_SIZE);
- if (!event_buffer)
- die_perror("unable to allocate the line event buffer");
-
- for (;;) {
- ret = gpiod_line_request_wait_edge_event(request, timeout);
- if (ret < 0)
- die_perror("error waiting for events");
- if (ret == 0)
- continue;
-
- ret = gpiod_line_request_read_edge_event(request, event_buffer,
- EVENT_BUF_SIZE);
- if (ret < 0)
- die_perror("error reading line events");
-
- for (i = 0; i < ret; i++) {
- event = gpiod_edge_event_buffer_get_event(event_buffer,
- i);
- if (!event)
- die_perror("unable to retrieve the event from the buffer");
-
- handle_event(gpiod_edge_event_get_line_offset(event),
- gpiod_edge_event_get_event_type(event),
- gpiod_edge_event_get_timestamp_ns(event),
- &ctx);
-
- events_done++;
-
- if (events_wanted && events_done >= events_wanted)
- goto done;
- }
- }
-
-done:
- gpiod_edge_event_buffer_free(event_buffer);
- gpiod_line_request_release(request);
- gpiod_request_config_free(req_cfg);
- gpiod_line_config_free(line_cfg);
- gpiod_line_settings_free(settings);
- gpiod_chip_close(chip);
-
- return EXIT_SUCCESS;
-}
diff --git a/tools/gpioset.c b/tools/gpioset.c
index 290d1a3..0e3a1e4 100644
--- a/tools/gpioset.c
+++ b/tools/gpioset.c
@@ -14,333 +14,3 @@
#include "tools-common.h"
-static const struct option longopts[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'v' },
- { "active-low", no_argument, NULL, 'l' },
- { "bias", required_argument, NULL, 'B' },
- { "drive", required_argument, NULL, 'D' },
- { "mode", required_argument, NULL, 'm' },
- { "sec", required_argument, NULL, 's' },
- { "usec", required_argument, NULL, 'u' },
- { "background", no_argument, NULL, 'b' },
- { GETOPT_NULL_LONGOPT },
-};
-
-static const char *const shortopts = "+hvlB:D:m:s:u:b";
-
-static void print_help(void)
-{
- printf("Usage: %s [OPTIONS] <chip name/number> <offset1>=<value1> <offset2>=<value2> ...\n",
- get_progname());
- printf("\n");
- printf("Set GPIO line values of a GPIO chip and maintain the state until the process exits\n");
- printf("\n");
- printf("Options:\n");
- printf(" -h, --help:\t\tdisplay this message and exit\n");
- printf(" -v, --version:\tdisplay the version and exit\n");
- printf(" -l, --active-low:\tset the line active state to low\n");
- printf(" -B, --bias=[as-is|disable|pull-down|pull-up] (defaults to 'as-is'):\n");
- printf(" set the line bias\n");
- printf(" -D, --drive=[push-pull|open-drain|open-source] (defaults to 'push-pull'):\n");
- printf(" set the line drive mode\n");
- printf(" -m, --mode=[exit|wait|time|signal] (defaults to 'exit'):\n");
- printf(" tell the program what to do after setting values\n");
- printf(" -s, --sec=SEC:\tspecify the number of seconds to wait (only valid for --mode=time)\n");
- printf(" -u, --usec=USEC:\tspecify the number of microseconds to wait (only valid for --mode=time)\n");
- printf(" -b, --background:\tafter setting values: detach from the controlling terminal\n");
- printf("\n");
- print_bias_help();
- printf("\n");
- printf("Drives:\n");
- printf(" push-pull:\tdrive the line both high and low\n");
- printf(" open-drain:\tdrive the line low or go high impedance\n");
- printf(" open-source:\tdrive the line high or go high impedance\n");
- printf("\n");
- printf("Modes:\n");
- printf(" exit:\t\tset values and exit immediately\n");
- printf(" wait:\t\tset values and wait for user to press ENTER\n");
- printf(" time:\t\tset values and sleep for a specified amount of time\n");
- printf(" signal:\tset values and wait for SIGINT or SIGTERM\n");
- printf("\n");
- printf("Note: the state of a GPIO line controlled over the character device reverts to default\n");
- printf("when the last process referencing the file descriptor representing the device file exits.\n");
- printf("This means that it's wrong to run gpioset, have it exit and expect the line to continue\n");
- printf("being driven high or low. It may happen if given pin is floating but it must be interpreted\n");
- printf("as undefined behavior.\n");
-}
-
-struct callback_data {
- /* Replace with a union once we have more modes using callback data. */
- struct timeval tv;
- bool daemonize;
-};
-
-static void maybe_daemonize(bool daemonize)
-{
- int rv;
-
- if (daemonize) {
- rv = daemon(0, 0);
- if (rv < 0)
- die("unable to daemonize: %s", strerror(errno));
- }
-}
-
-static void wait_enter(void *data UNUSED)
-{
- getchar();
-}
-
-static void wait_time(void *data)
-{
- struct callback_data *cbdata = data;
-
- maybe_daemonize(cbdata->daemonize);
- select(0, NULL, NULL, NULL, &cbdata->tv);
-}
-
-static void wait_signal(void *data)
-{
- struct callback_data *cbdata = data;
- struct pollfd pfd;
- int sigfd, rv;
-
- sigfd = make_signalfd();
-
- memset(&pfd, 0, sizeof(pfd));
- pfd.fd = sigfd;
- pfd.events = POLLIN | POLLPRI;
-
- maybe_daemonize(cbdata->daemonize);
-
- for (;;) {
- rv = poll(&pfd, 1, 1000 /* one second */);
- if (rv < 0)
- die("error polling for signals: %s", strerror(errno));
- else if (rv > 0)
- break;
- }
-
- /*
- * Don't bother reading siginfo - it's enough to know that we
- * received any signal.
- */
- close(sigfd);
-}
-
-enum {
- MODE_EXIT = 0,
- MODE_WAIT,
- MODE_TIME,
- MODE_SIGNAL,
-};
-
-struct mode_mapping {
- int id;
- const char *name;
- void (*callback)(void *);
-};
-
-static const struct mode_mapping modes[] = {
- [MODE_EXIT] = {
- .id = MODE_EXIT,
- .name = "exit",
- .callback = NULL,
- },
- [MODE_WAIT] = {
- .id = MODE_WAIT,
- .name = "wait",
- .callback = wait_enter,
- },
- [MODE_TIME] = {
- .id = MODE_TIME,
- .name = "time",
- .callback = wait_time,
- },
- [MODE_SIGNAL] = {
- .id = MODE_SIGNAL,
- .name = "signal",
- .callback = wait_signal,
- },
-};
-
-static const struct mode_mapping *parse_mode(const char *mode)
-{
- size_t i;
-
- for (i = 0; i < ARRAY_SIZE(modes); i++)
- if (strcmp(mode, modes[i].name) == 0)
- return &modes[i];
-
- return NULL;
-}
-
-static int parse_drive(const char *option)
-{
- if (strcmp(option, "open-drain") == 0)
- return GPIOD_LINE_DRIVE_OPEN_DRAIN;
- if (strcmp(option, "open-source") == 0)
- return GPIOD_LINE_DRIVE_OPEN_SOURCE;
- if (strcmp(option, "push-pull") != 0)
- die("invalid drive: %s", option);
- return 0;
-}
-
-int main(int argc, char **argv)
-{
- const struct mode_mapping *mode = &modes[MODE_EXIT];
- int ret, optc, opti, bias = 0, drive = 0, *values;
- struct gpiod_line_settings *settings;
- struct gpiod_request_config *req_cfg;
- struct gpiod_line_request *request;
- struct gpiod_line_config *line_cfg;
- struct callback_data cbdata;
- struct gpiod_chip *chip;
- bool active_low = false;
- unsigned int *offsets;
- size_t i, num_lines;
- char *device, *end;
-
- memset(&cbdata, 0, sizeof(cbdata));
-
- for (;;) {
- optc = getopt_long(argc, argv, shortopts, longopts, &opti);
- if (optc < 0)
- break;
-
- switch (optc) {
- case 'h':
- print_help();
- return EXIT_SUCCESS;
- case 'v':
- print_version();
- return EXIT_SUCCESS;
- case 'l':
- active_low = true;
- break;
- case 'B':
- bias = parse_bias(optarg);
- break;
- case 'D':
- drive = parse_drive(optarg);
- break;
- case 'm':
- mode = parse_mode(optarg);
- if (!mode)
- die("invalid mode: %s", optarg);
- break;
- case 's':
- cbdata.tv.tv_sec = strtoul(optarg, &end, 10);
- if (*end != '\0')
- die("invalid time value in seconds: %s", optarg);
- break;
- case 'u':
- cbdata.tv.tv_usec = strtoul(optarg, &end, 10);
- if (*end != '\0')
- die("invalid time value in microseconds: %s",
- optarg);
- break;
- case 'b':
- cbdata.daemonize = true;
- break;
- case '?':
- die("try %s --help", get_progname());
- default:
- abort();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (mode->id != MODE_TIME && (cbdata.tv.tv_sec || cbdata.tv.tv_usec))
- die("can't specify wait time in this mode");
-
- if (mode->id != MODE_SIGNAL &&
- mode->id != MODE_TIME &&
- cbdata.daemonize)
- die("can't daemonize in this mode");
-
- if (argc < 1)
- die("gpiochip must be specified");
-
- if (argc < 2)
- die("at least one GPIO line offset to value mapping must be specified");
-
- device = argv[0];
-
- num_lines = argc - 1;
-
- offsets = calloc(num_lines, sizeof(*offsets));
- values = calloc(num_lines, sizeof(*values));
- if (!offsets)
- die("out of memory");
-
- for (i = 0; i < num_lines; i++) {
- ret = sscanf(argv[i + 1], "%u=%d", &offsets[i], &values[i]);
- if (ret != 2)
- die("invalid offset<->value mapping: %s", argv[i + 1]);
-
- if (values[i] != 0 && values[i] != 1)
- die("value must be 0 or 1: %s", argv[i + 1]);
-
- if (offsets[i] > INT_MAX)
- die("invalid offset: %s", argv[i + 1]);
- }
-
- if (has_duplicate_offsets(num_lines, offsets))
- die("offsets must be unique");
-
- chip = chip_open_lookup(device);
- if (!chip)
- die_perror("unable to open %s", device);
-
- settings = gpiod_line_settings_new();
- if (!settings)
- die_perror("unable to allocate line settings");
-
- if (bias)
- gpiod_line_settings_set_bias(settings, bias);
- if (drive)
- gpiod_line_settings_set_drive(settings, drive);
- if (active_low)
- gpiod_line_settings_set_active_low(settings, active_low);
- gpiod_line_settings_set_direction(settings,
- GPIOD_LINE_DIRECTION_OUTPUT);
-
- req_cfg = gpiod_request_config_new();
- if (!req_cfg)
- die_perror("unable to allocate the request config structure");
-
- gpiod_request_config_set_consumer(req_cfg, "gpioset");
-
- line_cfg = gpiod_line_config_new();
- if (!line_cfg)
- die_perror("unable to allocate the line config structure");
-
- for (i = 0; i < num_lines; i++) {
- gpiod_line_settings_set_output_value(settings, values[i]);
-
- ret = gpiod_line_config_add_line_settings(line_cfg, &offsets[i],
- 1, settings);
- if (ret)
- die_perror("unable to add line settings");
- }
-
- request = gpiod_chip_request_lines(chip, req_cfg, line_cfg);
- if (!request)
- die_perror("unable to request lines");
-
- if (mode->callback)
- mode->callback(&cbdata);
-
- gpiod_line_request_release(request);
- gpiod_request_config_free(req_cfg);
- gpiod_line_config_free(line_cfg);
- gpiod_line_settings_free(settings);
- gpiod_chip_close(chip);
- free(offsets);
-
- return EXIT_SUCCESS;
-}
diff --git a/tools/tools-common.c b/tools/tools-common.c
index 8957293..ea7dfa8 100644
--- a/tools/tools-common.c
+++ b/tools/tools-common.c
@@ -79,26 +79,6 @@ void print_bias_help(void)
printf(" pull-down:\tenable pull-down\n");
}
-int make_signalfd(void)
-{
- sigset_t sigmask;
- int sigfd, rv;
-
- sigemptyset(&sigmask);
- sigaddset(&sigmask, SIGTERM);
- sigaddset(&sigmask, SIGINT);
-
- rv = sigprocmask(SIG_BLOCK, &sigmask, NULL);
- if (rv < 0)
- die("error masking signals: %s", strerror(errno));
-
- sigfd = signalfd(-1, &sigmask, 0);
- if (sigfd < 0)
- die("error creating signalfd: %s", strerror(errno));
-
- return sigfd;
-}
-
int chip_dir_filter(const struct dirent *entry)
{
bool is_chip;
@@ -114,38 +94,6 @@ int chip_dir_filter(const struct dirent *entry)
return !!is_chip;
}
-struct gpiod_chip *chip_open_by_name(const char *name)
-{
- struct gpiod_chip *chip;
- char *path;
- int ret;
-
- ret = asprintf(&path, "/dev/%s", name);
- if (ret < 0)
- return NULL;
-
- chip = gpiod_chip_open(path);
- free(path);
-
- return chip;
-}
-
-static struct gpiod_chip *chip_open_by_number(unsigned int num)
-{
- struct gpiod_chip *chip;
- char *path;
- int ret;
-
- ret = asprintf(&path, "/dev/gpiochip%u", num);
- if (!ret)
- return NULL;
-
- chip = gpiod_chip_open(path);
- free(path);
-
- return chip;
-}
-
static bool isuint(const char *str)
{
for (; *str && isdigit(*str); str++)
@@ -153,32 +101,3 @@ static bool isuint(const char *str)
return *str == '\0';
}
-
-struct gpiod_chip *chip_open_lookup(const char *device)
-{
- struct gpiod_chip *chip;
-
- if (isuint(device)) {
- chip = chip_open_by_number(strtoul(device, NULL, 10));
- } else {
- if (strncmp(device, "/dev/", 5))
- chip = chip_open_by_name(device);
- else
- chip = gpiod_chip_open(device);
- }
-
- return chip;
-}
-
-bool has_duplicate_offsets(size_t num_offsets, unsigned int *offsets)
-{
- size_t i, j;
-
- for (i = 0; i < num_offsets; i++) {
- for (j = i + 1; j < num_offsets; j++)
- if (offsets[i] == offsets[j])
- return true;
- }
-
- return false;
-}
--
2.38.1
next prev parent reply other threads:[~2022-11-14 4:01 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-14 4:00 [libgpiod v2][PATCH v4 0/5] tools: improvements for v2 Kent Gibson
2022-11-14 4:00 ` Kent Gibson [this message]
2022-11-14 4:00 ` [libgpiod v2][PATCH v4 2/5] tools: line name focussed rework Kent Gibson
2022-11-14 4:01 ` [libgpiod v2][PATCH v4 3/5] tools: tests for " Kent Gibson
2022-11-15 13:08 ` Bartosz Golaszewski
2022-11-15 23:25 ` Kent Gibson
2022-11-14 4:01 ` [libgpiod v2][PATCH v4 4/5] tools: add gpionotify Kent Gibson
2022-11-14 4:01 ` [libgpiod v2][PATCH v4 5/5] tools: gpionotify tests Kent Gibson
2022-11-14 14:26 ` [libgpiod v2][PATCH v4 0/5] tools: improvements for v2 Bartosz Golaszewski
2022-11-14 15:12 ` Kent Gibson
2022-11-14 16:42 ` Bartosz Golaszewski
2022-11-14 23:35 ` Kent Gibson
2022-11-15 3:44 ` Kent Gibson
2022-11-15 14:32 ` Bartosz Golaszewski
2022-11-16 0:12 ` Kent Gibson
2022-11-16 8:14 ` Bartosz Golaszewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221114040102.66031-2-warthog618@gmail.com \
--to=warthog618@gmail.com \
--cc=brgl@bgdev.pl \
--cc=linux-gpio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.