101 lines
2.5 KiB
Bash
Executable File
101 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
need_cmd() {
|
|
command -v "$1" >/dev/null 2>&1 || { echo "[ERR] Missing command: $1" >&2; exit 1; }
|
|
}
|
|
|
|
need_cmd rs-enumerate-devices
|
|
need_cmd awk
|
|
need_cmd sed
|
|
need_cmd grep
|
|
|
|
is_realsense_present() {
|
|
local out
|
|
out="$(rs-enumerate-devices 2>/dev/null || true)"
|
|
echo "$out" | grep -qi "Intel RealSense"
|
|
}
|
|
|
|
print_bool() {
|
|
if is_realsense_present; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
}
|
|
|
|
# Apply USB power settings to the RealSense sysfs path + its parent hub
|
|
apply_fix() {
|
|
local RS_OUT SERIAL PHY USB_NODE PARENT_HUB DEV_SYS HUB_SYS
|
|
|
|
RS_OUT="$(rs-enumerate-devices 2>/dev/null || true)"
|
|
if ! echo "$RS_OUT" | grep -qi "Intel RealSense"; then
|
|
# No device: just print false
|
|
echo "false"
|
|
return 0
|
|
fi
|
|
|
|
SERIAL="$(echo "$RS_OUT" | awk -F':' '/Serial Number/ {gsub(/[ \t]/,"",$2); print $2; exit}')"
|
|
PHY="$(echo "$RS_OUT" | awk -F':' '/Physical Port/ {print $2; exit}' | sed 's/^[ \t]*//')"
|
|
|
|
# Extract USB node like "2-2.3" from Physical Port
|
|
USB_NODE="$(echo "$PHY" | grep -oE '/usb[0-9]+/[^ ]+' | sed -E 's#.*/usb[0-9]+/##' | cut -d'/' -f2 | head -n1 || true)"
|
|
if [[ -z "${USB_NODE:-}" ]]; then
|
|
USB_NODE="$(echo "$PHY" | grep -oE 'usb[0-9]+/[0-9]+-[0-9]+(\.[0-9]+)?' | sed 's#usb[0-9]+/##' | head -n1 || true)"
|
|
fi
|
|
|
|
if [[ -z "${USB_NODE:-}" ]]; then
|
|
# Can't map sysfs; still detected though
|
|
echo "true"
|
|
return 0
|
|
fi
|
|
|
|
PARENT_HUB="${USB_NODE%%.*}"
|
|
DEV_SYS="/sys/bus/usb/devices/${USB_NODE}"
|
|
HUB_SYS="/sys/bus/usb/devices/${PARENT_HUB}"
|
|
|
|
# Disable autosuspend globally (optional)
|
|
echo -1 | sudo tee /sys/module/usbcore/parameters/autosuspend >/dev/null || true
|
|
|
|
apply_power_fix() {
|
|
local path="$1"
|
|
[[ -d "$path" ]] || return 0
|
|
[[ -e "$path/power/control" ]] && echo on | sudo tee "$path/power/control" >/dev/null || true
|
|
[[ -e "$path/power/autosuspend" ]] && echo -1 | sudo tee "$path/power/autosuspend" >/dev/null || true
|
|
[[ -e "$path/power/autosuspend_delay_ms" ]] && echo 0 | sudo tee "$path/power/autosuspend_delay_ms" >/dev/null || true
|
|
}
|
|
|
|
apply_power_fix "$HUB_SYS"
|
|
apply_power_fix "$DEV_SYS"
|
|
|
|
# Final verification
|
|
print_bool
|
|
}
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
bash fix_realsense_usb.sh --check # prints true/false only
|
|
bash fix_realsense_usb.sh --fix # applies fix then prints true/false
|
|
Default: --fix
|
|
EOF
|
|
}
|
|
|
|
mode="${1:---fix}"
|
|
|
|
case "$mode" in
|
|
--check)
|
|
print_bool
|
|
;;
|
|
--fix)
|
|
apply_fix
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
;;
|
|
*)
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|