GPIO

Fórumok

Sziasztok

Egy Wafer LX2 800-as alaplapon kéne a GPIO portot kezelni Linux (Ubuntu 10.04) alól.
A GPIO hardver egyszerű mint a faék. A 0x320-as című 8 bites IO portra kell kiírni az adatot, a 0x321-re padig az adat irányt.
Régebben egy Fedora 9 ment a gépen, és írtam hozzá egy drivert, és ez így működött is.
Most új program került a gépre, és csomag függőségek miatt meg kellet újítani a Linux-ot is rajta. Most egy Ubuntu 10.04 van. A driver szépen lefordult az aktuális kernelre, betölthető, és konzolról működik is. Viszont, grafikus módban, ha meghívom a drivert (írok a device fájlba) akkor összeomlik a rendszer (a hiba üzenetek értelmezhetetlenek). (Az X geode drivere nem csomagból van telepítve, mivel sig11-el elszállt. Le lett fordítva a legújabb driver, és ezt tölti be az xorg.)
Elkezdtem kutakodni, hogy erre az igen bonyolult IO műveletre van-e "hivatalos" driver. Ha jól értelmezem akkor az UIO-n keresztül lehetne a GPIO-t kezelni. És ha jól értem erre vannak általános kernel modulok is. De sajnos semmilyen használható dokumentációt nem találtam.
Valaki elárulná, hogy erre a bonyolult IO műveletre milyen egyszerű megoldás van Linux alatt? Van-e általános UIO modul a feladatra, és az hogyan működik?

Hozzászólások

Driver helyett próbálhatod közvetlenül is piszkálni. Elvileg ennek működnie kéne:

#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>

#define IO_PORT 0x320
int main()
{
// io kérelem
if (ioperm(IO_PORT, 2, 1)) {printf("ioperm hiba!\n"); return 1;}
// írás a portra
outb(IO_PORT, 0); // minden gpio pint nullára állítunk
// lezárás
if (ioperm(IO_PORT, 2, 0)) {printf("ioperm hiba"); return 1;}
return 0;
}

Elnézést kérek, de fejből írtam az egészet, így lehet első nekifutásra nem fog működni, de az fvg nevek biztosak, ez alapján pontos kódrészletet, vagy man-t tudsz keresni.
az outb() mellett van még egy inb() melynek a portot kell megadni, ez az adott portot olvassa és ha jól emlékszem, egy int-el tér vissza.

Nem feltétlen, ha nem cserélgetnék a kernelben az összes lehetséges dolgot három hetente, akkor működne az is (illetve elegánsabb is). Így meg ha jól emlékszem az a problematikás, hogy sima userként elvileg nem engedi, 0-ás uid kell a futtatáshoz, szemben a drivernél, ahol kitudod hozni a dolgot user szintre is.
Ezt használd nyugodtan, mert ezt nem fogják cserélgetni (kompatibilitási okok miatt van meg, ez a része még a régi DOS-os időkből jött, hogy meglegyen a "platformfüggetlenség")