From cbaf6103aa32926eb25b2042816e951812362c52 Mon Sep 17 00:00:00 2001 From: joerg_wunsch Date: Thu, 3 Nov 2005 22:37:37 +0000 Subject: [PATCH] Add ecpp(7D) (parallel port) for Solaris. * configure.ac: add Solaris' default parallel port. * linux_ppdev.h: change parallel port access to the new style. * freebsd_ppi.h: New file, abstract FreeBSD's ppi(4). * solaris_ecpp.h: New file, abstract Solaris' ecpp(7D). * par.c: change header inclusion sequence. * pgm.h: remove obsolete ppi_claim() and ppi_release() dummies. * ppi.c: change header inclusion sequence, use new parport abstraction, drop obsolete dummy implementation. git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@542 81a1dc3b-b13d-400b-aceb-764788c761c2 --- configure.ac | 2 +- freebsd_ppi.h | 40 +++++++++++++++++++++ linux_ppdev.h | 17 +++++---- par.c | 6 ++-- pgm.h | 8 ----- ppi.c | 94 +++++--------------------------------------------- solaris_ecpp.h | 51 +++++++++++++++++++++++++++ 7 files changed, 113 insertions(+), 105 deletions(-) create mode 100644 freebsd_ppi.h create mode 100644 solaris_ecpp.h diff --git a/configure.ac b/configure.ac index 1120bffa..e6a57fbc 100644 --- a/configure.ac +++ b/configure.ac @@ -140,7 +140,7 @@ case $target in DEFAULT_SER_PORT="/dev/cuaa0" ;; *-*-solaris*) - DEFAULT_PAR_PORT="unknown" + DEFAULT_PAR_PORT="/dev/printers/0" DEFAULT_SER_PORT="/dev/term/a" ;; *-*-msdos* | *-*-mingw32* | *-*-cygwin* | *-*-windows*) diff --git a/freebsd_ppi.h b/freebsd_ppi.h new file mode 100644 index 00000000..93e076ce --- /dev/null +++ b/freebsd_ppi.h @@ -0,0 +1,40 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2005 Joerg Wunsch + * + * This program 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 of the License, or + * (at your option) any later version. + * + * This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id$ */ + +#ifndef freebsd_ppi_h +#define freebsd_ppi_h + +#include + +#define ppi_claim(pgm) {} + +#define ppi_release(pgm) {} + +#define DO_PPI_READ(fd, reg, valp) \ + (void)ioctl(fd, \ + (reg) == PPIDATA? PPIGDATA: ((reg) == PPICTRL? PPIGCTRL: PPIGSTATUS), \ + valp) +#define DO_PPI_WRITE(fd, reg, valp) \ + (void)ioctl(fd, \ + (reg) == PPIDATA? PPISDATA: ((reg) == PPICTRL? PPISCTRL: PPISSTATUS), \ + valp) + +#endif /* freebsd_ppi_h */ diff --git a/linux_ppdev.h b/linux_ppdev.h index afa3982b..1fa36ef1 100644 --- a/linux_ppdev.h +++ b/linux_ppdev.h @@ -9,15 +9,6 @@ #include -#define PPISDATA PPWDATA -#define PPIGDATA PPRDATA - -#define PPISCTRL PPWCONTROL -#define PPIGCTRL PPRCONTROL - -#define PPISSTATUS PPWSTATUS -#define PPIGSTATUS PPRSTATUS - #define ppi_claim(pgm) \ if (ioctl(pgm->fd, PPCLAIM)) { \ fprintf(stderr, "%s: can't claim device \"%s\": %s\n\n", \ @@ -33,5 +24,13 @@ exit(1); \ } +#define DO_PPI_READ(fd, reg, valp) \ + (void)ioctl(fd, \ + (reg) == PPIDATA? PPRDATA: ((reg) == PPICTRL? PPRCONTROL: PPRSTATUS), \ + valp) +#define DO_PPI_WRITE(fd, reg, valp) \ + (void)ioctl(fd, \ + (reg) == PPIDATA? PPWDATA: ((reg) == PPICTRL? PPWCONTROL: PPWSTATUS), \ + valp) #endif /* __linux_ppdev_h__ */ diff --git a/par.c b/par.c index e6b489a7..3292e2c0 100644 --- a/par.c +++ b/par.c @@ -29,9 +29,11 @@ #include #if defined(__FreeBSD__) -#include +# include "freebsd_ppi.h" #elif defined(__linux__) -#include "linux_ppdev.h" +# include "linux_ppdev.h" +#elif defined(__sun__) && defined(__svr4__) /* Solaris */ +# include "solaris_ecpp.h" #endif #include "avr.h" diff --git a/pgm.h b/pgm.h index de9510ef..f03fdbb2 100644 --- a/pgm.h +++ b/pgm.h @@ -111,12 +111,4 @@ void gettimeofday(struct timeval*, void*z); #endif /* __win32native_h */ -#if !defined(ppi_claim) -# define ppi_claim(pgm) -#endif - -#if !defined(ppi_release) -# define ppi_release(pgm) -#endif - #endif diff --git a/ppi.c b/ppi.c index 1b6ac805..ee191466 100644 --- a/ppi.c +++ b/ppi.c @@ -19,10 +19,10 @@ /* $Id$ */ -#if defined(__FreeBSD__) || defined(__linux__) - #include "ac_cfg.h" +#if HAVE_PARPORT + #include #include #include @@ -31,9 +31,11 @@ #include #if defined(__FreeBSD__) -#include +# include "freebsd_ppi.h" #elif defined(__linux__) -#include "linux_ppdev.h" +# include "linux_ppdev.h" +#elif defined(__sun__) && defined(__svr4__) /* Solaris */ +# include "solaris_ecpp.h" #endif #include "avr.h" @@ -53,22 +55,15 @@ int ppi_shadow_access(int fd, int reg, unsigned char *v, unsigned char action) { static unsigned char shadow[3]; int shadow_num; - unsigned long set, get; switch (reg) { case PPIDATA: - set = PPISDATA; - get = PPIGDATA; shadow_num = 0; break; case PPICTRL: - set = PPISCTRL; - get = PPIGCTRL; shadow_num = 1; break; case PPISTATUS: - set = PPISSTATUS; - get = PPIGSTATUS; shadow_num = 2; break; default: @@ -83,12 +78,12 @@ int ppi_shadow_access(int fd, int reg, unsigned char *v, unsigned char action) *v = shadow[shadow_num]; break; case PPI_READ: - ioctl(fd, get, v); + DO_PPI_READ(fd, reg, v); shadow[shadow_num]=*v; break; case PPI_WRITE: shadow[shadow_num]=*v; - ioctl(fd, set, v); + DO_PPI_WRITE(fd, reg, v); break; } return 0; @@ -231,76 +226,5 @@ void ppi_close(int fd) close(fd); } - -#elif defined(__POWERPC__) && defined(__APPLE__) - -int ppi_shadow_access(int fd, int reg, unsigned char *v, unsigned char action) -{ - return -1; -} - -/* - * set the indicated bit of the specified register. - */ -int ppi_set(int fd, int reg, int bit) -{ - return -1; -} - - -/* - * clear the indicated bit of the specified register. - */ -int ppi_clr(int fd, int reg, int bit) -{ - return -1; -} - - -/* - * get the indicated bit of the specified register. - */ -int ppi_get(int fd, int reg, int bit) -{ - return -1; -} - -/* - * toggle the indicated bit of the specified register. - */ -int ppi_toggle(int fd, int reg, int bit) -{ - return -1; -} - - -/* - * get all bits of the specified register. - */ -int ppi_getall(int fd, int reg) -{ - return -1; -} - -/* - * set all bits of the specified register to val. - */ -int ppi_setall(int fd, int reg, int val) -{ - return -1; -} - - -int ppi_open(char * port) -{ - return -1; -} - - -void ppi_close(int fd) -{ -} - - -#endif +#endif /* HAVE_PARPORT */ diff --git a/solaris_ecpp.h b/solaris_ecpp.h new file mode 100644 index 00000000..7179f0d6 --- /dev/null +++ b/solaris_ecpp.h @@ -0,0 +1,51 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2005 Joerg Wunsch + * + * This program 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 of the License, or + * (at your option) any later version. + * + * This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id$ */ + +#ifndef solaris_ecpp_h +#define solaris_ecpp_h + +#include + +#define ppi_claim(pgm) \ + do { \ + struct ecpp_transfer_parms p; \ + (void)ioctl(pgm->fd, ECPPIOC_GETPARMS, &p); \ + p.mode = ECPP_DIAG_MODE; \ + (void)ioctl(pgm->fd, ECPPIOC_SETPARMS, &p); \ + } while(0); + +#define ppi_release(pgm) + +#define DO_PPI_READ(fd, reg, valp) \ + do { struct ecpp_regs r; \ + if ((reg) == PPIDATA) { (void)ioctl(fd, ECPPIOC_GETDATA, valp); } \ + else { (void)ioctl(fd, ECPPIOC_GETREGS, &r); \ + *(valp) = ((reg) == PPICTRL)? r.dcr: r.dsr; } \ + } while(0) +#define DO_PPI_WRITE(fd, reg, valp) \ + do { struct ecpp_regs r; \ + if ((reg) == PPIDATA) { (void)ioctl(fd, ECPPIOC_SETDATA, valp); } \ + else { if ((reg) == PPICTRL) r.dcr = *(valp); else r.dsr = *(valp); \ + (void)ioctl(fd, ECPPIOC_SETREGS, &r); } \ + } while(0) + + +#endif /* solaris_ecpp_h */