Zugriff auf Hardware Port's

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
rudirabbit
Beiträge: 15
Registriert: Do 11. Jan 2007, 18:33

Zugriff auf Hardware Port's

Beitrag von rudirabbit »

Hallo
Vorweg - habe die Suche benutzt, und keine Treffer seltsam gefunden :roll:
oder habe ich Tomaten auf den Augen :oops:

Ich habe ein Graphik Display (T6963c) am Druckerport (LPT 1) angeschlossen.
Unter Win XP und Delphi nutze ich dafür die portio.dll

Will mein Projekt nun unter einer Linuxumgebung laufen lassen (Delphi Quelltext unter lazarus etwas verändert)

Im Prinzip stehe ich nur vor dem Problem wie ich an den Lpt Port komme ?


Grüsse Rudi

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Beitrag von baba »

Hallo,

AssignFile(var F; FileName: string);

z.B. AssignFile(xLPT, "LPT1");
ReWrite(xLPT);

Unix handelt Geräte wie Dateien.

Baba.
Baba.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das Beispiel ist aber unter Unix nicht lauffähig.

http://wiki.freepascal.org/Hardware_Acc ... arezugriff
^^
Wie so oft findet sich eine gute Antwort in der Lazarus Wiki.

Man kann unter Linux auch über die gerätedateien auf Hardware zugreifen aber über /dev/lpt0 sprichst du "nur" den druckertreiber an wenn keiner installiert ist existiert das gerät gleich gar nicht. Und das Rewrite würde sowiso fehlschlagen weil du dort eh keine Dateien erstellen darfst schon gar nicht wenn sie existient sind.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Beitrag von baba »

"Damit sie die "ports" Unit unter Linux benutzen können, muß ihr Programm als root laufen"
Aua. :shock:


Funktioniert bei mir, und das ohne ROOT-Rechte. (Suse 10.3)

Code: Alles auswählen

AssignFile(xLP, '/dev/lp0'); 
Reset(xLP);
Baba.

@Christian: Probier mal aus -> "cat datei > /dev/lp0" (Ups da kommt ja was , auch wenn kein Drucker installiert ist!)
Zuletzt geändert von baba am Di 8. Jul 2008, 16:00, insgesamt 1-mal geändert.
Baba.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das ist auch was anderes als ein rewrite auf ein Gerätefile das geht schon nicht. Und das ist kein Oberlehrergetue. Lass du es lieber die leute auf falsche Fährten zu führen mit absoulut nicht funktionierendem Code.
Funktioniert bei mir, und das ohne ROOT-Rechte. (Suse 10.3)
Was funktioniert bei dir ? Der zugriff auf IO Ports wie im Wiki beitrag beschrieben ohne Root rechte ? Halt ich für ein gerücht. Der Zugriff auf /dev/lp0 funktioniert natürlich ohne Root Rechte da dieser nur auf den Druickertreiber zugreift und nicht auf den Paralellport wie hier gefordert.

Also 1. wollte er auf den Paralellport zugreifen und nicht auf einen Drucker.
2. Funktioniert der code nicht. Es existiert weder ein gerätefile namens "LPT1" wie im ersten Codeabschnitt noch benutzt man " in Pascal, noch funktioniert ein Rewrite auf ein Gerätefile.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

... die Frage ging dahin, Daten auf dem LPT auszugeben. Wie kommst Du auf einen Drucker?
Er will ein Display ansteuern was am Paralellport hängt, wie kommst du darauf das es Dateien lesen kann ? Es wird warscheinlich nicht mal mit RAW Daten klarkommen und man muss die Druckerportleitungen einzeln ansprechen.
Wenn Daten, wie von mir beschrieben, an "dev/lp0" gesendet werden kommen sie am Display an. (Wer dies über CUPS tätigen will installiert einfach einen RAW Drucker)

"/dev/lp0" wäre dann die erste parallele Schnittstelle (Adresse $378, IRQ 7)
/dev/lp0 ist ein Drucker. Unter vielen Distributionen existiert dieses Gerätefile nichtmal wenn kein Drucker installiert ist. Es weist keinesfalls zwingend auf die 1. Paralelle Schnittstelle hin. Da kann genauso ein GDI Drucker dahinterhängen der über USB angesprochen wird oder gar nicht vorhanden sein.
Du hast da ein Problem mit dem Verständniss von Druckertreibern. "/dev/lp0" ist eine Gerätedatei und kein Druckertreiber. (siehe /etc/printcap)
Nein du hast ein verständnisproblem mit Unix, hinter jeder Gerätedatei hängt ein Treiber. Und es ist nirgends definiert welcher Treiber dahinter hängen muss.

Und deine persönlichen Angriffe auf Theo und mich solltest du vieleicht lieber per PN oder nach /dev/null was ungefähr genauso wirksam wäre verlegen. Solang mir nicht etwas extrem auf die Nerven geht wie Leute die anderen Leuten mit unwissen helfen wollen versuche ich hier nur zu helfen.

PS: Noch was, was ich gar nicht leiden kann ist wenn man Falschinformationen in seinen anfänglichen Hilfebeiträgen nachträglich wegeditiert.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

ist zwar 'low level' und kein Pascal,
aber für die Grundlagen könnte das hier helfen:

http://www.faqs.org/docs/Linux-mini/IO- ... mming.html" onclick="window.open(this.href);return false;

rudirabbit
Beiträge: 15
Registriert: Do 11. Jan 2007, 18:33

Beitrag von rudirabbit »

Hallo Leute - immer locker bleiben. ich wollte keinen Streit auslösen :shock: - brauche nur etwas Wissensdownload von euch :wink:


Fazit mit:

Code: Alles auswählen

AssignFile(xLP, '/dev/lp0'); 
Reset(xLP);
Komme ich auf den Druckerport lp0, ein write.. würde jetzt die D0..D7 Datenpins Steuern.
Um mein Display zu steuern brauch ich aber noch den Zugriff auf die Strobe/LF/.. Pin 's
diese liegen an Offsetadresse +2

also ein

Code: Alles auswählen

seek(xLP, 2); write(xLp, xxx);
würde das so funktionieren ?

Grüsse Rudi

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Glaub ich nicht. Das seek dürfte nichts ausmachen.
Und wie gesagt /dev/lp0 zeigt nicht auf jedem rechner auf den 1. paralellport. Nimm lieber ioperm wie in der Lazarus Wiki beschrieben, dann bist auf der Sicheren Seite und kannst auch alle Statusleitungen steuern.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Beitrag von baba »

rudirabbit hat geschrieben:Komme ich auf den Druckerport lp0, ein write.. würde jetzt die D0..D7 Datenpins Steuern. Um mein Display zu steuern brauch ich aber noch den Zugriff auf die Strobe/LF/.. Pin 's diese liegen an Offsetadresse +2
... mal so frei von der Leber:

wenn Du /dev/lp1 auf 37a umdefinierst und/dev/lp1 zusätzlich öffnest, solle der Zuriff doch möglich sein!?

So müsstest Du auch nur zum definieren von /dev/lp1 als Root angemeldet sein. Das Programm läuft mit normalen User-Rechten, also sicher.

Baba.
Baba.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

So etwas ist eine sehr schlampige Art zu programmieren.
ioperm ist die vorgeschlagene methode um auf io ports zuzugreifen und ist mit userrechten möglich. Wo bitte ist das schlampig ? Wo das 2. Zitat herstammt weiss ich jetzt aus dem Hut nicht wenn von mir ist es komplett aus dem zusammenhang gerissen.
Jedenfalls ist es sicherer direkt auf den Paralellport zuzugreifen nämlich über ioperm als über devicefiles wo man nicht sicher sagen kann wohin sie zeigen. Das ist wohl eher schlampig.

Was mit 37a gemeint ist ist für mich nicht entzifferbar.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

rudirabbit
Beiträge: 15
Registriert: Do 11. Jan 2007, 18:33

Beitrag von rudirabbit »

wenn Du /dev/lp1 auf 37a umdefinierst und/dev/lp1 zusätzlich öffnest, solle der Zuriff doch möglich sein!?
Umständlich ?
Denke doch , das die Losung via ioperm die bessere ist.

Werde das mal Testen.

Danke an Euch ALLE

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Der Beitrag ist gesäubert worden und bleibt so!
Sachliche Beiträge zum eigentlichen Thema von rudirabbit sind natürlich willkommen.

Und unabhängig davon besteht kein grund, 3 Beiträge hintereinander zu schreiben, genau dafür gibts die Bearbeiten-Funktion. Unabhängig davon, das dieses Niveau hier gänzlich unangebracht ist und man muss auch mal einzelne Beiträge überlesen können.

Und im übrigen endscheide ich selbst, wie und was ich ggf. mache...es steht natürlich jedem frei, Beiträge zu melden.
Johannes

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Beitrag von Eb »

Ich lese mit ioperm den Status des Parallelports aus.
Das funktioniert, wie in der wiki beschrieben:

Code: Alles auswählen

wert := ioperm($379, 8, 1);
  port[$379] := $00;
  wert := Integer(port[$379]);
Falls du es hinbekommst mit ioperm auf den Parallelport zu schreiben, poste doch bitte deine Lösung hier,

Eberhard

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

Eb hat geschrieben: Falls du es hinbekommst mit ioperm auf den Parallelport zu schreiben, poste doch bitte deine Lösung hier,

Eberhard
laut Mailingliste mit:
http://www.freepascal.org/docs-html/rtl ... operm.html" onclick="window.open(this.href);return false;

http://www.freepascal.org/docs-html/rtl ... portb.html" onclick="window.open(this.href);return false;

Antworten