GPIO kezelés embedded Linux-okon: OLinuxIno iMX233, Raspberry Pi

Beágyazott Linux-ok alatt a GPIO-kat akár shell script-ből is vezérelhetjük. A maximális sebességhez memórián keresztül (memory mapped, mmap) kell a GPIO-kat elérni, de ebben az írásban erre nem térek ki. Ha script-ből használjuk az IO-t, először exportálni kell az adott GPIO lábat, hogy fájlként látszódjon a rendszerben. A 32-es GPIO exportáláshoz ezt kell futtatni bash-ból:

  echo 32 >/sys/class/gpio/export

Más script-ekből vagy C programból meg kell nyitni a /sys/class/gpio/export fájlt és beleírni 32-t, majd lezárni a fájlt. Ezután a /sys/class/gpio/gpio32 könyvtárban a direction és a value fájlokkal vezérelhető az adott láb. OLinuXino-nál a 32-es GPIO a P1-es láb. Ha a direction fájlba out-ot írunk, kimenetként lesz beállítva a GPIO: a value fájba 0-t vagy 1-et írva alacsony vagy magas állapotba állíthatjuk. Ha a direction-be in-t írunk, akkor a value-t olvasva állapíthatjuk meg, hogy alacsony vagy magas szinten van a láb. Ez a script a 32-es GPIO-t 0 és 1 szintbe állítja:
#!/bin/sh
GPIO=32
echo "Exporting $GPIO..."
echo $GPIO >/sys/class/gpio/export

echo "OUT"
echo out >/sys/class/gpio/gpio$GPIO/direction
echo "0"
echo 0 >/sys/class/gpio/gpio$GPIO/value
sleep 1
echo "1"
echo 1 >/sys/class/gpio/gpio$GPIO/value
sleep 1

Az alábbi tesztprogram exportálja az összes GPIO lábat, kimenetnek konfigurálja és alacsony majd magas szintre állítja. A portlábak kimenetre való konfigurálása veszélyes lehet a hardverre nézve: ha például egy kapcsolásban egy láb bementként van vezetékezve, mi pedig kimenetként konfiguráljuk és mondjuk a túloldali IC-vel ellentétes szintű jelet kapcsolunk, akkor nagy áramok folyhatnak, ami egyik vagy mindkettő IC-ben károsodást okozhat!
#!/bin/sh
for i in `seq 95`; do
  echo "Exporting $i..."
  echo $i >/sys/class/gpio/export
done

for i in `seq 95`; do
  echo "OUT"
  echo out >/sys/class/gpio/gpio$i/direction
  echo "0"
  echo 0 >/sys/class/gpio/gpio$i/value
  sleep 1
  echo "1"
  echo 1 >/sys/class/gpio/gpio$i/value
  sleep 1
done