linuxgpio: add gpiod_line_set_direction_input helper for libgpiod v1.4 support (refs #1782)

This ancient libgpiod version is still shipped on Ubuntu 20.04 LTS.
Add support for it by adding another helper.

Signed-off-by: Michael Heimpold <mhei@heimpold.de>
This commit is contained in:
Michael Heimpold
2024-04-22 23:11:33 +02:00
parent db2580d17b
commit 6a75ac7057
4 changed files with 66 additions and 15 deletions

View File

@@ -240,6 +240,7 @@ if(HAVE_LINUXGPIO)
# defaults/fallbacks
set(HAVE_LIBGPIOD 0)
set(HAVE_LIBGPIOD_V2 0)
set(HAVE_LIBGPIOD_V1_6 0)
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
@@ -251,12 +252,21 @@ if(HAVE_LINUXGPIO)
set(CMAKE_REQUIRED_LIBRARIES ${LIBGPIODV2_LIBRARIES})
set(LIB_LIBGPIOD ${LIBGPIODV2_LINK_LIBRARIES})
else()
# check whether we have at least an older version
pkg_check_modules(LIBGPIOD libgpiod)
if(LIBGPIOD_FOUND)
# check whether we have version >= 1.6
pkg_check_modules(LIBGPIODV1_6 libgpiod>=1.6)
if(LIBGPIODV1_6_FOUND)
set(HAVE_LIBGPIOD 1)
set(CMAKE_REQUIRED_LIBRARIES ${LIBGPIOD_LIBRARIES})
set(LIB_LIBGPIOD ${LIBGPIOD_LINK_LIBRARIES})
set(HAVE_LIBGPIOD_V1_6 1)
set(CMAKE_REQUIRED_LIBRARIES ${LIBGPIODV1_6_LIBRARIES})
set(LIB_LIBGPIOD ${LIBGPIODV1_6_LINK_LIBRARIES})
else()
# check whether we have at least an older version
pkg_check_modules(LIBGPIOD libgpiod)
if(LIBGPIOD_FOUND)
set(HAVE_LIBGPIOD 1)
set(CMAKE_REQUIRED_LIBRARIES ${LIBGPIOD_LIBRARIES})
set(LIB_LIBGPIOD ${LIBGPIOD_LINK_LIBRARIES})
endif()
endif()
endif()
else()
@@ -358,6 +368,7 @@ if (DEBUG_CMAKE)
message(STATUS "HAVE_HIDAPI_HIDAPI_H: ${HAVE_HIDAPI_HIDAPI_H}")
message(STATUS "LIBUSB_COMPAT_DIR: ${LIBUSB_COMPAT_DIR}")
message(STATUS "LIBGPIODV2_FOUND: ${LIBGPIODV2_FOUND}")
message(STATUS "LIBGPIODV1_6_FOUND: ${LIBGPIODV1_6_FOUND}")
message(STATUS "LIBGPIOD_FOUND: ${LIBGPIOD_FOUND}")
message(STATUS "----------------------")
endif()
@@ -429,7 +440,9 @@ endif()
if(HAVE_LINUXGPIO)
message(STATUS "ENABLED linuxgpio")
if (LIBGPIODV2_FOUND)
message(STATUS "DO HAVE libgpiod (v2.x)")
message(STATUS "DO HAVE libgpiod (>=2.0)")
elseif(LIBGPIODV1_6_FOUND)
message(STATUS "DO HAVE libgpiod (>=1.6)")
elseif(LIBGPIOD_FOUND)
message(STATUS "DO HAVE libgpiod")
else()

View File

@@ -30,8 +30,11 @@
/* Let linuxgpio know if libgpiod is available. */
#cmakedefine HAVE_LIBGPIOD
/* Let linuxgpio know whether v2 of libgpiod is available. */
#cmakedefine HAVE_LIBGPIOD_V2
/* Let linuxgpio know whether libgpiod is available in version >= v1.6 but < v2.0. */
#cmakedefine01 HAVE_LIBGPIOD_V1_6
/* Let linuxgpio know whether v2.0 or higher of libgpiod is available. */
#cmakedefine01 HAVE_LIBGPIOD_V2
/* Linux SPI support enabled */
#cmakedefine HAVE_LINUXSPI 1

View File

@@ -529,17 +529,26 @@ if test "x$enabled_linuxgpio" = xyes; then
have_libgpiod=yes
have_libgpiodv2=yes
AC_DEFINE([HAVE_LIBGPIOD], [1], [Linux libgpiod available])
AC_DEFINE([HAVE_LIBGPIOD_V2], [1], [Linux libgpiod (v2.x) available])
AC_DEFINE([HAVE_LIBGPIOD_V1_6], [0], [Linux libgpiod >= v1.6 but < 2.0 available])
AC_DEFINE([HAVE_LIBGPIOD_V2], [1], [Linux libgpiod >= 2.0 available])
], [
PKG_CHECK_MODULES([LIBGPIOD], [libgpiod], [
PKG_CHECK_MODULES([LIBGPIOD], [libgpiod >= 1.6], [
have_libgpiod=yes
have_libgpiodv2=no
have_libgpiodv1_6=yes
AC_DEFINE([HAVE_LIBGPIOD], [1], [Linux libgpiod available])
AC_DEFINE([HAVE_LIBGPIOD_V1_6], [1], [Linux libgpiod >= v1.6 but < 2.0 available])
AC_DEFINE([HAVE_LIBGPIOD_V2], [0], [Linux libgpiod >= 2.0 available])
], [
have_libgpiod=no
have_libgpiodv2=no
PKG_CHECK_MODULES([LIBGPIOD], [libgpiod], [
have_libgpiod=yes
AC_DEFINE([HAVE_LIBGPIOD_V1_6], [0], [Linux libgpiod >= v1.6 but < 2.0 available])
AC_DEFINE([HAVE_LIBGPIOD_V2], [0], [Linux libgpiod >= 2.0 available])
], [
have_libgpiod=no
])
])
])
else
confsubst="$confsubst -e /^@HAVE_LINUXGPIO_BEGIN@/,/^@HAVE_LINUXGPIO_END@/d"
fi
@@ -748,7 +757,9 @@ fi
if test "x$enabled_linuxgpio" = xyes; then
echo "ENABLED linuxgpio"
if test "x$have_libgpiodv2" = xyes; then
echo "DO HAVE libgpiod (v2.x)"
echo "DO HAVE libgpiod (>=2.0)"
elif test "x$have_libgpiodv1_6" = xyes; then
echo "DO HAVE libgpiod (>=1.6)"
elif test "x$have_libgpiod" = xyes; then
echo "DO HAVE libgpiod"
else

View File

@@ -344,7 +344,23 @@ void linuxgpio_teardown(PROGRAMMER *pgm) {
#ifdef HAVE_LIBGPIOD
#ifdef HAVE_LIBGPIOD_V2
#if !HAVE_LIBGPIOD_V1_6 && !HAVE_LIBGPIOD_V2
int gpiod_line_set_direction_input(struct gpiod_line **gpio_line) {
struct gpiod_chip *chip = gpiod_line_get_chip(*gpio_line);
unsigned int gpio_num = gpiod_line_offset(*gpio_line);
// release to pin first...
gpiod_line_release(*gpio_line);
// so that we can re-acquire it as input
*gpio_line = gpiod_chip_get_line(chip, gpio_num);
return gpiod_line_request_input(*gpio_line, "avrdude");
}
#endif
#if HAVE_LIBGPIOD_V2
struct gpiod_line {
struct gpiod_chip *chip;
@@ -565,7 +581,11 @@ static void linuxgpio_libgpiod_close(PROGRAMMER *pgm) {
// This should avoid possible conflicts when AVR firmware starts.
for (i = 0; i < N_PINS; ++i) {
if (linuxgpio_libgpiod_lines[i] != NULL && i != PIN_AVR_RESET) {
#if HAVE_LIBGPIOD_V1_6 || HAVE_LIBGPIOD_V2
int r = gpiod_line_set_direction_input(linuxgpio_libgpiod_lines[i]);
#else
int r = gpiod_line_set_direction_input(&linuxgpio_libgpiod_lines[i]);
#endif
if (r != 0) {
msg_error("failed to set pin %u to input: %s\n",
linuxgpio_libgpiod_lines[i]->gpio_num, strerror(errno));
@@ -577,7 +597,11 @@ static void linuxgpio_libgpiod_close(PROGRAMMER *pgm) {
// Configure RESET as input.
if (linuxgpio_libgpiod_lines[PIN_AVR_RESET] != NULL) {
#if HAVE_LIBGPIOD_V1_6 || HAVE_LIBGPIOD_V2
int r = gpiod_line_set_direction_input(linuxgpio_libgpiod_lines[PIN_AVR_RESET]);
#else
int r = gpiod_line_set_direction_input(&linuxgpio_libgpiod_lines[PIN_AVR_RESET]);
#endif
if (r != 0) {
msg_error("failed to set pin %u to input: %s\n",
linuxgpio_libgpiod_lines[PIN_AVR_RESET]->gpio_num, strerror(errno));