Skip to content

Instantly share code, notes, and snippets.

@polson
Last active May 24, 2026 22:03
Show Gist options
  • Select an option

  • Save polson/682ebc1fbff9216a2355c924daceb8d9 to your computer and use it in GitHub Desktop.

Select an option

Save polson/682ebc1fbff9216a2355c924daceb8d9 to your computer and use it in GitHub Desktop.
YARG HID diagnostic tool - run with guitar plugged in and share the output
#!/bin/bash
# YARG Guitar Diagnostic Tool
# Plug in your guitar adapter, run this script, share the output.
# No dependencies needed - just reads system files.
OUTFILE="$(pwd)/yarg-hid-diag.txt"
echo "=== YARG HID Diagnostic ===" > "$OUTFILE"
echo "Date: $(date)" >> "$OUTFILE"
echo "Distro: $(cat /etc/os-release 2>/dev/null | head -4)" >> "$OUTFILE"
echo "Kernel: $(uname -r)" >> "$OUTFILE"
echo "" >> "$OUTFILE"
echo "=== All hidraw devices ===" >> "$OUTFILE"
ls -la /dev/hidraw* >> "$OUTFILE" 2>&1
echo "" >> "$OUTFILE"
echo "=== hidraw device details ===" >> "$OUTFILE"
for dev in /sys/class/hidraw/hidraw*; do
[ -d "$dev" ] || continue
name=$(basename "$dev")
# Parse HID_ID from uevent: "HID_ID=0003:00001209:00002882"
hid_id=$(grep "HID_ID" "$dev/device/uevent" 2>/dev/null | cut -d= -f2-)
vid=$(echo "$hid_id" | cut -d: -f2 | sed 's/^0000//' | tr '[:upper:]' '[:lower:]')
pid=$(echo "$hid_id" | cut -d: -f3 | sed 's/^0000//' | tr '[:upper:]' '[:lower:]')
# Product name from uevent
prodname=$(grep "HID_NAME" "$dev/device/uevent" 2>/dev/null | cut -d= -f2-)
# Report descriptor size (0 = problem)
descsize=$(wc -c < "$dev/device/report_descriptor" 2>/dev/null)
# Parse usage_page from HID report descriptor (first byte pair: 05 XX = Usage Page)
# 0x05 = Usage Page (global tag), next byte is the page value
usage_page="unknown"
usage="unknown"
if [ "$descsize" -gt 2 ] 2>/dev/null; then
first_byte=$(xxd -p -l 1 "$dev/device/report_descriptor" 2>/dev/null)
if [ "$first_byte" = "05" ]; then
usage_page=$(xxd -p -s 1 -l 1 "$dev/device/report_descriptor" 2>/dev/null)
usage_page="0000$usage_page"
usage_page=${usage_page: -4}
fi
# Usage (local tag 0x09) usually follows soon after
# Scan first 16 bytes for 09 XX pattern
hexdump=$(xxd -p -l 16 "$dev/device/report_descriptor" 2>/dev/null | tr -d '\n')
usage_match=$(echo "$hexdump" | grep -oP '09([0-9a-f]{2})' | head -1)
if [ -n "$usage_match" ]; then
usage=${usage_match:2:2}
usage="0000$usage"
usage=${usage: -4}
fi
fi
# Permissions
perms=$(stat -c "%a %U:%G" "/dev/$name" 2>/dev/null)
echo "--- $name ---" >> "$OUTFILE"
echo " name: $prodname" >> "$OUTFILE"
echo " VID: $vid PID: $pid" >> "$OUTFILE"
echo " usage_page: $usage_page usage: $usage" >> "$OUTFILE"
echo " report_descriptor size: $descsize" >> "$OUTFILE"
echo " /dev/$name permissions: $perms" >> "$OUTFILE"
echo "" >> "$OUTFILE"
done
echo "=== js devices ===" >> "$OUTFILE"
ls -la /dev/input/js* >> "$OUTFILE" 2>&1
echo "" >> "$OUTFILE"
echo "=== input devices ===" >> "$OUTFILE"
cat /proc/bus/input/devices >> "$OUTFILE" 2>&1
echo "" >> "$OUTFILE"
echo "=== USB devices (lsusb) ===" >> "$OUTFILE"
lsusb >> "$OUTFILE" 2>&1
echo "" >> "$OUTFILE"
echo "=== YARG log (if exists) ===" >> "$OUTFILE"
for logdir in "$(pwd)" "$(dirname $0)" "$HOME/.config/yarg" "$HOME/.local/share/yarg"; do
for logfile in "$logdir/Player.log" "$logdir/yarg.log" "$logdir/YARG/Player.log"; do
if [ -f "$logfile" ]; then
echo "Found: $logfile" >> "$OUTFILE"
grep -i "hidrogen\|hidapi\|santroller\|device.*remove\|device.*add\|unsupported" "$logfile" >> "$OUTFILE" 2>&1
echo "" >> "$OUTFILE"
fi
done
done
echo "" >> "$OUTFILE"
echo "Done! Output saved to: $OUTFILE"
echo "Please share the contents of that file."
echo ""
echo "--- Quick summary ---"
echo ""
for dev in /sys/class/hidraw/hidraw*; do
[ -d "$dev" ] || continue
name=$(basename "$dev")
hid_id=$(grep "HID_ID" "$dev/device/uevent" 2>/dev/null | cut -d= -f2-)
vid=$(echo "$hid_id" | cut -d: -f2 | sed 's/^0000//' | tr '[:upper:]' '[:lower:]')
pid=$(echo "$hid_id" | cut -d: -f3 | sed 's/^0000//' | tr '[:upper:]' '[:lower:]')
prodname=$(grep "HID_NAME" "$dev/device/uevent" 2>/dev/null | cut -d= -f2-)
descsize=$(wc -c < "$dev/device/report_descriptor" 2>/dev/null)
usage_page="?"
usage="?"
if [ "$descsize" -gt 2 ] 2>/dev/null; then
first_byte=$(xxd -p -l 1 "$dev/device/report_descriptor" 2>/dev/null)
if [ "$first_byte" = "05" ]; then
up=$(xxd -p -s 1 -l 1 "$dev/device/report_descriptor" 2>/dev/null)
usage_page="0000$up"
usage_page=${usage_page: -4}
fi
hexdump=$(xxd -p -l 16 "$dev/device/report_descriptor" 2>/dev/null | tr -d '\n')
usage_match=$(echo "$hexdump" | grep -oP '09([0-9a-f]{2})' | head -1)
if [ -n "$usage_match" ]; then
usage=${usage_match:2:2}
usage="0000$usage"
usage=${usage: -4}
fi
fi
perms=$(stat -c "%a" "/dev/$name" 2>/dev/null)
echo "$name: VID=$vid PID=$pid name=\"$prodname\" usage_page=$usage_page usage=$usage perms=$perms desc=$descsize"
done
echo ""
cat "$OUTFILE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment