core: provide functions for reading multiple line events at once
The kernel allows us to read multiple (up to 16) line events with
a single read() call, but up to this point libgpiod only supported
reading one event at a time. Add two new functions that allow users
to read more events at the same time.
core: use gpiod_line_event_get_fd() in gpiod_line_event_read()
We can drop the redundant line state check if we directly call
gpiod_line_event_get_fd() from gpiod_line_event_read(). As opposed
to line_get_fd() it checks if the line was requested for events.
gitignore: ignore libtool scripts created when cross-compiling
When '--host' option is passed to configure, the name of the generated
libtool script will be prefixed with the value used as argument for
'--host'. Add a pattern for prefixed 'libtool' scripts to .gitignore.
Original libgpiod relied on linux headers v4.8 to build but it was only
documented in README and not enforced at build-time. We now support
features first available in linux v5.5. Add a check to configure.ac that
verifies if recent enough kernel headers are available - otherwise we'd
fail only when trying to build the library.
Joel Savitz [Tue, 3 Dec 2019 19:23:05 +0000 (14:23 -0500)]
bindings: python: fix segfault when calling Line.request()
When Line.request() is called without the required 'consumer=value'
argument, the module attempts access an empty dictionary object
resulting in a segfault. This patch avoids such access when the
dictionary is empty and maintains the current design where the
LineBulk object is responsible for validation of arguments.
Signed-off-by: Joel Savitz <jsavitz@redhat.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kent Gibson [Sun, 1 Dec 2019 03:24:07 +0000 (11:24 +0800)]
bindings: python: make vals in gpiod_Line_set_value consistent with other functions
Change the vals in gpiod_Line_set_value from a tuple of tuples to just a
tuple. This brings it into line with other vals in the module such as
gpiod_Line_set_config and gpiod_Line_set_direction_output.
The previous usage made the vals equivalent to an args (a tuple of
arguments equivalent to argc,argv in C), as per gpiod_Line_set_flags.
Renaming vals to args in gpiod_Line_set_value was not an option as there
is already an args parameter.
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
The handling of NULL values by gpiod_line_set_value_bulk has been changed
to interpret NULL as low values for all lines. This patch updates the
documentation of the function to describe that.
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kent Gibson [Sun, 1 Dec 2019 03:23:58 +0000 (11:23 +0800)]
bindings: python: move tuple to int array conversion into helper function
Restructured gpiod_LineBulk_set_values to move the conversion of values
from Python tuple to int array into a helper function as it is useful for
similar functions.
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kent Gibson [Sun, 1 Dec 2019 03:23:54 +0000 (11:23 +0800)]
core: add support for SET_CONFIG
Extend the libgpiod API to support the setting line configuration using the
GPIO GPIOHANDLE_SET_CONFIG_IOCTL uAPI ioctl.
The core change is the addition of gpiod_line_set_config, which provides a
low level wrapper around the ioctl.
Additionally, higher level helper functions, gpiod_line_set_flags,
gpiod_line_set_direction_input, and gpiod_line_set_direction_output provide
slightly simplified APIs for common use cases.
Bulk forms of all functions are also provided.
Documented the fields of gpiod_line to better identify the purpose of
each where the field name alone is not sufficiently clear, and to
indicate which flags are applicable to each field.
Implementation includes a few helper functions that serve to keep the
code tidier and are consistent with similar helper functions already
present.
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kent Gibson [Sun, 1 Dec 2019 03:23:48 +0000 (11:23 +0800)]
core: add support for bias flags
Extend the libgpiod API to support the bias flags recently added to the
kernel GPIO uAPI. The core change is the addition of
GPIOD_LINE_REQUEST_FLAG_BIAS_DISABLE, GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP
and GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN flags to be passed into
line_request functions, and the addition of gpiod_line_bias to return the
bias state of lines.
Variants of the ctxless functions that accept an active_low flag
are added to also accept other flags. The variant names add a "_ext"
suffix to the name of the original function.
Based on initial work by Drew Fustini <drew@pdp7.com>.
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
build: use AC_CHECK_PROG() instead of AC_CHECK_FILE() for python3-config
Commit 9ed02fc793b3 ("build: check for python-config in configure")
breaks cross-compilation because AC_CHECK_FILE() only checks the host
machine. Use AC_CHECK_PROG() instead.
Cc: Joel Savitz <joelsavitz@gmail.com> Fixes: 9ed02fc793b3 ("build: check for python-config in configure") Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This function and the logic behind have been introduced in an early
version of libgpiod for reasons that have been long forgotten.
When updating the line info after a line request fails, just propagate
the error out of the request function instead of setting the internal
needs_update variable. Drop the entire logic behind gpiod_needs_update(),
make this routine always return false and mark it as deprecated in the
header.
Suggested-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kent Gibson [Mon, 18 Nov 2019 14:46:12 +0000 (15:46 +0100)]
treewide: change "correspond with" to "correspond to"
Trivial grammar fix. "correspond with" can mean either being in agreement
with, happening at the same time, or communication between parties.
"correspond to" is used to mean equivalance, which is the intended use
throughout the documentation.
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kent Gibson [Mon, 18 Nov 2019 14:41:04 +0000 (15:41 +0100)]
core: allow gpiod_line_set_value_bulk() to accept null values
Change gpiod_line_set_value_bulk to interpret a NULL values pointer as an
array of zero, as per gpiod_line_request_bulk, gpiod_line_set_config_bulk,
and gpiod_line_set_direction_bulk_output.
The old behaviour was to segfault.
Add a corresponding test case for gpiod_line_set_value_bulk().
Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Joel Savitz [Fri, 4 Oct 2019 16:11:26 +0000 (12:11 -0400)]
build: check for python-config in configure
Currently, configure succeeds when python is installed without its
development components, i.e. python-config and headers. The subsequent
make will fail when gcc cannot locate Python.h.
This patch fixes that behavior by throwing an error at configure-time if
python-config cannot be found.
Signed-off-by: Joel Savitz <joelsavitz@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
bindings: python: directly return the value from PyErr_SetFromErrno()
PyErr_SetFromErrno() always returns NULL. We can return from functions
on failure directly instead of calling it and then returning NULL in
the next line.
Add information about the tests included in Python and C++ bindings.
Move the BINDINGS section above TESTING so that the user first knows
that bindings exist before learning they also provide their own
test-suites.
Python bindings are missing the functionality provided by the core C
library's gpiod_line_update(). Extend the Line class with the update()
method that allows to re-read the line information from the kernel.
The C++ bindings are missing the functionality provided by the core C
library's gpiod_line_update(). Extend the line class with the update()
method that allows to re-read the line information from the kernel.
core: rename up_to_date to needs_update in struct gpiod_line
This variable is called up_to_date which can lead readers to the wrong
conclusion that libgpiod can somehow know when external actors (such as
a different process or a kernel driver) change the state of a GPIO line.
This is not the case and libgpiod only ever knows if a line needs info
update when a previous internal call to gpiod_line_update() fails.
The kernel does not provide any notification mechanism currently.
For that reason: rename the variable to needs_update.
While at it: clarify the documentation for gpiod_line_needs_update().
bindings: python: tests: fix checking the kernel version
Kernel release candidate version strings seem to not be working
correctly with python's version.parse() function. Split the string
retrieved with os.uname().release using '-' as delimiter and pass
only the first part - 'major.minor.release' - to version.parse().
core: fix the major:minor number comparison between the device and sysfs
Current code will incorrectly conclude that a device "1:1" matches
a sysfs device "1:10" as the length it reads from sysfsp is based on
the devstr length, which in this example is 3.
Always read the whole sysfs attribute and compare the string generated
from actual major:minor numbers against it (minus the trailing newline).
treewide: tests: uncomment previously failing test assertions
Mainline commit 2c60e6b5c924 ("gpiolib: never report open-drain/source
lines as 'input' to user-space") in the linux kernel has now been
backported to v5.2 stable branch and released in linux v5.2.11. We can
now enable back the assertions that were previously failed in test
suites (core, C++ and python). The required kernel versions must be
updated as well.
bindings: cxx: tests: simplify the event fd polling test case
The mapping of file descriptors to lines was copied over from the
pre-catch2 set of C++ examples. It's not needed here as we know which
line the event will be generated on.
bindings: python: examples: wait for ENTER press in gpioset.py
After setting the line values in gpioset.py: don't exit until the user
presses ENTER. This makes the example work the same as the 'wait' mode
in the original gpioset utility.
bindings: python: use unittest to implement a proper test-suite
Currently the only tests we have for python bindings are in a simple
script that makes a lot of assumptions about the environment and
doesn't even work anymore with recent kernels.
Remove it and replace it with a proper test-suite implemented using
libgpiod and the standard python unittest package.
bindings: python: fix the default_val argument name in the doc string
The argument in Line.request() is called default_val, not default_vals.
For backward compatibility with older versions default_vals would still
work if it was passed a tuple or list, but let's not confuse users:
default_val is the preferred way for single lines.
Alexander Stein [Wed, 7 Aug 2019 19:51:32 +0000 (21:51 +0200)]
bindings: cxx: add a workaround for --success run
If run with --success, all expressions are evaluated and printed out.
But REQUIRE_FALSE(chip) tries to iterate over the chip resulting in this
backtrace:
[...]
Work around this by forcing catch2 to call gpiod::chip::operator bool().
Signed-off-by: Alexander Stein <alexander.stein@mailbox.org> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Alexander Stein [Wed, 7 Aug 2019 19:51:31 +0000 (21:51 +0200)]
bindings: cxx: vix compile errors
This fixes the following compile errors:
tests-event.cpp:152:3: error: cannot declare reference to
'class std::system_error&', which is not a typedef or a template type
argument
152 | REQUIRE_THROWS_AS(line.event_get_fd(), ::std::system_error&);
This occurs on catch2 but not on catch.
Signed-off-by: Alexander Stein <alexander.stein@mailbox.org> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Alexander Stein [Wed, 7 Aug 2019 19:51:30 +0000 (21:51 +0200)]
bindings: cxx: split out catch's main()
Compiling the source using CATCH_CONFIG_MAIN to provide main() takes
several seconds, so split it out from any library testing code, so it
really needs to be built once only.
Signed-off-by: Alexander Stein <alexander.stein@mailbox.org>
[Bartosz: added the copyright notice for consistency with other files] Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Alexander Stein [Wed, 7 Aug 2019 19:51:28 +0000 (21:51 +0200)]
bindings: cxx: use 'upstream' include path
According to https://github.com/catchorg/Catch2/issues/1202 the
regular include is 'catch2/catch.hpp'. Also CMake and pkg-config
provide include paths for this include name.
Signed-off-by: Alexander Stein <alexander.stein@mailbox.org> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
tools: tests: restore the bats shebang in the bats source file
In commit f52e12eafd17 ("tools: tests: run the bats script indirectly
from a shell script") we removed the bats shebang and dropped the
execute permission from the .bats test-suite file.
While the preferred method of running the gpio-tools tests is using
the helper bash script, the .bats file should still be executable on
its own. Restore the execute permissions and the shebang.
bindings: cxx: use catch2 to implement a proper test-suite
Currently the only tests we have for C++ bindings are in a simple
program that makes a lot of assumptions about the environment and
doesn't even work anymore with recent kernels.
Remove it and replace it with a proper test-suite implemented using
libgpiomockup and Catch2.
bindings: cxx: add a missing throw to line::event_get_fd()
If the call to gpiod_line_event_get_fd() fails, we're not actually
throwing the exception - we're only creating it on stack. Add the
missing throw keyword.
Fixes: 8078a4a2ad90 ("bindings: implement C++ bindings") Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Kernel commit 223ecaf140b1 ("gpiolib: fix incorrect IRQ requesting of
an active-low lineevent") fixed an issue with line events not being
inverted with the GPIOHANDLE_REQUEST_ACTIVE_LOW flag. This change has
now been released in linux v5.2.7 and the relevant test case must be
adjusted.
Convert the test case to expect a falling edge event. Since the first
pull change will be 0->1, it will be interpreted as such when the
active-low flag is used.
The minimum kernel version to run the core test-suite is now set to
v5.2.7.
tests: mockup: don't fail at init-time if gpio-mockup is already loaded
The comment in gpio_mockup_new() says we can deal with gpio-mockup
already being loaded, but it's wrong - we'd actually fail in the call
to kmod_module_probe_insert_module().
Pass the KMOD_PROBE_IGNORE_LOADED flag to the insert function to fix
that.
tools: tests: fix the gpiomon test case with --active-low switch
Kernel commit 223ecaf140b1 ("gpiolib: fix incorrect IRQ requesting of
an active-low lineevent") fixed an issue with line events not being
inverted with the GPIOHANDLE_REQUEST_ACTIVE_LOW flag. This change has
now been released in linux v5.2.7 and the relevant test case for
gpiomon needs to be adjusted.
Since the line going down will now be interpreted as a rising edge
event, set the pull to 1 before running gpiomon and then set it to 0
after starting it to trigger a rising edge event.
The minimum kernel version to run tests must be set to v5.2.7.
tools: tests: pass command-line arguments to the underlying bats script
Command-line arguments need to be forwarded to the bats test-suite if
we want to control bats' execution.
Fixes: f52e12eafd17 ("tools: tests: run the bats script indirectly from a shell script") Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
tools: tests: run the bats script indirectly from a shell script
Bats makes it very difficult to run some initial code once, perform
checks for requirements and optionally exit if they are not satisfied.
Instead of working around it in the .bats script, just create
a separate shell script that does all the initial checks and then
execs the actual bats test-suite.
tests: add a test case for using misc line flags together
This adds a test case that verifies that the ACTIVE_LOW flag works
correctly when used together with OPEN_SOURCE and OPEN_DRAIN flags.
Note: a bug has been discovered in the kernel that makes the LINEINFO
ioctl() incorrectly report the direction of lines requested with
open-drain or open-source flags as 'input' if the underlying hardware
doesn't support these config options. A patch fixing it has been sent
and once it's released, the FIXME's added by this patch will be
removed.
While at it: extend the previous misc flags test with additional checks
of the reported direction, but disable the one that fails due to the
bug mentioned above.
bindings: cxx: examples: use seconds for timeout in line.event_wait()
While the event_wait() method takes ::std::chrono::nanoseconds as the
timeout argument, we don't actually need to use the same type - we can
use less fine-grained duration types. Switch to using seconds in the
gpiomoncxx example to showcase this implicit conversion.
tests: mockup: make sure the gpio-mockup debugfs directory is writable
The gpio-mockup library needs write permissions to make full use of
the debugfs interface. Add the W_OK flag to the call to access() when
preparing the context structure.
tests: mockup: add a comment explaining the kernel version definition
The library only works on newer kernels. The specific features we're
using have only available since linux v5.1.0. Add a comment explaining
this limitation to the library code.
tests: mockup: validate the chip index where applicable
In functions that take the chip index as argument: let's verify that
its value is valid i.e. it refers to an existing chip to avoid potential
segfaults.
While we're at it: delegate the validation of arguments in mockup getter
helpers to a separate routine.
tests: use GLib for library test cases and bats for gpio-tools
This replaces the custom hand-crafted testing suite with well-known
open-source tools while keeping the same coverage. The core library
is now tested using the GLib unit testing framework. The gpio-tools
are now tested in bash using the bats testing system instead of being
invoked from a C program.
This simplifies and shrinks the testing code and makes it less prone
to bugs.
Ramon Fried [Wed, 31 Jul 2019 17:38:14 +0000 (20:38 +0300)]
gpioinfo: mark kernel claimed lines as used
In case where the GPIOLINE_FLAG_KERNEL flag was set and no consumer
string is provided by the kernel, the used column was still showing
the pin as "unused" Fix that by writing "kernel".
Signed-off-by: Ramon Fried <rfried.dev@gmail.com>
[Bartosz:
- fixed indentation and alignment
- tweaked the commit message formatting] Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
tests: setup libgpiomockup before checking the kernel version
The gpio-mockup helper library checks the kernel version itself when
creating the context object. We then check the version again (as the
minimum versions for libgpiomockup and the test-suite may differ) in
the test-suite's main function. Make sure the library runs the check
first as we don't want to tell the user the version is OK and then
fail because it isn't...
There's no need to reimplement checking the kernel version. An
appropriate macro - KERNEL_VERSION() - is already provided in
linux/version.h. Use it in libgpiomockup.
When using gpiod_foreach_chip_noclose() we need to close any non-mockup
GPIO chip that may be present in the system. Otherwise we'll be leaking
memory.
bindings: python: fix GCC8 warnings due to function pointer casting
GCC8 has added a new warning heuristic to detect invalid function
casts. This causes a lot of warnings when building libgpiod python
bindings.
Let's use Py_UNUSED where applicable to make function prototypes match
that of PyCFunction. For keyword functions, let's cast them to a
function pointer taking no arguments before casting them again to
PyCFunction. This may not be the best solution but it has to do for
the moment.