From d556c4d71d763a2760c8330609da2d947919c386 Mon Sep 17 00:00:00 2001 From: Lorenzooone Date: Tue, 4 Nov 2025 10:20:04 +0100 Subject: [PATCH] Fix broken Pi build for new Pi OS release --- CMakeLists.txt | 2 +- docker-scripts/build-dockers/Dockerfile | 44 +++-- .../linux_compile_install_packages.sh | 13 ++ .../linux_install_arch_packages.sh | 21 +++ ...es.sh => linux_install_shared_packages.sh} | 19 +-- docker-scripts/build-dockers/push_builder.sh | 6 + include/ExtraButtons.hpp | 4 +- include/libgpiod_compat.h | 35 ++++ rpi_setup/setup.sh | 2 +- source/ExtraButtons.cpp | 5 +- source/libgpiod_compat.cpp | 159 ++++++++++++++++++ 11 files changed, 274 insertions(+), 36 deletions(-) create mode 100644 docker-scripts/build-dockers/linux_compile_install_packages.sh create mode 100644 docker-scripts/build-dockers/linux_install_arch_packages.sh rename docker-scripts/build-dockers/{linux_install_packages.sh => linux_install_shared_packages.sh} (73%) create mode 100644 docker-scripts/build-dockers/push_builder.sh create mode 100644 include/libgpiod_compat.h create mode 100644 source/libgpiod_compat.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d057cd..eeba879 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -520,7 +520,7 @@ else() set_source_files_properties(source/conversions.cpp PROPERTIES COMPILE_OPTIONS "$<$:-O3;-funroll-loops>") endif() -set(EXECUTABLE_SOURCE_FILES source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/TextRectanglePool.cpp source/WindowScreen.cpp source/WindowScreen_Menu.cpp source/devicecapture.cpp source/conversions.cpp source/ExtraButtons.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp source/Menus/RelativePositionMenu.cpp source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.cpp source/Menus/ExtraSettingsMenu.cpp source/Menus/StatusMenu.cpp source/Menus/LicenseMenu.cpp source/WindowCommands.cpp source/Menus/ShortcutMenu.cpp source/Menus/ActionSelectionMenu.cpp source/Menus/ScalingRatioMenu.cpp source/Menus/ISNitroMenu.cpp source/Menus/VideoEffectsMenu.cpp source/CaptureDataBuffers.cpp source/Menus/InputMenu.cpp source/Menus/AudioDeviceMenu.cpp source/Menus/SeparatorMenu.cpp source/Menus/ColorCorrectionMenu.cpp source/Menus/Main3DMenu.cpp source/Menus/SecondScreen3DRelativePositionMenu.cpp source/Menus/USBConflictResolutionMenu.cpp source/Menus/Optimize3DSMenu.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp ${TOOLS_DATA_DIR}/shaders_list.cpp ${SOURCE_CPP_EXTRA_FILES}) +set(EXECUTABLE_SOURCE_FILES source/cc3dsfs.cpp source/utils.cpp source/audio_data.cpp source/audio.cpp source/frontend.cpp source/TextRectangle.cpp source/TextRectanglePool.cpp source/WindowScreen.cpp source/WindowScreen_Menu.cpp source/devicecapture.cpp source/conversions.cpp source/ExtraButtons.cpp source/Menus/ConnectionMenu.cpp source/Menus/OptionSelectionMenu.cpp source/Menus/MainMenu.cpp source/Menus/VideoMenu.cpp source/Menus/CropMenu.cpp source/Menus/PARMenu.cpp source/Menus/RotationMenu.cpp source/Menus/OffsetMenu.cpp source/Menus/AudioMenu.cpp source/Menus/BFIMenu.cpp source/Menus/RelativePositionMenu.cpp source/Menus/ResolutionMenu.cpp source/Menus/FileConfigMenu.cpp source/Menus/ExtraSettingsMenu.cpp source/Menus/StatusMenu.cpp source/Menus/LicenseMenu.cpp source/WindowCommands.cpp source/Menus/ShortcutMenu.cpp source/Menus/ActionSelectionMenu.cpp source/Menus/ScalingRatioMenu.cpp source/Menus/ISNitroMenu.cpp source/Menus/VideoEffectsMenu.cpp source/CaptureDataBuffers.cpp source/Menus/InputMenu.cpp source/Menus/AudioDeviceMenu.cpp source/Menus/SeparatorMenu.cpp source/Menus/ColorCorrectionMenu.cpp source/Menus/Main3DMenu.cpp source/Menus/SecondScreen3DRelativePositionMenu.cpp source/Menus/USBConflictResolutionMenu.cpp source/Menus/Optimize3DSMenu.cpp source/libgpiod_compat.cpp ${TOOLS_DATA_DIR}/font_ttf.cpp ${TOOLS_DATA_DIR}/shaders_list.cpp ${SOURCE_CPP_EXTRA_FILES}) if(${CMAKE_SYSTEM_NAME} STREQUAL "Android") add_compile_flag("SFML_SYSTEM_ANDROID") diff --git a/docker-scripts/build-dockers/Dockerfile b/docker-scripts/build-dockers/Dockerfile index cda8c3c..fe3925f 100644 --- a/docker-scripts/build-dockers/Dockerfile +++ b/docker-scripts/build-dockers/Dockerfile @@ -36,13 +36,19 @@ RUN useradd builder -m RUN mkdir -p /home/builder/cc3dsfs RUN mkdir -p /home/builder/building RUN chown -R builder:builder /home/builder +COPY linux_install_shared_packages.sh / +RUN chmod +x /linux_install_shared_packages.sh ; /linux_install_shared_packages.sh ################################################################################ ### Build x86_32 ### ################################################################################ FROM base_builder as builder32 -COPY linux_install_packages.sh / -RUN chmod +x /linux_install_packages.sh ; /linux_install_packages.sh i386 +ENV ARCH_USABLE=i386 +ENV ARCH_COMPILER_NAME=i686-linux-gnu +COPY linux_install_arch_packages.sh / +RUN chmod +x /linux_install_arch_packages.sh ; /linux_install_arch_packages.sh ${ARCH_USABLE} +COPY linux_compile_install_packages.sh / +RUN chmod +x /linux_compile_install_packages.sh ; /linux_compile_install_packages.sh ${ARCH_COMPILER_NAME} WORKDIR /home/builder/building COPY docker_build_starter / RUN chmod +x /docker_build_starter @@ -53,8 +59,12 @@ CMD /docker_build_starter docker-scripts/docker_build_x86_32 ### Build x86_64 ### ################################################################################ FROM base_builder as builder64 -COPY linux_install_packages.sh / -RUN chmod +x /linux_install_packages.sh ; /linux_install_packages.sh amd64 +ENV ARCH_USABLE=amd64 +ENV ARCH_COMPILER_NAME=x86_64-linux-gnu +COPY linux_install_arch_packages.sh / +RUN chmod +x /linux_install_arch_packages.sh ; /linux_install_arch_packages.sh ${ARCH_USABLE} +COPY linux_compile_install_packages.sh / +RUN chmod +x /linux_compile_install_packages.sh ; /linux_compile_install_packages.sh ${ARCH_COMPILER_NAME} WORKDIR /home/builder/building COPY docker_build_starter / RUN chmod +x /docker_build_starter @@ -65,8 +75,12 @@ CMD /docker_build_starter docker-scripts/docker_build_x86_64 ### Build arm 32 ### ################################################################################ FROM base_builder as builderarm32 -COPY linux_install_packages.sh / -RUN chmod +x /linux_install_packages.sh ; /linux_install_packages.sh armhf +ENV ARCH_USABLE=armhf +ENV ARCH_COMPILER_NAME=arm-linux-gnueabihf +COPY linux_install_arch_packages.sh / +RUN chmod +x /linux_install_arch_packages.sh ; /linux_install_arch_packages.sh ${ARCH_USABLE} +COPY linux_compile_install_packages.sh / +RUN chmod +x /linux_compile_install_packages.sh ; /linux_compile_install_packages.sh ${ARCH_COMPILER_NAME} WORKDIR /home/builder/building COPY docker_build_starter / RUN chmod +x /docker_build_starter @@ -77,8 +91,12 @@ CMD /docker_build_starter docker-scripts/docker_build_arm32 ### Build arm 64 ### ################################################################################ FROM base_builder as builderarm64 -COPY linux_install_packages.sh / -RUN chmod +x /linux_install_packages.sh ; /linux_install_packages.sh arm64 +ENV ARCH_USABLE=arm64 +ENV ARCH_COMPILER_NAME=aarch64-linux-gnu +COPY linux_install_arch_packages.sh / +RUN chmod +x /linux_install_arch_packages.sh ; /linux_install_arch_packages.sh ${ARCH_USABLE} +COPY linux_compile_install_packages.sh / +RUN chmod +x /linux_compile_install_packages.sh ; /linux_compile_install_packages.sh ${ARCH_COMPILER_NAME} WORKDIR /home/builder/building COPY docker_build_starter / RUN chmod +x /docker_build_starter @@ -86,11 +104,15 @@ USER builder CMD /docker_build_starter docker-scripts/docker_build_arm64 ################################################################################ -### Build riscv 64 ### +### Build riscv 64 ### ################################################################################ FROM base_builder as builderriscv64 -COPY linux_install_packages.sh / -RUN chmod +x /linux_install_packages.sh ; /linux_install_packages.sh riscv64 +ENV ARCH_USABLE=riscv64 +ENV ARCH_COMPILER_NAME=riscv64-linux-gnu +COPY linux_install_arch_packages.sh / +RUN chmod +x /linux_install_arch_packages.sh ; /linux_install_arch_packages.sh ${ARCH_USABLE} +COPY linux_compile_install_packages.sh / +RUN chmod +x /linux_compile_install_packages.sh ; /linux_compile_install_packages.sh ${ARCH_COMPILER_NAME} WORKDIR /home/builder/building COPY docker_build_starter / RUN chmod +x /docker_build_starter diff --git a/docker-scripts/build-dockers/linux_compile_install_packages.sh b/docker-scripts/build-dockers/linux_compile_install_packages.sh new file mode 100644 index 0000000..dcbb90d --- /dev/null +++ b/docker-scripts/build-dockers/linux_compile_install_packages.sh @@ -0,0 +1,13 @@ +git clone https://github.com/brgl/libgpiod.git +mkdir -p tmp_install_folder +cd libgpiod +git checkout 50a9f04ee333900962f8632aeae6cdf19cc32454 +./autogen.sh --host=$1 --prefix=$(pwd)/../tmp_install_folder/ +make +make install +cd ../tmp_install_folder/ +cp include/* /usr/include/ +cp lib/* /usr/lib/$1/ +cd .. +rm -rf libgpiod +rm -rf tmp_install_folder diff --git a/docker-scripts/build-dockers/linux_install_arch_packages.sh b/docker-scripts/build-dockers/linux_install_arch_packages.sh new file mode 100644 index 0000000..99acc59 --- /dev/null +++ b/docker-scripts/build-dockers/linux_install_arch_packages.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +LIST_PACKAGES_BASE=("libxinerama-dev" "libxi-dev" "libxss-dev" "libxxf86vm-dev" "libxkbfile-dev" "libxv-dev" "libx11-dev" "libxrandr-dev" "libxcursor-dev" "libudev-dev" "libflac-dev" "libvorbis-dev" "libgl1-mesa-dev" "libegl1-mesa-dev" "libdrm-dev" "libgbm-dev" "libfreetype-dev" "libharfbuzz-dev") + +dpkg --add-architecture $1 +apt update + +#PACKAGES="" +#for p in ${LIST_PACKAGES_SPECIAL[@]}; +#do +# PACKAGES="${PACKAGES} ${p}:$1" +#done +#apt install -y ${PACKAGES} + +PACKAGES="" +for p in ${LIST_PACKAGES_BASE[@]}; +do + PACKAGES="${PACKAGES} ${p}:$1" +done +apt install -y ${PACKAGES} + diff --git a/docker-scripts/build-dockers/linux_install_packages.sh b/docker-scripts/build-dockers/linux_install_shared_packages.sh similarity index 73% rename from docker-scripts/build-dockers/linux_install_packages.sh rename to docker-scripts/build-dockers/linux_install_shared_packages.sh index 2df9b0a..0022889 100644 --- a/docker-scripts/build-dockers/linux_install_packages.sh +++ b/docker-scripts/build-dockers/linux_install_shared_packages.sh @@ -13,9 +13,7 @@ LOCATION_AMD="${LOCATION_BASE}/x86_compilers.list" LOCATION_ARM="${LOCATION_BASE}/arm_compilers.list" LIST_ARCHITECTURES=("amd64" "i386" "arm64" "armhf" "riscv64") -LIST_PACKAGES_BASE=("libxinerama-dev" "libxi-dev" "libxss-dev" "libxxf86vm-dev" "libxkbfile-dev" "libxv-dev" "libx11-dev" "libxrandr-dev" "libxcursor-dev" "libudev-dev" "libflac-dev" "libvorbis-dev" "libgl1-mesa-dev" "libegl1-mesa-dev" "libdrm-dev" "libgbm-dev" "libfreetype-dev" "libharfbuzz-dev") -LIST_PACKAGES_NORMAL=("g++-riscv64-linux-gnu" "g++-multilib-i686-linux-gnu" "g++-aarch64-linux-gnu" "g++-arm-linux-gnueabihf" "g++:amd64" "g++" "git" "xorg-dev") -LIST_PACKAGES_SPECIAL=("libgpiod-dev") +LIST_PACKAGES_NORMAL=("g++-riscv64-linux-gnu" "g++-multilib-i686-linux-gnu" "g++-aarch64-linux-gnu" "g++-arm-linux-gnueabihf" "g++:amd64" "g++" "git" "xorg-dev" "autoconf" "autoconf-archive" "libtool" "pkg-config") echo "${BASE_AMD_STR}$(lsb_release -sc)${NO_SPECIAL_STR}" > ${LOCATION_AMD} echo "${BASE_SECURITY_AMD_STR}$(lsb_release -sc)${SECURITY_STR}" >> ${LOCATION_AMD} @@ -32,7 +30,6 @@ echo "${BASE_ARM_STR}$(lsb_release -sc)${UPDATES_STR}" >> ${LOCATION_ARM} # dpkg --add-architecture ${a} #done -dpkg --add-architecture $1 apt update #for a in ${LIST_ARCHITECTURES[@]}; @@ -45,20 +42,6 @@ apt update # apt install -y ${PACKAGES} #done -PACKAGES="" -for p in ${LIST_PACKAGES_SPECIAL[@]}; -do - PACKAGES="${PACKAGES} ${p}:$1" -done -apt install -y ${PACKAGES} - -PACKAGES="" -for p in ${LIST_PACKAGES_BASE[@]}; -do - PACKAGES="${PACKAGES} ${p}:$1" -done -apt install -y ${PACKAGES} - PACKAGES="" for p in ${LIST_PACKAGES_NORMAL[@]}; do diff --git a/docker-scripts/build-dockers/push_builder.sh b/docker-scripts/build-dockers/push_builder.sh new file mode 100644 index 0000000..a174293 --- /dev/null +++ b/docker-scripts/build-dockers/push_builder.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for image in "builder32" "builder64" "builderarm32" "builderarm64" "builderriscv64" "builderandroid" ; +do + docker image push lorenzooone/cc3dsfs:${image} +done diff --git a/include/ExtraButtons.hpp b/include/ExtraButtons.hpp index 962d708..2c01255 100755 --- a/include/ExtraButtons.hpp +++ b/include/ExtraButtons.hpp @@ -3,9 +3,7 @@ #include #include "event_structs.hpp" -#ifdef RASPI -#include -#endif +#include "libgpiod_compat.h" class ExtraButton { public: diff --git a/include/libgpiod_compat.h b/include/libgpiod_compat.h new file mode 100644 index 0000000..390b69c --- /dev/null +++ b/include/libgpiod_compat.h @@ -0,0 +1,35 @@ +#ifndef __LIBGPIOD_COMPAT_H +#define __LIBGPIOD_COMPAT_H + +#ifdef RASPI +#include +// This seems to work... The fact that there is no compile +// time version is baffling... :/ +// It's the basis of making a library... +// Do they expect you to use dlopen? Is that what is going on? +#ifndef GPIOD_CTXLESS_FLAG_OPEN_DRAIN +#define LIBGPIOD3 +#endif + +#ifdef LIBGPIOD3 + +#define GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP GPIOD_LINE_BIAS_PULL_UP +#define GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN GPIOD_LINE_BIAS_PULL_DOWN + +// Extra struct needed due to how libgpiod3 is written... :/ +struct gpiod_line { + struct gpiod_line_request* request; + struct gpiod_chip* chip; + int offset; +}; + +struct gpiod_line* gpiod_line_find(const char *line_name); +void gpiod_line_close_chip(struct gpiod_line* in); +void gpiod_line_release(struct gpiod_line* in); +void gpiod_line_request_input_flags(struct gpiod_line* in, const char *consumer, gpiod_line_bias); +int gpiod_line_get_value(struct gpiod_line* in); + +#endif +#endif + +#endif diff --git a/rpi_setup/setup.sh b/rpi_setup/setup.sh index ae8b35d..0eeb278 100755 --- a/rpi_setup/setup.sh +++ b/rpi_setup/setup.sh @@ -10,7 +10,7 @@ BASE_SOURCE_DIR="." BASE_TARGET_DIR=${HOME} sudo apt update -sudo apt -y install xterm gpiod xserver-xorg xinit libxcursor1 x11-xserver-utils pipewire pipewire-alsa libharfbuzz-icu0 +sudo apt -y install xterm xserver-xorg xinit libxcursor1 x11-xserver-utils pipewire pipewire-alsa libharfbuzz-icu0 libgpiod3 sudo raspi-config nonint do_boot_behaviour B2 diff --git a/source/ExtraButtons.cpp b/source/ExtraButtons.cpp index 4af6759..3730dc3 100755 --- a/source/ExtraButtons.cpp +++ b/source/ExtraButtons.cpp @@ -1,4 +1,5 @@ #include "ExtraButtons.hpp" +#include "utils.hpp" #define NUM_PI_BUTTONS (sizeof(pi_buttons) / sizeof(pi_buttons[0])) @@ -25,9 +26,9 @@ void ExtraButton::initialize(int id, sf::Keyboard::Key corresponding_key, bool i this->gpioline_ptr = NULL; if(this->gpioline_ptr) { if(use_pud_up) - gpiod_line_request_input_flags(this->gpioline_ptr, "cc3dsfs", GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP); + gpiod_line_request_input_flags(this->gpioline_ptr, NAME, GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP); else - gpiod_line_request_input_flags(this->gpioline_ptr, "cc3dsfs", GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN); + gpiod_line_request_input_flags(this->gpioline_ptr, NAME, GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN); } #endif } diff --git a/source/libgpiod_compat.cpp b/source/libgpiod_compat.cpp new file mode 100644 index 0000000..8c98f4c --- /dev/null +++ b/source/libgpiod_compat.cpp @@ -0,0 +1,159 @@ +#include "libgpiod_compat.h" + +#if defined(RASPI) && defined(LIBGPIOD3) +#include +#include +#include +#include + +// Apparently libgpiod3 removed some useful functions... +// Not only that, but there is no migration guide. :/ +// Need to do this horrible thing to fix that. :/ + +std::string prefix_path = "/dev/"; + +static std::string entry_to_dev_path(const struct dirent *entry) { + return prefix_path + std::string(entry->d_name); +} + +static int chip_dir_filter(const struct dirent *entry) +{ + if(entry == NULL) + return 0; + + struct stat sb; + std::string path = entry_to_dev_path(entry); + + if((lstat(path.c_str(), &sb) == 0) && (!S_ISLNK(sb.st_mode)) && gpiod_is_gpiochip_device(path.c_str())) + return 1; + + return 0; +} + +static int all_chip_paths(std::string **paths_ptr) +{ + struct dirent **entries; + *paths_ptr = NULL; + + int num_chips = scandir(prefix_path.c_str(), &entries, chip_dir_filter, versionsort); + if(num_chips < 0) + return 0; + + if(num_chips == 0) { + free(entries); + return 0; + } + + std::string *paths = new std::string[num_chips]; + + for(int i = 0; i < num_chips; i++) + paths[i] = entry_to_dev_path(entries[i]); + + *paths_ptr = paths; + + for(int i = 0; i < num_chips; i++) + free(entries[i]); + free(entries); + + return num_chips; +} + +struct gpiod_line* gpiod_line_find(const char *line_name) +{ + struct gpiod_chip *chip; + std::string *chip_paths; + + int num_chips = all_chip_paths(&chip_paths); + for(int i = 0; i < num_chips; i++) { + chip = gpiod_chip_open(chip_paths[i].c_str()); + if(!chip) + continue; + + int offset = gpiod_chip_get_line_offset_from_name(chip, line_name); + if(offset != -1) { + struct gpiod_line* output = new gpiod_line; + output->chip = chip; + output->offset = offset; + delete []chip_paths; + return output; + } + + gpiod_chip_close(chip); + } + if(num_chips >= 0) + delete []chip_paths; + + return NULL; +} + +static void return_from_gpiod_line_request_input_flags(struct gpiod_request_config* req_cfg, struct gpiod_line_config* line_cfg, struct gpiod_line_settings* settings) { + if(req_cfg) + gpiod_request_config_free(req_cfg); + + if(line_cfg) + gpiod_line_config_free(line_cfg); + + if(settings) + gpiod_line_settings_free(settings); +} + +void gpiod_line_request_input_flags(struct gpiod_line* in, const char* consumer, gpiod_line_bias bias) { + if(in == NULL) + return; + if(in->chip == NULL) + return; + + struct gpiod_request_config* req_cfg = NULL; + struct gpiod_line_config* line_cfg = NULL; + + struct gpiod_line_settings* settings = gpiod_line_settings_new(); + if(settings == NULL) + return return_from_gpiod_line_request_input_flags(req_cfg, line_cfg, settings); + + gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT); + gpiod_line_settings_set_bias(settings, bias); + + line_cfg = gpiod_line_config_new(); + if(line_cfg == NULL) + return return_from_gpiod_line_request_input_flags(req_cfg, line_cfg, settings); + + if(gpiod_line_config_add_line_settings(line_cfg, (const unsigned int*)&in->offset, 1, settings) != 0) + return return_from_gpiod_line_request_input_flags(req_cfg, line_cfg, settings); + + if(consumer != NULL) { + req_cfg = gpiod_request_config_new(); + if(req_cfg == NULL) + return return_from_gpiod_line_request_input_flags(req_cfg, line_cfg, settings); + + gpiod_request_config_set_consumer(req_cfg, consumer); + } + + in->request = gpiod_chip_request_lines(in->chip, req_cfg, line_cfg); + + return return_from_gpiod_line_request_input_flags(req_cfg, line_cfg, settings); +} + +int gpiod_line_get_value(struct gpiod_line* in) { + return gpiod_line_request_get_value(in->request, in->offset); +} + +void gpiod_line_close_chip(struct gpiod_line* in) +{ + if(in == NULL) + return; + if(in->request != NULL) + gpiod_line_request_release(in->request); + in->request = NULL; + if(in->chip != NULL) + gpiod_chip_close(in->chip); + in->chip = NULL; +} + +void gpiod_line_release(struct gpiod_line* in) +{ + if(in == NULL) + return; + gpiod_line_close_chip(in); + delete in; +} +#endif