Re: [libgpiod] reading multiple lines after edge event

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 17.06.20 um 03:57 schrieb Kent Gibson:
On Mon, Jun 15, 2020 at 09:39:45PM +0200, Gerrit Wyen wrote:
Hi,

can someone explain the following behavior and whether it is a bug?

When reading two lines at once via get_values() in response to an edge event
I only receive the correct value for the first line (second line is high
during the test but always reported as low).
See example code below:

lines.request({
  “gpiotest”, ::gpiod::line_request::EVENT_BOTH_EDGES,
  0,
});

auto events = lines.event_wait(::std::chrono::seconds(10));
if (events) {
  auto values = lines.get_values();
  for (auto& it: values) {
    ::std::cout << it;
    }
  }

However reading the same lines via get_value() one by one after the event
works correctly. Like so:

for (auto& it: lines) { ::std::cout << it.get_value(); }


Also, when reading them without waiting for the event with
line_request::DIRECTION_INPUT  the correct values are returned by
get_values() as well as by get_value().

This behavior was tested on multiple different devices.



I have written some test cases and can confirm that behaviour
with libgpiod v1.5.

When you request the lines with DIRECTION_INPUT, libgpiod is using a
linehandle (which works), but with EVENT_BOTH_EDGES it is using
a collection of linevents (which doesn't).

I would consider that a bug - linehandles (lines without edge detection)
and lineevents (lines with edge detection) are treated differently
in the GPIO uAPI and libgpiod should be hiding that from you - and is
failing to do that.

The issue here is that the underlying function that retrieves the values,
gpiod_line_get_value_bulk, assumes it is dealing with a linehandle
that can be read in bulk by the kernel, not a collection of lineevents
that must be read individually, so it is only getting the value of the
first line in the set.  It should be getting the event lines
individually, as you are, and collecting those values into the response.

Until there is a fix, the workaround is to read the event lines
individually - as you have already discovered.

Cheers,
Kent.


Thanks a lot for the quick response.
I applied your patch and it fixed the issue.

best regards,
Gerrit



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux