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)
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
#!/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}'
|
||||
Reference in New Issue
Block a user