die grundlage fuer meinen treiber war wie oben erwaehnt die software folgenden projekts:
http://www.thiemo.net/projects/orpheus/optrex/
die software:
http://www.thiemo.net/projects/orpheus/optrex/LCD.tgz
oeffnen von /dev/parportX (linux benoetigt zusaetzlich ein PPCLAIM, freebsd anscheinend nicht, ppdev => zb. "/dev/parport0")
int openPP(const char ppdev[]) {
int fd;
if ((fd = open(ppdev, O_RDWR)) < 0) {
fprintf(stderr, "Error opening %s: %s\n",
ppdev, strerror(errno));
return -1;
}
if ( ioctl(fd,PPCLAIM,0) ) {
fprintf(stderr, "Error claiming %s: %s\n",
ppdev, strerror(errno));
return -1;
}
return fd;
}
die 'lowlevel'-ansteuerung habe ich fast 1:1 uebernommen, die essentielle funktion ist 'dowrite', diese sendet die daten zum druckerport (alle anderen funktionen wie WriteSED, PutCtrl, PutData greifen darauf zu)
void dowrite(int fd, u_int8_t data) {
u_int8_t foo;
foo = data;
if (ioctl(fd, PPWDATA, &foo) < 0) {
fprintf(stderr, "ioctl() failed: %s.\n", strerror(errno));
exit(23);
}
}
(Anmerkung: PPISDATA => FreeBSD, PPWDATA => linux)
anbindung an GLCD:
Im cGraphLCDDevice::cGraphLCDDevice (void):
lptDevice="/dev/parport0";
int
cGraphLCDDevice::Init (void) {
int x;
struct timeval tv1, tv2;
if(!lptDevice) {
esyslog("graphlcd plugin: ERROR LPT Port not specified (cGraphLCDDevice::Init)\n");
return -1;
}
lptFD = openPP(lptDevice);
if(lptFD < 0) {
esyslog("graphlcd plugin: ERROR could not open LPT Port (cGraphLCDDevice::Init)\n");
return -1;
}
... initialisierung ...
hoffe, dass man damit etwas anfangen kann (und ich die tags richtig gesetzt habe und die zeilenvorschuebe nicht verschluckt werden ....
gruesse
/wastl