From: Kent Gibson <warthog618@gmail.com>
To: Ryan Lovelett <ryan@lovelett.me>
Cc: linux-gpio@vger.kernel.org
Subject: Re: [libgpiod] Polling precision/order
Date: Wed, 3 Jun 2020 22:54:47 +0800 [thread overview]
Message-ID: <20200603145447.GA26614@sol> (raw)
In-Reply-To: <c5498c40-7e80-4dc5-bff3-3ab8efd4898f@www.fastmail.com>
On Mon, Jun 01, 2020 at 09:59:07PM -0400, Ryan Lovelett wrote:
> I am trying to use libgpiod to listen for falling edge events to determine rotation direction for a rotary encoder and the values I'm reading seem unstable. I am starting to wonder if either my approach is flawed or libgpiod/Linux cannot be used for this purpose.
>
Your approach isn't ideal. It would be better to receive interrupts on
both edges of one line, and compare the phase of the the two lines
at that time to determine direction. Depending on the responsiveness of
your platform you may be able to do that from userspace - depends on
how the interrupt rate compares to the interrupt latency to userspace.
> Rather than post my code and go with that I think I can explain the problem using the provided tools. Specifically, gpiomon,
> e.g., gpiomon --falling-edge --active-low gpiochip0 3 4. Here I've hooked up the rotary encoder clock and signal gpio pins 3 and 4. Spinning one direction should make 3 go low before 4 and spinning the opposite should make 4 go low before 3. Looking at the signal on the oscilloscope shows exactly that behavior.
>
The GPIO uAPI does not guarantee ordering of events across multiple
lines, so mis-ordering is possible. Also, the interface to userspace is
buffered and it is possible for the buffer to overflow so events can be
lost. Obviously either of those would play havoc with your algorithm.
What the uAPI does provide is timestamps on the events, and if I were
you I would be looking at those. That would provide you with ordering
and spacing, and probably provide some clues as to the underlying
problem. e.g. if the timestamps are jumbled then you are getting
mis-ordering. If the spacing is less than you are seeing on your scope
then you may have noise. If the spacing is greater than you are seeing
on your scope then you may be losing events...
> Unfortunately, I do not see that in the gpiomon output. It is erratic and order is not always guaranteed. Is this just something that is not going to work on Linux due to the nature of interrupts on Linux? Is this a bug? Or just not supported use case?
>
I'd rather not speculate - more information required.
It certainly isn't a use case that the GPIO uAPI is ideal for.
Also, gpiomon could be part of your problem. If it is too slow dumping
events to wherever stdout goes, it will certainly cause events to be
lost...
Maybe redirect that to a file in RAM while you perform your test, then
examine the file afterwards.
Cheers,
Kent.
next prev parent reply other threads:[~2020-06-03 14:54 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-02 1:59 [libgpiod] Polling precision/order Ryan Lovelett
2020-06-03 14:54 ` Kent Gibson [this message]
2020-06-11 16:52 ` Ryan Lovelett
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=20200603145447.GA26614@sol \
--to=warthog618@gmail.com \
--cc=linux-gpio@vger.kernel.org \
--cc=ryan@lovelett.me \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).