RetroPie-Setup/scriptmodules/supplementary/gamecondriver.sh
cmitu 2e5a1b56cc gamecondriver: update for newer version
Upstream has re-organized the repository with the new versions for DB9/Gamecondriver and removed the version suffix from the source folders. Modified the module to fix the symlink to `/usr/src` needed by `dkms` and also fix the license URL.
2024-10-15 21:49:45 +01:00

197 lines
6.4 KiB
Bash

#!/usr/bin/env bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
rp_module_id="gamecondriver"
rp_module_desc="Gamecon & Db9 drivers GPIO drivers"
rp_module_licence="GPL2 https://raw.githubusercontent.com/marqs85/gamecon_gpio_rpi/master/gamecon_gpio_rpi/gamecon_gpio_rpi.c"
rp_module_section="driver"
rp_module_flags="!all rpi !rpi5"
function depends_gamecondriver() {
getDepends dkms LINUX-HEADERS
}
function _gamecon_version() {
echo "1.5"
}
function _db9_version() {
echo "1.3"
}
function install_bin_gamecondriver() {
# install both modules
declare -A modules=(
[gamecon_gpio_rpi]=$(_gamecon_version)
[db9_gpio_rpi]=$(_db9_version)
)
local github_url="https://github.com/marqs85"
_remove_gamecondriver_files
pushd "$md_inst"
for module_name in "${!modules[@]}"; do
local module_ver="${modules[$module_name]}"
gitPullOrClone "$module_name" "$github_url/$module_name"
pushd "$module_name"
dkmsManager remove "$module_name"
ln -sfn "`pwd`/$module_name" /usr/src/"$module_name-$module_ver"
dkms install --force -m "$module_name" -v "$module_ver"
popd
# test if module installation is OK
if ! dkms status | grep -q "^$module_name"; then
md_ret_errors+=("$module_name driver installation FAILED")
fi
done
popd
}
function _remove_gamecondriver_config()
{
sed -i "/gamecon_gpio_rpi/d" /etc/modules
rm -f /etc/modprobe.d/gamecon.conf
}
function _remove_gamecondriver_files()
{
dkmsManager remove gamecon_gpio_rpi
dkmsManager remove db9_gpio_rpi
# remove older version of the driver, installed as Debian packages
hasPackage gamecon-gpio-rpi-dkms && aptRemove gamecon-gpio-rpi-dkms
hasPackage db9-gpio-rpi-dkms && aptRemove db9-gpio-rpi-dkms
}
function remove_gamecondriver() {
_remove_gamecondriver_files
_remove_gamecondriver_config
}
function configure_gamecondriver() {
[[ "$md_mode" == "remove" ]] && return
if ! grep -q "gamecon_gpio_rpi" /etc/modules; then
addLineToFile "gamecon_gpio_rpi" /etc/modules
elif grep -q "gamecon_gpio_rpi.*map" /etc/modules; then
sed -i "s/gamecon_gpio_rpi.*/gamecon_gpio_rpi/" /etc/modules
fi
}
function dual_snes_gamecondriver() {
local gpio_rev
case "$(grep Revision /proc/cpuinfo | cut -d ':' -f 2 | tr -d ' \n' | tail -c 4)" in
"0002"|"0003")
gpio_rev=1
;;
*)
gpio_rev=2
;;
esac
if [[ "$gpio_rev" == 1 ]]; then
echo "options gamecon_gpio_rpi map=0,1,1,0" >/etc/modprobe.d/gamecon.conf
else
echo "options gamecon_gpio_rpi map=0,0,1,0,0,1" >/etc/modprobe.d/gamecon.conf
fi
[[ -n "$(lsmod | grep gamecon_gpio_rpi)" ]] && rmmod gamecon_gpio_rpi
modprobe gamecon_gpio_rpi
iniConfig " = " "" "$configdir/all/retroarch.cfg"
if dialog --yesno "Would you like to update button mappings in $configdir/all/retroarch.cfg for 2 SNES controllers?" 22 76 >/dev/tty; then
if [[ "$GPIOREV" == 1 ]]; then
iniSet "input_player1_joypad_index" "0"
iniSet "input_player2_joypad_index" "1"
else
iniSet "input_player1_joypad_index" "1"
iniSet "input_player2_joypad_index" "0"
fi
iniSet "input_player1_a_btn" "0"
iniSet "input_player1_b_btn" "1"
iniSet "input_player1_x_btn" "2"
iniSet "input_player1_y_btn" "3"
iniSet "input_player1_l_btn" "4"
iniSet "input_player1_r_btn" "5"
iniSet "input_player1_start_btn" "7"
iniSet "input_player1_select_btn" "6"
iniSet "input_player1_left_axis" "-0"
iniSet "input_player1_up_axis" "-1"
iniSet "input_player1_right_axis" "+0"
iniSet "input_player1_down_axis" "+1"
iniSet "input_player2_a_btn" "0"
iniSet "input_player2_b_btn" "1"
iniSet "input_player2_x_btn" "2"
iniSet "input_player2_y_btn" "3"
iniSet "input_player2_l_btn" "4"
iniSet "input_player2_r_btn" "5"
iniSet "input_player2_start_btn" "7"
iniSet "input_player2_select_btn" "6"
iniSet "input_player2_left_axis" "-0"
iniSet "input_player2_up_axis" "-1"
iniSet "input_player2_right_axis" "+0"
iniSet "input_player2_down_axis" "+1"
fi
dialog --clear --msgbox "\
__________\n\
| ### Board gpio revision $gpio_rev detected ###\n\
+ * |\n\
* * |\n\
1 - | The driver is now set to use the following\n\
2 * | configuration for 2 SNES controllers:\n\
* * | (compatible with RetroPie GPIO adapter)\n\
* * |\n\
* * | + = power\n\
* * | - = ground\n\
* * | C = clock\n\
C * | L = latch\n\
* * | 1 = player1 pad\n\
L * | 2 = player2 pad\n\
* * | * = unconnected\n\
|\n\
|" 22 76 >/dev/tty
}
function gui_gamecondriver() {
local default
local options=(
1 "Configure for two SNES controllers"
2 "Read Gamecon GPIO driver documentation"
3 "Read Db9 GPIO driver documentation"
)
while true; do
local cmd=(dialog --backtitle "$__backtitle" --default-item "$default" --menu "Choose an option." 22 86 16)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
default="$choice"
if [[ -n "$choice" ]]; then
case "$choice" in
1)
dialog --defaultno --yesno "Gamecon driver supports RetroPie GPIO adapter board for 2 SNES controllers. Do you want to configure gamecon for 2 SNES controllers?" 22 76 >/dev/tty || continue
dual_snes_gamecondriver
;;
2)
dialog --msgbox "$(cat "$md_inst/gamecon_gpio_rpi/gamecon_gpio_rpi-$(_gamecon_version)/README")" 22 80 >/dev/tty
;;
3)
dialog --msgbox "$(cat "$md_inst/db9_gpio_rpi/db9_gpio_rpi-$(_db9_version)/README")" 22 80 >/dev/tty
;;
esac
else
break
fi
done
}