1
0
mirror of https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git synced 2026-10-24 00:48:53 +03:00
Commit Graph

235 Commits

Author SHA1 Message Date
Bartosz Golaszewski
e6f20c261d core: rework gpiod_chip_find_line()
GPIO line names are not unique and the library has been incorrectly
making such assumption in v1.x series. We've already dropped interfaces
that would be too complicated to maintain when taking this into account.

Let's now rework the remaming API. This introduces a new function to the
C API: gpiod_chip_find_line_unique() which assumes that the line name is
unique and signals an error if it's not. The previous
gpiod_chip_find_line() function now returns a bulk object containing all
matching lines.

Python and C++ bindings are updated: their find_line() functions return
bulk objects (or an ::std::vector> too now and they take an additional
argument specifying whether we're looking for a unique line or not.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2020-12-14 15:57:07 +01:00
Bartosz Golaszewski
8496158bc0 treewide: kill find_lines()
GPIO line names are not unique. Looking up multiple lines by names would
require us to return a list of matching lines for every name. We're
simplifying the library API so drop this interface treewide.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2020-12-14 15:57:05 +01:00
Bartosz Golaszewski
fa1fe46653 treewide: kill global line lookup
Global line lookup doesn't really work correctly because GPIO line names
are not unique. We'd have to return a list of matching lines. Also: not
all chips may be accessible by user in which case the chip iterator will
fail. We'll soon be removing chip iterators entirely so for now drop the
global line lookup and let users iterate over chips themselves.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2020-12-14 15:56:57 +01:00
Bartosz Golaszewski
44ed2c098e treewide: kill opening chips by label
Chip labels are not unique - opening chips by label may lead to errors
or to ignoring chips with duplicate labels. Users can easily implement
chip lookup by label themselves so remove this part from the core library
and all bindings.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2020-12-14 15:56:46 +01:00
Bartosz Golaszewski
0bdee1e36f core: drop line iterators
Hand-crafted iterators don't make much sense in C and impose an
additional layer of memory allocation and resource releasing. Remove
the line iterators from the core C library.

We're leaving the iterators where they make sense: in C++ and Python
bindings but we convert them to using other means of keeping track of
lines.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2020-12-14 15:56:43 +01:00
Bartosz Golaszewski
cada6cad2a bulk: drop the limit on the max number of lines
The limit of 64 lines max per bulk object is wrong. We may want to
retrieve all lines from a chip exporting more than 64. We'll be reducing
the role of bulk objects soon so drop this limit now.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
2020-12-14 15:56:40 +01:00
Bartosz Golaszewski
2b02d7ae1a treewide: rework struct gpiod_line_bulk
Current implementation of struct gpiod_line_bulk uses stack memory
excessively. The structure is big: it's an array 64 pointers + 4 bytes
size. That amounts to 260 bytes on 32-bit and 516 bytes on 64-bit
architectures respectively. It's also used everywhere as all functions
dealing with single lines eventually end up calling bulk counterparts.

The rework addresses it by making the bulk structure opaque and
providing appropriate interfaces for library users while retaining a way
for internal users to allocate single line bulks on the stack.

The macro-based loop has been removed. In its place we provide a function
iterating over all lines held by a bulk and calling the provided callback
function for each line.

Since bulk operations can now fail, a bunch of test-cases has been added
to cover the relevant code.

While at it: using the word offset both when referring to line's HW
offset in a chip as well as the offset in a bulk leads to confusion.
This patch renames the bulk offset to index.

Some additional improvements to the patch by:
  Kent Gibson <warthog618@gmail.com>

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-11-04 16:39:09 +01:00
Bartosz Golaszewski
21f7744251 treewide: make linux v5.10 a hard requirement for libgpiod
The library now uses v2 of the GPIO uAPI. The new user interface is
scheduled for release as part of linux v5.10. Linux v5.10-rc1 is now
tagged so make v5.10 headers a requirement for the build and update
all tests to check for the correct version.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-10-26 11:19:59 +01:00
Bartosz Golaszewski
0bea9ee220 bindings: python: remove gpiod.version_string()
We support the standard __version__ module attribute. There's no need
to duplicate this functionality in the form of the version_string()
function.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-10-14 10:08:15 +02:00
Kent Gibson
db552da19c bindings: cxx: tests: rename freq parameter to period_ms
The freq field of struct gpiod_test_event_thread is actually used as a
period measured in milliseconds, so rename it to period_ms in the struct
and wherever it is used as a function parameter.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-10-14 09:43:47 +02:00
Jiri Benc
6132bc75c2 bindings: python: fix Line.request() crashing
On an attempt to call the 'request' method of a Line object, the program
crashes with this exception:

> SystemError: ../Objects/dictobject.c:2606: bad argument to internal function
>
> The above exception was the direct cause of the following exception:
>
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> SystemError: <class 'gpiod.LineBulk'> returned a result with an error set

The problem is that keyword args are NULL (rather than an empty dict) if
they are not present. However, PyDict_Size sets an exception if it gets
NULL.

Fixes: 02a3d0a2ab ("bindings: python: fix segfault when calling Line.request()")
Signed-off-by: Jiri Benc <jbenc@upir.cz>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-10-09 14:24:10 +02:00
Bartosz Golaszewski
e120d3e996 bindings: python: tests: add a test-case exposing a bug in Line.request()
Calling Line.request() with no keyword arguments leads to an exception
being raised by PyDict_Size(). Add a test-case exposing this bug. It
will be fixed in the subsequent commit.

Reported-by: Jiri Benc <jbenc@upir.cz>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-10-09 14:24:10 +02:00
Jiri Benc
3ffa77c4c2 bindings: python: fix incorrect object size
tp_basicsize is the size of the allocated object, not of the class.

Fixes: 96c524c495 ("bindings: implement python bindings")
Signed-off-by: Jiri Benc <jbenc@upir.cz>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-10-09 09:41:25 +02:00
Bartosz Golaszewski
7f30548da6 bindings: python: add the __version__ module attribute
The python module provides the version_string() function that returns
the API version but the standard way to do this according to PEP 396
is by providing the __version__ attribute at the module level.

Add __version__ constant to gpiod module and mark version_string() as
deprecated in the doc.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-04-02 11:02:20 +02:00
Bartosz Golaszewski
c89e9565cf build: use the gnu89 C standard explicitly
We're already using it implicitly but GCC may change the default
standard to gnu99 at some point, so use gnu89 explicitly whenever
building C files.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-03-17 18:08:36 +01:00
Bartosz Golaszewski
8add960f6b bindings: python: tests: package the python test-suite in the dist tarball
The test-suite python scripts is added to bin_SCRIPTS in Makefile.am.
This means it's not distributed by default. Add it to dist_bin_SCRIPTS
and make it part of the distribution tarball.

Fixes: 452696601a ("bindings: python: use unittest to implement a proper test-suite")
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-01-06 15:31:10 +01:00
Bartosz Golaszewski
ec20df2a76 bindings: python: tests: add a test-case for reading multiple line events
Extend the test coverage of Python bindings with tests of reading of
multiple line events at once.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-01-02 18:30:53 +01:00
Bartosz Golaszewski
40504d6a32 bindings: python: add a method for reading multiple line events
Add a new method to the Line class allowing to read up to 16 line
events at once.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2020-01-02 18:30:53 +01:00
Joel Savitz
02a3d0a2ab 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>
2019-12-11 16:10:06 +01:00
Kent Gibson
3e30364cc1 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>
2019-12-10 16:43:09 +01:00
Kent Gibson
02615b7b1b bindings: python: tests: add tests for SET_CONFIG methods
Extend test coverage over set_config, set_flags, set_direction_input, and
set_direction_output methods.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-12-10 14:56:07 +01:00
Kent Gibson
937ca5ae35 bindings: python: add support for SET_CONFIG
Add methods to support setting line configuration.

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-12-10 14:46:27 +01:00
Kent Gibson
587fd12961 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>
2019-12-10 14:45:32 +01:00
Kent Gibson
6acdb16a79 bindings: python: tests: add tests for bias flags
Extend test coverage to cover the bias flags in requests and the bias
setting returned by line.bias().

Signed-off-by: Kent Gibson <warthog618@gmail.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-12-10 11:45:52 +01:00
Kent Gibson
811a694411 bindings: python: add support for bias flags
Add support for bias flags in line requests and returning the line bias
setting via a bias accessor.

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>
2019-12-10 08:58:55 +01:00
Kent Gibson
bb3dc9eb2e 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>
2019-11-18 15:46:12 +01:00
Bartosz Golaszewski
1395cf9edf 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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-09-19 18:51:27 +02:00
Bartosz Golaszewski
4029c34f5c bindings: python: provide Line.update()
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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-09-14 15:29:48 +02:00
Bartosz Golaszewski
1f0d078c83 build: tweak formatting of multi-line variables in Makefiles
Don't put a tab between the asignment and the first string - just move
the whole list one line below.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-09-10 10:43:24 +02:00
Bartosz Golaszewski
8fc50f32cd bindings: python: examples: check if '__main__' is set
The examples are programs meant to be executed directly and not
imported. Use the standard "if __name__ == '__main__':" before
any code.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-09-10 10:43:24 +02:00
Bartosz Golaszewski
87a1d4f663 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().

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-09-10 10:39:12 +02:00
Bartosz Golaszewski
c83573ba31 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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-29 09:41:37 +02:00
Bartosz Golaszewski
f5f4794647 bindings: python: tests: verify the errno field of OSError exceptions
When a call is expected to raise the OSError exception, verify that its
errno field is set to the expected value.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-14 14:24:29 +02:00
Bartosz Golaszewski
3212e5797a 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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-12 14:27:32 +02:00
Bartosz Golaszewski
ef857e6dec bindings: python: examples: don't store the return value unnecessarily
In gpioset.py: when calling lines.set_values(), there's no point in
storing the return value as it's always None. It's also not used
anywhere.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-12 14:20:48 +02:00
Bartosz Golaszewski
e03044f862 bindings: python: examples: make gpiomon.py output resemble the original
Modify the gpiomon.py example to describe the detected events in
a format similar to the one used by the original gpiomon tool.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-12 14:12:13 +02:00
Bartosz Golaszewski
452696601a 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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-09 14:52:01 +02:00
Bartosz Golaszewski
b33cb2aa56 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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-08-09 11:49:09 +02:00
Bartosz Golaszewski
583cf823d3 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.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-07-11 11:57:13 +02:00
Bartosz Golaszewski
8159d9b540 treewide: rearrange source directories
The src directory containing lib and tools is not necessary and will
actually cause problems if we tried to add a new component to src/
which would depend on libraries from the bindings directory because it
(bindings) already depends on src/lib.

Simplify the directory structure. Move lib and tools to the root source
directory and update all relevant files. That way we can specify the
exact build order of components from the top source Makefile.am.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-03-07 13:49:00 +01:00
Bartosz Golaszewski
0e2ff67853 bindings: python: add support for 'default_val' in Line.request()
Until now Line.request() only took 'default_vals' argument which was
passed down directly to LineBulk.request() internally. This meant that
even when requesting a single line in output mode, the default value
had to be passed in a sequence.

Add support for the 'default_val' argument which makes it possible to
specify the default value as an integer. The previous 'default_vals'
argument is still supported, but the two cannot be passed at the same
time.

Documentation for default_vals is removed, as it's now deprecated for
Line.request().

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-02-15 13:46:10 +01:00
Bartosz Golaszewski
aa1eb7e6eb bindings: python: fix argument alignment in a function call
When breaking a line, the arguments should be aligned with the opening
bracket of the function call.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
2019-02-15 13:16:57 +01:00
Bartosz Golaszewski
acdd77c639 treewide: unify naming of local variables representing return values
For integers representing simple return values of various functions
use the name 'rv' everywhere.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-11-14 17:43:35 +01:00
Bartosz Golaszewski
3feb6d4fd5 bindings: python: pydoc improvements
Current documentation of python bindings is quite limited. Extend it
with more elaborate descriptions of types and methods.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-31 16:24:01 +02:00
Bartosz Golaszewski
ba8ee34516 bindings: python: bail-out if the line was not found in gpiofind.py
Currently we're not checking if the object returned from
gpiod.fine_line() is None which results in an attribute error being
raised when we try to call line methods on a non-line object.

Add an if and bail-out with an error code if the line with given name
was not found.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-31 14:40:09 +02:00
Bartosz Golaszewski
cdf5ef94c4 bindings: python: fix gpiod_Chip_find_lines() for nonexistent lines
Currently if we call gpiod_Chip_find_lines() with some names that
cannot be looked up, we end up getting an exception from the LineBulk
object's constructor (because None is not a Line and LineBulk can only
hold Line objects).

Fix the behavior of gpiod_Chip_find_lines() for nonexistent lines by
raising an explicit exception if the underlying gpiod_Chip_find_line()
call returns None. Also: add a relevant test case.

Fixes: 96c524c495 ("bindings: implement python bindings")
Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-31 14:30:46 +02:00
Bartosz Golaszewski
e9e56da405 bindings: python: remove a redundant if
We don't need to check if bulk is NULL in gpiod_Chip_find_lines()
before returning it.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-31 14:30:46 +02:00
Bartosz Golaszewski
1d87088b1e bindings: python: examples: close chip objects where needed
Unlike the C++ bindings: we can't expect the python runtime to call
the Chip object's destructor when all references are dropped. We need
to close each chip explicitly. Either call the close() method directly
or use controlled execution in all examples.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-31 14:30:46 +02:00
Bartosz Golaszewski
29adcc24da bindings: python: fix tp_dealloc callbacks in all objects
We have a significant memory leak in the current implementation as we
don't call PyObject_Del() as the last action in tp_dealloc callbacks.

From tp_dealloc's documentation:

---
The destructor function should free all references which the instance
owns, free all memory buffers owned by the instance (using the freeing
function corresponding to the allocation function used to allocate the
buffer), and finally (as its last action) call the type’s tp_free
function.
---

PyObject_Del() will internally call the tp_free callback of the type.
Add a call to it as the last action in every destructor.

Fixes: 96c524c495 ("bindings: implement python bindings")
Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-24 14:12:18 +02:00
Bartosz Golaszewski
9d97f989ef bindings: python: don't force python to use the system allocator
When allocating raw memory let python decide which allocator to use.
Convert all calls to PyMem_Raw*() to PyMem_*().

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
2018-07-22 21:26:47 +02:00