AI_Photographer/Scripts/fix_realsense_usb.sh
2026-04-12 18:52:37 +04:00

123 lines
2.9 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
realsense_output() {
rs-enumerate-devices 2>/dev/null || true
}
is_realsense_present() {
local out
out="$(realsense_output)"
echo "$out" | grep -qi "Intel RealSense"
}
print_bool() {
if is_realsense_present; then
echo "true"
else
echo "false"
fi
}
list_serials() {
local out
out="$(realsense_output)"
if ! echo "$out" | grep -qi "Intel RealSense"; then
return 0
fi
echo "$out" \
| awk -F':' '/Serial Number/ {print $2}' \
| sed 's/^[[:space:]]*//; s/[[:space:]]*$//' \
| grep -v '^$' \
| awk '!seen[$0]++'
}
# 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="$(realsense_output)"
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
bash fix_realsense_usb.sh --serials # prints available RealSense serials, one per line
Default: --fix
EOF
}
mode="${1:---fix}"
case "$mode" in
--check)
print_bool
;;
--fix)
apply_fix
;;
--serials|--list-serials)
list_serials
;;
-h|--help)
usage
;;
*)
usage >&2
exit 1
;;
esac