User Space GPIO Interrupt programming - GSoC-2018

Ian Lepore ian at freebsd.org
Thu Nov 26 19:56:40 UTC 2020


On Tue, 2020-11-24 at 17:14 -0300, Dr. Rolf Jansen wrote:
> Hello
> 
> Has anything of the GSoC-2018 efforts made it into the current code
> base?
> 
> 
https://wiki.freebsd.org/SummerOfCode2018Projects/UserSpaceGPIOinterrupts
> 
> I installed the recent 13.0-CURRENT snapshot (2020-11-19) on a
> BeagleBone Black which was one of the implementation targets of said
> project, but when running the test tools, I either see cannot
> read/kevent/poll/aio_read - Operation not supported by device or
> Inappropriate ioctl for device.
> 
> Perhaps I need to pull the project’s changes into the kernel by
> myself. However, before this I would like to ask whether it is worth
> the effort.
> 
> Please, can anyone shed some light on this.
> 
> Best regards
> 
> Rolf
> 

I made some time this morning to review the gsoc2018 code.  It turns
out this code is very high quality, nearly ready to commit as-is.  The
main thing it needs is some style cleanup in its comment blocks, and
documentation.  I'd be inclined to commit the code first and write the
documentation over the next little while and commit it separately.

If you'd like to give it a try, here's a diff that should apply and
build cleanly on freebsd 12 or 13:

 https://people.freebsd.org/~ian/gpio_gsoc2018.diff

While there isn't any documentation yet, there is a test program (I
haven't run it yet) that demonstrates all the features:

https://github.com/ckraemer/gsoc2018-utils/blob/master/src/gpioc_intr_test.c

Right now the code will let you block waiting for a pin-change event
using select(), poll() or kevents, or to be notified via SIGIO, but
after being notified that something happened, you still have to call
read() to see which pin changed.  I think if the pin changes state
multiple times between calls to read(), you'll lose track of some
changes (I'm not positive of that, I don't understand the kevent stuff
well).

I'd like to add some features so that you can configure it to track pin
changes in counting-mode and timestamping-mode.  In counting mode, when
you do a read() you would get back a pair of values, the pin number and
how many times its interrupt fired since the last read.  In
timestamping mode, every read would return a pin number and an
associated timespec giving the exact time the interrupt happened (there
would need to be a way to configure how many events it could buffer,
but I think even allowing a thousand buffered events would only use a
few kbytes of memory).

-- Ian




More information about the freebsd-arm mailing list