Forum: PC-Programmierung Problem mit Parallelport unter Linux


von Florian (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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?

von Michael L. (zvpunry)


Lesenswert?

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. ;-)

von Bernhard Walle (Gast)


Lesenswert?

http://cyberelk.net/tim/software/libieee1284/ ist noch besser. Verwendet 
intern ppdev. Es gibt sogar Python-Bindings.


    Bernhard

von Michael L. (zvpunry)


Lesenswert?

Bernhard Walle wrote:
> http://cyberelk.net/tim/software/libieee1284/ ist noch besser. Verwendet
> intern ppdev. Es gibt sogar Python-Bindings.
Interessant, kannte ich noch garnicht. Selbst "apt-cache search 1284" 
spuckt die Namen dreier Pakete aus... werde ich mir sofort mal 
anschauen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.