lesavka/scripts/navka-core.sh

69 lines
2.4 KiB
Bash
Raw Normal View History

2025-06-01 21:28:09 -05:00
#!/usr/bin/env bash
# Proven Pi-5 configfs gadget: HID keyboard+mouse + stereo UAC2
2025-06-06 20:25:26 -05:00
# Still need Web Cam Support
2025-06-06 20:45:09 -05:00
# navka-core one-shot gadget bring-up for Pi-5 / Arch-ARM
2025-06-01 21:28:09 -05:00
set -euo pipefail
2025-06-06 20:25:26 -05:00
2025-06-06 20:45:09 -05:00
# 1) Ensure the dwc2 peripheral overlay is active exactly once
CFG=/boot/config.txt
grep -q 'dtoverlay=dwc2,dr_mode=peripheral' "$CFG" || echo 'dtoverlay=dwc2,dr_mode=peripheral' >> "$CFG"
2025-06-06 20:25:26 -05:00
2025-06-06 20:45:09 -05:00
# 2) Load kernel modules (idempotent)
2025-06-06 20:55:01 -05:00
modprobe dwc2 || { echo "dwc2 not in kernel; abort" >&2; exit 1; }
2025-06-06 00:41:32 -05:00
modprobe libcomposite || { echo "libcomposite not in kernel; abort" >&2; exit 1; }
2025-06-06 20:45:09 -05:00
# 3) Mount configfs once
2025-06-06 20:25:26 -05:00
mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config
2025-06-01 21:28:09 -05:00
G=/sys/kernel/config/usb_gadget/navka
2025-06-06 20:45:09 -05:00
# 4) Tear down any previous half-built gadget
2025-06-02 20:18:19 -05:00
if [[ -d $G ]]; then
2025-06-06 22:10:59 -05:00
echo '' >"$G/UDC" 2>/dev/null || true
sleep 0.2
2025-06-06 20:55:01 -05:00
find "$G/configs" -type l -delete 2>/dev/null || true
2025-06-06 22:10:59 -05:00
rm -rf "$G/functions"/* 2>/dev/null || true
rmdir "$G" || true
2025-06-02 20:18:19 -05:00
fi
2025-06-01 21:28:09 -05:00
2025-06-06 20:45:09 -05:00
# 5) Create gadget (boot-keyboard + UAC2 mic/spkr, 500 mA max)
2025-06-01 21:28:09 -05:00
mkdir -p "$G"
echo 0x1d6b >"$G/idVendor" # Linux Foundation
echo 0x0104 >"$G/idProduct" # Multifunction Composite Gadget
echo 0x0200 >"$G/bcdUSB"
mkdir -p "$G/strings/0x409"
2025-06-06 20:25:26 -05:00
echo "$(cat /proc/sys/kernel/random/uuid)" >"$G/strings/0x409/serialnumber"
echo "Navka" >"$G/strings/0x409/manufacturer"
echo "Navka Composite" >"$G/strings/0x409/product"
2025-06-01 21:28:09 -05:00
# HID (boot keyboard)
mkdir -p "$G/functions/hid.usb0"
echo 1 >"$G/functions/hid.usb0/protocol"
echo 1 >"$G/functions/hid.usb0/subclass"
echo 8 >"$G/functions/hid.usb0/report_length"
2025-06-06 22:10:59 -05:00
cat >"$G/functions/hid.usb0/report_desc" <<'EOF'
05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02
95 01 75 08 81 01 95 05 75 01 05 08 19 01 29 05 91 02 95 01 75 03
91 01 95 06 75 08 15 00 25 65 05 07 19 00 29 65 81 00 c0
EOF
2025-06-01 21:28:09 -05:00
2025-06-06 20:55:01 -05:00
# # -- UAC2 Audio
# mkdir -p $G/functions/uac2.usb0
# echo 48000 > $G/functions/uac2.usb0/c_srate
# echo 2 > $G/functions/uac2.usb0/c_ssize
# echo 2 > $G/functions/uac2.usb0/p_chmask
2025-06-06 20:25:26 -05:00
2025-06-06 20:55:01 -05:00
# -- Config
2025-06-06 20:45:09 -05:00
mkdir -p $G/configs/c.1/strings/0x409
2025-06-06 22:10:59 -05:00
echo 'Kbd only' >"$G/configs/c.1/strings/0x409/configuration"
echo 250 > $G/configs/c.1/MaxPower
2025-06-06 20:55:01 -05:00
# -- Bindings
2025-06-06 20:45:09 -05:00
ln -s $G/functions/hid.usb0 $G/configs/c.1/
2025-06-06 20:55:01 -05:00
# ln -s $G/functions/uac2.usb0 $G/configs/c.1/
2025-06-01 21:28:09 -05:00
2025-06-06 20:45:09 -05:00
# 6) Finally bind to first available UDC
echo $(ls /sys/class/udc | head -n1) > $G/UDC
echo "[navka-core] gadget ready on USB-C port"