From: Kent Gibson <warthog618@gmail.com>
To: "Jiří Prchal" <jiri.prchal@aksignal.cz>
Cc: linux-gpio@vger.kernel.org, brgl@bgdev.pl
Subject: Re: [libgpiod] feature request: output state read and sustain
Date: Wed, 29 Jun 2022 18:10:51 +0800 [thread overview]
Message-ID: <20220629101051.GA27271@sol> (raw)
In-Reply-To: <a1cdd48d-0da9-b61a-3530-ef2e99539b74@aksignal.cz>
On Wed, Jun 29, 2022 at 11:25:57AM +0200, Jiří Prchal wrote:
>
>
> On 29. 06. 22 9:23, Kent Gibson wrote:
> > On Tue, Jun 28, 2022 at 03:08:20PM +0200, Jiří Prchal wrote:
> > > Hi,
> > > using new libgpiod / chardev driver, is there any way to get state of
> > > output? I mean one process sets it for example to 1 and another process
> > > reads this output state for example to show that on web page.
> > > I have to say that old sysfs interface was more user friendly...
> > >
> >
> > "new" being anything since Linux 4.8 ;-)?
> > And strictly speaking it isn't a driver - libgpiod and the GPIO subsystem
> > provide an interface to the chip driver. More on that later.
> >
> > Only the process holding the line has access to the current value.
> > If you need that value elsewhere then it has to be published by that
> > process - it is not available through the GPIO API itself.
> > There is nothing preventing that process publishing the value
> > in whatever way is appropriate to your application.
> > e.g. write it to a file that can be read by your webapp, just as it
> > would from sysfs.
> >
> > Less restrictive access models are frequently "more user friendly", but
> > have other issues. e.g. some misbehaving process just reset your
> > modem for you.
> >
> > And sysfs has other great features like being slow and being complete
> > rubbish for events on input lines.
> >
> > > And at second: it would be better to NOT "the state of a GPIO line
> > > controlled over the character device reverts to default when the last
> > > process referencing the file descriptor representing the device file exits."
> > > "Set and forget" behavior is more natural to what some gpios are used. For
> > > example resetting external modems, need set 1 for short time, then to 0 and
> > > leave it for long long time until next reset is needed. It's non sense to
> > > keep running some process only to keep output at 0.
> >
> > Agreed, that might be more natural, but that behaviour is not by choice,
> > it is a consequence of the kernel internals. In short, if the GPIO
> > subsystem does not hold the chip then the driver is free to do what it
> > likes to it.
> > So when you release a line all bets are off.
> > It may stay where you left it, but it may not - it may even switch to an
> > input - it depends on the driver.
> Does it mean that without changing this particular line it could be changed? For example by setting another line in chip?
>
If you hold a line then it is guaranteed to remain in the state you
request. Changing or releasing other lines will not alter that line.
If you release a line then other processes are free to request it and
alter it. But if no other process request it, it will generally will
remain in the state you left it. Generally.
The exception is if you release the last requested line on the chip, in
which case the GPIO subsystem will release the chip to the driver and
what happens to all the lines on the chip after that is up to the driver.
The big problem is you never know if the line you are releasing is the
last requested line. Unless you explicitly hold at least one line.
> > If it works for you that's great, but without major kernel changes
> > libgpiod has no better option than to provide the caveat as the "set and
> > forget" behaviour is something that it cannot guarantee.
> Than is only way to write my own user space driver simulating sysfs? Or what is the right way of this scenario:
> start proces -> gpioset =1 -> sleep -> gpioset =0 -> do other things
> when the proces dies systemd will start it again
>
No, you don't have to emulate sysfs, you can do whatever works for you,
that was just an example.
The libgpiod tools are not the only interface libgpiod provides - they
are just the command line/shell interface.
You would not call gpioset repeatedly, you would request the line using
libgpiod (for C), or the appropriate bindings for the language you are
working in, and then set the line as required in your program.
If you are working in shell with libgpiod v1.6.3 then there is no way
to hold a line and subsequently change it. You would have to repeatedly
call gpioset and hope for the best in between times.
For libgpiod v2 I'm working on an interactive mode for gpioset that
keeps it running and holding the line(s) and you pipe set commands to it
from your script as required.
If you need anything more complicated for scripting then the Python
bindings would be the way to go.
> and another scenario:
> proces checks time, if is the right time -> gpioset =1
> other proces reads output and print out on web
>
line manager process:
request line (using appropriate binding)
wait until whenever
set=1 (using appropriate binding)
publish line state where web server can see
...
web server process:
webserver asked for state
returns last published value
Cheers,
Kent.
next prev parent reply other threads:[~2022-06-29 10:11 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-25 10:02 [libgpiod] bug: pull-up does not work Jiří Prchal
2022-03-25 14:57 ` Kent Gibson
2022-03-25 15:13 ` Jiří Prchal
2022-03-25 16:01 ` Kent Gibson
2022-03-28 7:12 ` Jiří Prchal
2022-03-28 8:08 ` Kent Gibson
2022-03-28 8:58 ` Jiří Prchal
2022-03-28 9:56 ` Kent Gibson
2022-06-28 13:08 ` [libgpiod] feature request: output state read and sustain Jiří Prchal
2022-06-29 7:23 ` Kent Gibson
2022-06-29 9:25 ` Jiří Prchal
2022-06-29 10:10 ` Kent Gibson [this message]
2022-06-29 10:27 ` Andy Shevchenko
2022-06-29 10:47 ` Kent Gibson
2022-06-29 10:58 ` Andy Shevchenko
2022-06-29 11:20 ` Kent Gibson
2022-06-29 11:55 ` Andy Shevchenko
2022-06-29 12:56 ` Bartosz Golaszewski
2022-06-29 15:22 ` Andy Shevchenko
2022-06-29 11:17 ` Jiří Prchal
2022-06-29 11:25 ` Kent Gibson
2022-06-29 11:48 ` Jiří Prchal
2022-06-29 12:51 ` Kent Gibson
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=20220629101051.GA27271@sol \
--to=warthog618@gmail.com \
--cc=brgl@bgdev.pl \
--cc=jiri.prchal@aksignal.cz \
--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 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).