Re: Reading current output value

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

 



On Mon, Jun 27, 2022 at 12:37:46PM +0200, Yegor Yefremov wrote:
> Hi Kent,
> 
> On Wed, Jun 22, 2022 at 12:26 PM Kent Gibson <warthog618@xxxxxxxxx> wrote:
> >
> > On Wed, Jun 22, 2022 at 09:54:41AM +0200, Yegor Yefremov wrote:
> > > On a am335x based board I have a GPIO pin that enables/disables power
> > > of an external device (the bootloader sets this pin to output and 1,
> > > and the kernel is instructed to not change it). Using kernel
> > > 5.19.0-rc2 and sysfs interface, I can read the current status as
> > > follows:
> > >
> > > echo 68 > /sys/class/gpio/export
> > > cat /sys/class/gpio/gpio68/value
> > >
> > > As a result, I read 1.
> > >
> > > Using gpioget (libgpiod) v1.6.3, the line will be configured to
> > > "input" and the value is set to 0:
> > >
> > > # gpioget 2 4
> > > 0
> > >
> > > So, how can I read the state without changing it? I am mostly
> > > interested in using the kernel userspace API directly.
> > >
> >
> > The API itself supports it, but it isn't exposed in gpioget v1.6.3.
> > The gpioget in libgpiod master has a --dir-as-is option for exactly
> > this case, but that hasn't made its way into a libgpiod release yet.
> > (commit 3a912fbc1e2 tools: gpioget: add new --dir-as-is option for GPO read-back)
> > Can you try master?
> 
> # gpioget -v
> gpioget (libgpiod) v2.0-devel
> Copyright (C) 2017-2018 Bartosz Golaszewski
> License: LGPLv2.1
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
> 
> Now, I get my "1", but as soon as gpioget exits, the pin goes at "0".
> 

Is that line the only line used (i.e. exported) on that chip?
If that is the case, can you request another unused line first (e.g.
using gpiomon in the background, or, and only since you've already
mentioned sysfs, exporting using sysfs), then try the gpioget?


But fundamentally what you are trying to do is use the GPIO line as a
persistent store, which it is not.  The state of a GPIO line is
uncontrolled, and considered undefined, unless the line is requested
(exported to use the sysfs terminology).
The gpio tools have no option but to release the line when they exit,
and so can't be guaranteed to do what you want here.
It may work or, as you have found, it might not.

What you need is a userspace entity to request and hold the line and
be the ultimate arbiter of the state of the line.  The initial state of
the line could still be read from the line itself, though that should be
a last resort.  You mention your bootloader is configured to
initialise the line to 1, so you could take that as a given and have
the arbiter set it to 1 on startup.
I'm currently working on an update of gpioset for libgpiod v2 [1] that
has an interactive mode, so you can set the line and then control the
value later.
 e.g. gpioset --interactive --chip 2 4=1

Would that work for you?

Cheers,
Kent.

[1] https://lore.kernel.org/linux-gpio/20220627134447.81927-1-warthog618@xxxxxxxxx/



[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