Problem mit Parallelport unter Linux

Gast #810222
Hallo,

ich habe ein Problem beim Programmieren der Parallelen Schnittstelle 
unter Linux:
Für die ersten Tests habe ich ein Programm erstellt, welches mit ioperm 
den Speicherbereich reserviert und dann direkt mit inb, outb auf die 
drei Register der Schnittstelle schreibt/liest. Das Programm 
funktioniert aber nur, wenn das Kernelmodul parport aktiv ist. Wenn ich 
das Modul entlade, so bekomme ich von den drei IO-Zelle (0x378, 0x379, 
0x37A) immer 0xFF.
Ich muss das Modul parport entladen, da ich mein Programm zu einem 
Treiber erweitern möchte. Dazu brauche ich u.a. den Interrupt der 
Schnittstelle, welcher aber durch das Modul belegt ist.

Muss ich zum Ansprechen der Schnittstelle sonst noch irgend ein Register 
beschreiben? - Ich habe im Internet diverse Programme zum Ansteuern der 
Schnittstelle gefunden, alle verwenden den selben Syntax wie ich.


Ich hoffe es kann mir jemand bei dem Problem helfen,
Vielen Dank,
Florian
Ich vermute das der Parport bei dir ein PCI/PNP Device ist, und der 
Parport-Treiber schaltet das Device beim Initialisieren erst ein, und 
beim Unload wieder aus.

Warum benutzt du nicht das /dev/parport0 interface, brauchst du ein 
spezielles Timing, das darüber nicht geht?
Mach es über den Treiber, das ist am sichersten. Das rumgefrickel am 
System vorbei mit ioperm auf ioports die schon von Treibern verwendet 
werden ist mir schon immer unheimlich.

Ein Beispiel:
1
#include <sys/types.h>  /* open() */
2
#include <sys/stat.h>   /* open() */
3
#include <fcntl.h>      /* open() */
4
#include <sys/ioctl.h>  /* ioctl() */
5
#include <linux/ppdev.h> /* XXX die ioctl's für /dev/parport* */
6
#include <unistd.h>     /* close() */
7

8
int main(int argc, char *argv[])
9
{
10
        int fd = open("/dev/parport0", O_RDWR);
11
        if (fd == -1) {
12
                /* fehler behandeln */
13
        }
14

15
        if (ioctl(fd, PPCLAIM) == -1) {
16
                /* fehler behandeln */
17
        }
18

19
        /* hier wird dann erstmal alles eingeschaltet, 0xff halt */
20
        if (ioctl(fd, PPWDATA, 0xff) == -1) {
21
                /* fehler behandeln */
22
        }
23

24
        if (ioctl(fd, PPRELEASE) == -1) {
25
                /* fehler behandeln */
26
        }
27
        if (close(fd) == -1) {
28
                /* fehler behandeln */
29
        }
30
        return 0;
31
}

Was es nun mit PPCLAIM, PPRELEASE und PPWDATA auf sich hat überlass ich 
Dir. Ach ja, alles ungetestet und keine Garantie daß es tut. ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.