diff options
author | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2004-01-20 14:35:38 +0000 |
---|---|---|
committer | reinelt <reinelt@3ae390bd-cb1e-0410-b409-cd5a39f66f1f> | 2004-01-20 14:35:38 +0000 |
commit | d198bf228c98434578920e7301fb9edf13a37d3b (patch) | |
tree | 320ff85707722fc3a8ebcdc2f346d921a3810f2f | |
parent | 57a7eddbbbff009cc52746e584cfd4857c0040f8 (diff) | |
download | lcd4linux-d198bf228c98434578920e7301fb9edf13a37d3b.tar.gz |
[lcd4linux @ 2004-01-20 14:35:38 by reinelt]
drv_generic_parport added, code from parport.c
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@326 3ae390bd-cb1e-0410-b409-cd5a39f66f1f
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | Makefile.in | 21 | ||||
-rw-r--r-- | drv_generic_parport.c | 411 | ||||
-rw-r--r-- | drv_generic_parport.h | 87 |
4 files changed, 512 insertions, 12 deletions
diff --git a/Makefile.am b/Makefile.am index 7c1759e..486ac94 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 \ diff --git a/Makefile.in b/Makefile.in index fcec677..0ebe621 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 index 0000000..416e79c --- /dev/null +++ b/drv_generic_parport.c @@ -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 index 0000000..6decaa7 --- /dev/null +++ b/drv_generic_parport.h @@ -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 |