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

Oldalak