diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 282548bea..ed81ea1a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -105,6 +105,7 @@ jobs: cmake -D BUILD_DOC=1 -D DEBUG_CMAKE=1 + -D HAVE_PARPORT=1 -D HAVE_LINUXGPIO=1 -D HAVE_LINUXSPI=1 -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} @@ -169,6 +170,7 @@ jobs: run: >- cmake -D DEBUG_CMAKE=1 + -D HAVE_PARPORT=1 -D HAVE_LINUXGPIO=1 -D HAVE_LINUXSPI=1 -D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} diff --git a/CMakeLists.txt b/CMakeLists.txt index 2be40343f..e2b5f709a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -352,6 +352,14 @@ if(BUILD_DOC) add_subdirectory(src/doc) endif() +if(HAVE_PARPORT) + if(WIN32) + message(FATAL_ERROR "avrdude does not support parallel port on Windows") + elseif(APPLE) + message(FATAL_ERROR "avrdude does not support parallel port on Apple systems") + endif() +endif() + # ===================================== # Configuration # ===================================== diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f7b1700b8..e358e4b13 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -236,7 +236,6 @@ set(SOURCES pindefs.c ppi.c ppi.h - ppiwin.c serbb.h serbb_posix.c serbb_win32.c diff --git a/src/Makefile.am b/src/Makefile.am index b075ea869..9d0833f23 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -163,7 +163,6 @@ libavrdude_la_SOURCES = \ pindefs.c \ ppi.c \ ppi.h \ - ppiwin.c \ serbb.h \ serbb_posix.c \ serbb_win32.c \ diff --git a/src/configure.ac b/src/configure.ac index 2abf92196..91f6a4459 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -449,6 +449,17 @@ AC_ARG_ENABLE( esac], [enabled_parport=no]) +AS_IF([test "x$enabled_parport" = xyes], [dnl + case $target in + *-*-mingw32* | *-*-cygwin* | *-*-windows*) + AC_MSG_ERROR([avrdude does not support parallel port on Windows]) + ;; + *-*-darwin*) + AC_MSG_ERROR([avrdude does not support parallel port on MacOS]) + ;; + esac +]) + AC_ARG_ENABLE( [linuxgpio], AS_HELP_STRING([--enable-linuxgpio], diff --git a/src/ppiwin.c b/src/ppiwin.c deleted file mode 100644 index bbb71ce38..000000000 --- a/src/ppiwin.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * avrdude - A Downloader/Uploader for AVR device programmers - * Copyright (C) 2003, 2004, 2006 Eric B. Weddington - * Copyright (C) 2008 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, see . - */ - -/* - * This is the parallel port interface for Windows built using Cygwin. - * - * In the ppi_* functions that access the parallel port registers, - * fd = parallel port address - * reg = register as defined in an enum in ppi.h. This must be converted - * to a proper offset of the base address. - */ - -#include - -#if defined(HAVE_PARPORT) && defined(WIN32) -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "avrdude.h" -#include "libavrdude.h" - -#include "ppi.h" - -#define DEVICE_LPT1 "lpt1" -#define DEVICE_LPT2 "lpt2" -#define DEVICE_LPT3 "lpt3" - -#define DEVICE_MAX 3 - -typedef struct { - const char *name; - int base_address; -} winpp; - -static const winpp winports[DEVICE_MAX] = { - {DEVICE_LPT1, 0x378}, - {DEVICE_LPT2, 0x278}, - {DEVICE_LPT3, 0x3BC}, -}; - -static int winnt_pp_open(void); -static unsigned short port_get(const union filedescriptor *fdp, int reg); -static unsigned char reg2offset(int reg); -static unsigned char inb(unsigned short port); -static void outb(unsigned char value, unsigned short port); - -void ppi_open(const char *port, union filedescriptor *fdp) { - unsigned char i; - int fd; - - fd = winnt_pp_open(); - - if(fd < 0) { - pmsg_ext_error("cannot winnt_pp_open()\n"); - fdp->ifd = -1; - return; - } - - // Search the windows port names for a match - fd = -1; - for(i = 0; i < DEVICE_MAX; i++) { - if(str_eq(winports[i].name, port)) { - // Set the file descriptor with the Windows parallel port base address - fd = winports[i].base_address; - break; - } - } - if(fd == -1) { - /* - * Supplied port name did not match any of the pre-defined names. Try - * interpreting it as a numeric (hexadecimal/decimal/octal) address. - */ - char *cp; - - fd = strtol(port, &cp, 0); - if(*port == '\0' || *cp != '\0') { - pmsg_error("port %s is neither lpt1/2/3 nor valid number\n", port); - fd = -1; - } - } - if(fd < 0) { - pmsg_ext_error("cannot open port %s\n\n", port); - fdp->ifd = -1; - return; - } - - fdp->ifd = fd; -} - -#define DRIVERNAME "\\\\.\\giveio" -static int winnt_pp_open(void) { - // Only try to use giveio under Windows NT/2000/XP. - OSVERSIONINFO ver_info; - - memset(&ver_info, 0, sizeof(ver_info)); - - ver_info.dwOSVersionInfoSize = sizeof(ver_info); - - if(!GetVersionEx(&ver_info)) { - return (-1); - } else if(ver_info.dwPlatformId == VER_PLATFORM_WIN32_NT) { - HANDLE h = CreateFile(DRIVERNAME, - GENERIC_READ, - 0, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if(h == INVALID_HANDLE_VALUE) { - return (-1); - } - - // Close immediately; the process now has the rights it needs - if(h != NULL) { - CloseHandle(h); - } - } - return (0); -} - -void ppi_close(const union filedescriptor *fdp) { - return; -} - -// Set the indicated bit of the specified register -int ppi_set(const union filedescriptor *fdp, int reg, int bit) { - unsigned char v; - unsigned short port; - - port = port_get(fdp, reg); - v = inb(port); - v |= bit; - outb(v, port); - return 0; -} - -// Clear the indicated bit of the specified register -int ppi_clr(const union filedescriptor *fdp, int reg, int bit) { - unsigned char v; - unsigned short port; - - port = port_get(fdp, reg); - v = inb(port); - v &= ~bit; - outb(v, port); - - return 0; -} - -// Get the indicated bit of the specified register -int ppi_get(const union filedescriptor *fdp, int reg, int bit) { - unsigned char v; - - v = inb(port_get(fdp, reg)); - v &= bit; - - return (v); -} - -// Toggle the indicated bit of the specified register -int ppi_toggle(const union filedescriptor *fdp, int reg, int bit) { - unsigned char v; - unsigned short port; - - port = port_get(fdp, reg); - - v = inb(port); - v ^= bit; - outb(v, port); - - return 0; -} - -// Get all bits of the specified register -int ppi_getall(const union filedescriptor *fdp, int reg) { - unsigned char v; - - v = inb(port_get(fdp, reg)); - - return ((int) v); -} - -// Set all bits of the specified register to val -int ppi_setall(const union filedescriptor *fdp, int reg, int val) { - outb((unsigned char) val, port_get(fdp, reg)); - return 0; -} - -// Calculate port address to access -static unsigned short port_get(const union filedescriptor *fdp, int reg) { - return ((unsigned short) (fdp->ifd + reg2offset(reg))); -} - -// Convert register enum to offset of base address -static unsigned char reg2offset(int reg) { - unsigned char offset = 0; - - switch(reg) { - case PPIDATA: - { - offset = 0; - break; - } - case PPISTATUS: - { - offset = 1; - break; - } - case PPICTRL: - { - offset = 2; - break; - } - } - - return (offset); -} - -// Read in value from port -static unsigned char inb(unsigned short port) { - unsigned char t; - - asm volatile ("in %1, %0":"=a" (t) - :"d"(port)); - - return t; -} - -// Write value to port -static void outb(unsigned char value, unsigned short port) { - asm volatile ("out %1, %0"::"d" (port), "a"(value)); - - return; -} -#endif