#!/bin/bash # diag.sh — run on the board for diagnostics set -e echo "--- System ---" echo " Kernel: $(uname -r)" echo " Uptime: $(uptime -p | sed 's/up //')" echo " Load: $(cat /proc/loadavg | cut -d' ' -f1-3)" echo " Memory: $(free -h | awk '/^Mem:/{print $3 "/" $2}')" echo " Disk: $(df -h / | awk 'NR==2{print $3 "/" $2 " (" $5 ")"}')" echo "" echo "--- USB Gadget (configfs) ---" UDC=$(cat /sys/kernel/config/usb_gadget/g1/UDC 2>/dev/null || echo '(not bound)') echo " UDC bound: $UDC" for f in /sys/kernel/config/usb_gadget/g1/functions/*/; do echo " Function: $(basename "$f")" done for c in /sys/kernel/config/usb_gadget/g1/configs/*/; do cfg=$(basename "$c") for l in "$c"/*.*/; do [ -L "$l" ] && echo " linked: $(basename "$l") -> config $cfg" done done echo "" echo "--- UDC Hardware ---" for u in /sys/class/udc/*/; do name=$(basename "$u") echo " Controller: $name" echo " state: $(cat "$u/state" 2>/dev/null)" echo " speed: $(cat "$u/current_speed" 2>/dev/null)" echo " max_speed: $(cat "$u/maximum_speed" 2>/dev/null)" done role=$(cat /sys/class/usb_role/*/role 2>/dev/null || echo '(none)') echo " USB role: $role" echo " Role sw: $(ls /sys/class/usb_role/ 2>/dev/null | tr '\n' ' ')" echo "" echo "--- USB Audio Params ---" for p in /sys/kernel/config/usb_gadget/g1/functions/uac1.gs0/p_* /sys/kernel/config/usb_gadget/g1/functions/uac1.gs0/c_*; do name=$(basename "$p") echo " $name: $(cat "$p" 2>/dev/null)" done echo "" echo "--- USB MIDI Params ---" for p in in_ports out_ports index; do val=$(cat /sys/kernel/config/usb_gadget/g1/functions/midi.gs0/$p 2>/dev/null) echo " $p: $val" done echo "" echo "--- Modules ---" lsmod | awk '$1 ~ /^(usb_f_|u_audio|libcomposite|snd_usb|snd_rawmidi|snd_soc|dwc3)/ {print " " $0}' for m in usb_f_uac1 usb_f_midi dwc3-qcom-legacy; do if lsmod 2>/dev/null | grep -q "^$m "; then echo " $m: LOADED" else echo " $m: not loaded" fi done echo "" echo "--- ALSA Cards ---" cat /proc/asound/cards echo "" aplay -l 2>/dev/null | awk '{print " " $0}' echo "" arecord -l 2>/dev/null | awk '{print " " $0}' echo "" echo "--- ALSA MIDI ---" echo " Raw MIDI devices:" ls /dev/snd/midi* 2>/dev/null | awk '{print " " $0}' || echo " (none)" echo " ALSA sequencer:" aconnect -lio 2>/dev/null | awk '{print " " $0}' || echo " (none)" echo " amidi ports:" amidi -l 2>/dev/null | awk '{print " " $0}' || echo " (none)" echo "" echo "--- Pd Status ---" pd_pid=$(pgrep -x pd 2>/dev/null || echo "") if [ -n "$pd_pid" ]; then echo " PID: $pd_pid" echo " Args: $(tr '\0' ' ' < /proc/$pd_pid/cmdline 2>/dev/null)" echo " Uptime: $(ps -o etime= -p $pd_pid 2>/dev/null | xargs)" echo " CPU: $(ps -o %cpu= -p $pd_pid 2>/dev/null | xargs)%" echo " MEM: $(ps -o %mem= -p $pd_pid 2>/dev/null | xargs)%" else echo " Pd: not running" fi for svc in pd-synth-auto pd-synth pd-synth-i2s usb-role-detect usb-gadget-audio; do state=$(systemctl is-active "$svc" 2>/dev/null || echo '(not found)') enabled=$(systemctl is-enabled "$svc" 2>/dev/null || echo '(not found)') echo " $svc: $state (enabled: $enabled)" done echo "" echo "--- dmesg (USB/gadget errors) ---" dmesg -l err,warn 2>/dev/null | grep -iE 'usb|gadget|uac1|midi|pd|audio|dwc3' | tail -20 | awk '{print " " $0}' echo "" dmesg 2>/dev/null | grep -i 'failed to start\|incorrect sample\|couldn.t find.*UDC\|probe.*failed' | tail -5 | awk '{print " " $0}'