Last active
May 24, 2026 22:03
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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