GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So steuern Sie Peripherieports:Zugriff auf und Schreiben auf Parallelport mit C unter Linux. Teil I

Einer der auffälligsten und neusten Anwendungsfälle zur Steuerung von Peripherieanschlüssen auf einem PC ist die Heimautomatisierung. Diese Technologie bietet ein unendliches Feld an Möglichkeiten in unseren Häusern. Home Automation ist eine technische Disziplin mit einer sozialen Seite. Unser Ansatz ist es, mit einigen Schlagworten die Lebensqualität zu verbessern, die Kommunikation zu erweitern und Prozesse zu automatisieren. All dies scheint ganz einfach zu sein, aber die Komplexität, die dieser neuen Welt der Heimautomatisierung innewohnt, ist aufregend, mal sehen warum.

Home Automation ist aus mehreren Gründen eine komplexe Aktivität. Zunächst vermittelt Ihnen die Bedienung an Heimgeräten (Sensoren, Smart Appliances, Aktoren ...) eine Vorstellung von den komplizierten physikalischen Phänomenen, wie z. B. der Quantenmechanik oder dem photoelektrischen Effekt. Darüber hinaus kann eines dieser Geräte verschiedene Aufgaben erfüllen und nicht unbedingt nur eine einfache. Zweitens spricht man von Heimautomatisierung, wenn man von Systemen spricht, die aus vielen verschiedenen Komponenten bestehen, die nicht immer problemlos interagieren (stellen Sie sich ein Heimsicherheitssystem vor, das Videokameras, Präsenzmelder, Kommunikationsgeräte, Alarme mit einem Fernwarnsystem usw . ...). Schließlich und vor allem ist es komplex, weil es der Automatisierung technischer Systeme mit sozialen Systemen gegenübersteht.

Begriffsdefinition

Parallelport:

Ein paralleler Port ist eine Schnittstelle zwischen einem Computer und einem Peripheriegerät, dessen Hauptmerkmal darin besteht, dass die Datenbits zusammen reisen und jeweils ein Paketbyte senden. Ein Kabel oder physischer Pfad für jedes Datenbit wird durch Bilden eines Busses aus 8 Leitungen implementiert. Über den parallelen Anschluss können wir auch Peripheriegeräte wie Lampen, Motoren und andere Geräte steuern.

Webschnittstellen:

Eine Webschnittstelle ermöglicht es Benutzern, ihre Geräte über einen Webbrowser zu steuern und mit ihnen zu interagieren. Dies kann für eine Fernbedienung, Bibliotheksverwaltung, visuelles Feedback und viele andere Dinge verwendet werden.

Hausautomation:

Es ist die Automatisierung aller Systeme, die in der Lage sind, ein Haus zu automatisieren, Energieverwaltungsdienste, Sicherheit, Wohlfahrt und Kommunikation bereitzustellen und in drahtgebundene oder drahtlose Kommunikationsnetzwerke für den Innen- und Außenbereich integriert werden können.

Wie man mit Parallelports in C arbeitet

Für unseren Hauptzweck, die grundlegende Heimautomatisierung, werden wir den parallelen Anschluss verwenden, um zu demonstrieren, wie wir einige Bytes schreiben (oder lesen) können, um einfache Geräte zu steuern. Der parallele Anschluss eines PC-ECP-Typs hat einen weiblichen DB25-Ausgangsanschluss, dessen Diagramm und Signale in der folgenden Abbildung zu sehen sind:

Abbildung 1:Parallelport-Diagramm. Pinbelegung der Buchse. Mit freundlicher Genehmigung von Wikipedia

Parallelport-Ausgabe

Der parallele Anschluss eines PCs besteht gemäß dem Centronics-Standard aus einem bidirektionalen 8-Datenbit-Kommunikationsbus plus einem Satz Leitungen für das Protokoll. Kommunikationsleitungen haben einen Retainer, der den zuletzt geschriebenen Wert hält, bis neue Daten geschrieben werden, die elektrischen Eigenschaften sind:

  •      Hochspannung:3,3 bis 5 V.
  •      Niederspannung:0 V.
  •      Maximaler Ausgangsstrom:2,6 mA.
  •      Maximaler Eingangsstrom:24 mA.

Die Spannung und der Strom können eine Reihe von Steuergeräten wie LEDs, Relais und Halbleiterschalter speisen. Diese Puffer werden benötigt, um Elemente mit einem höheren Stromverbrauch aus- oder einzuschalten.

Adressierung

Die Adressierung eines Standard-Parallelanschlusses ist wichtig aufgrund der Vielzahl von Ressourcen, die er vom Computer verwendet, und für Identifikationszwecke. Der Standard-Parallelport verwendet drei zusammenhängende Adressen, normalerweise in einem dieser Bereiche:

3BCh 3BDh 3BEh
378h 379h 37Ah
278h 279h 27Ah


Die erste Adresse im Bereich ist die Basisadresse des Ports, auch Datenregister oder einfach Portadresse genannt. Die zweite Adresse ist das Statusregister des Ports und die dritte das Steuerregister.

EPPs und ECPs reservieren zusätzliche Adressen für jeden Port. Ein EPP fügt fünf Register an der Basisadresse + 3 bis Basisadresse + 7 hinzu, und ein ECP fügt drei Register an der Basisadresse + 400 h bis Basisadresse + 402 h hinzu. Bei einer Basisadresse von 378h befinden sich die EPP-Register bei 37Bh bis 37Fh ​​und die ECP-Register bei 778h bis 77Fh.

DMA-Kanäle

ECPs können den direkten Speicherzugriff (DMA) für Datenübertragungen zum Parallelport verwenden. Während der DMA-Übertragungen kann die CPU andere Dinge tun, sodass DMA-Übertragungen insgesamt zu einer schnelleren Leistung führen können. Um DMA verwenden zu können, muss der Port einen zugewiesenen DMA-Kanal im Bereich von 0 bis 3 haben.

Zugriff auf physische Ports unter Linux

Da die Port-Hardware auf einem PC direkt vom Linux-Kernel gesteuert wird, müssen wir auf bestimmte Header zugreifen, die sich auf den parallelen Port-Bus beziehen. Der GCC-Compiler kann auf diese Header zugreifen, wobei immer zu beachten ist, dass der Benutzer Root-Rechte haben muss, um Zugriffsfehler zu vermeiden. Diese Header sind:

  • stdio.h:Der „Standard-Input-Output-Header“ (Standard-Header I/O) ist die Header-Datei, die die Makrodefinitionen, Konstanten, Funktionsdeklarationen in der Standardbibliothek der Programmiersprache C zur Ausführung von Operationen, Standard enthält Eingabe und Ausgabe sowie die Definition der für solche Operationen erforderlichen Typen. Aus Kompatibilitätsgründen hat die Programmiersprache C++ (C-Derivat) auch eine eigene Implementierung dieser Funktionen, die mit cstdio-Dateiheader deklariert werden. Die Funktion, die ich verwenden muss, ist fprintf, die es ermöglicht, auf einem Terminalfenster zu drucken, wenn ein Fehler auftritt.
  • stdlib.h: Ist die Header-Datei für die Standardbibliothek der universellen Programmiersprache C. Sie enthält die C-Funktionsprototypen für die dynamische Speicherverwaltung, Prozesssteuerung und andere. Es unterstützt C ++, wo es als cstdlib bekannt ist. Die Funktion, die ich verwenden werde, ist beenden, wenn wir einen Fehler erhalten
  • unistd.h: Header-Datei, die Zugriff auf die POSIX-Betriebssystem-API bietet. Auf Unix-ähnlichen Systemen besteht die von unistd.h definierte Schnittstelle typischerweise größtenteils aus Systemaufruf-Wrapper-Funktionen wie Fork, Pipe und I/O-Primitiven (Lesen, Schreiben, Schließen usw.).
  • sys/io.h:Diese Familie von Funktionen wird verwendet, um Low-Level-Port-Eingabe und -Ausgabe durchzuführen. Die out*-Funktionen führen Portausgaben durch, die in*-Funktionen führen Porteingaben durch; die b-Suffix-Funktionen haben Bytebreite und die w-Suffix-Funktionen Wortbreite; Die _p-Suffix-Funktionen pausieren, bis die E/A abgeschlossen ist. Von dieser Familienfunktion verwende ich outb.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

Unter Linux ist es einfach, auf den parallelen Port zuzugreifen und ihn zu steuern, jedoch muss der Root-Zugriff sehr berücksichtigt werden. Die oben genannten sind alle erforderlichen Bibliotheken für unser heutiges Tutorial.

Festlegen der Speicheradresse für den parallelen Port

Sobald die Bibliotheken eingebunden sind, müssen wir die dem parallelen Port zugewiesene Speicheradresse definieren, wie oben erwähnt, die Standardadresse für den ersten parallelen Port ist 0x378.

#define base 0x378           /* parallel port base address */

Wenn Sie Probleme haben, diese Adresse zu versuchen, sollten Sie 0x278 versuchen.

Verwendung des Datenbusses als Ausgangsport

Für diesen ersten Teil des Tutorials werde ich den Datenbus als Ausgangsport verwenden. Im nächsten Kapitel werden wir sehen, wie man ihn als Port für die Dateneingabe oder sogar als gemischten Port verwendet. In der Abbildung unten sehen wir die Steuerung eines Satzes von 8 LEDs, die über Strombegrenzungswiderstände mit dem Parallelport verbunden sind und auf den Wert reagieren, der der Adresse 0x378 zugewiesen ist. Der Wert für die Widerstände kann von 100 Ohm bis 300 Ohm variieren, dieser Teil ist wichtig, da wir den Port beschädigen können, wenn wir den Strom nicht begrenzen.

Schaltplan


Hinweis:Die Farbe der LEDs ist nicht wichtig.

Echte Schaltung



Achtung:Seien Sie bitte vorsichtig im Umgang mit dem Parallelport-Anschluss Stellen Sie sicher, dass Sie den Stromkreis nicht trennen, bevor Sie den PC ausgeschaltet haben. Dies kann zu Schäden am Anschluss oder sogar am Motherboard führen. Wir können keine Schäden übernehmen, die Sie an Ihren Hardwaregeräten verursachen können.

Softwareimplementierung

Für meine Zwecke zeige ich Ihnen, wie Sie einige Werte in den Port eingeben und wie das Timing dieser Werte erfolgen muss. Dies ist eine sehr einfache Routine, um Ihnen zu zeigen, wie es funktioniert.

Jetzt werde ich alle Befehle und Wörter erklären, die in der Steuersoftware verwendet werden:

  • Schritt 1:Bedingung, ob der Benutzer Root-Berechtigung hat, um auf den Port zuzugreifen. Das Argument für diesen bedingten Befehl ist ioperm, das die Port-Zugriffserlaubnis-Bits für die Port-Adressbasis setzt.
if (ioperm(base,1,1))
  • Schritt 2:Wenn der Benutzer nicht über ausreichende Berechtigungen für den Zugriff auf den parallelen Anschluss verfügt, wird ein Zugriffsfehler angezeigt und die Programmausführung beendet.
fprintf(stderr, "Access denied to %x\n", base), exit(1);
  • Schritt 3:Wenn der Zugriff gewährt wird, gibt eine for-Schleife eine Folge von Ein und Aus an die LEDs mit vordefinierten Werten, die im Port angezeigt werden. Die von mir verwendete Timing-Funktion ist sleep(), die den aufrufenden Thread schlafen lässt, bis Sekunden im Argument verstrichen sind.
        w=0;
        for (x=0; x=7; x++)  
            {        
            y=pow(2,w);
            outb(y, base);
            sleep(1);
            w=w+1;
               }


    Als die Codeverarbeitung die Zugriffserlaubniszeile passierte,  'fprintf (stderr, "Access denied to% x \ n", base), exit (1); ' stehen die Datenpins des Parallelports zur freien Verfügung und Fantasie. In meinem Fall nehme ich nur eine einfache Sequenz von der ersten bis zur letzten mit einem Intervall von einer Sekunde, wobei ich Potenzen der Basis 2 verwende (siehe Videolink). Die Möglichkeiten sind jedoch unendlich, tatsächlich können ohne Verwendung von Multiplexing bis zu 8 unabhängige Ausgänge gesteuert werden, mit Multiplexing-Ausgängen können bis zu 255 Möglichkeiten wachsen. Abhängig von der Anwendung, sei es in Bezug auf die Heimautomatisierung, können wir den Port ohne Multiplexing handhaben und die entsprechenden Puffer platzieren, um höhere Stromlasten zu bewältigen, was später in einem anderen Tutorial behandelt wird.


    Referenzen:

    Martin H., Saez F. Domotica, Un Enfoque Sociotécnico. Juni 2006. Fundación Rogelio Segovia para el Desarrollo de las Telecomunicaciones, Ciudad Universitaria, s/n 28040-Madrid, ISBN:84-7402-335-1.

    Axelson J. Parallelport abgeschlossen. Programmieren, Verbinden und Verwenden des parallelen Druckeranschlusses des PCs. Amazon INC.  ISBN:0-9650819-1-5

    Kerrisk M. Die Linux-Programmierschnittstelle. Linux-Manpages-Projekt. ISBN 978-1-59327-220-3


    Linux
    1. So finden Sie Dateien mit SUID- und SGID-Berechtigungen in Linux

    2. Flatpak unter Linux:Was es ist und wie man Apps damit installiert

    3. So komprimieren Sie Dateien und Verzeichnisse unter Linux (mit Beispielen)

    4. So suchen Sie unter Linux mit netstat, lsof und nmap nach offenen Ports

    5. Lesen und Schreiben auf die serielle Schnittstelle in C unter Linux

    So führen Sie einen Port-Scan unter Linux durch

    Was ist Crontab und wie werden Aufgaben in Linux mit Crontab automatisiert?

    So zeigen Sie die Festplattennutzung mit Duf unter Linux und Unix an

    So finden und schließen Sie offene Ports in Linux

    So verwenden Sie Netcat zum Scannen offener Ports in Linux

    Wie und warum Linux zur Installation von Telnet verwendet wird