#!/bin/sh # Project WH-1 ConfigFS Hardware Blueprint Initialization Script # Configures the Ingenic SoC to expose a Composite USB Device to the Host PC CONFIGFS_ROOT="/sys/kernel/config/usb_gadget" GADGET_DIR="${CONFIGFS_ROOT}/wh_tool" # 1. Clean up any stale configurations if [ -d "${GADGET_DIR}" ]; then echo "" > "${GADGET_DIR}/UDC" 2>/dev/null rm -f "${GADGET_DIR}/configs/c.1/hid.usb0" 2>/dev/null rm -f "${GADGET_DIR}/configs/c.1/hid.usb1" 2>/dev/null rm -f "${GADGET_DIR}/configs/c.1/acm.usb0" 2>/dev/null rm -f "${GADGET_DIR}/configs/c.1/uac2.usb0" 2>/dev/null rmdir "${GADGET_DIR}/configs/c.1/strings/0x409" 2>/dev/null rmdir "${GADGET_DIR}/configs/c.1" 2>/dev/null rmdir "${GADGET_DIR}/functions/hid.usb0" 2>/dev/null rmdir "${GADGET_DIR}/functions/hid.usb1" 2>/dev/null rmdir "${GADGET_DIR}/functions/acm.usb0" 2>/dev/null rmdir "${GADGET_DIR}/functions/uac2.usb0" 2>/dev/null rmdir "${GADGET_DIR}/strings/0x409" 2>/dev/null rmdir "${GADGET_DIR}" 2>/dev/null fi # 2. Instantiate the global USB Tool profile mkdir -p "${GADGET_DIR}" cd "${GADGET_DIR}" echo "0x1d6b" > idVendor # Linux Foundation Hardware Vendor ID Mapping echo "0x0104" > idProduct # Multifunction Composite Gadget ID echo "0x0200" > bcdUSB echo "0xEF" > bDeviceClass echo "0x02" > bDeviceSubClass echo "0x01" > bDeviceProtocol mkdir -p strings/0x409 echo "WH-1-SECURE" > strings/0x409/serialnumber echo "Ingenic Labs" > strings/0x409/manufacturer echo "WH-1 Pocket Rig" > strings/0x409/product # 3. Define Template Module Functions # Function 0: Keyboard HID Node (/dev/hidg0) mkdir -p functions/hid.usb0 echo 1 > functions/hid.usb0/subclass echo 1 > functions/hid.usb0/protocol echo 8 > functions/hid.usb0/report_length echo -ne \\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\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x26\\xff\\x00\\x05\\x07\\x19\\x00\\x2a\\xff\\x00\\x81\\x00\\xc0 > functions/hid.usb0/report_desc # Function 1: Consumer Control/Volume HID Node (/dev/hidg1) mkdir -p functions/hid.usb1 echo 0 > functions/hid.usb1/subclass echo 0 > functions/hid.usb1/protocol echo 2 > functions/hid.usb1/report_length echo -ne \\x05\\x0c\\x09\\x01\\xa1\\x01\\x15\\x00\\x25\\x01\\x09\\xe9\\x09\\xea\\x09\\xe2\\x75\\x01\\x95\\x03\\x81\\x02\\x95\\x05\\x81\\x03\\xc0 > functions/hid.usb1/report_desc # Function 2: CDC ACM Virtual Serial Port (/dev/ttyGS0) mkdir -p functions/acm.usb0 # Function 3: UAC2 Audio Stream Engine mkdir -p functions/uac2.usb0 # 4. Link Functions to Global Core Template Layout Configuration mkdir -p configs/c.1/strings/0x409 echo "Composite Master Config" > configs/c.1/strings/0x409/configuration echo 500 > configs/c.1/bmAttributes ln -s functions/hid.usb0 configs/c.1/ ln -s functions/hid.usb1 configs/c.1/ ln -s functions/acm.usb0 configs/c.1/ ln -s functions/uac2.usb0 configs/c.1/ # 5. Connect the core stack to the hardware controller UDC_DRIVER=$(ls /sys/class/udc | head -n 1) echo "${UDC_DRIVER}" > UDC