GPIOlib
Contents
Introduction
With recent Linux kernel (> 2.6.3x), there is an abstraction layer meant to ease GPIO usage: gpiolib. We will explain here how to use it.
For this purpose we will use the user LED and button of the button to let you operate the GPIO feature without any hardware modification.
Linux provides specific drivers for LEDs and switches - as explained in the Linux documentation of the GPIO - "that should be used instead of talking directly to the GPIOs; they integrate with kernel frameworks better than your userspace code could."
Datasheet gpio number correspondance
Linux manage gpio with a simple number, but under datasheet GPIO are referenced with port number (or letter) and pin number. To convert in single integer, use following formula :
- APF9328: TODO.
- APF27: (port letter (A=0, B=1, ...) x 32 ) + pin number.
- Example : PF14 = (5x32) + 14 = 174
- APF28: (Bank number x 32) + pin number
- Example : GPIO_0_21 = (0x32) + 21 = 21
- APF51: ((Bank number - 1) x 32) + pin number
- Example : GPIO1_2 = (0 x 32) + 2 = 2
Installation
- Configure Linux kernel:
$ make linux-menuconfig
- Enable the sysfs interface of the GPIOlib If not already done:
Device Drivers ---> -*- GPIO Support ---> [*] /sys/class/gpio/... (sysfs interface)
- In order to test the GPIOlib with the user LED and SWITCH of the board you will have to disable the GPIO_keys and GPIO_LEDS drivers that are the regular driver for such device.
Device Drivers ---> Input device support ---> [*] Keyboards ---> < > GPIO Buttons (be sure GPIO Buttons is unchecked)
Device Drivers ---> [ ] LED Support ---> (be sure "LED Support" or "GPIO connected LEDs" (hereafter) is unchecked) < > LED Support for GPIO connected LEDs
- Save your new configuration and rebuild your kernel (if needed)
$ make
- and reflash your kernel (if needed)
Usage
Blink APFxxDev i.MX LED
- Find the GPIO number connected to the LED, eg:
- for APF27Dev: PF14 -> PortF (n°6) pin 14 -> (6-1)*32 + 14 -> GPIO n°174
- for APF51Dev: GPIO1_2 -> Port 1 pin 2 -> GPIO n° 2
- for APF28Dev: Bank 0, pin 21 -> GPIO n° 21 (0*32 + 21)
- Define envt variable (for portability):
# export LED=174 (APF27Dev) or # export LED=2 (APF51Dev) or # export LED=21 (APF28Dev)
- Ask kernel to export the GPIO:
# echo $LED > /sys/class/gpio/export
- Access functions are created:
# ls /sys/class/gpio/gpio$LED/ active_low edge subsystem value direction power uevent
- Check GPIO direction and put in output:
# cat /sys/class/gpio/gpio$LED/direction in # echo out > /sys/class/gpio/gpio$LED/direction # cat /sys/class/gpio/gpio$LED/direction out
- Play with GPIO value to blink LED:
# echo 1 > /sys/class/gpio/gpio$LED/value # echo 0 > /sys/class/gpio/gpio$LED/value
Get APFxxDev i.MX switch status
- Find the GPIO number connected to the switch, eg:
- for APF27Dev: PF13 -> PortF (n°6) pin 13 -> (6-1)*32 + 13 -> GPIO n°173
- for APF51Dev: GPIO1_3 -> Port 1 pin 3 -> GPIO n°3 ((1-1)*32 + 3)
- for APF28Dev: Bank 0, pin 17 -> GPIO n° 17 (0*32 + 17)
- Define envt variable (for portability):
# export SWITCH=173 (APF27Dev) or # export SWITCH=3 (APF51Dev) or # export SWITCH=17 (APF28Dev)
- Ask kernel to export the GPIO:
# echo $SWITCH > /sys/class/gpio/export
- Access functions are created:
# ls /sys/class/gpio/gpio$SWITCH/ active_low edge subsystem value direction power uevent
- Check GPIO direction and put in output:
# cat /sys/class/gpio/gpio$SWITCH/direction in
- Get switch status:
# cat /sys/class/gpio/gpio$SWITCH/value 1 (released) ... # cat /sys/class/gpio/gpio$SWITCH/value 0 (pressed)
- Block until an event occur:
# cat /sys/class/gpio/gpio$SWITCH/edge none # echo both > /sys/class/gpio/gpio$SWITCH/edge
AsGpio
An example of AsDevices usage for GPIO in C can be found in armadeus BSP. To compile it:
$ cd target/demos/toggle_gpio $ make