diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 806ccfd6..3a1b8e61 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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=$ -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 diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index 11d0dd83..79b91c4e 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -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@ diff --git a/src/config.c b/src/config.c index db91a75c..7bf83095 100644 --- a/src/config.c +++ b/src/config.c @@ -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; diff --git a/src/config_gram.y b/src/config_gram.y index 03981519..154f6abe 100644 --- a/src/config_gram.y +++ b/src/config_gram.y @@ -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; } | diff --git a/src/configure.ac b/src/configure.ac index 6470f887..f947ef88 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -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" diff --git a/src/developer_opts.c b/src/developer_opts.c index 42318b74..57a7d0cc 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -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"; diff --git a/src/doc/avrdude.texi b/src/doc/avrdude.texi index 4a2197a9..4b0301db 100644 --- a/src/doc/avrdude.texi +++ b/src/doc/avrdude.texi @@ -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. diff --git a/src/lexer.l b/src/lexer.l index 9cf5a891..5a568ae6 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -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; } diff --git a/src/libavrdude.h b/src/libavrdude.h index 09f0966d..ef5c1303 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -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. */ diff --git a/src/main.c b/src/main.c index 68b55d47..f88c7209 100644 --- a/src/main.c +++ b/src/main.c @@ -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; + } }