https://gist.github.com/kbingham/c39c4cc7c20882a104c08df5206e2f9f
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 29 Jun 2019 09:02:28 +0000 (11:02 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 29 Jun 2019 09:02:28 +0000 (11:02 +0200)
uvc-gadget.sh [new file with mode: 0644]

diff --git a/uvc-gadget.sh b/uvc-gadget.sh
new file mode 100644 (file)
index 0000000..4b8a4f1
--- /dev/null
@@ -0,0 +1,227 @@
+#!/bin/sh
+
+# https://gist.github.com/kbingham/c39c4cc7c20882a104c08df5206e2f9f
+
+set -e
+#set -x
+
+CONFIGFS="/sys/kernel/config"
+GADGET="$CONFIGFS/usb_gadget"
+VID="0x0525"
+PID="0xa4a2"
+SERIAL="0123456789"
+MANUF=$(hostname)
+PRODUCT="UVC Gadget"
+
+USBFILE=/root/usbstorage.img
+
+BOARD=$(strings /proc/device-tree/model)
+
+case $BOARD in
+       "Renesas Salvator-X board based on r8a7795 ES1.x")
+               UDC_USB2=e6590000.usb
+               UDC_USB3=ee020000.usb
+
+               UDC_ROLE2=/sys/devices/platform/soc/ee080200.usb-phy/role
+               UDC_ROLE2=/dev/null #Not needed - always peripheral
+               UDC_ROLE3=/sys/devices/platform/soc/ee020000.usb/role
+
+               UDC=$UDC_USB2
+               UDC_ROLE=$UDC_ROLE2
+               ;;
+
+       "TI OMAP4 PandaBoard-ES")
+               UDC=`ls /sys/class/udc` # Should be musb-hdrc.0.auto
+               UDC_ROLE=/dev/null # Not needed - peripheral enabled
+               ;;
+
+       *)
+               UDC=`ls /sys/class/udc` # will identify the 'first' UDC
+               UDC_ROLE=/dev/null # Not generic
+               ;;
+esac
+
+echo "Detecting platform:"
+echo "  board : $BOARD"
+echo "  udc   : $UDC"     
+
+create_msd() {
+       # Example usage:
+       #       create_msd <target config> <function name> <image file>
+               #       create_msd configs/c.1 mass_storage.0 /root/backing.img
+       CONFIG=$1
+       FUNCTION=$2
+       BACKING_STORE=$3
+
+       if [ ! -f $BACKING_STORE ]
+       then
+               echo "\tCreating backing file"
+               dd if=/dev/zero of=$BACKING_STORE bs=1M count=32 > /dev/null 2>&1
+               mkfs.ext4 $USBFILE > /dev/null 2>&1
+               echo "\tOK"
+       fi
+
+        echo "\tCreating MSD gadget functionality"
+        mkdir functions/$FUNCTION
+        echo 1 > functions/$FUNCTION/stall
+        echo $BACKING_STORE > functions/$FUNCTION/lun.0/file
+        echo 1 > functions/$FUNCTION/lun.0/removable
+        echo 0 > functions/$FUNCTION/lun.0/cdrom
+
+        ln -s functions/$FUNCTION configs/c.1
+
+        echo "\tOK"
+}
+
+delete_msd() {
+       # Example usage:
+       #       delete_msd <target config> <function name>
+               #       delete_msd config/c.1 uvc.0
+       CONFIG=$1
+       FUNCTION=$2
+
+        echo "Removing Mass Storage interface : $FUNCTION"
+        rm -f $CONFIG/$FUNCTION
+        rmdir functions/$FUNCTION
+        echo "OK"
+}
+
+create_uvc() {
+       # Example usage:
+       #       create_uvc <target config> <function name>
+               #       create_uvc config/c.1 uvc.0
+       CONFIG=$1
+       FUNCTION=$2
+
+        echo " Creating UVC gadget functionality : $FUNCTION"
+        mkdir functions/$FUNCTION
+       mkdir -p functions/$FUNCTION/streaming/uncompressed/u/360p
+       cat <<EOF > functions/$FUNCTION/streaming/uncompressed/u/360p/dwFrameInterval
+666666
+1000000
+5000000
+EOF
+       mkdir functions/$FUNCTION/streaming/header/h
+       cd functions/$FUNCTION/streaming/header/h
+       ln -s ../../uncompressed/u
+       cd ../../class/fs
+       ln -s ../../header/h
+       cd ../../class/hs
+       ln -s ../../header/h
+       cd ../../../control
+       mkdir header/h
+       ln -s header/h class/fs
+       ln -s header/h class/ss
+       cd ../../../
+       echo 2048 > functions/$FUNCTION/streaming_maxpacket
+
+       ln -s functions/$FUNCTION configs/c.1
+}
+
+delete_uvc() {
+       # Example usage:
+       #       delete_uvc <target config> <function name>
+               #       delete_uvc config/c.1 uvc.0
+       CONFIG=$1
+       FUNCTION=$2
+
+        echo " Deleting UVC gadget functionality : $FUNCTION"
+       rm $CONFIG/$FUNCTION
+
+       rm functions/$FUNCTION/control/class/*/h
+       rm functions/$FUNCTION/streaming/class/*/h
+       rm functions/$FUNCTION/streaming/header/h/u
+       rmdir functions/$FUNCTION/streaming/uncompressed/u/360p
+       rmdir functions/$FUNCTION/streaming/uncompressed/u
+       rmdir functions/$FUNCTION/streaming/header/h
+       rmdir functions/$FUNCTION/control/header/h
+       rmdir functions/$FUNCTION
+}
+
+case "$1" in
+    start)
+        echo "Creating the USB gadget"
+        #echo "Loading composite module"
+        #modprobe libcomposite
+
+        echo "Creating gadget directory g1"
+        mkdir -p $GADGET/g1
+
+        cd $GADGET/g1
+        if [ $? -ne 0 ]; then
+            echo "Error creating usb gadget in configfs"
+            exit 1;
+        else
+            echo "OK"
+        fi
+
+       echo "Setting Vendor and Product ID's"
+        echo $VID > idVendor
+        echo $PID > idProduct
+        echo "OK"
+
+        echo "Setting English strings"
+        mkdir -p strings/0x409
+        echo $SERIAL > strings/0x409/serialnumber
+        echo $MANUF > strings/0x409/manufacturer
+        echo $PRODUCT > strings/0x409/product
+        echo "OK"
+
+       echo "Creating Config"
+        mkdir configs/c.1
+        mkdir configs/c.1/strings/0x409
+
+        echo "Creating functions..."
+       #create_msd configs/c.1 mass_storage.0 $USBFILE
+       create_uvc configs/c.1 uvc.0
+        echo "OK"
+
+
+        echo "Binding USB Device Controller"
+       echo $UDC > UDC
+       echo peripheral > $UDC_ROLE
+       cat $UDC_ROLE
+        echo "OK"
+        ;;
+
+    stop)
+        echo "Stopping the USB gadget"
+
+       set +e # Ignore all errors here on a best effort
+
+        cd $GADGET/g1
+
+        if [ $? -ne 0 ]; then
+            echo "Error: no configfs gadget found" 
+            exit 1;
+        fi
+
+        echo "Unbinding USB Device Controller"
+        grep $UDC UDC && echo "" > UDC
+        echo "OK"
+
+       delete_uvc configs/c.1 uvc.0
+       #delete_msd configs/c.1 mass_storage.0
+
+       echo "Clearing English strings"
+        rmdir strings/0x409
+        echo "OK"
+
+        echo "Cleaning up configuration"
+        rmdir configs/c.1/strings/0x409
+        rmdir configs/c.1
+        echo "OK"
+
+        echo "Removing gadget directory"
+        cd $GADGET
+        rmdir g1
+        cd /
+        echo "OK"
+
+        #echo "Disable composite USB gadgets"
+        #modprobe -r libcomposite
+        #echo "OK"
+        ;;
+    *)
+        echo "Usage : $0 {start|stop}"
+esac