Om de GPIO (digitale ingangen en uitgangen) aan te sturen vanuit linux op een Beagle Bone Black kan je gebruik maken van de volgende opties die standaard in de kernel aanwezig zijn.
Wij maken gebruik van de directory /sys/class/gpio
Na het herstarten staat alle gpio pinnen standaard uit voor gebruik. We moeten ze dus bewust aanzetten om er gebruik van te kunnen maken.
Wat je wel ziet zijn de 4 gpio controllers gpio0, gpio1, gpio2 en gpio3.
# ls -al /sys/class/gpio/
total 0
drwxr-xr-x 2 root root 0 Sep 21 10:10 .
drwxr-xr-x 46 root root 0 Jan 1 2000 ..
--w------- 1 root root 4096 Sep 21 10:10 export
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Sep 21 10:10 unexport
Als je goed opgelet hebt dan zie je dat elke GPIO controller een offset van 32 heeft tov. de vorige (0, 32, 64, 96). Hieronder staat dit beschreven.
Zoals ik al eerder schreef staan de meeste pinnen niet aan voor gebruik, deze kan je zelf aanzetten. Een pin kan meerdere taken hebben, dus moet je deze configureren voordat je ze kunt gebruiken. Gelukkig kan dat eenvoudig op de commandline.
Om te begrijpen wat je kunt gebruiken en in welke modes moet je de handleiding bestuderen op pagina 75 en 77 in tabel 10 en 11 van dit document bbb_srm.pdf De headers P8 en P9 staan hier beschreven.
Om de juiste io pin te beschrijven moet je het getal van de io controller optellen bij het pin getal.
vb:
gpio0[10] wordt 0 + 10 = gpio10
gpio0[31] wordt 0 + 31 = gpio31
gpio1[18] wordt 32+ 18 = gpio50
gpio1[19] wordt 32+ 18 = gpio51
gpio2[10] wordt 64+ 10 = gpio74
gpio3[10] wordt 96+ 10 = gpio106
In dit voorbeeld zal ik P9 pin 11, 13, 14 gebruiken.
pin 11 –> gpio0[30] –> gpio30
pin 13 –> gpio0[31] –> gpio31
pin 14 –> gpio1[18] –> gpio50
Hier worden een aantal gpio poorten aangezet voor input/output, daarna worden de pinnen op output gezet.
Eerst wordt gekeken of de directory al bestaat zoniet dan wordt hij aangemaakt.
if [ ! -d /sys/class/gpio/gpio30 ]; then echo 30 > /sys/class/gpio/export; fi
if [ ! -d /sys/class/gpio/gpio31 ]; then echo 31 > /sys/class/gpio/export; fi
if [ ! -d /sys/class/gpio/gpio50 ]; then echo 50 > /sys/class/gpio/export; fi
echo low > /sys/class/gpio/gpio30/direction
echo low > /sys/class/gpio/gpio31/direction
echo low > /sys/class/gpio/gpio50/direction
We hebben nu een relatie tussen de hardware pin benaming zoals deze op de header zitten en pin benaming zoals de processor deze noemt en kan benaderen.
Nadat wij dit gedaan hebben zien we in de directory /sys/class/gpio/
dat de pinnen erbij gekomen zijn.
# ls -al /sys/class/gpio/
total 0
drwxr-xr-x 2 root root 0 Sep 21 10:10 .
drwxr-xr-x 46 root root 0 Jan 1 2000 ..
--w------- 1 root root 4096 Sep 21 10:36 export
lrwxrwxrwx 1 root root 0 Sep 21 10:36 gpio30 -> ../../devices/virtual/gpio/gpio30
lrwxrwxrwx 1 root root 0 Sep 21 10:36 gpio31 -> ../../devices/virtual/gpio/gpio31
lrwxrwxrwx 1 root root 0 Sep 21 10:36 gpio50 -> ../../devices/virtual/gpio/gpio50
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root 0 Sep 21 10:10 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Sep 21 10:10 unexport
En de directory inhoud van een van de pinnen ziet er alsvolgt uit.
# ls -al /sys/class/gpio/gpio30/
total 0
drwxr-xr-x 3 root root 0 Sep 21 10:36 .
drwxr-xr-x 9 root root 0 Sep 21 10:36 ..
-rw-r--r-- 1 root root 4096 Sep 21 10:38 active_low
-rw-r--r-- 1 root root 4096 Sep 21 10:38 direction
-rw-r--r-- 1 root root 4096 Sep 21 10:38 edge
drwxr-xr-x 2 root root 0 Sep 21 10:38 power
lrwxrwxrwx 1 root root 0 Sep 21 10:36 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Sep 21 10:36 uevent
-rw-r--r-- 1 root root 4096 Sep 21 10:38 value
Er zijn diverse configuratie mogelijkheden beschikbaar voor deze pinnen. Deze staan beschreven in de “Linux GPIO interfaces manual“. Hier bespreek ik alleen de basis opties.
Om deze aan te sturen gebruik je de volgende commandos
Om een 1 te zetten:
echo 1 > /sys/class/gpio/gpio30/value
Om een 0 te zetten:
echo 0 > /sys/class/gpio/gpio30/value