[RFC] GPIO framework
Hans Petter Selasky
hselasky at c2i.net
Thu Nov 26 09:16:42 UTC 2009
On Thursday 26 November 2009 05:57:36 Oleksandr Tymoshenko wrote:
> Recently I've been working on GPIO framework that, I believe,
> is much needed for embedded applications of FreeBSD. Now framework
> is mature enough to show it to the world, so this is my request
> for review.
>
> Patch: http://people.freebsd.org/~gonzo/mips/gpio.diff
> sys/gpio.h is based on the same file from NetBSD but all the other
> files have been written from the scratch.
>
> Description:
>
> GPIO stands for General Purpose Input/Output. This interface may be
> thought of as a set of pins which could serve as input or output
> having logical 0 and logical 1 as their values (some other options
> are applicable, but they're not crucial for this explanation).
> Most common usage of GPIO interface is LED and button control for
> various SoCs.
>
> Architecture:
>
> I tried to separate hardware implementation from logic as much as
> possible. All the HW-independent stuff resides in sys/dev/gpio
> directory. It consists of gpioc (GPIO controller device),
> gpiobus (bus that manages devices attached to GPIO controller)
> and gpioled (implementation of LED driver that illustrates usage
> pattern of gpiobus, utilizes led(4) interface).
>
> HW-dependent part might be a part of SoC, I2C extender, whatever.
> It should implement interface defined in sys/dev/gpio/gpio_if.m:
> gpio_pin_max - get maximum pin available
> gpio_pin_getcaps - get capabilities for given pin
> gpio_pin_getflags - get flags for given pin
> gpio_pin_setflags - set flags for given pin
> gpio_pin_getname - get pin name (if any)
> gpio_pin_set - set pin value
> gpio_pin_get - get pin value
> gpio_pin_toggle - toggle(invert) pin value
> And on attaching HW driver should add gpioc and gpiobus as its
> children.
>
> gpioc creates /dev/gpiocX entry that is used by gpioctl application
> for managing GPIO pins using following ioctls:
> GPIOMAXPIN - get maximum pin available
> GPIOGETCONFIG - get flags/capabilities/name for given pin
> GPIOSETCONFIG - set flags for given pin
> GPIOGET - get pin value
> GPIOSET - set pin value
> GPIOTOGGLE - toggle(invert) pin value
> gpioctl usage:
> gpioctl -f ctldev -l [-v]
> gpioctl -f ctldev -t pin
> gpioctl -f ctldev -c pin flag ...
> gpioctl -f ctldev pin [0|1]
>
> gpiobus manages devices attached to gpio controller. Its interface
> is a subset of of gpio_if.m interface and allows child devices talk
> to GPIO controller. At the moment children could be set only by hints
> file and pin space is limited to 32. Example:
>
> # RF led
> hint.gpioled.0.at="gpiobus0"
> hint.gpioled.0.name="rf"
> # pin 2
> hint.gpioled.0.pins=0x0004
>
> Interface functions:
> gpiobus_pin_getcaps - get capabilities for given pin
> gpiobus_pin_getflags - get flags for given pin
> gpiobus_pin_setflags - set flags for given pin
> gpiobus_pin_set - set pin value
> gpiobus_pin_get - get pin value
> gpiobus_pin_toggle - toggle(invert) pin value
>
> Reference implementation of child device is sys/dev/gpio/gpioled.c
> It provides on/off function for led(4) API
>
> Any comments/feedback are welcome
Are there any functions to setup interrupts on GPIO pins?
--HPS
More information about the freebsd-arch
mailing list