GPIO framework for FreeBSD

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

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

DEvice implementations

Latest version

Code has been committed to HEAD

FreeBSD/GPIO (last edited 2010-10-20 20:29:20 by OleksandrTymoshenko)