www.mikrocontroller.net

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


Autor: Alf (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

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

Autor: Alf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kilgore, Bill (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.