Die Komponente hal_parport ist ein Treiber für den traditionellen PC-Parallelport. Der Port hat insgesamt 17 physikalische Pins. Die ursprüngliche parallele Schnittstelle teilte diese Pins in drei Gruppen ein: Daten, Steuerung und Status. Die Datengruppe besteht aus 8 Ausgangspins, die Steuergruppe besteht aus 4 Pins und die Statusgruppe besteht aus 5 Eingangspins.

In den frühen 1990er Jahren wurde die bidirektionale parallele Schnittstelle eingeführt, die es ermöglicht, die Datengruppe für die Ausgabe oder Eingabe zu verwenden. Der HAL-Treiber unterstützt den bidirektionalen Anschluss und ermöglicht es dem Benutzer, die Datengruppe entweder als Eingang oder als Ausgang einzustellen. Ist ein Port als Ausgang konfiguriert, bietet er insgesamt 12 Ausgänge und 5 Eingänge. Wenn er als "in" konfiguriert ist, bietet er 4 Ausgänge und 13 Eingänge.

Bei einigen parallelen Anschlüssen sind die Pins der Steuergruppe offene Kollektoren, die auch durch ein externes Gate auf "low" gesetzt werden können. Auf einer Karte mit Open-Collector-Steuerpins. Bei einer Konfiguration als x stehen 8 Ausgänge und 9 Eingänge zur Verfügung.

Bei einigen parallelen Anschlüssen verfügt die Steuergruppe über Push-Pull-Treiber und kann nicht als Eingang verwendet werden.

Anmerkung
HAL und Open Collectors

HAL kann nicht automatisch feststellen, ob die bidirektionalen x-Modus-Pins tatsächlich offene Kollektoren (OC) sind. Wenn dies nicht der Fall ist, können sie nicht als Eingänge verwendet werden, und der Versuch, sie von einer externen Quelle auf LOW zu setzen, kann die Hardware beschädigen.

Um festzustellen, ob Ihr Port open collector Pins hat, laden Sie hal_parport im x Modus. Wenn kein Gerät angeschlossen ist, sollte HAL den Pin als TRUE lesen. Legen Sie dann einen 470 Ω-Widerstand von einem der Steuerpins auf GND. Wenn die resultierende Spannung am Steuerpin nahe bei 0 V liegt und HAL den Pin nun als FALSE liest, dann haben Sie einen OC-Port. Wenn die resultierende Spannung weit von 0 V entfernt ist oder HAL den Pin nicht als FALSE liest, dann kann Ihr Port nicht im x-Modus verwendet werden.

Die externe Hardware, welche die Steuerpins ansteuert, sollte ebenfalls Open-Collector-Gates verwenden, z. B. 74LS05.

Bei einigen Computern können die BIOS-Einstellungen beeinflussen, ob der x-Modus verwendet werden kann. Der SPP-Modus funktioniert am ehesten.

Andere Kombinationen werden nicht unterstützt, und ein Anschluss kann nach der Installation des Treibers nicht mehr von Eingang auf Ausgang umgestellt werden.

Der parport-Treiber kann bis zu 8 Ports steuern (definiert durch MAX_PORTS in hal_parport.c). Die Ports werden bei Null beginnend nummeriert.

1. Laden

Der hal_parport Treiber ist eine Echtzeitkomponente und muss daher mit loadrt in den Echtzeit-Thread geladen werden. Der Konfigurationsstring beschreibt die zu verwendenden parallelen Ports und (optional) deren Typen. Wenn der Konfigurationsstring nicht mindestens einen Port beschreibt, ist dies ein Fehler.

loadrt hal_parport cfg="Anschluss [Typ] [Anschluss [Typ] ...]"
Angabe des Ports

Zahlen unter 16 beziehen sich auf parallele Ports, die vom System erkannt werden. Dies ist der einfachste Weg, den hal_parport-Treiber zu konfigurieren und arbeitet mit dem Linux parport_pc-Treiber zusammen, wenn dieser geladen ist. Ein Port von 0 ist der erste vom System erkannte parallele Port, 1 ist der nächste und so weiter.

Grundkonfiguration

Dies wird den ersten parallelen Port verwenden, den Linux erkennt:

loadrt hal_parport cfg="0"
Verwenden der Portadresse

Stattdessen kann die Anschlussadresse in Hexadezimalschreibweise mit dem Präfix "0x" angegeben werden.

Die Konfigurationszeichenfolge stellt die hexadezimale Adresse des Anschlusses dar, optional gefolgt von einer Richtung, die für jeden Anschluss wiederholt wird. Die Richtungen sind in, out oder x und bestimmen die Richtung der physischen Pins 2 bis 9 des D-Sub 25-Anschlusses. Ist die Richtung nicht angegeben, so wird die Datengruppe standardmäßig als Ausgang konfiguriert. Zum Beispiel:

Befehl zum Laden des Echtzeitmoduls hal_partport mit dem Zusatz <config-string> zur Angabe des Ports, an dem die Parallel-Port-Karte erwartet wird.
loadrt hal_parport cfg="0x278 0x378 in 0x20A0 out"

Dieses Beispiel installiert die Treiber für einen Anschluss 0x0278, mit den Pins 2 bis 9 als Ausgänge (standardmäßig, da weder in noch out angegeben ist), einen Anschluss 0x0378, mit den Pins 2 bis 9 als Eingänge und einen Anschluss 0x20A0, mit den Pins 2 bis 9 explizit als Ausgänge angegeben. Beachten Sie, dass Sie die Basisadresse der parallelen Ports kennen müssen, um die Treiber korrekt zu konfigurieren. Bei ISA-Bus-Ports ist dies in der Regel kein Problem, da die Ports fast immer eine bekannte Adresse haben, wie z. B. 0x278 oder 0x378, die normalerweise im BIOS konfiguriert werden. Die Adressen von PCI-Bus-Karten werden normalerweise mit lspci -v in einer I/O-Ports-Zeile oder in einer Kernel-Meldung nach der Ausführung von sudo modprobe -a parport_pc gefunden. Es gibt keine Standardadresse, wenn also <config-string> nicht mindestens eine Adresse enthält, ist das ein Fehler.

Parport-Blockdiagramm
Abbildung 1. Parport-Blockdiagramm
Typ

Für jede parallele Schnittstelle, die vom hal_parport Treiber verwaltet wird, kann optional ein Typ angegeben werden. Der Typ ist einer von in, out, epp oder x.

Tabelle 1. Parallele Port-Richtung
Pin in out/epp x

1

out

out

in

2

in

out

out

3

in

out

out

4

in

out

out

5

in

out

out

6

in

out

out

7

in

out

out

8

in

out

out

9

in

out

out

10

in

in

in

11

in

in

in

12

in

in

in

13

in

in

in

14

out

out

in

15

in

in

in

16

out

out

in

17

out

out

in

Wenn der Typ nicht angegeben wird, ist der Standardwert "out".

Ein Typ epp ist derselbe wie out, aber der hal_parport Treiber fordert den Port auf, in den EPP-Modus zu wechseln. Der hal_parport-Treiber benutzt nicht das EPP-Busprotokoll, aber auf einigen Systemen ändert der EPP-Modus die elektrischen Eigenschaften des Ports auf eine Weise, die einige marginale Hardware besser funktionieren lässt. Es ist bekannt, dass die Ladungspumpe des Gecko G540 dies bei einigen parallelen Anschlüssen erfordert.

Siehe den obigen Hinweis zum Modus x.

Beispiel mit zwei parallelen Anschlüssen

Dadurch werden zwei vom System erkannte parallele Schnittstellen aktiviert, die erste im Ausgabemodus und die zweite im Eingabemodus:

loadrt hal_parport cfg="0 out 1 in"
Parallelport Lesen und Schreiben (engl. R/W-Functions)

Sie müssen LinuxCNC auch anweisen, die Funktionen Lesen und Schreiben auszuführen.

addf parport.0.read base-thread
addf parport.0.write base-thread

2. PCI-Port-Adresse

Eine gute PCI-Parport-Karte wird mit dem Netmos 9815-Chipsatz hergestellt. Sie hat gute +5 V-Signale und kann mit einem oder zwei Anschlüssen geliefert werden.

Um die E/A-Adressen für PCI-Karten zu finden, öffnen Sie ein Terminalfenster und verwenden Sie den Befehl list pci:

lspci -v

Suchen Sie nach dem Eintrag mit "Netmos". Beispiel einer 2-Port-Karte:

0000:01:0a.0 Communication controller: \
      Netmos Technology PCI 9815 Multi-I/O Controller (rev 01)
Subsystem: LSI Logic / Symbios Logic 2POS (2 port parallel adapter)
Flags: medium devsel, IRQ 5
I/O ports at b800 [size=8]
I/O ports at bc00 [size=8]
I/O ports at c000 [size=8]
I/O ports at c400 [size=8]
I/O ports at c800 [size=8]
I/O ports at cc00 [size=16]

Beim Experimentieren habe ich festgestellt, dass der erste Anschluss (der Anschluss auf der Karte) die dritte Adresse (c000) und der zweite Anschluss (derjenige, der mit einem Flachbandkabel angeschlossen wird) die erste Adresse (b800) verwendet. Das folgende Beispiel zeigt den Onboard-Parallelport und einen PCI-Parallelport, der die Standard-Ausgangsrichtung verwendet.

loadrt hal_parport cfg="0x378 0xc000"

Bitte beachten Sie, dass Ihre Werte abweichen können. Netmos-Karten sind Plug-N-Play und könnten ihre Einstellungen ändern, je nachdem, in welchem Steckplatz sie steckt, so dass, wenn Sie gerne "unter der Haube" Dinge neu anordnen, Sie bitte darauf achten, diese Werte zu überprüfen, bevor Sie LinuxCNC starten.

3. Pins

  • ‚parport.<p>.pin-`__<n>__`-out‘ (bit) Steuert einen physischen Ausgangspin.

  • parport.<p>.pin-`__<n>__-in` (bit) Verfolgt einen physischen Eingangspin.

  • parport.<p>.pin-`__<n>__-in-not` (bit) Verfolgt einen physischen Eingangs-Pin, aber invertiert.

Für jeden Pin ist <p> die Anschlussnummer und <n> die physische Pin-Nummer im 25-poligen D-Shell-Stecker.

Für jeden physischen Ausgangspin legt der Treiber einen einzelnen HAL-Pin an, z. B.: parport.0.pin-14-out.

Für jeden physischen Eingangspin erstellt der Treiber zwei HAL-Pins, zum Beispiel: parport.0.pin-12-in und parport.0.pin-12-in-not.

Der HAL-Pin -in ist TRUE, wenn der physikalische Pin high ist, und FALSE, wenn der physikalische Pin low ist. Der -in-not-HAL-Pin ist invertiert und ist FALSE, wenn der physikalische Pin high ist.

4. Parameter

  • parport.`__<p>__.pin-__<n>__-out-invert` (bit) Invertiert einen Ausgangspin.

  • parport.`__<p>__.pin-__<n>__-out-reset` (bit) (nur für -out Pins) TRUE wenn dieser Pin zurückgesetzt werden soll wenn die -reset Funktion ausgeführt wird.

  • parport.`__<p>__.reset-time` (U32) Die Zeit (in Nanosekunden) zwischen dem Setzen eines Pins durch -write und dem Zurücksetzen durch die Funktion -reset, wenn diese aktiviert ist.

Der Parameter -invert bestimmt, ob ein Ausgangspin aktiv high oder aktiv low ist. Wenn -invert FALSE ist, wird der physikalische Pin durch das Setzen des HAL -out-Pins TRUE high und durch FALSE low. Wenn -invert TRUE ist, dann wird der physikalische Pin durch das Setzen des HAL -out-Pins TRUE auf low gesetzt.

5. Funktionen

  • parport.`__<p>__.read` (funct) Liest die physikalischen Eingangspins von Port Nummer <p> und aktualisiert die HAL -in und -in-not Pins.

  • parport.read-all (funct) liest physikalische Eingabepins aller Ports und aktualisiert HAL -in und -in-not Pins.

  • parport.`__<p>__.write` (funct) Liest HAL -out Pins von Port Nummer <p> und aktualisiert die physikalischen Ausgangspins dieses Ports.

  • parport.write-all (funct) liest HAL -out Pins aller Ports und aktualisiert alle physikalischen Ausgangspins.

  • parport.`__<p>__.reset` (funct) Wartet, bis reset-time seit dem zugehörigen write verstrichen ist, und setzt dann die Pins auf die durch -out-invert und -out-invert angegebenen Werte zurück. reset muss später im selben Thread wie write erfolgen. Wenn reset TRUE ist, dann setzt die Funktion reset den Pin auf den Wert von -out-invert. Dies kann in Verbindung mit stepgen’s doublefreq verwendet werden, um einen Schritt pro Periode zu erzeugen. Der stepgen stepspace für diesen Pin muss auf 0 gesetzt werden, um doublefreq zu aktivieren.

Die einzelnen Funktionen sind für Situationen vorgesehen, in denen ein Anschluss in einem sehr schnellen Thread aktualisiert werden muss, während andere Anschlüsse in einem langsameren Thread aktualisiert werden können, um CPU-Zeit zu sparen. Es ist wahrscheinlich keine gute Idee, gleichzeitig eine -all Funktion und eine individuelle Funktion zu verwenden.

6. Häufige Probleme

Wenn das Laden des Moduls berichtet

insmod: error inserting '/home/jepler/emc2/rtlib/hal_parport.ko':
-1 Device or resource busy

dann stellen Sie sicher, dass das Standard-Kernelmodul parport_pc nicht geladen ist Fußnote:[In den LinuxCNC-Paketen für Ubuntu verhindert die Datei /etc/modprobe.d/emc2 im Allgemeinen, dass parport_pc automatisch geladen wird.] und dass kein anderes Gerät im System die I/O-Ports beansprucht hat.

Wenn das Modul geladen wird, aber nicht zu funktionieren scheint, ist die Anschlussadresse falsch.

7. DoubleStep verwenden

Um DoubleStep an der parallelen Schnittstelle einzurichten, müssen Sie die Funktion parport.n.reset nach parport.n.write hinzufügen und den Schrittabstand auf 0 und die gewünschte Reset-Zeit konfigurieren. So kann der Schritt bei jeder Periode im HAL aktiviert und dann von parport ausgeschaltet werden, nachdem er für die durch parport.`__n__.reset-time` festgelegte Zeit aktiviert wurde.

Zum Beispiel:

loadrt hal_parport cfg="0x378 out"
setp parport.0.reset-time 5000
loadrt stepgen step_type=0,0,0
addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread
addf stepgen.capture-position servo-thread
...
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0

Weitere Informationen zu DoubleStep finden Sie im wiki.

8. probe_parport

In heutigen PCs erfordern parallele Schnittstellen möglicherweise eine Plug-and-Play-Konfiguration (PNP), bevor sie verwendet werden können. Das Kernelmodul probe_parport konfiguriert alle vorhandenen PNP-Ports. Es muss vor hal_parport geladen werden. Auf Rechnern ohne PNP-Port kann es geladen werden, hat aber keine Wirkung.

8.1. Installation von probe_parport

Wenn das Kernelmodul parport_pc mit dem Befehl geladen wird:

sudo modprobe -a parport_pc; sudo rmmod parport_pc

Der Linux-Kernel gibt eine Meldung ähnlich der folgenden aus:

parport: PnPBIOS parport erkannt.

Dann wird die Verwendung dieses Moduls wahrscheinlich notwendig sein.

Schließlich sollten die HAL-Parport-Komponenten geladen werden:

loadrt probe_parport
loadrt hal_parport ...