Hallo Markus,
ich hab ein kleines Programm geschrieben, dass auf /dev/port zugreifen
soll. Aber ein 'open("/dev/port",O_RDWR);' schlaegt fehl, mit dem
Fehler, dass ich nicht genug Rechte hab.
crw-rw-rw- 1 root kmem 1, 4 2003-03-14 14:07 port
Als root geht dann wieder alles! Was muss ich nun aendern, damit es auch
als "normaler" Benutzer funktioniert?
vielleicht hilft die das etwas weiter.
Es beschreibt wie man als NichtRootUser auf dem LPT-Port was ausgeben kann:
--- Externes Programm lptout/lptout.c -> Wert auf LPT-Port ausgeben ---
// Kompilieren: gcc -O2 -o lptin lptin.c
// Programm braucht set uid Bit --> z.B. mit mc setzen
// Aufruf mit: system(lptout 888,int Wert);
#include
#include
int main(int argc, char* argv[]) {
int base=atoi(argv[1]); // Basisadresse des LPT-Ports
//(888%=LPT1=378hex)
int value=atoi(argv[2]); // Ausgabewert, Bitmuster
if(base!=888)exit(1);// Sicherheitsabfrage(n)
ioperm(base,3,1);// Zugriff auf die drei (zweiter Parameter)
//LPT_Adressen
// BasisAdresse_(erster Parameter) = Datenregister
// BasisAdresse+1 = Statusregister
// BasisAdresse+2 = CtrlRegister
// des LPT-Ports erlauben=1 (dritter Parameter)
//rest noch nicht fertig formatiert...
outb(value,base); //Bitmuster ausgeben
outb(1,base+2); //Fallende Flanke in CtrlRegister erzeugen;
//dadurch wird Byte geschrieben
outb(0,base+2);
ioperm(base,3,0);//Zugriff auf die Portadressen wieder verbieten
};
--- Externes Programm lptin/lptin.c -> Wert von LPT-Port einlesen ---
//Kompilieren: gcc -O2 -o lptin lptin.c //Programm braucht set uid Bit
//Aufruf mit: system(lptin 888,int Dummy);
#include
#include
int main(int argc, char* argv[]) {
unsigned int in1,in2,in=0,out=0;
int base=atoi(argv[1]); //---Basisadresse
int value=atoi(argv[2]); //---Dummy
if(base!=888)exit(1);//---Sicherheitsabfrage. hiermit ist nur Adresse
//888dez=(378hex) zulÀssig
ioperm(base,3,1); //Schreiberlaubnis aktivieren (vgl. lptout.c)
out=inb(base+2); //CtrlRegister lesen
out=out | 4; //auf jeden Fall Bit_3 setzen=erster Logikbaustein
//aktiv=obere HÀlfte; bitweise OR
outb(out,base+2); //in CtrlRegister schreiben
while((inb(base+2)&4)!=4); //warten bis Bit reagiert hat
in2=inb(base+1); //Statusregister->este HÀlfte der Daten auslesen und
//obere BytehÀlfte zusammenrechnen
if(!(in2 & 128))in=in | 16; //NICHT AND OR
if(in2 & 32) in=in | 32; // AND OR
if(in2 & 16) in=in | 64; // AND OR
if(in2 & 8) in=in | 128; // AND OR
out=out & (~4); //UND mit NEGATION -> auf jeden Fall Bit_3 nicht setzen
// -> anderer Logikbaustein aktiv
outb(out,base+2); //in CtrlRerister schreiben -> umschalten auf anderen
//Logikbaustein
in1=inb(base+1); //Statusregister->Daten auslesen und _untere_
//BytehÀlfte zusammenrechnen
if(!(in1 & 128)) in=in | 1; //NICHT AND OR
if(in1 & 32) in=in | 2; // AND OR
if(in1 & 16) in=in | 4; // AND OR
if(in1 & 8) in=in | 8; // AND OR
ioperm(base,3,0); //Schreiberlaubnis wieder sperren
return 255-in; //Ergebnis zurÃŒckgeben
}
Anmerkung:
- lptout steuert 8 Ausgangskanäle über LPT
- lptin steuert 8 Eingangskanäle über LPT
man braucht aber eine selbsgelötete Platine um 8 Kanäle einzulesen
Gruß Ulrich