Skip to content

Instantly share code, notes, and snippets.

@xiongyihui
Last active December 11, 2024 09:43
Show Gist options
  • Save xiongyihui/2d57e22d166bfb478654a8e0d5c68577 to your computer and use it in GitHub Desktop.
Save xiongyihui/2d57e22d166bfb478654a8e0d5c68577 to your computer and use it in GitHub Desktop.
Linux USB Gadget - UAC & HID
#!/bin/bash
modprobe libcomposite
mkdir -p /sys/kernel/config/usb_gadget/g
echo 0x1d6b > /sys/kernel/config/usb_gadget/g/idVendor # Linux Foundation
echo 0x0104 > /sys/kernel/config/usb_gadget/g/idProduct # Multifunction Composite Gadget
echo 0x0100 > /sys/kernel/config/usb_gadget/g/bcdDevice # v1.0.0
echo 0x0200 > /sys/kernel/config/usb_gadget/g/bcdUSB # USB 2.0
echo 0xef > /sys/kernel/config/usb_gadget/g/bDeviceClass # USB 2.0
echo 0x02 > /sys/kernel/config/usb_gadget/g/bDeviceSubClass # USB 2.0
echo 0x01 > /sys/kernel/config/usb_gadget/g/bDeviceProtocol # USB 2.0
mkdir -p /sys/kernel/config/usb_gadget/g/strings/0x409
echo "000001" > /sys/kernel/config/usb_gadget/g/strings/0x409/serialnumber
echo "VOICEN" > /sys/kernel/config/usb_gadget/g/strings/0x409/manufacturer
echo "devkit" > /sys/kernel/config/usb_gadget/g/strings/0x409/product
#mkdir -p /sys/kernel/config/usb_gadget/g/functions/acm.usb0 # serial
mkdir -p /sys/kernel/config/usb_gadget/g/functions/uac1.usb0 # audio
echo 0x1 > /sys/kernel/config/usb_gadget/g/functions/uac1.usb0/c_chmask
echo 48000 > /sys/kernel/config/usb_gadget/g/functions/uac1.usb0/c_srate
echo 0xf > /sys/kernel/config/usb_gadget/g/functions/uac1.usb0/p_chmask
echo 16000 > /sys/kernel/config/usb_gadget/g/functions/uac1.usb0/p_srate
mkdir -p /sys/kernel/config/usb_gadget/g/configs/c.1
echo 250 > /sys/kernel/config/usb_gadget/g/configs/c.1/MaxPower
mkdir -p /sys/kernel/config/usb_gadget/g/functions/hid.usb0 # hid
cd /sys/kernel/config/usb_gadget/g
echo 1 > functions/hid.usb0/protocol
echo 1 > functions/hid.usb0/subclass
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\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0 > functions/hid.usb0/report_desc
ln -s /sys/kernel/config/usb_gadget/g/functions/uac1.usb0 /sys/kernel/config/usb_gadget/g/configs/c.1/
#ln -s /sys/kernel/config/usb_gadget/g/functions/acm.usb0 /sys/kernel/config/usb_gadget/g/configs/c.1/
ln -s /sys/kernel/config/usb_gadget/g/functions/hid.usb0 /sys/kernel/config/usb_gadget/g/configs/c.1/
udevadm settle -t 5 || :
ls /sys/class/udc/ > /sys/kernel/config/usb_gadget/g/UDC
@xiongyihui
Copy link
Author

xiongyihui commented Dec 27, 2020

Send A through HID:

sudo su
echo -ne "\0\0\x4\0\0\0\0\0" > /dev/hidg0 && echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0

Send Caps:

echo -ne "\0\0\x39\0\0\0\0\0" > /dev/hidg0 && echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0

@xiongyihui
Copy link
Author

A compatible issue on Windows 10

  1. only enable UAC at first
  2. disable USB
  3. re-enable with UAC and HID
ls /sys/class/udc/ > /sys/kernel/config/usb_gadget/g/UDC
sleep 1
echo '' > /sys/kernel/config/usb_gadget/g/UDC
sleep 1
ln -s /sys/kernel/config/usb_gadget/g/functions/hid.usb0  /sys/kernel/config/usb_gadget/g/configs/c.1/
udevadm settle -t 5 || :
ls /sys/class/udc/ > /sys/kernel/config/usb_gadget/g/UDC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment