#!/bin/bash # Adapted from # "Using OTG mode on Raspberry Pi SBCs" # https://pip-assets.raspberrypi.com/categories/685-app-notes-guides-whitepapers/documents/RP-009276-WP/Using-OTG-mode-on-Raspberry-Pi-SBCs # This script only works if you are running it as root if [ $(id -u) -ne 0 ]; then echo "Please run as root or use sudo" exit 1 fi # Is the dwc2 overlay installed? Nothing will work if it isn't. if lsmod | grep -q "dwc2"; then echo "DWC2 module loaded, setting up OTG gadget serial and ethernet" | logger -t $0 -p info echo "DWC2 module loaded" else echo "DWC2 module missing. Aborting OTG setup." | logger -t $0 -p info echo "DWC2 module missing" systemctl disable serial-getty@ttyGS0.service exit 1 fi modprobe libcomposite cd /sys/kernel/config/usb_gadget if [ -d "MyGadget" ]; then echo "MyGadget already exists. Aborting OTG setup." | logger -t $0 -p info exit 1 fi # Create our new gadget mkdir MyGadget cd MyGadget # Add some boilerplate data that the gadget needs echo 0x1d6b > idVendor # Linux Foundation’s USB VID. Replace with your own VID if required echo 0x0104 > idProduct # Multifunction Composite Gadget echo 0x0100 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB2 mkdir strings/0x409 # 0x409 = English # Insert your own manufacturer and gadget name here echo "RaspberryPi" > strings/0x409/manufacturer echo "MyPiGadget" > strings/0x409/product # Make the serial number the same as the Raspberry Pi serial number; you can use whatever is required here SERIAL=`cat /proc/cpuinfo | awk '/Serial/ {print $3}' ` echo $SERIAL > strings/0x409/serialnumber # Create a configuration area and populate mkdir configs/c.1 echo 120 > configs/c.1/MaxPower mkdir configs/c.1/strings/0x409 echo "Config 1" > configs/c.1/strings/0x409/configuration # Create our specific gadget type ## Mass storage device ### Remember to create the storage block device first ## cd /root ### Example: Make a 256 MB file to act as "USB stick" ## Only create it once or it will delete the previous content ## sudo dd if=/dev/zero of=drive.bin bs=1M count=256 ### Create a VFAT file system on the backing store ## sudo mkfs.vfat drive.bin ## # mkdir functions/mass_storage.usb0 ## Set up our backing store # echo "/home/pi/drive.bin" > functions/mass_storage.usb0/lun.0/file ## Link our function to our configuration #ln -s functions/mass_storage.0 configs/c.1/ ## Serial (CDC ACM) mkdir functions/acm.usb0 ln -s functions/acm.usb0 configs/c.1/ ## Ethernet (RNDIS and ECM) ## Of note, this may cause the IP to show up as 127.0.0.1 ## and wireless to suddenly fail to connect mkdir functions/ecm.usb0 ln -s functions/ecm.usb0 configs/c.1/ ## USB Device Controller update UDC=`ls /sys/class/udc` echo $UDC > UDC # Enable the gettys systemctl enable serial-getty@ttyGS0.service