GPIO (General Purpose Input/Output) s? uniwersalnymi liniami wyprowadzonymi z procesora, które zwykle wykorzystywane s? przez system operacyjny do sterowania innymi komponentami systemu. Mo?e to by? prze??cznik, mo?e to by? realizacja magistrali np. i2c lub 1-wire, SDMOD albo od innych celów. Takie linie s? zwykle programowalne i mo?na jest ustawi? jako wej?cie lub wyj?cie. Lini jest zwykle 8 do 22, cz??? jest ca?kowicie wolna i mo?na je wykorzysta? do w?asnych celów.
Najwa?niejsze aby system mia? wkompilowan? obs?ug? GPIO. Je?eli istnieje katalog /sys/class/gpio to mo?emy programowo sterowa? liniami z wykorzystaniem mechanizmu tzw. sysfs.
W??czenie obs?ugi GPIO
Aby sterowa? lini? nale?y je najpierw udost?pni? do przestrzeni u?ytkownika ("wyeksportowa?"). Robi si? to podaj?c odpowiedni numer GPIO do pliku export w w/w katalogu (w tym przyk?adzie gpio o numerze 2):
# echo "2" > /sys/class/gpio/export
Powinien pojawi? si? katalog o nazwie /sys/class/gpio/gpio2. Je?eli takiego nie ma - najprawdopodobniej GPIO o numerze 2 jest wykorzystywane przez system i nie mo?na z niego skorzysta?.
Linia wyj?ciowa
Lini? mo?na zdefiniowa? jako wyj?cie poleceniem:
# echo out > /sys/class/gpio/gpio2/direction
Lini? zdefiniowan? jako wyj?cie mo?na sterowa? ustawiaj?c odpowiedni? warto?? w pliku value
# echo 1 > /sys/class/gpio/gpio2/value
# echo 0 > /sys/class/gpio/gpio2/value
Je?eli pod??czymy pod t? lini? np. diod? LED lub przeka?nik to mo?na tak dane urz?dzenie w??czy? i wy??czy?.
Nale?y pami?ta? ?e w??czona linia ma napi?cie zwykle 3.3V (takie jak router), oraz ma niewielk? obci??alno?? pr?dow? (rz?du kilku - kilkunastu mA).
Linia wej?ciowa
Lini? mo?na zdefiniowa? jako wej?cie poleceniem:
# echo in > /sys/class/gpio/gpio2/direction
Stan linii zdefiniowanej jako wej?cie mo?na odczyta? tak samo z pliku value
# echo /sys/class/gpio/gpio2/value
Je?eli pod??czymy pod t? lini? np. przycisk, to naciskaj?c do mo?na odczyta? jego stan (w??czone lub nie)
Zwolnienie linii
Je?eli nie u?ywamy ju? linii mo?na "odda?" j? systemowi poleceniem
# echo "2" > /sys/class/gpio/unexport
Przy odrobinie umiej?tno?ci mo?na takie linie wykorzysta? do w?asnych potrzeb.
Cze?? linii mo?e by? wykorzystywana przez system i wtedy nale?y wykorzystywa? mechanizmy dost?pne systemowo lub odpowiednio modyfikuj?c kody ?ród?owe zwolni? system od wykorzystywania tych linii.
W przyk?adach za?o?ono, ?e dost?pne s? cztery GPIO o numerach 2,3,4 oraz 5. Dost?pne numery zale?? od konkretnego modelu urz?dzenia; nale?y wi?c polecenia dostosowa? o posiadanego sprz?tu. U?yto tak?e kernela z serii 2.6.
Liczba dost?pnych GPIO: 1
Sterowanie diod?
# echo "2" > /sys/class/gpio/export
# echo out > /sys/class/gpio/gpio2/direction
Sterowanie to:
# echo 1 > /sys/class/gpio/gpio2/value
dla w??czenia linii, oraz
# echo 0 > /sys/class/gpio/gpio2/value
dla wy??czenia linii.
Odczyt przycisku
Ustawiamy lini? i odczytujemy jej warto??
# echo "2" > /sys/class/gpio/export
# echo in > /sys/class/gpio/gpio2/direction
# cat /sys/class/gpio/gpio2/value
Poniewa? nie jest to skojarzone z systemem, to musimy samodzielnie zapewni? odpytywanie linii (nie b?dzie wo?any ?aden skrypt z hotpluga).
Cykliczny odczyt warto?ci mo?emy zrobi? prostym skryptem:
# GPIO=2; while true; do sleep 1; [ $(cat /sys/devices/virtual/gpio/gpio$GPIO/value) = "1" ] && echo -n -|| echo -n _; done
Stan "_" to wci?ni?cie przycisku.
Sterowanie przeka?nikiem
Podobnie jak w poprzednim przyk?adzie, linia wyj?ciowa mo?e s?u?y? do sterowania przeka?nikami czy triakami, a tym samym w??czeniem/wy??czeniem urz?dze? zasilanych z 230V. Przyk?adowe schematy:
Osobi?cie wykona?em urz?dzenie wg schematu pierwszego - dzia?a wy?mienicie. Koszt elementów takiego uk?adu dla jednego kana?u - ok 10z?.
Magistarala 1-Wire
Magistrala 1-Wire jest znana chocia? by z powodu popularnego czujnika temperatury DS1820 - ale oczywi?cie s? te? dost?pne inne czujniki, a tak?e chipy pami?ci czy portów I/O. Zalet? tej magistrali jest u?ycie tylko jednej linii danych.
Aby utworzy? magistral? 1-Wire nale?y zainstalowa? pakiet kmod-w1-gpio-custom
# opkg install kmod-w1 kmod-w1-master-gpio kmod-w1-gpio-custom
Konfiguracja to okre?lenie która linia GPIO ma by? wykorzystywana; w tym przyk?adnie to GPIO2, wiec wygl?da to w nast?puj?cy sposób:
# insmod w1-gpio-custom bus0=0,2,0
Oczywi?cie mo?na upro?ci? sobie spraw? wprowadzaj?c ten parametr na sta?e
# echo "w1-gpio-custom bus0=0,2,0" > /etc/modules.d/59-w1-gpio-custom
Nale?y pami?ta? ?e linie gpio s? bezpo?rednio wprowadzone do uk?adów SoC, w zwi?zku z tym wyprowadzenie ich na zewn?trz i pod??czenie d?ugim kablem bez ?adnych zabezpiecze? jest raczej z?ym pomys?em. Nale?y tak?e pami?ta? ?e napi?cie z routera to 3,3v, niektóre uk?adu mog? wymaga? zasilania z 5V.
Jako przyk?ad mo?na poda? w?a?nie odczyt temperatury z chipu DS1820. Nale?y zainstalowa? pakiet kmod-w1-slave-therm
# opkg install kmod-w1-slave-therm
A nast?pnie odczyta? warto?? z czujnika. Dane zawarte s? w podkatalogu /sys/bus/w1/drivers/w1_slave_driver/numer_seryjny_czujnika. Czujników mo?e by? kilka i nale?y jest po??czy? równolegle. Odczyt warto?ci to:
# cat /sys/bus/w1/drivers/w1_slave_driver/*/w1_slave
W tym przypadku by? to wynik
7c 01 4b 46 7f ff 04 10 09 : crc=09 YES
7c 01 4b 46 7f ff 04 10 09 t=23750
Wa?n? dan? jest warto?? CRC (YES) wskazuj?cy poprawno?? odczytu. Temperatura to warto?? t=, jej odczyt w postaci czytelnej dla cz?owieka to:
# awk -F= '/t=/ {printf "%.02f\n", $2/1000}' /sys/bus/w1/drivers/w1_slave_driver/*/w1_slave
Liczba dost?pnych GPIO: 2
Magistrala i2c
Podobnie jak w poprzednim przypadku wymagane jest zainstalowanie modu?u kmod-i2c-gpio-custom
# opkg install kmod-i2c-gpio-custom
Konfiguracja to za?adowanie modu?u z odpowiednimi opcjami:
# insmod i2c-gpio-custom.ko bus0=0,2,3
lub
# echo "i2c-gpio-custom bus0=0,2,3" > /etc/modules.d/i2c-gpio-custom
Je?eli zosta?o to wykonane, mo?na ju? odczyta? warto?ci z rejestrów pod??czonego chipu (w tym przypadku by? to LM75)
# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# i2cget 0 0x48 0 w
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will read from device file /dev/i2c-0, chip address 0x48, data address
0x00, using read word data.
Continue? [Y/n]
0x0016
Nale?y teraz zdekodowa? tylko t? warto?? (zgodnie z wymaganiami danego chipu).
Nale?y tak?e pami?ta? ?e napi?cie z routera to 3,3v, niektóre chipy mog? wymaga? zasilania z 5V.
Liczba dost?pnych GPIO: 4
SDMOD
Jeden z najpopularniejszych sposobów wykorzystania linii - SDMOD, czyli dodanie karty SD do systemu. Pozwala?o to uzyska? dodatkow? przestrze? na dane i programy w czasach, kiedy routery z portem USB nie by?y dost?pne.
Do obs?ugi niezb?dne s? pakiety kmod-mmc-over-gpio z zale?no?ciami oraz obs?uga systemu plików, np. vfat.
# opkg install kmod-mmc-over-gpio kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1
Konfiguracja zawarta jest w pliku /etc/config/mmc_over_gpio. W zale?no?ci od sposobu pod??czenia nale?y umie?ci? tam odpowiednie warto?ci, np.
# uci set mmc_over_gpio.@mmc_over_gpio[0].enabled=1
# uci set mmc_over_gpio.@mmc_over_gpio[0].DI_pin=3
# uci set mmc_over_gpio.@mmc_over_gpio[0].DO_pin=5
# uci set mmc_over_gpio.@mmc_over_gpio[0].CLK_pin=4
# uci set mmc_over_gpio.@mmc_over_gpio[0].CS_pin=2
# uci commit mmc_over_gpio
Przy takim po??czeniu
Karta SD router
9
1 CS GPIO 2
2 DI GPIO 3
3 GND GND
4 VDD +3,3v
5 CLK GPIO 4
6 GND GND
7 DO GPIO 5
8
Uruchomienie to
# /etc/init.d/mmc_over_gpio start
Je?eli zosta?o to poprawnie pod??czone to w logach powinna pojawi? si? informacja typu:
mmc_spi spi0.0: ASSUMING 3.2-3.4 V slot power
mmc_spi spi0.0: SD/MMC host mmc0, no DMA, no WP, no poweroff
gpio-mmc: MMC-Card "mmc" attached to GPIO pins di=3, do=5, clk=4, cs=2
mmc_spi spi0.0: can't change chip-select polarity
mmcblk0: mmc0:0000 SD 1960448KiB
mmcblk0: p1
Zostaje jeszcze tylko zamontowanie systemu plików (lub wykona si? do automatyczne je?eli zosta? zainstalowany pakiet block-hotplug)
# mkdir -p /mnt/sd
# mount -t vfat /dev/mmcblk0p1 /mnt/sd
W wi?kszo?ci przypadków (magistrala 1-Wire, i2c, a tak?e sterowanie prze??cznikami) dost?pne s? tak?e gotowe modu?y na USB (do kupienia np. na allegro), które umo?liwiaj? realizacj? podobnych tematów.
W?tek na forum: http://openrouter.info/forum/viewtopic.php?f=19&t=539