From cd81b8b630ecf6e2990380e64833e68ecedb603d Mon Sep 17 00:00:00 2001 From: Hans Ulrich Niedermann Date: Thu, 8 Aug 2024 11:31:20 +0200 Subject: [PATCH] ci: Build parallel port code on supported systems Build parallel port code on supported systems Unsupported systems are: * MSVC compiler (does not support GNU style inline asm) * macos operating system (no macos implementations for preprocessor macros DO_PPI_READ, DO_PPI_WRITE, ppi_claim, ppi_release) This means the CI can test * native Linux builds (yes, even for arm systems) * native Windows builds using mingw Untested at this time are the BSDs. Removes the dysfunctional Windows (since Windows XP) parallel port code, and has the buildsystems fail Windows builds if parallel port builds are requested (HAVE_PARPORT or --enable-parport). https://github.com/avrdudes/avrdude/pull/1874#issuecomment-2275762550 --- .github/workflows/build.yml | 2 + CMakeLists.txt | 8 + src/CMakeLists.txt | 1 - src/Makefile.am | 1 - src/configure.ac | 11 ++ src/ppiwin.c | 323 ------------------------------------ 6 files changed, 21 insertions(+), 325 deletions(-) delete mode 100644 src/ppiwin.c diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d87a7b2db..32336524c 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 0adf1b36d..6b32b324b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -340,6 +340,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 796008681..5728ba0dc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -223,7 +223,6 @@ add_library(libavrdude 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 5b9957564..2cf6efc2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -159,7 +159,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 29174acd9..000000000 --- a/src/ppiwin.c +++ /dev/null @@ -1,323 +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}, -}; - - - - - -/* FUNCTION PROTOTYPES */ -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); - - - -/* FUNCTION DEFINITIONS */ - -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 open device \"giveio\"\n\n"); // giveio?!? FIXME! - 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