92 lines
2.5 KiB
Bash
92 lines
2.5 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
CONFIGFS=/sys/kernel/config/usb_gadget/g1
|
||
|
USB_VENDORID="0x1D6B" # Linux Foundation
|
||
|
USB_PRODUCTID="0x0104" # Multifunction composite gadget
|
||
|
USB_MANUF="Manjaro"
|
||
|
USB_PRODUCT="Manjaro"
|
||
|
USB_SERIAL=`cat /etc/machine-id`
|
||
|
|
||
|
setup() {
|
||
|
# Don't do anything if the USB gadget already exists
|
||
|
[ -d $CONFIGFS ] && exit 0
|
||
|
|
||
|
# Required to make a composite gadget
|
||
|
modprobe libcomposite
|
||
|
|
||
|
# Create all required directories
|
||
|
echo "Creating the USB gadget..."
|
||
|
mkdir -p $CONFIGFS
|
||
|
mkdir -p $CONFIGFS/strings/0x409
|
||
|
mkdir -p $CONFIGFS/configs/c.1
|
||
|
mkdir -p $CONFIGFS/configs/c.1/strings/0x409
|
||
|
|
||
|
# Setup IDs and strings
|
||
|
echo "Setting up gadget strings..."
|
||
|
echo $USB_VENDORID > $CONFIGFS/idVendor
|
||
|
echo $USB_PRODUCTID > $CONFIGFS/idProduct
|
||
|
echo $USB_MANUF > $CONFIGFS/strings/0x409/manufacturer
|
||
|
echo $USB_PRODUCT > $CONFIGFS/strings/0x409/product
|
||
|
echo $USB_SERIAL > $CONFIGFS/strings/0x409/serialnumber
|
||
|
|
||
|
# Create ECM (ethernet) function
|
||
|
echo "Adding ECM function..."
|
||
|
mkdir $CONFIGFS/functions/ecm.usb0
|
||
|
|
||
|
# TODO: create RNDIS function for Windows compatibility
|
||
|
|
||
|
# Create MTP using FunctionFS
|
||
|
echo "Adding MTP function using FunctionFS..."
|
||
|
mkdir $CONFIGFS/functions/ffs.mtp
|
||
|
|
||
|
# Create configuration
|
||
|
echo "Creating gadget configuration..."
|
||
|
echo "Ethernet + MTP" > $CONFIGFS/configs/c.1/strings/0x409/configuration
|
||
|
ln -s $CONFIGFS/functions/ecm.usb0 $CONFIGFS/configs/c.1
|
||
|
ln -s $CONFIGFS/functions/ffs.mtp $CONFIGFS/configs/c.1
|
||
|
|
||
|
# Mount the MTP FunctionFS
|
||
|
echo "Mounting FunctionFS..."
|
||
|
mkdir -p /dev/ffs-mtp
|
||
|
mount -t functionfs mtp /dev/ffs-mtp
|
||
|
}
|
||
|
|
||
|
start() {
|
||
|
echo "Enabling the USB gadget..."
|
||
|
sleep 1
|
||
|
UDC=`ls /sys/class/udc`
|
||
|
echo "$UDC" > $CONFIGFS/UDC
|
||
|
}
|
||
|
|
||
|
reset() {
|
||
|
echo "Removing the USB gadget..."
|
||
|
|
||
|
# Remove USB gadget
|
||
|
if [ -d $CONFIGFS ]; then
|
||
|
echo "Removing gadget configuration..."
|
||
|
rm $CONFIGFS/configs/c.1/ffs.mtp
|
||
|
rm $CONFIGFS/configs/c.1/ecm.usb0
|
||
|
rmdir $CONFIGFS/configs/c.1/strings/0x409/
|
||
|
rmdir $CONFIGFS/configs/c.1/
|
||
|
rmdir $CONFIGFS/functions/ffs.mtp
|
||
|
rmdir $CONFIGFS/functions/ecm.usb0
|
||
|
rmdir $CONFIGFS/strings/0x409/
|
||
|
rmdir $CONFIGFS
|
||
|
fi
|
||
|
|
||
|
# Unmount FunctionFS and delete its mount point
|
||
|
if [ -d /dev/ffs-mtp ]; then
|
||
|
echo "Unmounting FunctionFS..."
|
||
|
umount /dev/ffs-mtp
|
||
|
rmdir /dev/ffs-mtp
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
|
||
|
case "$1" in
|
||
|
reset) reset ;;
|
||
|
setup) setup ;;
|
||
|
start) start ;;
|
||
|
*) ;;
|
||
|
esac
|