From b639517c82d42ac5f8b95756fd4985aeaf819118 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Wed, 4 Oct 2023 23:49:18 +0200 Subject: [PATCH 1/2] feat: replace xow with xone Xone is a linux kernel driver for Xbox One and Xbox Series X|S accessories. It serves as a modern replacement for xpad, aiming to be compatible with Microsoft's Game Input Protocol (GIP). --- Config.in | 2 +- configs/recalbox-odroidxu4_defconfig | 2 +- configs/recalbox-rg353x_defconfig | 1 + configs/recalbox-rpi1_defconfig | 2 +- configs/recalbox-rpi3_defconfig | 2 +- configs/recalbox-rpi4_64_defconfig | 2 +- configs/recalbox-rpi4_defconfig | 2 +- configs/recalbox-rpizero2_defconfig | 2 +- configs/recalbox-x86_64_defconfig | 2 +- package/xone/Config.in | 6 +++ package/xone/assets/FW_ACC_00U.bin | Bin 0 -> 70620 bytes package/xone/xone.mk | 19 ++++++++++ package/xow/Config.in | 6 --- package/xow/xow-001-use-wget.patch | 11 ------ ...02-fix-recent-controllers-disconnect.patch | 11 ------ package/xow/xow-003-no-systemd.patch | 32 ---------------- package/xow/xow-004-strip-executable.patch | 10 ----- package/xow/xow-005-no-modules-conf.patch | 17 --------- package/xow/xow-init | 35 ------------------ package/xow/xow.mk | 30 --------------- 20 files changed, 34 insertions(+), 160 deletions(-) create mode 100644 package/xone/Config.in create mode 100644 package/xone/assets/FW_ACC_00U.bin create mode 100644 package/xone/xone.mk delete mode 100644 package/xow/Config.in delete mode 100644 package/xow/xow-001-use-wget.patch delete mode 100644 package/xow/xow-002-fix-recent-controllers-disconnect.patch delete mode 100644 package/xow/xow-003-no-systemd.patch delete mode 100644 package/xow/xow-004-strip-executable.patch delete mode 100644 package/xow/xow-005-no-modules-conf.patch delete mode 100644 package/xow/xow-init delete mode 100644 package/xow/xow.mk diff --git a/Config.in b/Config.in index 6be6945e84..ab4075a6a4 100644 --- a/Config.in +++ b/Config.in @@ -83,7 +83,7 @@ menu "Controllers" source "$BR2_EXTERNAL_RECALBOX_PATH/package/virtualgamepads/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xarcade2jstick/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xboxdrv/Config.in" - source "$BR2_EXTERNAL_RECALBOX_PATH/package/xow/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/xone/Config.in" comment "Nintendo switch Joycons support" source "$BR2_EXTERNAL_RECALBOX_PATH/package/joycond/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/hid-nintendo/Config.in" diff --git a/configs/recalbox-odroidxu4_defconfig b/configs/recalbox-odroidxu4_defconfig index 397229a4d1..f11c41d663 100644 --- a/configs/recalbox-odroidxu4_defconfig +++ b/configs/recalbox-odroidxu4_defconfig @@ -344,5 +344,5 @@ BR2_PACKAGE_RTL88X2BU=y BR2_PACKAGE_JOYCOND=y BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y BR2_PACKAGE_KMSGRAB=y diff --git a/configs/recalbox-rg353x_defconfig b/configs/recalbox-rg353x_defconfig index 93f2a25bf8..34184463e7 100644 --- a/configs/recalbox-rg353x_defconfig +++ b/configs/recalbox-rg353x_defconfig @@ -283,3 +283,4 @@ BR2_PACKAGE_PAMIX=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_RECALBOX_ROCKCHIP_MALI_BIFROST_G52=y BR2_PACKAGE_RECALBOX_ROCKCHIP_MALI_LIB_VERSION_G52_G2P0=y +BR2_PACKAGE_XONE=y diff --git a/configs/recalbox-rpi1_defconfig b/configs/recalbox-rpi1_defconfig index 5e0cc7885d..8a3d90315d 100644 --- a/configs/recalbox-rpi1_defconfig +++ b/configs/recalbox-rpi1_defconfig @@ -282,5 +282,5 @@ BR2_PACKAGE_JOYCOND=y BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y BR2_PACKAGE_RPI_FIRMWARE_CMDLINE_FILE="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/rpi/cmdline.txt" diff --git a/configs/recalbox-rpi3_defconfig b/configs/recalbox-rpi3_defconfig index 2bacf38dc7..af7fe8fb01 100644 --- a/configs/recalbox-rpi3_defconfig +++ b/configs/recalbox-rpi3_defconfig @@ -355,7 +355,7 @@ BR2_PACKAGE_JOYCOND=y BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-rpi4_64_defconfig b/configs/recalbox-rpi4_64_defconfig index 225fde4564..a543e3fe1c 100644 --- a/configs/recalbox-rpi4_64_defconfig +++ b/configs/recalbox-rpi4_64_defconfig @@ -344,7 +344,7 @@ BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_KODI_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-rpi4_defconfig b/configs/recalbox-rpi4_defconfig index 974dac6263..4787235cfd 100644 --- a/configs/recalbox-rpi4_defconfig +++ b/configs/recalbox-rpi4_defconfig @@ -336,7 +336,7 @@ BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_KODI_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-rpizero2_defconfig b/configs/recalbox-rpizero2_defconfig index 18284f28b3..44446126f4 100644 --- a/configs/recalbox-rpizero2_defconfig +++ b/configs/recalbox-rpizero2_defconfig @@ -355,7 +355,7 @@ BR2_PACKAGE_JOYCOND=y BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-x86_64_defconfig b/configs/recalbox-x86_64_defconfig index b8642f266a..37a87d3663 100644 --- a/configs/recalbox-x86_64_defconfig +++ b/configs/recalbox-x86_64_defconfig @@ -407,4 +407,4 @@ BR2_PACKAGE_JOYCOND=y BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_KODI_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y -BR2_PACKAGE_XOW=y +BR2_PACKAGE_XONE=y diff --git a/package/xone/Config.in b/package/xone/Config.in new file mode 100644 index 0000000000..80d67ac6e3 --- /dev/null +++ b/package/xone/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_XONE + bool "xone" + depends on BR2_LINUX_KERNEL + help + Linux kernel driver for Xbox One and + Xbox Series X|S accessories diff --git a/package/xone/assets/FW_ACC_00U.bin b/package/xone/assets/FW_ACC_00U.bin new file mode 100644 index 0000000000000000000000000000000000000000..22624d59fa880037c248556c9a4ff94d170b99b1 GIT binary patch literal 70620 zcmWgmz`(FZnSp_kfq_BjsSJ~mfuXs9v5|$Lfw6IXe0;nc14CZ~1N#jx1_p+Pd2S4h z0uc-x3~mC90ucfo3~maHLJ^AGYa9$&7#$dR7_06A)3M>pR z1`Mwnlo}XC3>jHm6c}cRC^WK(7%+0&oi~ZW`v0Fj@Bg?7urRPFG%_?WMkq2Ui6}HO zum~`6ISI_+6cJ$La{It2!w}vO*`j!n$L#~75KDN|$kf$mSBj{9+5+9L8;IH+Wi@Tm%?$TO8az zFt9~@?_s&C-@>qs4Qv~G)29#y2Id3IEeu!L8x-6=Ff>Jc?=HBj50+JL`s5 zVs?a&G*9Msok<5K$3tP)#u#4HqSq_#z0M1ZLgYzKSOgO-Ii zl-w9t1XvOnSsj=yI3~#--~xw73djer@CadMXn>15BEkuzQzU_r^$m+v{v6~uU|<2K zIhF*53Ws6`&gnlwm>ZZ5aDZ(sZx(e)VqmzcIn7|2%RzRi7)#5+s|q0u3`_@LBCIWk zu8L3pa~!5i#3hk|;VNGPdxN^00z+SfBEN)-0mDhR4-703-y3bfz60CZq9BsMPytip zz%Yl+#em@ovN}fT2nN=kyXqM3hML=Opy6Q*1A{_~f{OveG!&ge5ez&676npVZUQXe z{KUf0P|@P(kSM|9z|6oR!q8B`!q8CVkj%g$lF(2Ev%xBV$)5LLS`Q*Np(-s+0ibx+eiFj0;*)ydS7Ag5o1UxN1p&a^05*2F?u#QHY+-h5+HJ zCjrX!ED;Qx4K4-@3J6^_An_KESOf#-1dwhqN#>gtRdH_iJY0LN>dB<7!F(W21&eF%uU9bA!w@mIG{V42)6{46GqnnHE?D zC^m3xW1KQ&#wI4=2A(CtAp-mVPvUc6u;6fDU}0G!JVj<%_zZ&p28NE7gb0BKhjroG z5|#=r51-WM;AFwERwyK>p?y9rw=2HLvyo2E!rU=6Zj&;XC>2Jwo zP^|z8$u&(3%&d!8lo_+;ForNN$j_N5qRf~jz|6WxfT6Ji+1*&eh{Gy>0XVK#?RgK4 zYiOA2+|_Soa6iDn5_yi%#%%#ZW5iOHo~ugB?L(Xx8jhG)OlD%TXlCMaU{PVaYs0|O zAmygOC>5c|q%wu2L30L^_X7>aW%e%e{||utyv`n!YUVJCfYOdLV>U}LV@^mBgM0vU zqenn-gT~Z9vvnFYpn2cK#ej)(=6650|EG~%4~oxKaJM!x1Te6kXjS;o2y>h30fvC9 z$;-k+1R5F+=2@ihG4TCXh0O9%{ zkQ~(&a94j>QA@*m6OqaFf2Z)c2{1}U2sEk8Us(n_7>Eim)(df>2@Zq(@T@Duw#5f%>6 zdiVoFL&W!X4MdG0 z@TSj@TDW<~U44*>1~mvDR4aq{ADJN`+w|nFen1KX%hWA1_cgG!D7Yvv2)KPG~$ zeB`eFGV=ftMimR;Hl_#$28RV+>&&;QEis1Vtq2A-k2S`h83h^}cQ7!wE(GTWW&!5b zh2NOAuwCtYBV&~hNrWH=^2N`7~BjPnj#F_b6}=1 zG`B8b2x(m7z@oq~hj9wCLy7>$42yszj0!XN`7|}?E-MFzxWSC7F`&Ljq_{26;#6c}?G4umK&FrDHA zw;l2kEd&;3#@q-71||_^#$2oX8PGNYOpgmA1A_xjeNGGx9H{z0Wy>~&M&}g=-3(X+ zA`Ck>G#qp&;9*|i?B>8I72(7r;ugRt6%o|L;$SpK%E3rR`g3EW(h8?m2G;{@9#?e` z@eeK!8Y8|poVcss@Zbb*g90oEyBILsN91DR!wnqE%6l0@1RCtul`koV)HV?UZ60fi z7gVh(ktu0lgruzow#QsAFTg?u6fSNIEDRA0ObiQK9GDe2r!j;GFbEukv@6q_4X$d1 z2rwwX`G!}OLIfBb;C!R2QXvcs4F_QAjjsw#x-fmiG!wXp$yLsfWCo_`8;-Gp+feDv zrY#B%3^UlEK8bNLV8}!GO22t9RA6upQ7r znC@c0@C;IWGJZf&4KnB1UG)WpTijY0Rs?QyTw%D44U$qCKP*_aMRnf96{~KtFW`3j zz`zvoy?X~JFGE_i;I_*jw-1a`EaDCI4G#`VG=SO)P*pAh%rBgTTU1;W>i^I10;^(g zsGp<{F{l3nvN@o%3lVR(xvSr(;Ku&{e*^>ne@NNh_`&f=1B2)RPz!0xK{o-$2OXMj z3m8};mNMFWY`p4)w?mQ%nMBJDvBO% zV7bb%pk|h%pC|+KRi+g-jci*^xHT|JMYJ$}@JXrPyk*%ni3KJt3Jxp{jFaS{aRjol z2oc{4Ou9HBHuw76)kox$C41igacOv!(D2Z00s~9Lltvrm7-eK@H~?ykK4yO*>&CbA zV*~^1LI-9f|AK7c1F3LeUSRGbFS=kFqf-G(@fx%9>>!^tytvBT!m!57h2j5y41F>V zllO2STo^E=`MC=N^9zS54dQMEj8YNBjUNy(=Frl>ux0smwgom0EDVf(EDWIjsFX;1 zLqh|SzeJiDm_TJKGz`G8fv{nV+DWi37WRf()X)Z%_lUN#TLL3vL^9Wfh6kWFGol@} z#chG%f}&Xy92i+ZeVP_TNFmwbwxH+(<2+9XfexlQUQ@hg6s|nEMQx7fHc&kYYI#RM zLLbzk1(n~RJm;3cC>4>+_@U*&0%LgZ3Y2T+Y&*7cZzW;$#9&B-7XaM

Rs6_!T?V)~eV0*&>DG9-O`%8;M!vPlqhCT;I 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

evsAH<{;6F??0?{N`eG`OqQk_fe}#YKS0 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 literal 0 HcmV?d00001 diff --git a/package/xone/xone.mk b/package/xone/xone.mk new file mode 100644 index 0000000000..7c9e0ea142 --- /dev/null +++ b/package/xone/xone.mk @@ -0,0 +1,19 @@ +################################################################################ +# +# XONE +# +################################################################################ + +XONE_VERSION = bbf0dcc484c3f5611f4e375da43e0e0ef08f3d18 +XONE_SITE = $(call github,medusalix,xone,$(XONE_VERSION)) +XONE_LICENSE = GPL-2.0 + +define XONE_COPY_CMDS + $(INSTALL) -D -m 0644 $(@D)/install/modprobe.conf $(TARGET_DIR)/etc/modprobe.d/xone-blacklist.conf + $(INSTALL) -D -m 0644 $(XONE_PKGDIR)/assets/FW_ACC_00U.bin $(TARGET_DIR)/lib/firmware/xow_dongle.bin +endef + +XONE_INSTALL_TARGET_CMDS += $(XONE_COPY_CMDS) + +$(eval $(kernel-module)) +$(eval $(generic-package)) diff --git a/package/xow/Config.in b/package/xow/Config.in deleted file mode 100644 index c4eed996b6..0000000000 --- a/package/xow/Config.in +++ /dev/null @@ -1,6 +0,0 @@ -config BR2_PACKAGE_XOW - bool "xow" - depends on BR2_LINUX_KERNEL - depends on BR2_INSTALL_LIBSTDCPP - help - Xbox One wireless dongles support diff --git a/package/xow/xow-001-use-wget.patch b/package/xow/xow-001-use-wget.patch deleted file mode 100644 index f4b46bb278..0000000000 --- a/package/xow/xow-001-use-wget.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/Makefile 2021-09-01 00:41:53.020173380 +0200 -+++ b/Makefile 2021-09-01 00:42:03.916002471 +0200 -@@ -35,7 +35,7 @@ - $(LD) -r -b binary -z noexecstack -o $@ $< - - firmware.bin: -- curl -o driver.cab $(DRIVER_URL) -+ wget -O driver.cab $(DRIVER_URL) - cabextract -F FW_ACC_00U.bin driver.cab - echo $(FIRMWARE_HASH) FW_ACC_00U.bin | sha256sum -c - mv FW_ACC_00U.bin firmware.bin diff --git a/package/xow/xow-002-fix-recent-controllers-disconnect.patch b/package/xow/xow-002-fix-recent-controllers-disconnect.patch deleted file mode 100644 index f36d98917c..0000000000 --- a/package/xow/xow-002-fix-recent-controllers-disconnect.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/dongle/dongle.cpp.orig 2021-09-18 23:26:11.165286869 +0200 -+++ b/dongle/dongle.cpp 2021-09-18 23:27:52.328034010 +0200 -@@ -269,7 +269,7 @@ - - case EVT_CLIENT_LOST: - // Packet is guaranteed not to be empty -- handleControllerDisconnect(packet[0]); -+ //handleControllerDisconnect(packet[0]); - break; - } - } diff --git a/package/xow/xow-003-no-systemd.patch b/package/xow/xow-003-no-systemd.patch deleted file mode 100644 index aa9865670f..0000000000 --- a/package/xow/xow-003-no-systemd.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- xow-700529b2517df7d17ad5a2fa0bd679143ac48666/Makefile.orig 2021-09-18 23:43:52.954208081 +0200 -+++ xow-700529b2517df7d17ad5a2fa0bd679143ac48666/Makefile 2021-09-18 23:44:49.581512871 +0200 -@@ -20,7 +20,6 @@ - UDEVDIR := /etc/udev/rules.d - MODLDIR := /etc/modules-load.d - MODPDIR := /etc/modprobe.d --SYSDDIR := /etc/systemd/system - - .PHONY: all - all: xow -@@ -43,13 +42,10 @@ - - .PHONY: install - install: xow -- sed 's|#BINDIR#|$(BINDIR)|' install/service.in > xow.service - install -D -m 755 xow $(DESTDIR)$(BINDIR)/xow - install -D -m 644 install/udev.rules $(DESTDIR)$(UDEVDIR)/50-xow.rules - install -D -m 644 install/modules.conf $(DESTDIR)$(MODLDIR)/xow-uinput.conf - install -D -m 644 install/modprobe.conf $(DESTDIR)$(MODPDIR)/xow-blacklist.conf -- install -D -m 644 xow.service $(DESTDIR)$(SYSDDIR)/xow.service -- $(RM) xow.service - - .PHONY: uninstall - uninstall: -@@ -57,7 +53,6 @@ - $(RM) $(DESTDIR)$(UDEVDIR)/50-xow.rules - $(RM) $(DESTDIR)$(MODLDIR)/xow-uinput.conf - $(RM) $(DESTDIR)$(MODPDIR)/xow-blacklist.conf -- $(RM) $(DESTDIR)$(SYSDDIR)/xow.service - - .PHONY: clean - clean: diff --git a/package/xow/xow-004-strip-executable.patch b/package/xow/xow-004-strip-executable.patch deleted file mode 100644 index 4852fc8720..0000000000 --- a/package/xow/xow-004-strip-executable.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- xow-700529b2517df7d17ad5a2fa0bd679143ac48666/Makefile.orig 2021-09-19 00:33:28.812049626 +0200 -+++ xow-700529b2517df7d17ad5a2fa0bd679143ac48666/Makefile 2021-09-19 00:33:52.595649415 +0200 -@@ -42,6 +42,7 @@ - - .PHONY: install - install: xow -+ $(STRIP) xow - install -D -m 755 xow $(DESTDIR)$(BINDIR)/xow - install -D -m 644 install/udev.rules $(DESTDIR)$(UDEVDIR)/50-xow.rules - install -D -m 644 install/modules.conf $(DESTDIR)$(MODLDIR)/xow-uinput.conf diff --git a/package/xow/xow-005-no-modules-conf.patch b/package/xow/xow-005-no-modules-conf.patch deleted file mode 100644 index 2c1cfb910a..0000000000 --- a/package/xow/xow-005-no-modules-conf.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- xow-700529b2517df7d17ad5a2fa0bd679143ac48666/Makefile.orig 2021-09-19 23:48:24.030263120 +0200 -+++ xow-700529b2517df7d17ad5a2fa0bd679143ac48666/Makefile 2021-09-19 23:48:45.505907742 +0200 -@@ -45,14 +45,12 @@ - $(STRIP) xow - install -D -m 755 xow $(DESTDIR)$(BINDIR)/xow - install -D -m 644 install/udev.rules $(DESTDIR)$(UDEVDIR)/50-xow.rules -- install -D -m 644 install/modules.conf $(DESTDIR)$(MODLDIR)/xow-uinput.conf - install -D -m 644 install/modprobe.conf $(DESTDIR)$(MODPDIR)/xow-blacklist.conf - - .PHONY: uninstall - uninstall: - $(RM) $(DESTDIR)$(BINDIR)/xow - $(RM) $(DESTDIR)$(UDEVDIR)/50-xow.rules -- $(RM) $(DESTDIR)$(MODLDIR)/xow-uinput.conf - $(RM) $(DESTDIR)$(MODPDIR)/xow-blacklist.conf - - .PHONY: clean diff --git a/package/xow/xow-init b/package/xow/xow-init deleted file mode 100644 index 763bf54367..0000000000 --- a/package/xow/xow-init +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# -# Start xow -# -# userspace driver for Xbox One wireless dongles -# -systemsetting="recalbox_settings" - -start() { - if [ "$($systemsetting -command load -key controllers.xow.enabled -default 1)" -eq 1 ]; then - echo -n "Starting xow: " - start-stop-daemon -b -S -q -m -p /var/run/xow.pid --exec /usr/bin/xow - echo "OK" - fi -} - -stop() { - echo -n "Stopping xow: " - start-stop-daemon -K -q -p /var/run/xow.pid - echo "OK" -} - -case "$1" in - start) start ;; - stop) stop ;; - restart|reload) - stop - start - ;; - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 -esac - -exit $? diff --git a/package/xow/xow.mk b/package/xow/xow.mk deleted file mode 100644 index bfcd5d3e68..0000000000 --- a/package/xow/xow.mk +++ /dev/null @@ -1,30 +0,0 @@ -################################################################################ -# -# XOW -# -################################################################################ - -XOW_VERSION = 700529b2517df7d17ad5a2fa0bd679143ac48666 -XOW_SITE = $(call github,medusalix,xow,$(XOW_VERSION)) -XOW_LICENSE = GPL-2.0 -XOW_LICENSE_FILES = LICENSE - -XOW_DEPENDENCIES = libusb - -define XOW_BUILD_CMDS - CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include" CXXFLAGS="$(TARGET_CXXFLAGS) -I$(STAGING_DIR)/usr/include" LD_FLAGS="$(TARGET_LDFLAGS)" \ - $(MAKE) CXX="$(TARGET_CXX)" CC="$(TARGET_CC)" LD="$(TARGET_LD)" STRIP="$(TARGET_STRIP)" -C $(@D) PREFIX="/usr" -endef - -define XOW_INSTALL_TARGET_CMDS - CFLAGS="$(TARGET_CFLAGS)" CXXFLAGS="$(TARGET_CXXFLAGS)" \ - $(MAKE) CXX="$(TARGET_CXX)" CC="$(TARGET_CC)" LD="$(TARGET_LD)" STRIP="$(TARGET_STRIP)" -C $(@D) install DESTDIR="$(TARGET_DIR)" PREFIX="/usr" -endef - -define XOW_INIT_INSTALL - $(INSTALL) -D -m 0755 $(XOW_PKGDIR)/xow-init $(TARGET_DIR)/etc/init.d/S17xow -endef - -XOW_POST_INSTALL_TARGET_HOOKS += XOW_INIT_INSTALL - -$(eval $(generic-package)) -- GitLab From 69d5bec09759a57c0250b7d5f5d3235334fc3cb8 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Tue, 17 Oct 2023 22:48:58 +0200 Subject: [PATCH 2/2] feat: add xpad-noone for xbox/xbox 360 controllers --- Config.in | 1 + .../4.19/0003-add-input_device_enabled.patch | 45 +++++++++++++++++++ configs/recalbox-odroidxu4_defconfig | 1 + configs/recalbox-rg353x_defconfig | 1 + configs/recalbox-rpi1_defconfig | 1 + configs/recalbox-rpi3_defconfig | 1 + configs/recalbox-rpi4_64_defconfig | 1 + configs/recalbox-rpi4_defconfig | 1 + configs/recalbox-rpizero2_defconfig | 1 + configs/recalbox-x86_64_defconfig | 1 + ...Added-device-IDs-for-8BitDo-Ultimate.patch | 33 ++++++++++++++ ...2-Add-support-for-8bitdo-Pro-2-wired.patch | 32 +++++++++++++ package/xpad-noone/Config.in | 7 +++ package/xpad-noone/xpad-noone.mk | 12 +++++ 14 files changed, 138 insertions(+) create mode 100644 board/recalbox/anbernic/rg353x/kernel_patches/4.19/0003-add-input_device_enabled.patch create mode 100644 package/xpad-noone/0001-Added-device-IDs-for-8BitDo-Ultimate.patch create mode 100644 package/xpad-noone/0002-Add-support-for-8bitdo-Pro-2-wired.patch create mode 100644 package/xpad-noone/Config.in create mode 100644 package/xpad-noone/xpad-noone.mk diff --git a/Config.in b/Config.in index ab4075a6a4..cdfcfcbc07 100644 --- a/Config.in +++ b/Config.in @@ -84,6 +84,7 @@ menu "Controllers" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xarcade2jstick/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xboxdrv/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/xone/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/xpad-noone/Config.in" comment "Nintendo switch Joycons support" source "$BR2_EXTERNAL_RECALBOX_PATH/package/joycond/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/hid-nintendo/Config.in" diff --git a/board/recalbox/anbernic/rg353x/kernel_patches/4.19/0003-add-input_device_enabled.patch b/board/recalbox/anbernic/rg353x/kernel_patches/4.19/0003-add-input_device_enabled.patch new file mode 100644 index 0000000000..d85a768ff3 --- /dev/null +++ b/board/recalbox/anbernic/rg353x/kernel_patches/4.19/0003-add-input_device_enabled.patch @@ -0,0 +1,45 @@ +From 13bb6c29d8423f4365ef4a08e2bc35aadf22b2a8 Mon Sep 17 00:00:00 2001 +From: David Barbion +Date: Wed, 18 Oct 2023 09:13:39 +0200 +Subject: [PATCH 3/3] add input_device_enabled + +--- + drivers/input/input.c | 8 ++++++++ + include/linux/input.h | 2 ++ + 2 files changed, 10 insertions(+) + +diff --git a/drivers/input/input.c b/drivers/input/input.c +index f96c40aed..5403f82d9 100644 +--- a/drivers/input/input.c ++++ b/drivers/input/input.c +@@ -2114,6 +2114,14 @@ void input_enable_softrepeat(struct input_dev *dev, int delay, int period) + } + EXPORT_SYMBOL(input_enable_softrepeat); + ++bool input_device_enabled(struct input_dev *dev) ++{ ++ lockdep_assert_held(&dev->mutex); ++ ++ return dev->users > 0; ++} ++EXPORT_SYMBOL_GPL(input_device_enabled); ++ + /** + * input_register_device - register device with input core + * @dev: device to be registered +diff --git a/include/linux/input.h b/include/linux/input.h +index dcf02073e..14ad49d06 100644 +--- a/include/linux/input.h ++++ b/include/linux/input.h +@@ -492,6 +492,8 @@ bool input_match_device_id(const struct input_dev *dev, + + void input_enable_softrepeat(struct input_dev *dev, int delay, int period); + ++bool input_device_enabled(struct input_dev *dev); ++ + extern struct class input_class; + + /** +-- +2.42.0 + diff --git a/configs/recalbox-odroidxu4_defconfig b/configs/recalbox-odroidxu4_defconfig index f11c41d663..c2ac4972ec 100644 --- a/configs/recalbox-odroidxu4_defconfig +++ b/configs/recalbox-odroidxu4_defconfig @@ -345,4 +345,5 @@ BR2_PACKAGE_JOYCOND=y BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_KMSGRAB=y diff --git a/configs/recalbox-rg353x_defconfig b/configs/recalbox-rg353x_defconfig index 34184463e7..424ac8cd3a 100644 --- a/configs/recalbox-rg353x_defconfig +++ b/configs/recalbox-rg353x_defconfig @@ -284,3 +284,4 @@ BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_RECALBOX_ROCKCHIP_MALI_BIFROST_G52=y BR2_PACKAGE_RECALBOX_ROCKCHIP_MALI_LIB_VERSION_G52_G2P0=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y diff --git a/configs/recalbox-rpi1_defconfig b/configs/recalbox-rpi1_defconfig index 8a3d90315d..40d3e02337 100644 --- a/configs/recalbox-rpi1_defconfig +++ b/configs/recalbox-rpi1_defconfig @@ -283,4 +283,5 @@ BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_RPI_FIRMWARE_CMDLINE_FILE="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/rpi/cmdline.txt" diff --git a/configs/recalbox-rpi3_defconfig b/configs/recalbox-rpi3_defconfig index af7fe8fb01..62ec64abba 100644 --- a/configs/recalbox-rpi3_defconfig +++ b/configs/recalbox-rpi3_defconfig @@ -356,6 +356,7 @@ BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-rpi4_64_defconfig b/configs/recalbox-rpi4_64_defconfig index a543e3fe1c..eef88d7a8c 100644 --- a/configs/recalbox-rpi4_64_defconfig +++ b/configs/recalbox-rpi4_64_defconfig @@ -345,6 +345,7 @@ BR2_PACKAGE_KODI_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-rpi4_defconfig b/configs/recalbox-rpi4_defconfig index 4787235cfd..a9e8e68bce 100644 --- a/configs/recalbox-rpi4_defconfig +++ b/configs/recalbox-rpi4_defconfig @@ -337,6 +337,7 @@ BR2_PACKAGE_KODI_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-rpizero2_defconfig b/configs/recalbox-rpizero2_defconfig index 44446126f4..c2978a3fa1 100644 --- a/configs/recalbox-rpizero2_defconfig +++ b/configs/recalbox-rpizero2_defconfig @@ -356,6 +356,7 @@ BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_RECALBOX_WPAF=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_RECALBOX_VOLUMED=y BR2_PACKAGE_KMSGRAB=y BR2_PACKAGE_SWITCHRES=y diff --git a/configs/recalbox-x86_64_defconfig b/configs/recalbox-x86_64_defconfig index 37a87d3663..0ee70358c4 100644 --- a/configs/recalbox-x86_64_defconfig +++ b/configs/recalbox-x86_64_defconfig @@ -408,3 +408,4 @@ BR2_PACKAGE_FLUIDSYNTH_PULSEAUDIO=y BR2_PACKAGE_KODI_PULSEAUDIO=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_XONE=y +BR2_PACKAGE_XPAD_NOONE=y diff --git a/package/xpad-noone/0001-Added-device-IDs-for-8BitDo-Ultimate.patch b/package/xpad-noone/0001-Added-device-IDs-for-8BitDo-Ultimate.patch new file mode 100644 index 0000000000..be5bfad20f --- /dev/null +++ b/package/xpad-noone/0001-Added-device-IDs-for-8BitDo-Ultimate.patch @@ -0,0 +1,33 @@ +From e28bc1ee82e09bc55054ace04b42574771cd4618 Mon Sep 17 00:00:00 2001 +From: btegs <5166649+btegs@users.noreply.github.com> +Date: Sun, 18 Dec 2022 15:05:55 -0500 +Subject: [PATCH 1/2] Added device IDs for 8BitDo Ultimate + +Referenced from https://github.com/paroj/xpad/commit/1821d2822783e8c24733b05138e06d9a9f4d309d +--- + xpad.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/xpad.c b/xpad.c +index 3d1b969..15ea7f1 100644 +--- a/xpad.c ++++ b/xpad.c +@@ -308,6 +308,7 @@ static const struct xpad_device { + { 0x31e3, 0x1300, "Wooting 60HE (AVR)", 0, XTYPE_XBOX360 }, + { 0x31e3, 0x1310, "Wooting 60HE (ARM)", 0, XTYPE_XBOX360 }, + { 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 }, ++ { 0x2dc8, 0x3106, "8BitDo Ultimate Wireless Controller", 0, XTYPE_XBOX360 }, + { 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX }, + { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, + { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } +@@ -413,6 +414,7 @@ static const struct usb_device_id xpad_table[] = { + XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */ + XPAD_XBOX360_VENDOR(0x31e3), /* Wooting Keyboards */ + XPAD_XBOX360_VENDOR(0x3285), /* Nacon GC-100 */ ++ XPAD_XBOX360_VENDOR(0x2dc8), /* 8BitDo Ultimate Wireless Controller */ + { } + }; + +-- +2.42.0 + diff --git a/package/xpad-noone/0002-Add-support-for-8bitdo-Pro-2-wired.patch b/package/xpad-noone/0002-Add-support-for-8bitdo-Pro-2-wired.patch new file mode 100644 index 0000000000..45977a268b --- /dev/null +++ b/package/xpad-noone/0002-Add-support-for-8bitdo-Pro-2-wired.patch @@ -0,0 +1,32 @@ +From 46727b8c0c28d1d82e2459955384579d30e0466c Mon Sep 17 00:00:00 2001 +From: Benoit Goudreault-Emond +Date: Fri, 30 Dec 2022 13:36:10 -0500 +Subject: [PATCH 2/2] Add support for 8bitdo Pro 2 wired + +--- + xpad.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/xpad.c b/xpad.c +index 15ea7f1..40261e5 100644 +--- a/xpad.c ++++ b/xpad.c +@@ -301,6 +301,7 @@ static const struct xpad_device { + { 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 }, + { 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, + { 0x2563, 0x058d, "OneXPlayer Gamepad", 0, XTYPE_XBOX360 }, ++ { 0x2dc8, 0x3106, "8bitdo Pro 2 wired controller", 0, XTYPE_XBOX360 }, + { 0x31e3, 0x1100, "Wooting One", 0, XTYPE_XBOX360 }, + { 0x31e3, 0x1200, "Wooting Two", 0, XTYPE_XBOX360 }, + { 0x31e3, 0x1210, "Wooting Lekker", 0, XTYPE_XBOX360 }, +@@ -411,6 +412,7 @@ static const struct usb_device_id xpad_table[] = { + XPAD_XBOX360_VENDOR(0x24c6), /* PowerA Controllers */ + XPAD_XBOX360_VENDOR(0x2563), /* OneXPlayer Gamepad */ + XPAD_XBOX360_VENDOR(0x260d), /* Dareu H101 */ ++ XPAD_XBOX360_VENDOR(0x2dc8), /* 8bitdo Controllers */ + XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */ + XPAD_XBOX360_VENDOR(0x31e3), /* Wooting Keyboards */ + XPAD_XBOX360_VENDOR(0x3285), /* Nacon GC-100 */ +-- +2.42.0 + diff --git a/package/xpad-noone/Config.in b/package/xpad-noone/Config.in new file mode 100644 index 0000000000..bac8a73680 --- /dev/null +++ b/package/xpad-noone/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_XPAD_NOONE + bool "xpad-noone" + depends on BR2_LINUX_KERNEL + help + This is the original xpad kernel driver + with support for Xbox One controllers removed. + https://github.com/medusalix/xpad-noone diff --git a/package/xpad-noone/xpad-noone.mk b/package/xpad-noone/xpad-noone.mk new file mode 100644 index 0000000000..92c32ad46b --- /dev/null +++ b/package/xpad-noone/xpad-noone.mk @@ -0,0 +1,12 @@ +################################################################################ +# +# XPAD_NOONE +# +################################################################################ + +XPAD_NOONE_VERSION = d02737f7eab1e17a7748fbe550dd982e3808525d +XPAD_NOONE_SITE = $(call github,medusalix,xpad-noone,$(XPAD_NOONE_VERSION)) +XPAD_NOONE_LICENSE = GPL-2.0 + +$(eval $(kernel-module)) +$(eval $(generic-package)) -- GitLab