Paralell Port zugriff

tassilo

Active Member
Moin Moin

Hat jemand ein funktionierendes Beispiel wie man den paralell Port mit OpenBSD benutzen kann? Ich habe bereits gegoogelt und auch die Suche hier Versucht, viele Tipps gefunden, aber ein wirklich funktionierendes Beispiel habe ich nicht gefunden.

Ich will z.b. 0x9A also "10011010" ausgeben. Normalerweise würde ich das einfach "nach" 0x378 schreiben, aber da bekomme ich einen core dump.

openbsd scheint meinen port aber zu finden :

lpt0 at isa0 port 0x378/4 irq 7

verwenden tu ich ein openbsd 4.9

grüße und im voraus vielen dank.

tassilo
 
Ach ja ein beispiel das ich hier in Forum gefunden habe :


[tassilo@gigant:~/workbench/control]$ cat bsd_forum_01.c
#include <stdio.h>

int main(void)
{
FILE *f;
f=fopen("/dev/lpt0","a+");
fprintf(f,"der parallelport funktioniert!!!\n");
fclose(f);
}


[tassilo@gigant:~/workbench/control]$ gcc bsd_forum_01.c
[tassilo@gigant:~/workbench/control]$ ./a.out
Segmentation fault
 
Glaubst du wirklich OpenBSD würde die I/O Ports direkt in den Adressraum eines jeden Prozesses einblenden? Ein Blick in die lpt Manpage legt nahe das es ein oder mehrere Devicenodes für deinen Parallelport gibt.
 
Glaubst du wirklich OpenBSD würde die I/O Ports direkt in den Adressraum eines jeden Prozesses einblenden? Ein Blick in die lpt Manpage legt nahe das es ein oder mehrere Devicenodes für deinen Parallelport gibt.

hallo,

Danke für die schnelle Antwort. ich greife doch auf /dev/lpt0 zu wie in der manpage gesagt, oder habe ich hier schon den fehler?
ansonsten lasse ich das auch als root (der dürfte das bestimmt?) aber funkt auch nicht.

EDIT : ok bei root kommt kein segmentation fault aber ein "lpt0: out of paper" hmm....

grüße

tassilo
 
Ich frage mich gerade wieso meint Openbsd das da kein papier da ist (es ist ja nicht mal ein drucker angeschlossen)? und wieso wird das überhaupt nachgeprüft, ich mein ich schreibe doch auf das "device" und nicht in sowas wie eine druckerque oder?
 
Ich glaube (Ich bin kein OpenBSDler), dass es so nicht geht. lpt(4) ist ein relativ hoch im System sitzender Treiber, der dazu gedacht ist mit einem Drucker zu kommunizieren. Willst du direkt auf den Parallelport schreiben, musst du dich selbst auf diese tiefe Ebene hinabbegeben. Eine Möglichkeit dazu ist, dir mit i386_get_ioperm() und i386_set_ioperm() die Rechte zu holen und dann per outb() und inb() rumzufummeln, aber das ist gefährlich und es würde mich sehr wundern, wenn es da keine besseren Methoden gibt...
 
Hallo,

danke für die Antworten. Hab auch noch etwas weiter gegoogelt. Finde diese Seite auch recht informativ (falls mal jemand das gleiche Problem hat) : http://0x1392.livejournal.com/78937.html?thread=439385

doch leider bekomme ich bei dem dort vorgestellten Programm wie auch beim 4x4 LED Matrix Programm immer diese meldung :

[root@gigant:~/work]$ ./portio out 378 255
portio: i386_set_permio: Operation not permitted

compilieren ohne probleme (mit -li386) ich führe es auch als root aus, aber bekomm immer " i386_set_permio: Operation not permitted" ...
wenn man das mal so einfach 1zu1 in googel eingibt gibt es genau 0 treffer...

grüße

Tassilo
 
bloede frage...

hast du schonmal als root
Code:
# cat /etc/fstab >/dev/lpt0
probiert?
und was hast du ueberhaupt fuer einen drucker?
 
So als kleiner Tipp fuer die Zukunft (was Crest auch schon meinte): Es ist gut[TM], wenn man sich gleich angewoehnt die Return-Werte zu checken. mit perrror() bekommt man dann auch veruenftigen Output. Also z.B.:

Code:
...
FILE *f;
if ( (f=fopen("/dev/lpt0","a+")) == NULL)
  perror("lpt0");
 
bloede frage...
hast du schonmal als root
Code:
# cat /etc/fstab >/dev/lpt0
probiert?

Ja, kommt no paper...

und was hast du ueberhaupt fuer einen drucker?

ich habe keinen drucker. Z.Zt. sind ein paar wiederstände mit led's am Stecker damit ich sehen kann ob da überhaupt was raus kommt. Wie schon geschrieben will ich auf den Port zugreifen aber nicht zum drucken :)

grüße
 
[root@gigant:~/work]$ ./portio out 378 255
portio: i386_set_permio: Operation not permitted
Ist das ein (Ab-)Schreibfehler und es heißt in Wirklichkeit i386_set_ioperm?

Laut Manpage liegt das daran, dass du es nicht als superuser aufrufst:
Code:
     [b]i386_set_ioperm[/b]() sets the I/O permission bitmap from the data pointed to
     by iomap.  This call is restricted to the superuser.
 
Wenn Du genau gelesen hättest was tassilo geschrieben hat, wäre Dir aufgefallen, dass er das Kommando als root ausgeführt hat...

Dann hat er einen Bug aufgedeckt und sollte ihn schleunigst melden!
In der Manpage steht nämlich, dass der Fehler (EPERM) nur auftritt, wenn er nicht superuser-Rechte hat. Sollte etwas anderes dazu geführt haben, ist es entweder ein Bug in der Funktion oder ein Bug in der Manpage.
 
Hallo BSDler,

ich habe hier auf meiner Homepage einen Punkt EISENBAHN. Dort findet man unter DOWNLOAD den Sourcecode für ein simple LPT ausgabe zur Lampen- und Motorsteuerung per LPT.

MfG

echo "HUE\a"

HOMEPAGE www.volker-wolfram.de
 
Hallo HUE

ich hab mal alle schritte hier mitgenommen (einfach consolen log).
was mache ich falsch ?

grüße

tassilo


# pwd
/root
# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem), 3(sys), 4(tty), 5(operator), 20(staff), 31(guest)
# mkdir test
# cd test
# wget http://www.volker-wolfram.de/source/bahn.tgz
--2012-02-28 20:32:30-- http://www.volker-wolfram.de/source/bahn.tgz
Resolving www.volker-wolfram.de (www.volker-wolfram.de)... 95.129.49.139
Connecting to www.volker-wolfram.de (www.volker-wolfram.de)|95.129.49.139|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 991 [application/x-gzip]
Saving to: `bahn.tgz'

100%[=============================================================================================================================>] 991 --.-K/s in 0s

2012-02-28 20:32:31 (3.33 MB/s) - `bahn.tgz' saved [991/991]

# tar xvfz bahn.tgz
bahn.c
Makefile
# make
cc -lcurses bahn.c -o bahn
# ./bahn
Segmentation fault (core dumped)
#
 
Hallo,

ich benutze dafür folgende Anweisung:

$ sudo ./bahn

MfG

HUE

Ein wenig witzig von mir!

Ich habe zu spät gesehen, dass Du schon ROOT bist.

Ich habe mein Programm noch einmal geprüft und stelle fest, dass es der Befehl OUTB ist, der den Absturz auslöst. Ich finde diesen in dem Header PIO.H wieder.

Verstehen tue ich das ganze unter OBSD nicht, da es bei mir unter NetBSD prima bis heute läuft. D.h, dass die Bahn jährlich in den Wintermonaten bei meinem Neffen ihre Runde dreht.

MfG

HUE
 
Hallo tassilo,

ich habe folgenden Kommentar im Netz gefunden:


List: openbsd-tech
Subject: Re: parallel port programming
From: Matthieu Herrb <matthieu.herrb () wanadoo ! fr>
Date: 2002-04-26 18:58:07
[Download message RAW]

Musawir Ali wrote (in a message from Friday 26)
> Hello,
>
> I'm doing some parallel port programming and I was wondering what include
> files need to be used for port I/O ? In linux i used #include <asm/io.h> and
> it had the functions such as inb(), outb(), etc.
> Also, is there anything special needed to be done to give exclusive read/write
> access to the ports? or just being root will work?

No, you also need to allow access to I/O ports by calling
i386_iopl(2). And you need to have the machdep.allowaperture sysctl
set to >=1 if running at securelevel 1 or above. Then you can use
inb/outb and friends.

Note that this is not the recommended way to manipulate the parallel
port. It is acceptable for a prototype application, but for something
serious, it's better to write a real kernel driver, which is the only
way to have proper access control, correct timings, interrupt
handlings, etc.
 
Hallo tassilo,
No, you also need to allow access to I/O ports by calling
i386_iopl(2). And you need to have the machdep.allowaperture sysctl
set to >=1 if running at securelevel 1 or above. Then you can use
inb/outb and friends.

WOW! Das wars. Meine LED blinken und ich kann weitermachen. Vielen dank an dich und all die anderen Helfer!

grüße

tassilo

p.s.: ich fände aber einen hinweis in den manpages dennoch hilfreich :)
 
Hallo tassilo,

es wäre auch für die Anderen und auch für mich nicht schlecht, wie Deine Lösung zum Schluss aussieht.

Bitte poste mal das Wichtigste vom Quellcode und der Compileranweisung.

Vielen Dank und freundlichen Gruss!

echo "HUE\a"
 
Ein Hallo dem Suchenden von bahn.tgz!

Beim Durchsehen meines Logfiles am Webserver habe ich festgestellt, dass jemand kürzlich in diesem Monat einen Zugriff auf eine verwaiste Seite meines alten Internetauftrittes hatte.

Er wollte die Datei "bahn.tgz" herunterladen…

Sowas aber auch ;-)

Ich hoffe, ich kann dem Suchenden nachträglich noch eine Hilfe sein.

Bis dahin

HUE\a
 

Anhänge

  • bahn.zip
    4,7 KB · Aufrufe: 314
Zurück
Oben