]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2004-01-20 14:35:38 by reinelt]
authorreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Tue, 20 Jan 2004 14:35:38 +0000 (14:35 +0000)
committerreinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Tue, 20 Jan 2004 14:35:38 +0000 (14:35 +0000)
drv_generic_parport added, code from parport.c

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@326 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

Makefile.am
Makefile.in
drv_generic_parport.c [new file with mode: 0644]
drv_generic_parport.h [new file with mode: 0644]

index 7c1759ee2877c26d78f279b5b39c7d662887c20c..486ac9481be8d00a45ea0c39af1a3f222c13c503 100644 (file)
@@ -54,8 +54,9 @@ imon.c imon.h \
 \
 display.c display.h \
 drv.c drv.h \
-drv_generic_serial.c drv_generic_serial.h \
-drv_generic_text.c   drv_generic_text.h \
+drv_generic_serial.c  drv_generic_serial.h \
+drv_generic_parport.c drv_generic_parport.h \
+drv_generic_text.c    drv_generic_text.h \
 debug.c debug.h \
 cfg.c cfg.h \
 lock.c lock.h \
index fcec6778b433346ca6ebfe02407c00bd981bfe91..0ebe62165c76b30b274166739096d4b1a8d9f5a1 100644 (file)
@@ -106,7 +106,7 @@ lcd4linux_LDADD = @DRIVERS@ @DRVLIBS@
 #remove next line for liblcd4linux
 lcd4linux_DEPENDENCIES = @DRIVERS@
 
-lcd4linux_SOURCES =  lcd4linux.c pid.c pid.h hash.c hash.h parser.c parser.h processor.c processor.h layout.c layout.h timer.c timer.h evaluator.c evaluator.h widget.c widget.h widget_text.c widget_text.h widget_bar.c widget_bar.h plugin.c plugin.h plugin_math.c plugin_string.c plugin_cfg.c plugin_uname.c plugin_loadavg.c plugin_proc_stat.c plugin_cpuinfo.c plugin_meminfo.c plugin_i2c_sensors.c plugin_xmms.c system.c system.h isdn.c isdn.h wifi.c wifi.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h exec.c exec.h expr.c expr.h mail2.c socket.c socket.h imon.c imon.h display.c display.h drv.c drv.h drv_generic_serial.c drv_generic_serial.h drv_generic_text.c   drv_generic_text.h debug.c debug.h cfg.c cfg.h lock.c lock.h pixmap.c pixmap.h bar.c bar.h icon.c icon.h fontmap.c fontmap.h udelay.c udelay.h
+lcd4linux_SOURCES =  lcd4linux.c pid.c pid.h hash.c hash.h parser.c parser.h processor.c processor.h layout.c layout.h timer.c timer.h evaluator.c evaluator.h widget.c widget.h widget_text.c widget_text.h widget_bar.c widget_bar.h plugin.c plugin.h plugin_math.c plugin_string.c plugin_cfg.c plugin_uname.c plugin_loadavg.c plugin_proc_stat.c plugin_cpuinfo.c plugin_meminfo.c plugin_i2c_sensors.c plugin_xmms.c system.c system.h isdn.c isdn.h wifi.c wifi.h mail.c mail.h seti.c seti.h battery.c battery.h dvb.c dvb.h filter.c filter.h exec.c exec.h expr.c expr.h mail2.c socket.c socket.h imon.c imon.h display.c display.h drv.c drv.h drv_generic_serial.c  drv_generic_serial.h drv_generic_parport.c drv_generic_parport.h drv_generic_text.c    drv_generic_text.h debug.c debug.h cfg.c cfg.h lock.c lock.h pixmap.c pixmap.h bar.c bar.h icon.c icon.h fontmap.c fontmap.h udelay.c udelay.h
 
 
 #liblcd4linux_la_DEPENDENCIES = @DRIVERS@
@@ -158,9 +158,9 @@ isdn.$(OBJEXT) wifi.$(OBJEXT) mail.$(OBJEXT) seti.$(OBJEXT) \
 battery.$(OBJEXT) dvb.$(OBJEXT) filter.$(OBJEXT) exec.$(OBJEXT) \
 expr.$(OBJEXT) mail2.$(OBJEXT) socket.$(OBJEXT) imon.$(OBJEXT) \
 display.$(OBJEXT) drv.$(OBJEXT) drv_generic_serial.$(OBJEXT) \
-drv_generic_text.$(OBJEXT) debug.$(OBJEXT) cfg.$(OBJEXT) lock.$(OBJEXT) \
-pixmap.$(OBJEXT) bar.$(OBJEXT) icon.$(OBJEXT) fontmap.$(OBJEXT) \
-udelay.$(OBJEXT)
+drv_generic_parport.$(OBJEXT) drv_generic_text.$(OBJEXT) \
+debug.$(OBJEXT) cfg.$(OBJEXT) lock.$(OBJEXT) pixmap.$(OBJEXT) \
+bar.$(OBJEXT) icon.$(OBJEXT) fontmap.$(OBJEXT) udelay.$(OBJEXT)
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -181,12 +181,13 @@ DEP_FILES =  .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/Cwlinux.P \
 .deps/MilfordInstruments.P .deps/PalmPilot.P .deps/Raster.P .deps/SIN.P \
 .deps/T6963.P .deps/Text.P .deps/USBLCD.P .deps/XWindow.P .deps/bar.P \
 .deps/battery.P .deps/cfg.P .deps/debug.P .deps/display.P .deps/drv.P \
-.deps/drv_MatrixOrbital.P .deps/drv_generic_serial.P \
-.deps/drv_generic_text.P .deps/dvb.P .deps/evaluator.P .deps/exec.P \
-.deps/expr.P .deps/filter.P .deps/fontmap.P .deps/hash.P .deps/icon.P \
-.deps/imon.P .deps/isdn.P .deps/layout.P .deps/lcd4linux.P .deps/lock.P \
-.deps/mail.P .deps/mail2.P .deps/parport.P .deps/parser.P .deps/pid.P \
-.deps/pixmap.P .deps/plugin.P .deps/plugin_cfg.P .deps/plugin_cpuinfo.P \
+.deps/drv_MatrixOrbital.P .deps/drv_generic_parport.P \
+.deps/drv_generic_serial.P .deps/drv_generic_text.P .deps/dvb.P \
+.deps/evaluator.P .deps/exec.P .deps/expr.P .deps/filter.P \
+.deps/fontmap.P .deps/hash.P .deps/icon.P .deps/imon.P .deps/isdn.P \
+.deps/layout.P .deps/lcd4linux.P .deps/lock.P .deps/mail.P \
+.deps/mail2.P .deps/parport.P .deps/parser.P .deps/pid.P .deps/pixmap.P \
+.deps/plugin.P .deps/plugin_cfg.P .deps/plugin_cpuinfo.P \
 .deps/plugin_i2c_sensors.P .deps/plugin_loadavg.P .deps/plugin_math.P \
 .deps/plugin_meminfo.P .deps/plugin_proc_stat.P .deps/plugin_string.P \
 .deps/plugin_uname.P .deps/plugin_xmms.P .deps/processor.P .deps/seti.P \
diff --git a/drv_generic_parport.c b/drv_generic_parport.c
new file mode 100644 (file)
index 0000000..416e79c
--- /dev/null
@@ -0,0 +1,411 @@
+/* $Id: drv_generic_parport.c,v 1.1 2004/01/20 14:35:38 reinelt Exp $
+ *
+ * generic driver helper for serial and parport access
+ *
+ * Copyright 1999, 2000 Michael Reinelt <reinelt@eunet.at>
+ * Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: drv_generic_parport.c,v $
+ * Revision 1.1  2004/01/20 14:35:38  reinelt
+ * drv_generic_parport added, code from parport.c
+ *
+ * Revision 1.2  2004/01/20 05:36:59  reinelt
+ * moved text-display-specific stuff to drv_generic_text
+ * moved all the bar stuff from drv_generic_bar to generic_text
+ *
+ * Revision 1.1  2004/01/20 04:51:39  reinelt
+ * moved generic stuff from drv_MatrixOrbital to drv_generic
+ * implemented new-stylish bars which are nearly finished
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#ifdef HAVE_SYS_IO_H
+#include <sys/io.h>
+#define WITH_OUTB
+#else
+#ifdef HAVE_ASM_IO_H
+#include <asm/io.h>
+#define WITH_OUTB
+#endif
+#endif
+
+#if defined (HAVE_LINUX_PARPORT_H) && defined (HAVE_LINUX_PPDEV_H)
+#define WITH_PPDEV
+#include <linux/parport.h>
+#include <linux/ppdev.h>
+#else
+#define PARPORT_CONTROL_STROBE    0x1
+#define PARPORT_CONTROL_AUTOFD    0x2
+#define PARPORT_CONTROL_INIT      0x4
+#define PARPORT_CONTROL_SELECT    0x8
+#endif
+
+#if !defined(WITH_OUTB) && !defined(WITH_PPDEV)
+#error neither outb() nor ppdev() possible
+#error cannot compile parallel port driver
+#endif
+
+#include "debug.h"
+#include "cfg.h"
+#include "udelay.h"
+#include "drv_generic_parport.h"
+
+
+static unsigned short Port=0;
+static char *PPdev=NULL;
+
+// initial value taken from linux/parport_pc.c
+static unsigned char ctr = 0xc;
+
+#ifdef WITH_PPDEV
+static int PPfd=-1;
+#endif
+
+
+int drv_generic_parport_open (void)
+{
+  char *s, *e;
+  
+#ifdef USE_OLD_UDELAY
+  if (cfg_number(NULL, "Delay", 0, 1, 1000000000, &loops_per_usec)<0) return -1;
+#else
+  udelay_init();
+#endif
+  
+  s=cfg_get (NULL, "Port", NULL);
+  if (s==NULL || *s=='\0') {
+    error ("parport: no 'Port' entry in %s", cfg_source());
+    return -1;
+  }
+  PPdev=NULL;
+  if ((Port=strtol(s, &e, 0))==0 || *e!='\0') {
+#ifdef WITH_PPDEV
+    Port=0;
+    PPdev=s;
+#else
+    error ("parport: bad Port '%s' in %s", s, cfg_source());
+    return -1;
+#endif
+  }
+  
+  
+#ifdef WITH_PPDEV
+  
+  if (PPdev) {
+    debug ("using ppdev %s", PPdev);
+    PPfd=open(PPdev, O_RDWR);
+    if (PPfd==-1) {
+      error ("parport: open(%s) failed: %s", PPdev, strerror(errno));
+      return -1;
+    }
+    
+#if 0
+    // Fixme: this always fails here...
+    if (ioctl(PPfd, PPEXCL)) {
+      debug ("ioctl(%s, PPEXCL) failed: %s", PPdev, strerror(errno));
+    } else {
+      debug ("ioctl(%s, PPEXCL) succeded.");
+    }
+#endif
+    
+    if (ioctl(PPfd, PPCLAIM)) {
+      error ("parport: ioctl(%s, PPCLAIM) failed: %d %s", PPdev, errno, strerror(errno));
+      return -1;
+    }
+  } else
+    
+#endif
+    
+    {
+      debug ("using raw port 0x%x", Port);
+      if ((Port+3)<=0x3ff) {
+       if (ioperm(Port, 3, 1)!=0) {
+         error ("parport: ioperm(0x%x) failed: %s", Port, strerror(errno));
+         return -1;
+       }
+      } else {
+       if (iopl(3)!=0) {
+         error ("parport: iopl(1) failed: %s", strerror(errno));
+         return -1;
+       }
+      }
+    }
+  return 0;
+}
+
+
+int drv_generic_parport_close (void)
+{
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    debug ("closing ppdev %s", PPdev);
+    if (ioctl(PPfd, PPRELEASE)) {
+      error ("parport: ioctl(%s, PPRELEASE) failed: %s", PPdev, strerror(errno));
+    }
+    if (close(PPfd)==-1) {
+      error ("parport: close(%s) failed: %s", PPdev, strerror(errno));
+      return -1;
+    }
+  } else 
+#endif    
+    {
+      debug ("closing raw port 0x%x", Port);
+      if ((Port+3)<=0x3ff) {
+       if (ioperm(Port, 3, 0)!=0) {
+         error ("parport: ioperm(0x%x) failed: %s", Port, strerror(errno));
+         return -1;
+       } 
+      } else {
+       if (iopl(0)!=0) {
+         error ("parport: iopl(0) failed: %s", strerror(errno));
+         return -1;
+       }
+      }
+    }
+  return 0;
+}
+
+
+unsigned char drv_generic_parport_wire_ctrl (char *name, unsigned char *deflt)
+{
+  unsigned char w;
+  char wire[256];
+  char *s;
+  
+  snprintf (wire, sizeof(wire), "Wire.%s", name);
+  s=cfg_get (NULL, wire, deflt);
+  if (strcasecmp(s,"STROBE")==0) {
+    w=PARPORT_CONTROL_STROBE;
+  } else if(strcasecmp(s,"AUTOFD")==0) {
+    w=PARPORT_CONTROL_AUTOFD;
+  } else if(strcasecmp(s,"INIT")==0) {
+    w=PARPORT_CONTROL_INIT;
+  } else if(strcasecmp(s,"SELECT")==0) {
+    w=PARPORT_CONTROL_SELECT;
+  } else if(strcasecmp(s,"GND")==0) {
+    w=0;
+  } else {
+    error ("parport: unknown signal <%s> for wire <%s>", s, name);
+    error ("         should be STROBE, AUTOFD, INIT, SELECT or GND");
+    return 0xff;
+  }
+
+  if (w&PARPORT_CONTROL_STROBE) {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:STROBE]", name);
+  }
+  if (w&PARPORT_CONTROL_AUTOFD) {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:AUTOFD]", name);
+  }
+  if (w&PARPORT_CONTROL_INIT) {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:INIT]", name);
+  }
+  if (w&PARPORT_CONTROL_SELECT) {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:SELECT]", name);
+  }
+  if (w==0) {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:GND]", name);
+  }
+  
+  return w;
+}
+
+
+unsigned char drv_generic_parport_wire_data (char *name, unsigned char *deflt)
+{
+  unsigned char w;
+  char wire[256];
+  char *s;
+  
+  snprintf (wire, sizeof(wire), "Wire.%s", name);
+  s=cfg_get (NULL, wire, deflt);
+  if(strlen(s)==3 && strncasecmp(s,"DB",2)==0 && s[2]>='0' && s[2]<='7') {
+    w=s[2]-'0';
+  } else if(strcasecmp(s,"GND")==0) {
+    w=0;
+  } else {
+    error ("parport: unknown signal <%s> for wire <%s>", s, name);
+    error ("         should be DB0..7 or GND");
+    return 0xff;
+  }
+  
+  if (w==0) {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:GND]", name);
+  } else {
+    info ("wiring: [DISPLAY:%s]<==>[PARPORT:DB%d]", name, w);
+  }
+  
+  w=1<<w;
+
+  return w;
+}
+
+
+void drv_generic_parport_direction (int direction)
+{
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    ioctl (PPfd, PPDATADIR, &direction);
+  } else
+#endif
+    {
+      // code stolen from linux/parport_pc.h
+      ctr = (ctr & ~0x20) ^ (direction?0x20:0x00);
+      outb (ctr, Port+2);
+    }
+}
+
+
+void drv_generic_parport_control (unsigned char mask, unsigned char value)
+{
+  // any signal affected?
+  // Note: this may happen in case a signal is hardwired to GND
+  if (mask==0) return;
+
+  // Strobe, Select and AutoFeed are inverted!
+  value = mask & (value ^ (PARPORT_CONTROL_STROBE|PARPORT_CONTROL_SELECT|PARPORT_CONTROL_AUTOFD));
+
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    struct ppdev_frob_struct frob;
+    frob.mask=mask;
+    frob.val=value;
+    ioctl (PPfd, PPFCONTROL, &frob);
+  } else
+#endif
+    {
+      // code stolen from linux/parport_pc.h
+      ctr = (ctr & ~mask) ^ value;
+      outb (ctr, Port+2);
+    }
+}
+
+
+void drv_generic_parport_toggle (unsigned char bits, int level, int delay)
+{
+  unsigned char value1, value2;
+
+  // any signal affected?
+  // Note: this may happen in case a signal is hardwired to GND
+  if (bits==0) return;
+
+  // prepare value
+  value1=level?bits:0;
+  value2=level?0:bits;
+  
+  // Strobe, Select and AutoFeed are inverted!
+  value1 = bits & (value1 ^ (PARPORT_CONTROL_STROBE|PARPORT_CONTROL_SELECT|PARPORT_CONTROL_AUTOFD));
+  value2 = bits & (value2 ^ (PARPORT_CONTROL_STROBE|PARPORT_CONTROL_SELECT|PARPORT_CONTROL_AUTOFD));
+  
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    struct ppdev_frob_struct frob;
+    frob.mask=bits;
+    
+    // rise
+    frob.val=value1;
+    ioctl (PPfd, PPFCONTROL, &frob);
+    
+    // pulse width
+    ndelay(delay);      
+    
+    // lower
+    frob.val=value2;
+    ioctl (PPfd, PPFCONTROL, &frob);
+  } else
+#endif
+    {
+      // rise
+      ctr = (ctr & ~bits) ^ value1;
+      outb (ctr, Port+2);
+
+      // pulse width
+      ndelay(delay);      
+      
+      // lower
+      ctr = (ctr & ~bits) ^ value2;
+      outb (ctr, Port+2);
+    }
+}
+
+
+void drv_generic_parport_data (unsigned char data)
+{
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    ioctl(PPfd, PPWDATA, &data);
+  } else
+#endif
+    {
+      outb (data, Port);
+    }
+}
+
+unsigned char drv_generic_parport_read (void)
+{
+  unsigned char data;
+  
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    ioctl (PPfd, PPRDATA, &data);
+  } else
+#endif
+    {
+      data=inb (Port);
+    }
+  return data;
+}
+
+
+void drv_generic_parport_debug(void)
+{
+  unsigned char control;
+  
+#ifdef WITH_PPDEV
+  if (PPdev) {
+    ioctl (PPfd, PPRCONTROL, &control);
+  } else 
+#endif
+    {
+      control=ctr;
+    }
+  
+  debug ("%cSTROBE %cAUTOFD %cINIT %cSELECT", 
+        control & PARPORT_CONTROL_STROBE ? '-':'+',
+        control & PARPORT_CONTROL_AUTOFD ? '-':'+',
+        control & PARPORT_CONTROL_INIT   ? '+':'-',
+        control & PARPORT_CONTROL_SELECT ? '-':'+');
+  
+}
diff --git a/drv_generic_parport.h b/drv_generic_parport.h
new file mode 100644 (file)
index 0000000..6decaa7
--- /dev/null
@@ -0,0 +1,87 @@
+/* $Id: drv_generic_parport.h,v 1.1 2004/01/20 14:35:38 reinelt Exp $
+ *
+ * generic driver helper for parallel port displays
+ *
+ * Copyright 1999, 2000 Michael Reinelt <reinelt@eunet.at>
+ * Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: drv_generic_parport.h,v $
+ * Revision 1.1  2004/01/20 14:35:38  reinelt
+ * drv_generic_parport added, code from parport.c
+ *
+ */
+
+/* 
+ *
+ * exported fuctions:
+ *
+ * int drv_generic_parport_open (void)
+ *   reads 'Port' entry from config and opens
+ *   the parallel port
+ *   returns 0 if ok, -1 on failure
+ *
+ * int drv_generic_parport_close (void)
+ *   closes parallel port
+ *   returns 0 if ok, -1 on failure
+ *
+ * unsigned char drv_generic_parport_wire_ctrl (char *name, char *deflt)
+ *   reads wiring for one control signal from config
+ *   returns DRV_GENERIC_PARPORT_CONTROL_* or 255 on error
+ *
+ * unsigned char drv_generic_parport_wire_data (char *name, char *deflt)
+ *   reads wiring for one data signal from config
+ *   returns 1<<bitpos or 255 on error
+ *
+ * void drv_generic_parport_direction (int direction)
+ *   0 - write to parport
+ *   1 - read from parport
+ *
+ * void drv_generic_parport_control (unsigned char mask, unsigned char value)
+ *   frobs control line and takes care of inverted signals
+ *
+ * void drv_generic_parport_toggle (unsigned char bit, int level, int delay)
+ *   toggles the line <bit> to <level> for <delay> nanoseconds
+ *
+ * void drv_generic_parport_data (unsigned char value)
+ *   put data bits on DB1..DB8
+ *
+ * unsigned char drv_generic_parport_read (void)
+ *   reads a byte from the parallel port
+ *
+ * void drv_generic_parport_debug(void)
+ *   prints status of control lines
+ *
+ */
+
+#ifndef _DRV_GENERIC_PARPORT_H_
+#define _DRV_GENERIC_PARPORT_H_
+
+int           drv_generic_parport_open       (void);
+int           drv_generic_parport_close      (void);
+unsigned char drv_generic_parport_wire_ctrl  (char *name, unsigned char *deflt);
+unsigned char drv_generic_parport_wire_data  (char *name, unsigned char *deflt);
+void          drv_generic_parport_direction  (int direction);
+void          drv_generic_parport_control    (unsigned char mask, unsigned char value);
+void          drv_generic_parport_toggle     (unsigned char bit, int level, int delay);
+void          drv_generic_parport_data       (unsigned char data);
+unsigned char drv_generic_parport_read       (void);
+void          drv_generic_parport_debug      (void);
+
+#endif