Einfache Steuerung der parallelen Schnittstelle
Ziel dieser Beschreibung ist es, die parallele Schnittstelle über ein Webinterface steuern zu können. Ich verwende eine Schaltung aus 4 Leds, die auf eine Rochlasterplatine gelötet wurden. Damit kann man sich sehr leicht den Zustand der einzelnen Ports anzeigen lassen. Ich verwende dabei keine Vorwiderstände da ich ultra helle LED's genommen habe. Zur Sicherheit empfiehlt es sich aber 100 Ohm Vorwiderstände zu verwenden. Im wesentlichen gibt es zwei Möglichkeiten den parallelen Port unter Debian zu steuern. Zum einen lässt sich der Port direkt per Speicher Adresse aus einem C Programm heraus schreiben und lesen. Nachteil dabei: Speicher Adressen darf nur Root schreiben. Es ist also nicht möglich das ganze per www-data User aus einer Website heraus zu starten. Die andere Möglichkeit besteht darin den Hardware Zugriff über ein C Programm das ein paar Linux Kernel Module benötigt vorzunehmen. Die Module können wiederum einem bestimmten Linux User oder einer Gruppe angehören. So kann der parallele Port dann auch über ein Webfrontend (PHP, Ajax etc.) gesteuert werden. Auf diese Möglichkeit möchte ich hier genauer eingehen.
Als erstes sollten die benötigten Module geladen werden:
modprobe parport modprobe ppdev
lsmod|grep parport
sollte dann folgende Ausgaben produzieren:
parport_pc 32132 0 parport 33256 2 ppdev,parport_pc
nun benötigen wir den gcc und alle Programme die zum kompilieren nötig sind:
apt-get install build-essential
nun legen wir uns einen Ordner zum kompilieren an. Für alle die wenig Erfahrung im kompilieren von Linux Software haben biete ich hier meine kompilierte ausführbare Datei zum Download an. (Debian etch 2.6.18-6-686):
mkdir /usr/src/blink cd /usr/src/blink
Darin speichern wir unsere C Quellcode Datei mit folgendem Inhalt:
vim blink.c
Inhalt, das Programm stammt übrigens aus diesem Forumbeitrag:
/*Dieser Code laesst LEDs die an Pins 2...9 (Datenregister)
angeschlossen sind blinken. */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/ppdev.h>
#include <linux/parport.h>
#include <sys/ioctl.h>
int main()
{
int fd,loop=0;
unsigned char datareg=0xFF;
unsigned char controlreg=0x00;
struct ppdev_frob_struct frob;
/*parallele Schnittstelle öen*/
if((fd = open ("/dev/parport0", O_RDWR))!=-1)
{
ioctl (fd, PPCLAIM);
}
else
{
printf("Konnte Schnittstelle nicht oeffnen\n");
return 1;
}
/*Pins 2..9 als Ausgang konfigurieren*/
frob.mask = 0x20;
frob.val =0x00;
ioctl (fd, PPFCONTROL, &frob);
/*10 mal LEDs ein- und ausschalten*/
while ((loop++)<1)
{
datareg=0xFF;
ioctl(fd,PPWDATA ,&datareg);
sleep(1);
datareg=0x00;
ioctl(fd,PPWDATA ,&datareg);
sleep(1);
}
/*parallele Schnittstelle sch