#!/bin/zsh
export cmd=$1
export name=$2
export vid=0x$3
export pid=0x$4
export manufacturer=$5
export serial=$6
export product=$7
export initfunc=$8
export file=$9
export home=/sys/kernel/config/usb_gadget/$name
function init
{
if [ -d $home ];then
echo gadget $name already exists
return 1
else
mkdir -p $home/strings/0x409
echo $vid > $home/idVendor
echo $pid > $home/idProduct
echo $manufacturer > $home/strings/0x409/manufacturer
echo $serial > $home/strings/0x409/serialnumber
echo $product > $home/strings/0x409/product
mkdir -p $home/configs/c.1
case "$initfunc" in
hid)
hid
;;
storage)
storage $file
;;
acm)
acm
;;
*)
echo function $initfunc not implemented
return 2
;;
esac
fi
}
function hid
{
mkdir -p $home/functions/hid.usb0
echo 1 > $home/functions/hid.usb0/protocol
echo 1 > $home/functions/hid.usb0/subclass
echo 8 > $home/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 > $home/functions/hid.usb0/report_desc
ln -s $home/functions/hid.usb0 $home/configs/c.1
echo `ls /sys/class/udc|head -n 1` > $home/UDC 
}
function storage
{
export file=$1
mkdir -p $home/functions/mass_storage.usb0
echo 1 > $home/functions/mass_storage.usb0/stall
echo 0 > $home/functions/mass_storage.usb0/lun.0/cdrom
echo 0 > $home/functions/mass_storage.usb0/lun.0/ro
echo 0 > $home/functions/mass_storage.usb0/lun.0/nofua
echo $file > $home/functions/mass_storage.usb0/lun.0/file
ln -s $home/functions/mass_storage.usb0 $home/configs/c.1
echo `ls /sys/class/udc|head -n 1` > $home/UDC 
}
function acm
{
mkdir -p $home/functions/acm.usb0
ln -s $home/functions/acm.usb0 $home/configs/c.1
}
function rm
{
find $home -delete 2>/dev/null
}
case "$cmd" in
init)
init
;;
rm)
rm
;;
esac
