GPIO pin is reset to default value after release.
Andrew Jeffery
andrew at aj.id.au
Mon Jan 11 10:57:31 AEDT 2021
On Wed, 6 Jan 2021, at 12:44, Thu Nguyen wrote:
> On 1/6/21 08:12, Andrew Jeffery wrote:
> >
> > On Wed, 6 Jan 2021, at 02:57, Thu Nguyen wrote:
> >> Hi,
> >>
> >>
> >> Current I'm using two difference GPIO libs gpiod and gpioplus to setting
> >> GPIO pins.
> >>
> >> I can set the GPIO pin to expected value in a service. And GPIO keep
> >> unchanging when the service is running.
> >>
> >> But when the service is exited, the GPIO handler is released then GPIO
> >> is reset to default value.
> >>
> >>
> >> Do we have any gpio lib which don't reset the GPIO when the handler is
> >> released?
> > No. This is a property of the GPIO chardev interface provided by the kernel. libgpiod makes the kernel interface a bit nicer to consume in user space, but isn't where this behaviour is contracted (i.e. any use of the chardev interface might result in this behaviour, libgpiod or otherwise).
> >
> > At the moment the way to get the behaviour you desire is to keep the line handle open.
>
> Yes, This is what I did at this moment to keep the GPIO pin unchanged.
>
> But the GPIO pin will be locked and no service can read that GPIO pins
> when is is locked.
>
> >
> > The deprecated approach is to use the sysfs interface instead, but that's strongly discouraged.
> >
> > That said, your problem is something I have on my to-do list to address with upstream. I'll Cc the openbmc list whenever I get to it.
>
> I thought about a GPIO service which will create DBus servers and Dbus
> method to set/get/release the GPIO pins and keep that GPIO pin unchanged
> until next setting.
>
> That service will handle and keep the gpio line. All of others openBmc
> services will access GPIO thru that service.
Bartosz (kernel GPIO / libgpiod maintainer) already has some half-baked code
along these lines:
https://github.com/brgl/libgpiod/tree/topic/gpio-dbus
That said, it doesn't solve the problem of needing GPIO state to persist across
reboots, as the moment the D-Bus daemon is killed the line state will revert.
I think it's desirable to solve it properly with some kernel trickery rather
than using a daemon in userspace.
All this aside, Jason's approach of exposing the lines in terms of their
purpose is also a good idea.
Andrew
More information about the openbmc
mailing list