add a new conntype for linuxgpio

This also adds a default linuxgpio port ("gpiochip0"), and adds a
programmer to the avrdude.conf file using linuxgpio from the Raspberry
Pi GPIO port.
This commit is contained in:
Sebastian Kuzminsky
2023-03-09 08:37:56 -07:00
parent 3b93eccfb5
commit 5abbefe63b
10 changed files with 68 additions and 2 deletions

View File

@@ -87,18 +87,23 @@ endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(DEFAULT_PAR_PORT "/dev/parport0")
set(DEFAULT_SER_PORT "/dev/ttyS0")
set(DEFAULT_LINUXGPIO_PORT "gpiochip0")
elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
set(DEFAULT_PAR_PORT "/dev/ppi0")
set(DEFAULT_SER_PORT "/dev/cuad0")
set(DEFAULT_LINUXGPIO_PORT "unknown")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris")
set(DEFAULT_PAR_PORT "/dev/printers/0")
set(DEFAULT_SER_PORT "/dev/term/a")
set(DEFAULT_LINUXGPIO_PORT "unknown")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(DEFAULT_PAR_PORT "lpt1")
set(DEFAULT_SER_PORT "com1")
set(DEFAULT_LINUXGPIO_PORT "unknown")
else()
set(DEFAULT_PAR_PORT "unknown")
set(DEFAULT_SER_PORT "unknown")
set(DEFAULT_LINUXGPIO_PORT "unknown")
endif()
# =====================================
@@ -120,6 +125,7 @@ add_custom_command(
-D HAVE_LINUXGPIO=$<BOOL:${HAVE_LINUXGPIO}>
-D DEFAULT_PAR_PORT=${DEFAULT_PAR_PORT}
-D DEFAULT_SER_PORT=${DEFAULT_SER_PORT}
-D DEFAULT_LINUXGPIO_PORT=${DEFAULT_LINUXGPIO_PORT}
-P "${CMAKE_CURRENT_SOURCE_DIR}/configure.cmake"
DEPENDS avrdude.conf.in
VERBATIM

View File

@@ -411,6 +411,7 @@ default_parallel = "@DEFAULT_PAR_PORT@";
default_serial = "@DEFAULT_SER_PORT@";
default_spi = "@DEFAULT_SPI_PORT@";
# default_bitclock = 2.5;
default_linuxgpio = "@DEFAULT_LINUXGPIO_PORT@";
@HAVE_PARPORT_BEGIN@
@@ -691,7 +692,7 @@ programmer
@HAVE_LINUXGPIO_BEGIN@
# This programmer bitbangs GPIO lines using the Linux sysfs GPIO interface
# This programmer bitbangs GPIO lines using the Linux libgpiod or sysfs GPIO interface
#
# To enable it set the configuration below to match the GPIO lines connected
# to the relevant ISP header pins and uncomment the entry definition. In case
@@ -719,6 +720,21 @@ programmer
# sdo = ?;
# sdi = ?;
# ;
# #------------------------------------------------------------
# # Program from a Raspberry Pi GPIO port using linuxgpio
# #------------------------------------------------------------
#
programmer
id = "raspberry_pi_gpio";
desc = "Bitbang Raspberry Pi GPIO via linuxgpio (sysfs or libgpiod)";
type = "linuxgpio";
connection_type = linuxgpio;
reset = 12;
sck = 24;
sdo = 23;
sdi = 18;
;
@HAVE_LINUXGPIO_END@
@HAVE_LINUXSPI_BEGIN@

View File

@@ -40,6 +40,7 @@ const char *default_parallel;
const char *default_serial;
const char *default_spi;
double default_bitclock;
char const *default_linuxgpio;
LISTID string_list;
LISTID number_list;

View File

@@ -81,6 +81,7 @@ static int pin_name;
%token K_DEFAULT_PROGRAMMER
%token K_DEFAULT_SERIAL
%token K_DEFAULT_SPI
%token K_DEFAULT_LINUXGPIO
%token K_HVUPDI_SUPPORT
%token K_DEVICECODE
%token K_EEPROM
@@ -88,6 +89,7 @@ static int pin_name;
%token K_FLASH
%token K_ID
%token K_IO
%token K_LINUXGPIO
%token K_LOADPAGE
%token K_SDI
%token K_SDO
@@ -228,6 +230,11 @@ def :
K_DEFAULT_BITCLOCK TKN_EQUAL number_real TKN_SEMI {
default_bitclock = $3->value.number_real;
free_token($3);
} |
K_DEFAULT_LINUXGPIO TKN_EQUAL TKN_STRING TKN_SEMI {
default_linuxgpio = cache_string($3->value.string);
free_token($3);
}
;
@@ -450,6 +457,7 @@ prog_parm_conntype:
;
prog_parm_conntype_id:
K_LINUXGPIO { current_prog->conntype = CONNTYPE_LINUXGPIO; } |
K_PARALLEL { current_prog->conntype = CONNTYPE_PARALLEL; } |
K_SERIAL { current_prog->conntype = CONNTYPE_SERIAL; } |
K_USB { current_prog->conntype = CONNTYPE_USB; } |

View File

@@ -364,30 +364,37 @@ case $target in
i[[3456]]86-*-linux*|x86_64-*-linux*)
DEFAULT_PAR_PORT="/dev/parport0"
DEFAULT_SER_PORT="/dev/ttyS0"
DEFAULT_LINUXGPIO_PORT="gpiochip0"
;;
*-*-linux*)
DEFAULT_PAR_PORT="unknown"
DEFAULT_SER_PORT="/dev/ttyS0"
DEFAULT_LINUXGPIO_PORT="gpiochip0"
;;
i[[3456]]86-*-*freebsd*|amd64-*-*freebsd*)
DEFAULT_PAR_PORT="/dev/ppi0"
DEFAULT_SER_PORT="/dev/cuad0"
DEFAULT_LINUXGPIO_PORT="unknown"
;;
*-*-*freebsd*)
DEFAULT_PAR_PORT="unknown"
DEFAULT_SER_PORT="/dev/cuad0"
DEFAULT_LINUXGPIO_PORT="unknown"
;;
*-*-solaris*)
DEFAULT_PAR_PORT="/dev/printers/0"
DEFAULT_SER_PORT="/dev/term/a"
DEFAULT_LINUXGPIO_PORT="unknown"
;;
*-*-msdos* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
DEFAULT_PAR_PORT="lpt1"
DEFAULT_SER_PORT="com1"
DEFAULT_LINUXGPIO_PORT="unknown"
;;
*)
DEFAULT_PAR_PORT="unknown"
DEFAULT_SER_PORT="unknown"
DEFAULT_LINUXGPIO_PORT="unknown"
;;
esac
@@ -414,6 +421,17 @@ else
fi
if test "$enabled_linuxgpio" = "yes"; then
AC_MSG_CHECKING([for default linuxgpio port])
if test "$DEFAULT_LINUXGPIO_PORT" = "unknown"; then
AC_MSG_NOTICE([linuxgpio port access disabled for this system])
enabled_linuxgpio=no
else
AC_MSG_RESULT([$DEFAULT_LINUXGPIO_PORT])
fi
AC_SUBST(DEFAULT_LINUXGPIO_PORT, $DEFAULT_LINUXGPIO_PORT)
fi
if test "$enabled_linuxgpio" = "yes"; then
AC_DEFINE(HAVE_LINUXGPIO, 1, [Linux sysfs GPIO support enabled])
confsubst="$confsubst -e /^@HAVE_LINUXGPIO_/d"

View File

@@ -835,6 +835,7 @@ void dev_output_pgm_part(int dev_opt_c, const char *programmer, int dev_opt_p, c
dev_info("default_parallel = %s;\n", p = cfg_escape(default_parallel)); free(p);
dev_info("default_serial = %s;\n", p = cfg_escape(default_serial)); free(p);
dev_info("default_spi = %s;\n", p = cfg_escape(default_spi)); free(p);
dev_info("default_linuxgpio = %s;\n", p = cfg_escape(default_linuxgpio)); free(p);
dev_info("\n#\n# PROGRAMMER DEFINITIONS\n#\n\n");
}
@@ -1203,6 +1204,7 @@ static void dev_pgm_raw(const PROGRAMMER *pgm) {
static const char *connstr(conntype_t conntype) {
switch(conntype) {
case CONNTYPE_LINUXGPIO: return "linuxgpio";
case CONNTYPE_PARALLEL: return "parallel";
case CONNTYPE_SERIAL: return "serial";
case CONNTYPE_USB: return "usb";

View File

@@ -1934,6 +1934,11 @@ Assign the default parallel port device. Can be overridden using the
Assign the default serial port device. Can be overridden using the
@option{-P} option.
@item default_linuxgpio = "@var{default-linuxgpio-device}";
Assign the default gpiochip for linuxgpio's libgpiod mode,
e.g. "gpiochip0". Ignored for linuxgpio's sysfs mode. Can be overridden
using the @option{-P} option.
@item default_programmer = "@var{default-programmer-id}";
Assign the default programmer id. Can be overridden using the @option{-c}
option.

View File

@@ -162,6 +162,7 @@ default_parallel { yylval=NULL; return K_DEFAULT_PARALLEL; }
default_programmer { yylval=NULL; return K_DEFAULT_PROGRAMMER; }
default_serial { yylval=NULL; return K_DEFAULT_SERIAL; }
default_spi { yylval=NULL; return K_DEFAULT_SPI; }
default_linuxgpio { yylval=NULL; return K_DEFAULT_LINUXGPIO; }
devicecode { yylval=NULL; ccap(); return K_DEVICECODE; }
eeprom { yylval=NULL; return K_EEPROM; }
eeprom_instr { yylval=NULL; ccap(); return K_EEPROM_INSTR; }
@@ -180,6 +181,7 @@ id { yylval=NULL; ccap(); return K_ID; }
io { yylval=new_token(K_IO); return K_IO; }
is_at90s1200 { yylval=NULL; ccap(); return K_IS_AT90S1200; }
is_avr32 { yylval=NULL; ccap(); return K_IS_AVR32; }
linuxgpio { yylval=NULL; ccap(); return K_LINUXGPIO; }
load_ext_addr { yylval=new_token(K_LOAD_EXT_ADDR); ccap(); return K_LOAD_EXT_ADDR; }
loadpage_hi { yylval=new_token(K_LOADPAGE_HI); ccap(); return K_LOADPAGE_HI; }
loadpage_lo { yylval=new_token(K_LOADPAGE_LO); ccap(); return K_LOADPAGE_LO; }

View File

@@ -722,7 +722,8 @@ typedef enum {
CONNTYPE_PARALLEL,
CONNTYPE_SERIAL,
CONNTYPE_USB,
CONNTYPE_SPI
CONNTYPE_SPI,
CONNTYPE_LINUXGPIO
} conntype_t;
/*
@@ -1112,6 +1113,7 @@ extern const char *default_parallel;
extern const char *default_serial;
extern const char *default_spi;
extern double default_bitclock;
extern char const * default_linuxgpio;
/* This name is fixed, it's only here for symmetry with
* default_parallel and default_serial. */

View File

@@ -540,6 +540,7 @@ int main(int argc, char * argv [])
default_serial = "";
default_spi = "";
default_bitclock = 0.0;
default_linuxgpio = "";
init_config();
@@ -1087,6 +1088,11 @@ int main(int argc, char * argv [])
port = cfg_strdup("main()", *default_spi? default_spi: "unknown");
#endif
break;
case CONNTYPE_LINUXGPIO:
port = cfg_strdup("main()", default_linuxgpio);
break;
}
}