Update of /cvsroot/pure-data/externals/zexy/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21273
Modified Files: configure.ac lpt.c Log Message: added support for accessing the parallel-port via device-files (/dev/parport0)
Index: configure.ac =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/configure.ac,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** configure.ac 16 Jun 2005 13:25:23 -0000 1.6 --- configure.ac 28 Sep 2005 12:18:13 -0000 1.7 *************** *** 350,353 **** --- 350,355 ---- fi
+ AC_CHECK_HEADER(linux/ppdev.h, [ have_ppdev="yes" ], [ have_ppdev="no" ]) + dnl check for LPT AC_MSG_CHECKING("parallel-port") *************** *** 359,362 **** --- 361,365 ---- echo "yes (forced)" else + cat > conftest.c << EOF # include <sys/io.h> *************** *** 372,376 **** then DFLAGS="$DFLAGS -DZ_WANT_LPT" ! echo "yes" else echo "no" --- 375,385 ---- then DFLAGS="$DFLAGS -DZ_WANT_LPT" ! if test "x$have_ppdev" = "xyes" ! then ! DFLAGS="$DFLAGS -DHAVE_PPDEV" ! echo "yes (with device-support)" ! else ! echo "yes" ! fi else echo "no"
Index: lpt.c =================================================================== RCS file: /cvsroot/pure-data/externals/zexy/src/lpt.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** lpt.c 9 Jun 2005 12:17:03 -0000 1.4 --- lpt.c 28 Sep 2005 12:18:14 -0000 1.5 *************** *** 25,29 **** Thomas Musil: adding "control-output" and "input" */ - #define BASE0 0x3bc #define BASE1 0x378 --- 25,28 ---- *************** *** 40,43 **** --- 39,51 ---- #ifdef Z_WANT_LPT # include <stdlib.h> + # include <errno.h> + + # ifdef HAVE_PPDEV + # include <sys/ioctl.h> + # include <linux/ppdev.h> + # include <linux/parport.h> + # include <fcntl.h> + # endif /* HAVE_PPDEV */ +
# ifdef __WIN32__ *************** *** 90,93 **** --- 98,102 ----
unsigned long port; + int device; /* file descriptor of device, in case we are using one ...*/
int mode; // MODE_IOPERM, MODE_IOPL *************** *** 96,102 **** static void lpt_float(t_lpt *x, t_floatarg f) { #ifdef Z_WANT_LPT if (x->port) { - unsigned char b = f; sys_outb(b, x->port+0); } --- 105,116 ---- static void lpt_float(t_lpt *x, t_floatarg f) { + unsigned char b = f; #ifdef Z_WANT_LPT + # ifdef HAVE_PPDEV + if (x->device>0){ + ioctl (x->device, PPWDATA, &b); + } else + # endif if (x->port) { sys_outb(b, x->port+0); } *************** *** 106,112 **** static void lpt_control(t_lpt *x, t_floatarg f) { #ifdef Z_WANT_LPT if (x->port) { - unsigned char b = f; sys_outb(b, x->port+2); } --- 120,131 ---- static void lpt_control(t_lpt *x, t_floatarg f) { + unsigned char b = f; + # ifdef HAVE_PPDEV + if (x->device>0){ + ioctl (x->device, PPWCONTROL, &b); + } else + # endif #ifdef Z_WANT_LPT if (x->port) { sys_outb(b, x->port+2); } *************** *** 116,119 **** --- 135,145 ---- static void lpt_bang(t_lpt *x) { + # ifdef HAVE_PPDEV + if (x->device>0){ + unsigned char b=0; + ioctl (x->device, PPRCONTROL, &b); + outlet_float(x->x_obj.ob_outlet, (float)b); + } else + # endif #ifdef Z_WANT_LPT if (x->port) { *************** *** 127,140 **** { t_lpt *x = (t_lpt *)pd_new(lpt_class); if(s==gensym("lp")) error("lpt: the use of 'lp' has been deprecated; use 'lpt' instead");
inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("control")); outlet_new(&x->x_obj, gensym("float")); x->mode = MODE_NONE; x->port = 0;
#ifdef Z_WANT_LPT - if ((argc==0)||(argv->a_type==A_FLOAT)) { /* FLOAT specifies a parallel port */ --- 153,168 ---- { t_lpt *x = (t_lpt *)pd_new(lpt_class); + char*devname=atom_getsymbol(argv)->s_name; if(s==gensym("lp")) error("lpt: the use of 'lp' has been deprecated; use 'lpt' instead");
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("control")); outlet_new(&x->x_obj, gensym("float")); x->mode = MODE_NONE; x->port = 0; + x->device = -1;
#ifdef Z_WANT_LPT if ((argc==0)||(argv->a_type==A_FLOAT)) { /* FLOAT specifies a parallel port */ *************** *** 159,191 **** LATER think about this */ ! x->port=strtol(atom_getsymbol(argv)->s_name, 0, 16); }
! if (!x->port || x->port>65535){ post("lpt : bad port %x", x->port); x->port = 0; return (x); } ! ! if (x->port && x->port < 0x400){ ! if (ioperm(x->port, 8, 1)) { ! x->mode=MODE_NONE; ! } else x->mode = MODE_IOPERM; ! } ! if(x->mode==MODE_NONE){ ! if (iopl(3)){ ! x->mode=MODE_NONE; ! } else x->mode=MODE_IOPL; ! count_iopl++; ! // post("iopl.............................%d", count_iopl); ! } ! ! if(x->mode==MODE_NONE){ ! error("lpt : couldn't get write permissions"); ! x->port = 0; ! return (x); } ! ! post("connected to port %x in mode '%s'", x->port, (x->mode==MODE_IOPL)?"iopl":"ioperm"); if (x->mode==MODE_IOPL)post("warning: this might seriously damage your pc..."); #else --- 187,248 ---- LATER think about this */ ! int bla; ! x->device=-1; ! x->port=strtol(devname, 0, 16); ! if(0==x->port){ ! x->port=-1; ! #ifdef HAVE_PPDEV ! x->device = open(devname, O_RDWR); ! if(x->device<0){ ! error("lpt: bad device %s", devname); ! return(x); ! } else { ! if (ioctl (x->device, PPCLAIM)) { ! perror ("PPCLAIM"); ! close (x->device); ! return(x); ! } ! } ! #endif /* HAVE_PPDEV */ ! } }
! if ((x->device<0) && (!x->port || x->port>65535)){ post("lpt : bad port %x", x->port); x->port = 0; return (x); } ! if (x->device<0){ ! /* this is ugly: when using a named device, ! * we are currently assuming that we have read/write-access ! * of course, this is not necessary true ! */ ! /* furthermore, we might also use the object ! * withOUT write permissions ! * (just reading the parport) ! */ ! if (x->port && x->port < 0x400){ ! if (ioperm(x->port, 8, 1)) { ! x->mode=MODE_NONE; ! } else x->mode = MODE_IOPERM; ! } ! if(x->mode==MODE_NONE){ ! if (iopl(3)){ ! x->mode=MODE_NONE; ! } else x->mode=MODE_IOPL; ! count_iopl++; ! // post("iopl.............................%d", count_iopl); ! } ! ! if(x->mode==MODE_NONE){ ! error("lpt : couldn't get write permissions"); ! x->port = 0; ! return (x); ! } } ! if(x->device>0) ! post("connected to device %s", devname); ! else ! post("connected to port %x in mode '%s'", x->port, (x->mode==MODE_IOPL)?"iopl":"ioperm"); if (x->mode==MODE_IOPL)post("warning: this might seriously damage your pc..."); #else *************** *** 199,202 **** --- 256,266 ---- { #ifdef Z_WANT_LPT + # ifdef HAVE_PPDEV + if (x->device>0){ + ioctl (x->device, PPRELEASE); + close(x->device); + x->device=0; + } else + # endif if (x->port) { if (x->mode==MODE_IOPERM && ioperm(x->port, 8, 0)) error("lpt: couldn't clean up device");