iotest.txt




BACK ..


#// Parallelport-Programmierung unter Linux #// (aus LINUX-Magazin 10/99 Seite 34-36) #// Bei der Ausführung dieses Beispiels auf der Komandozeile müssen #// zwei Argumente übergeben werden (z.B. mit iotest 378 85). #// Der erste Wert ist die Basis-Adresse eines freien Parallelports. #// Das zweite Argument wird als Bitmuster verwendet, #// welches an die Datenleitungen des Parallelports angelegt wird. #// In der Headerdatei asm/io.h befinden sich die Deklarationen für #// die benötigten Funktionen ioperm(), inb() und outb(). #// In den Zeilen drei und vier werden die beiden übergebenen #// Programmparameter (I/O-Basisadresse und Bitmuster) ausgelegt. #// Der angegebene I/O-Bereich wird in Zeile 5 durch den Aufruf von #// ioperm() freigeschaltet: ab der Basisadresse wird der Zugriff #// auf die nächsten drei I/O-Ports (z.B. 0x378-0x37a) erlaubt, #// da der dritte Parameter von ioperm() 1 ist. #// In der darauffolgenden Programmzeile wird das angegebenen #// Bitmuster (hier "01010101") an die Datenleitungen des #// Druckeranschlusses ausgegeben. Bei einem angeschlossenen #// Centronics-Relaisinterface wäre bei unserem obigen #// Kommandozeilen-Beispiel jedes zweite Relais geschaltet. #// In Zeile 8 wird ein Byte eingelesen, welches die anliegenden #// TTL bzw. CMOS-Pegel an den Eingangs-Pins repräsentiert. #// Dadurch können z.B. bis zu fünf Schalterzustände abgefragt werden. #// Schließlich muss der direkte Zugriff auf die Ports mit Hilfe #// einer 0 als letztem Parameter von ioperm() wieder verboten werden. #include main(int argc, char* argv[]) { int base=atoi(argv[1]); int value=atoi(argv[2]); ioperm(base,3,1); outb(value,base); outb(0,base+2); printf("%1/n",inb(base+1)); ioperm(base,3,0); }; #// gcc -O2 -o iotest iotest.c #// Die Compiler-Optimierungsstufe -O2 ist nicht zwingend notwendig #// - mindestens aber -O, da sonst die Code-Generierung #// mit einer lästigen Fehlermeldung abgebrochen wird. #// Das fertige Binary kann nun mit z.B. ./iotest 378 255 #// gestartet werden #// - unter der Vorraussetzung dass man als root eingeloggt ist. #// Der Parallelport #// Ein bidirektionaler PC-Parallelportbaustein besitzt drei Register: #// Mit dem Datenregister (befindet sich an der Basisadresse, z.B. 0x378) #// können acht Bit gleichzeitig auf die Datenleitung D0-D7 ausgegeben #// bzw. eingelesen werden (fals Bit 5 im Control-Register gesetzt ist). #// Mit dem Status-Register können die Zustände der Eingangsleitungen #// abgefragt werden. Allerdings ist der BUSY-Eingang (Pin 11) invertierend, #// d.h. ein anliegendes Low-Siegnal hat ein gesetztes Bit 7 im #// Status-Register zur Folge und umgehehrt. #// Bei einer Low-to-High-Transition an Pin 10 (/ACK) wird der #// (per Jumper oder BIOS eingestellte) Interrupt ausgelöst #// - aber nur unter der Vorraussetzung, dass Bit 4 (Interrupt Enable) #// im Steuerregisater vorher gesetzt wurde. #// Mit dem Control-Register (=Basisadresse+2) lassen sich weitere vier #// TTL/CMOS-Ausgänge ansteuern - davon verhalten sich drei invertierend. #// Ausserdem beherbergt das Steuerregister (wie bereits erähnt) jene Bits, #// um die Datenleitung umzukehren bzw. den Interrupt freizuschalten. #// Bei allen Experimenten am Parallelport ist höchste Vorsicht geboten #// weil (bei unsachgemässer Handhabung) lebensgefährliche Kurzschlüsse für #// den Parallelport oder gar für das gesamte Mainboard entstehen können. #// Möchte man Taster oder Schalter direkt abfragen, so müssen die Eingänge #// über Pull-Up-Wiederstände in einen definierten High-Zustand gebracht #// werden und können dann gezielt auf Masse kurzgeschlossen werden. #// Falls keine externen +5V Spannungsquellen für die Pull-Up-Wiederstände #// zur Verfügung stehen, so kann kurzerhand einer der TTL/CMOS-Ausgänge #// als Spannungsquelle missbraucht werden. #// Pin-Name Pin Funktion #// Data Register #// Data D0 Pin 02 Ein/Ausgang Bit 0 #// Data D1 Pin 03 Ein/Ausgang Bit 1 #// Data D2 Pin 04 Ein/Ausgang Bit 2 #// Data D3 Pin 05 Ein/Ausgang Bit 3 #// Data D4 Pin 06 Ein/Ausgang Bit 4 #// Data D5 Pin 07 Ein/Ausgang Bit 5 #// Data D6 Pin 08 Ein/Ausgang Bit 6 #// Data D7 Pin 09 Ein/Ausgang Bit 7 #// Status Register #// Status S3 /ERROR Pin 15 Eingang #// Status S4 SELECT Pin 13 Eingang #// Status S5 PAPEREND Pin 12 Eingang #// Status S6 /ACK Pin 10 Interruptfähiger Eingang (L->H) #// Status S7 (inv) BUSY Pin 11 invertierender Eingang #// Control Register #// Control C0 (inv) /STROBE Pin 01 invertierender Ausgang Bit 0 #// Control C1 (inv) /AUTOFD Pin 14 invertierender Ausgang Bit 1 #// Control C2 /INIT Pin 16 Ausgang Bit 2 #// Control C3 (inv) /SELECT Pin 17 invertierender Ausgang Bit 3 #// Control C4 Pin -- Interrupt: 0=aus, 1=an Bit 4 #// Control C5 Pin -- D0-D7: 0=Ausgang, 1=Eingang Bit 5 #// Masse Pin 18 #// Masse Pin 19 #// Masse Pin 20 #// Masse Pin 21 #// Masse Pin 22 #// Masse Pin 23 #// Masse Pin 24 #// Masse Pin 25 #// Pegel: 5,0 V (5,5 V) #// Last: 5-20 mA