Skip to content

Instantly share code, notes, and snippets.

@geekman
Created January 17, 2017 02:47
Show Gist options
  • Save geekman/5bdb5abdc9ec6ac91d5646de0c0c60c4 to your computer and use it in GitHub Desktop.
Save geekman/5bdb5abdc9ec6ac91d5646de0c0c60c4 to your computer and use it in GitHub Desktop.
Pi Zero multiple USB gadgets minimal example
#!/bin/bash -e
modprobe libcomposite
cd /sys/kernel/config/usb_gadget/
mkdir g && cd g
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB 2.0
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
mkdir -p strings/0x409
echo "deadbeef00115599" > strings/0x409/serialnumber
echo "irq5 labs" > strings/0x409/manufacturer
echo "Pi Zero Gadget" > strings/0x409/product
mkdir -p functions/acm.usb0 # serial
mkdir -p functions/rndis.usb0 # network
mkdir -p configs/c.1
echo 250 > configs/c.1/MaxPower
ln -s functions/rndis.usb0 configs/c.1/
ln -s functions/acm.usb0 configs/c.1/
# OS descriptors
echo 1 > os_desc/use
echo 0xcd > os_desc/b_vendor_code
echo MSFT100 > os_desc/qw_sign
echo RNDIS > functions/rndis.usb0/os_desc/interface.rndis/compatible_id
echo 5162001 > functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id
ln -s configs/c.1 os_desc
udevadm settle -t 5 || :
ls /sys/class/udc/ > UDC
# /usr/lib/systemd/system/myusbgadget.service
[Unit]
Description=My USB gadget
After=systemd-modules-load.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/myusbgadget
[Install]
WantedBy=sysinit.target
@rundekugel
Copy link

rundekugel commented Jun 17, 2021

For the network part, try this:
https://github.com/rundekugel/USBGadgetNetwork

It combines CDC/ECM and RNDIS
It works for Windows10 / Linux and MACos

I didn't try to add additional cdc/acm, but I think, it should work on most OS.

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