tech-embed archive

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

Re: Interrupts on GPIO (on RPI, specifically, but also in general)




> On Apr 19, 2018, at 12:31 AM, Manuel Bouyer <bouyer%antioche.eu.org@localhost> wrote:
> 
> On Wed, Apr 18, 2018 at 10:28:34PM -0700, Jason Thorpe wrote:
>> There seems to be support for interrupts on GPIO, but no in-tree examples of how it?s used, programming patterns, etc.
>> 
>> Anyone have any solid examples?
>> 
>> Context: I have a device I?m building that is going to have some buttons, a switch or two, and a rotary encoder for input.  Path of least resistance is to use an AVR and an existing software library for said AVR to emulate a USB keyboard (the ?throw more hardware at the problem? approach).  But I have enough GPIO pins on the Raspberry Pi for the task and I loathe to make the PCB more complicated than it has to be, so I?m considering writing an interrupt-driven ?gpiokbd? driver that would allow me to map GPIO input pin interrupts to a configurable set of ?wskbd? input events.  I could poll, but I *really* don?t want too, and if I?m forced down that path, then I?d almost rather use the AVR solution.
>> 
>> I found Manuel Bouyer?s chart plotter driver that uses this on Github, but it seems to have some FDT conditionals, as well?
> 
> Yes. I don't know specifiacally for RPis (I don't use them), but for
> sunxi the GPIO driver is declared as an interrupt controller too.
> With a reference to a GPIO in the device tree a driver can
> use fdtbus_intr_str()/fdtbus_intr_establish(). This interface is MI.
> I think this is the way to go for your driver (and writing a
> FDT-based driver isn't hard :)

It just doesn’t seem right to make a new DTB for this purpose.  It also seems kind of silly to have a separate driver instance for each button … seems analogous to building e.g. a game controller where you have anywhere between 4-10 momentary switches in a single logical device.  I’m already using the raw GPIO directly (to talk to a bank of shift registers).

Here’s kind of what I’m thinking…

Have gpiokbd attach to gpio.  It’s dormant until configured.  The configuration of the pins (active hi/low, interrupt on rising/falling/both edges, and which keysym a pin maps to) would be specified in a property list.  An “attach-keyboard” ioctl would push the property list into the gpiokbd driver which would do all of the necessary setup and then attach the wskbd instance.  A separate “detach-keyboard” ioctl would detach the wskbd instance and disable any previously registered interrupt handlers.  The disposition of the GPIO pins themselves would be done in the usual way.

> BTW we have a gpiobutton driver, but AFAIK it uses polling.

Yes and it’s also very much oriented to single-button-with-system-control-function.  I may prototype the gpiokbd approach with polling first, and then add the interrupt capability later.

> 
> -- 
> Manuel Bouyer <bouyer%antioche.eu.org@localhost>
>     NetBSD: 26 ans d'experience feront toujours la difference
> --

-- thorpej



Home | Main Index | Thread Index | Old Index