Forum: PC-Programmierung PCI-I/O_Karte in Linux


von Alf (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche eine PCI-IO_Karte(LCS-6019) in Linux(Suse 11.1) zum laufen 
bringen und anschließend diesen mit einem C-code steuern.

im alten Rechner mit integriertem Port war es kein proplem.

Auf der Herstellerseite habe ich eine Beschreibung gefunden(Anhang) wie 
man das unter Linux machen muss. Alles gemacht leider funzt es nicht.

Muss noch dazu einfügen, dass ich die komplette Beschreibung ins 
terminal eingehackt habe also den part für den Serial sowol für den 
Parallelport :-( brauchen tu ich nur den Parallelport. <--ist das 
schlimm?

unter C spreche ich den port so an.
.
.

int
main (int argc, char *argv[])
{
.
.
ParallelTimerSwitch(0x01); // bsp. für pin 1
.
.
}


void ParallelTimerSwitch(unsigned char PinNu)
{
 unsigned char current;
  current = inb(888); //<-- neue Adresse 0x4a00 und nicht 888-->0x378
  current ^=  PinNu;
  outb(current, 888);

}

ich habe keinen weiteren Parallelport kann man nicht eigentlich die 
0x378 weiter verwenden?? Bzw sieht irgend jemand was ich falsch mache??


thanks for help

von chris (Gast)


Lesenswert?

Für ports von 0-0x3ff musst du das port vorher mit ioperm freischalten.
Für höhere ports musst du iopl verwenden, um den Zugriff freizuschalten.
Beide Sachen benötigen root Berechtigung.

von chris (Gast)


Lesenswert?

Achso, legacy ports 0-0x3ff brauchen legacy waitstates, sind also (viel)
langsamer als andere Ports, welche Memory-mapped sind.

von Alf (Gast)


Lesenswert?

chris schrieb:
> Für ports von 0-0x3ff musst du das port vorher mit ioperm freischalten.

hab ioperm eingebaut:

int
main (int argc, char *argv[])
{
.
.


  if( ioperm(0xa400,1,1) )
    {
      printf("Couldn't get port 0x0xa400\n");
      return 1;
    }
.
.
ParallelTimerSwitch(0xff); // datenpins sollen auf hight
.
.
}


void ParallelTimerSwitch(unsigned char PinNu)
{
 unsigned char current;


  current = inb(0xa400);
  current ^=  PinNu;
  outb(current, 0xa400);

}


leider klappt das auch nicht.  was meinst du eigentlich mit "legacy 
ports" wie das aussieht liegt meine karte auf einen anderen 
adressbereich.
"/sbin/modprobe parport_pc io=0x3f8,a400 irq=4,18 " <-- port = 0xa400

von Εrnst B. (ernst)


Lesenswert?

Alf schrieb:
> "/sbin/modprobe parport_pc io=0x3f8,a400 irq=4,18 " <-- port = 0xa400

Wenn du sowieso direkt auf den IO-Registern rummachen willst, ist der 
Kernel-Treiber doch eher Kontraproduktiv? Nicht das dir der 
dazwischenfunkt...

Frage: Spricht eigentlich was dagegen, statt dem direktem Port-Gefriemel 
aus DOS-Zeiten direkt das dafür vorgesehene (ppdev-) Interface zu 
nehmen?

/dev/partport* öffnen, darauf arbeiten?

http://people.redhat.com/twaugh/parport/html/x623.html

von Kilgore, Bill (Gast)


Lesenswert?

Der erste Port (+0) ist eigentlich nicht dafür vorgesehen, gelesen zu 
werden. Manche Parallelports unterstützen das, müssen dies aber nicht 
tun. Der Zugriff inb(0x378) ist also laut Hardwaredefinition nicht 
erlaubt und das solltest du erstmal austesten. Der zweite Port (+1) ist 
ein reiner Leseport und der dritte "RW".
Versuch erstmal nur eine Ausgabe zu machen und wenn das nicht klappt den 
Parport-Treiber (falls er geladen ist) zu entladen.

von chris (Gast)


Lesenswert?

Klar geht das nicht, ioperm gilt ja nur für port von 0-0x3ff und du
benutzt 0xa400, da brauchst du schon iopl, hatte ich auch so 
geschrieben.

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.