diff --git a/system_files/deck/shared/usr/bin/custom-device-pollrates.sh b/system_files/deck/shared/usr/bin/custom-device-pollrates.sh new file mode 100755 index 00000000..69e14d33 --- /dev/null +++ b/system_files/deck/shared/usr/bin/custom-device-pollrates.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -m + +# Gather device poll rate settings from /etc/custom-device-pollrates/custom-device-pollrates.conf +DEVICES=$(grep -v '^\s*$\|^\s*\#' /etc/custom-device-pollrates/custom-device-pollrates.conf | paste -sd, -) + +# Set new polling rate for devices +echo "$DEVICES" | sudo tee /sys/module/usbcore/parameters/interrupt_interval_override > /dev/null + + +# Reload all USB devices + +for xhci in /sys/bus/pci/drivers/?hci_hcd ; do + + if ! cd $xhci ; then + echo Failed to change directory to $xhci + exit 1 + fi + + echo Resetting devices from $xhci... + + for i in ????:??:??.? ; do + echo -n "$i" > unbind + echo -n "$i" > bind + done +sleep 1 +done + + diff --git a/system_files/deck/shared/usr/etc/custom-device-pollrates.conf b/system_files/deck/shared/usr/etc/custom-device-pollrates.conf new file mode 100644 index 00000000..1691866f --- /dev/null +++ b/system_files/deck/shared/usr/etc/custom-device-pollrates.conf @@ -0,0 +1,25 @@ +# Format: +# vendorid:deviceid:rate +# +# Polling Rates: +# 1=1000Hz,2=500Hz,4=250Hz,8=125Hz +# +# Ex (PS5 DualSense, 1000Mhz polling rate): +# 054c:0ce6:1 +# +# One entry per line +# +# +# To allow these devices to have custom +# pollrates, uncomment the device or alternatively +# add a new device configuration line, then restart +# the service with: +# +# sudo systemctl restart custom-device-pollrates.service +# -------------SONY------------- +# DS4 +#054c:09cc:1 +# DS5 +#054c:0ce6:1 +# -------------SONY------------- + diff --git a/system_files/deck/shared/usr/lib/systemd/system-presets/99-custom-device-pollrates.preset b/system_files/deck/shared/usr/lib/systemd/system-presets/99-custom-device-pollrates.preset new file mode 100644 index 00000000..f6ab2433 --- /dev/null +++ b/system_files/deck/shared/usr/lib/systemd/system-presets/99-custom-device-pollrates.preset @@ -0,0 +1 @@ +enable custom-device-pollrates.service diff --git a/system_files/deck/shared/usr/lib/systemd/system/custom-device-pollrates.service b/system_files/deck/shared/usr/lib/systemd/system/custom-device-pollrates.service new file mode 100644 index 00000000..b8ae107c --- /dev/null +++ b/system_files/deck/shared/usr/lib/systemd/system/custom-device-pollrates.service @@ -0,0 +1,10 @@ +[Unit] +Description=Set custom polling rates for specific devices + +[Service] +Type=simple +ExecStart=/usr/bin/bash /usr/bin/custom-device-pollrates.sh + +[Install] +WantedBy=multi-user.target + diff --git a/system_files/desktop/shared/usr/bin/custom-device-pollrates.sh b/system_files/desktop/shared/usr/bin/custom-device-pollrates.sh new file mode 100755 index 00000000..69e14d33 --- /dev/null +++ b/system_files/desktop/shared/usr/bin/custom-device-pollrates.sh @@ -0,0 +1,29 @@ +#!/bin/bash +set -m + +# Gather device poll rate settings from /etc/custom-device-pollrates/custom-device-pollrates.conf +DEVICES=$(grep -v '^\s*$\|^\s*\#' /etc/custom-device-pollrates/custom-device-pollrates.conf | paste -sd, -) + +# Set new polling rate for devices +echo "$DEVICES" | sudo tee /sys/module/usbcore/parameters/interrupt_interval_override > /dev/null + + +# Reload all USB devices + +for xhci in /sys/bus/pci/drivers/?hci_hcd ; do + + if ! cd $xhci ; then + echo Failed to change directory to $xhci + exit 1 + fi + + echo Resetting devices from $xhci... + + for i in ????:??:??.? ; do + echo -n "$i" > unbind + echo -n "$i" > bind + done +sleep 1 +done + + diff --git a/system_files/desktop/shared/usr/etc/custom-device-pollrates.conf b/system_files/desktop/shared/usr/etc/custom-device-pollrates.conf new file mode 100644 index 00000000..1691866f --- /dev/null +++ b/system_files/desktop/shared/usr/etc/custom-device-pollrates.conf @@ -0,0 +1,25 @@ +# Format: +# vendorid:deviceid:rate +# +# Polling Rates: +# 1=1000Hz,2=500Hz,4=250Hz,8=125Hz +# +# Ex (PS5 DualSense, 1000Mhz polling rate): +# 054c:0ce6:1 +# +# One entry per line +# +# +# To allow these devices to have custom +# pollrates, uncomment the device or alternatively +# add a new device configuration line, then restart +# the service with: +# +# sudo systemctl restart custom-device-pollrates.service +# -------------SONY------------- +# DS4 +#054c:09cc:1 +# DS5 +#054c:0ce6:1 +# -------------SONY------------- + diff --git a/system_files/desktop/shared/usr/lib/systemd/system-presets/99-custom-device-pollrates.preset b/system_files/desktop/shared/usr/lib/systemd/system-presets/99-custom-device-pollrates.preset new file mode 100644 index 00000000..f6ab2433 --- /dev/null +++ b/system_files/desktop/shared/usr/lib/systemd/system-presets/99-custom-device-pollrates.preset @@ -0,0 +1 @@ +enable custom-device-pollrates.service diff --git a/system_files/desktop/shared/usr/lib/systemd/system/custom-device-pollrates.service b/system_files/desktop/shared/usr/lib/systemd/system/custom-device-pollrates.service new file mode 100644 index 00000000..b8ae107c --- /dev/null +++ b/system_files/desktop/shared/usr/lib/systemd/system/custom-device-pollrates.service @@ -0,0 +1,10 @@ +[Unit] +Description=Set custom polling rates for specific devices + +[Service] +Type=simple +ExecStart=/usr/bin/bash /usr/bin/custom-device-pollrates.sh + +[Install] +WantedBy=multi-user.target +