lesavka/scripts/navka-core.sh
2025-06-18 00:03:17 -05:00

110 lines
4.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# navka-core.sh - background stealth daemon to present gadget as usb hub of genuine devices
# Proven Pi-5 configfs gadget: HID keyboard+mouse
# Still need Web Cam Support + stereo UAC2
# navka-core one-shot gadget bring-up for Pi-5 / Arch-ARM
set -euo pipefail
# 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"
# 2) Load kernel modules (idempotent)
modprobe dwc2 || { echo "dwc2 not in kernel; abort" >&2; exit 1; }
modprobe libcomposite || { echo "libcomposite not in kernel; abort" >&2; exit 1; }
# 3) Mount configfs once
mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config
G=/sys/kernel/config/usb_gadget/navka
# 4) Tear down any previous half-built gadget
if [[ -d $G ]]; then
echo '' >"$G/UDC" 2>/dev/null || true
sleep 0.2
find "$G/configs" -type l -delete 2>/dev/null || true
rm -rf "$G" 2>/dev/null || true
fi
# 5) Create gadget (boot-keyboard + UAC2 mic/spkr, 500 mA max)
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"
echo "$(cat /proc/sys/kernel/random/uuid)" >"$G/strings/0x409/serialnumber"
echo "Navka" >"$G/strings/0x409/manufacturer"
echo "Navka Composite" >"$G/strings/0x409/product"
# ----------------------- HID keyboard (usb0) -----------------------
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"
printf '\x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01'\
'\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x01\x95\x05\x75\x01\x05'\
'\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x01\x95\x06\x75\x08'\
'\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00\xc0' \
>"$G/functions/hid.usb0/report_desc"
# ----------------------- HID mouse (usb1) --------------------------
mkdir -p "$G/functions/hid.usb1"
echo 0 > "$G/functions/hid.usb1/protocol" # Boot mouse
echo 0 > "$G/functions/hid.usb1/subclass"
echo 4 > "$G/functions/hid.usb1/report_length"
# 3 buttons, X, Y, Wheel → total 4 bytes
printf '\x05\x01' # Usage Page (Generic Desktop)
printf '\x09\x02' # Usage (Mouse)
printf '\xA1\x01' # Collection (Application)
printf '\x09\x01' # Usage (Pointer)
printf '\xA1\x00' # Collection (Physical)
printf '\x05\x09' # Usage Page (Button)
printf '\x19\x01' # Usage Min (1)
printf '\x29\x03' # Usage Max (3)
printf '\x15\x00' # Logical Min (0)
printf '\x25\x01' # Logical Max (1)
printf '\x95\x03' # Report Count (3)
printf '\x75\x01' # Report Size (1)
printf '\x81\x02' # Input (Data,Var,Abs) 3 button bits
printf '\x95\x01' # Report Count (1)
printf '\x75\x05' # Report Size (5)
printf '\x81\x03' # Input (Cnst,Var,Abs) 5 pad bits
printf '\x05\x01' # Usage Page (Generic Desktop)
printf '\x09\x30' # Usage (X)
printf '\x09\x31' # Usage (Y)
printf '\x15\x81' # Logical Min (-127)
printf '\x25\x7F' # Logical Max (127)
printf '\x75\x08' # Report Size (8)
printf '\x95\x02' # Report Count (2)
printf '\x81\x06' # Input (Data,Var,Rel) X, Y
printf '\x09\x38' # Usage (Wheel)
printf '\x15\x81' # Logical Min (-127)
printf '\x25\x7F' # Logical Max (127)
printf '\x75\x08' # Report Size (8)
printf '\x95\x01' # Report Count (1)
printf '\x81\x06' # Input (Data,Var,Rel) Wheel
printf '\xC0\xC0' # End collections
>"$G/functions/hid.usb1/report_desc"
# # -- 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
# ----------------------- configuration -----------------------------
mkdir -p "$G/configs/c.1/strings/0x409"
echo 500 > "$G/configs/c.1/MaxPower"
echo "Config 1" > "$G/configs/c.1/strings/0x409/configuration"
# 6) Finally bind to first available UDC
ln -s $G/functions/hid.usb0 $G/configs/c.1/
ln -s $G/functions/hid.usb1 $G/configs/c.1/
# ln -s $G/functions/uac2.usb0 $G/configs/c.1/
# 7) Finally bind to first available UDC
echo $(ls /sys/class/udc | head -n1) > $G/UDC
echo "[navka-core] gadget ready (keyboard on hidg0, mouse on hidg1)"