Files
david 8cd796e3dd Initial commit: Arduino Uno Q USB Audio Synth project
- USB gadget (UAC1 + MIDI) with boot persistence
- USB host mode with auto-detection
- Pure Data synth patch with ALSA + UDP netreceive MIDI input
- MIDI rawmidi-to-UDP bridge (midi-bridge.py)
- LED matrix visualization (led-matrix-viz.py via arduino-router RPC)
- MCU sketch for LED matrix control (Arduino_RouterBridge + ArduinoGraphics)
- Conftest/OPA Rego policy validation suite for .pd files
- gen_synth_pd.py: programmatic .pd file generator
- System services: midi-bridge, led-matrix-viz, pd-synth-auto, usb-role-detect
- Justfile with deploy, enable, diagnostic recipes
- Diagnostic script (diag.sh)
2026-06-22 22:46:36 -07:00

104 lines
3.5 KiB
Bash

#!/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}'