i/o Port prog in C für super i/o chip

  • hallo


    in der hoffnung das das hier jemand liest der sich mit i/0 port programierung unter linux auskennt


    ich möchte für mein Alix 1d Motherboard mit Winbond 83627HG-AW Super i/o Chip ein C Programm schreiben um auf die gpio prots zugreifen zu können,


    leider hab ich null ahnung von c oder ähnlichen


    ich habe mal mit dem studium der Chip Doku angefangen und auch die passenden register gefunden,
    beim googeln hab ich dann auch ein Beispiel für C gefunden um die Ports anzusteuern,
    leider wiederspricht sich das Beispiel mit den Beispielen aus der HOWTO http://www.faqs.org/docs/Linux-mini/IO-Port-Programming.html


    hier mal ein auzug aus einem pdf zum chip, hier wird zuerst die adresse angegeben und dann der Registerwert in hex


    //Step1. Enter W83627HG configuration registers mode:
    outportb(0x2E, 0x87);
    outportb(0x2E, 0x87);
    //* Step2. Pin89 to be WDTO
    outportb(0x2E, 0x2b);
    outportb(0x2E + 1, 0x04);



    hier kann ich leider mangels c kenntnise schon nicht nachvollziehen wofür in zeile 4 das +1 gut sein soll ???


    und in der Linux-mini/IO-Port-Programming sieht die sache noch wieder anders aus
    define BASEPORT 0x378 /* lp1 */


    int main()
    {
    /* Get access to the ports */
    if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}

    /* Set the data signals (D0-7) of the port to all low (0) */
    outb(0, BASEPORT);

    hier wird jetzt zuerst der register wert und dann die adresse angegeben


    was ist den jetzt richtig ???


    Gruß


    Oliver


    BTW: kann es sein das die code einfügen Funktion nicht klappt ?? oder bin ich zu blöd :)

  • Hi Oli,


    eventuell fällt es leichter, wenn ich Die ein wenig Background erkläre.
    Diese Chips haben alle eine gewisse Anzahl von Registern (Speicherzellen), die in einen Speicherbereich Deines Rechners eingeblendet werden. In Deinem Fall werden alle Register des IO-Chips in den Bereich um die Addresse 0x2E eingeblendet. Die beiden Funktionen inb(inportb) und outb(outportb) werden nun zum Lesen oder Schreiben an diese Addressen benutzt. Das hat erstmal garnichts damit zu tun etwas auf einem Port auszugeben bzw. einzulesen. Die Reaktion auf das Schreiben auf so eine Addresse hängt damit zusammen welche Funktion das Register hat. In dem oberen Beispiel wird in das Konfigurationsregister des IO-Chips geschrieben. dort kann zB. eingestellt werden ob ein Port ein Ausgabeport ist oder ein Eingabeport - genaueres steht in der Dokumentation zum Chip.


    Du mußt jetzt erstmal den Chip so konfigurieren, damit die Ports die Richtige "Richtung" haben und dann über das richtige Register auf den Port schreiben bzw. lesen.


    Sollte Dir das alles zu aufwendig sein, dann verwende doch einen fertigen Treiber. Dann kannst du die Ports bequem über das Geräteverzeichnis ansprechen.


    Grüße, Max

  • Hallo


    und Danke für deine Antwort, auch wenn sie meine Frage leider nicht beantwortet hat


    das mit den Registern vom chip ist mir schon klar die Doku vom Chip hab ich auch schon gelesen und verstanden welche register ich wie und wofür brauche


    was mich jetzt aus den tritt gebracht hatt sind die beiden unterschiedlichen code schnipsel


    bei dem ersten wird 1. die Protadresse angegeben und dann 2. der Register Wert
    und bei den zweiten wird 1. der Registerwert und dann die Portadresse angegeben


    und nein zu aufwendig ist es mir nicht , bin halt nur noch am anfang mit "c"
    außer einem printf einzeiler hab ich da noch keine erfahrung :lol2


    gibt es einen fertigen Treiber ??? ich habe nur das Kernel Modul gefunden und da sind keine
    passenden devices in sysfs zu finden


    Oliver

  • Auszug aus man (2) outb:


    The value argument is passed first and the port argument is passed second, which is the opposite order from most DOS implementations.


    Wenn Du also unter linux programmieren willst (mit outb/inb) zuerst der Wert und dann der Port.


    Gruß, Max

  • Tja, bei "outportb" gibt man anscheinend erst Port und dann Parameter an und bei "outb" halt erst den Parameter und dann den Port.
    "outportb" und "outb" sind halt vollkommen verschiedene Proceduren, Makros oder was weis ich.



    So richtig sehe ich dein Problem hier nicht.


    cu


    PS: OK, zu spät. Hier fehlt ne Löschen Funktion im Forum.

  • ja vielen Dank für die Antworten


    Max das war das was ich wissen wollte Danke :welle


    hatte es gerade im source des Kernel moduls auch gesehen ,und mir jetzt auch erstmal die manuals installiert


    Oliver

  • Hallo ich nochmal


    so nun habe ich ein paar c zeilen geschrieben die den chip konfigurieren und die ausgänge setzt.


    zum testen hatte ich erst LED´s angeschlossen was auch funktioniert hatt


    dann habe ich mal folgende schaltung aufgebaut um ein relais anzusteueren zusätlich zum Relais hängt noch eine LED (ist aber nicht eingezeichnet)


    [Blockierte Grafik: http://img222.imageshack.us/img222/9854/12011311ro8.gif][/URL][/IMG]


    die schaltung erfüllt soweit auch ihren zweck , wenn ich aber jetzt zum beispiel das System runterfahre wird wohl der Chip vom System resetet und das/die Relais flattern einmal kurz
    das würde ich natürlich noch gerne unterdrücken mit einem RC glied oder so vor dem Transistor am besten , leider weiß ich nur nicht wie ich es demensionieren soll aund auch nicht genau wohin damit in der schaltung ??? kann mir jemand helfen ??? das RC Glid sollte so 0,5 -> 1 s verzögern


    Gruß


    Oliver

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!