136 lines
4.1 KiB
Bash
Executable file
136 lines
4.1 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
####
|
|
# Default profile
|
|
USB_IDVENDOR=0FCE
|
|
USB_IDPRODUCT=7169
|
|
USB_IPRODUCT="Unknown"
|
|
USB_ISERIAL="Unknown"
|
|
USB_IMANUFACTURER="GNU/Linux Device"
|
|
USB_IFACE=""
|
|
|
|
####
|
|
# Override profile
|
|
if [ -f /etc/default/hybris-device ]; then
|
|
source /etc/default/hybris-device
|
|
fi
|
|
|
|
ANDROID_USB=/sys/class/android_usb/android0
|
|
USB_FUNCTIONS=rndis
|
|
LOCAL_IP=10.15.19.82
|
|
GADGET_DIR=/sys/kernel/config/usb_gadget
|
|
|
|
write() {
|
|
echo -n "$2" > "$1"
|
|
}
|
|
|
|
# This sets up the USB with whatever USB_FUNCTIONS are set to via configfs
|
|
usb_setup_configfs() {
|
|
G_USB_ISERIAL=$GADGET_DIR/g1/strings/0x409/serialnumber
|
|
|
|
mkdir $GADGET_DIR/g1
|
|
write $GADGET_DIR/g1/idVendor "0x$USB_IDVENDOR"
|
|
write $GADGET_DIR/g1/idProduct "0x$USB_IDPRODUCT"
|
|
mkdir $GADGET_DIR/g1/strings/0x409
|
|
write $GADGET_DIR/g1/strings/0x409/serialnumber "$USB_ISERIAL"
|
|
write $GADGET_DIR/g1/strings/0x409/manufacturer "$USB_IMANUFACTURER"
|
|
write $GADGET_DIR/g1/strings/0x409/product "$USB_IPRODUCT"
|
|
|
|
if echo $USB_FUNCTIONS | grep -q "rndis"; then
|
|
mkdir $GADGET_DIR/g1/functions/rndis.usb0
|
|
mkdir $GADGET_DIR/g1/functions/rndis_bam.rndis
|
|
fi
|
|
echo $USB_FUNCTIONS | grep -q "mass_storage" && mkdir $GADGET_DIR/g1/functions/storage.0
|
|
|
|
mkdir $GADGET_DIR/g1/configs/c.1
|
|
mkdir $GADGET_DIR/g1/configs/c.1/strings/0x409
|
|
write $GADGET_DIR/g1/configs/c.1/strings/0x409/configuration "$USB_FUNCTIONS"
|
|
|
|
if echo $USB_FUNCTIONS | grep -q "rndis"; then
|
|
ln -s $GADGET_DIR/g1/functions/rndis.usb0 $GADGET_DIR/g1/configs/c.1
|
|
ln -s $GADGET_DIR/g1/functions/rndis_bam.rndis $GADGET_DIR/g1/configs/c.1
|
|
fi
|
|
echo $USB_FUNCTIONS | grep -q "mass_storage" && ln -s $GADGET_DIR/g1/functions/storage.0 $GADGET_DIR/g1/configs/c.1
|
|
|
|
# ls /sys/class/udc > $GADGET_DIR/g1/UDC
|
|
ls /sys/class/udc | grep -v dummy | head -1 > $GADGET_DIR/g1/UDC
|
|
}
|
|
|
|
# This sets up the USB with whatever USB_FUNCTIONS are set to via android_usb
|
|
usb_setup_android_usb() {
|
|
G_USB_ISERIAL=$ANDROID_USB/iSerial
|
|
write $ANDROID_USB/enable 0
|
|
write $ANDROID_USB/functions ""
|
|
write $ANDROID_USB/enable 1
|
|
usleep 500000 # 0.5 delay to attempt to remove rndis function
|
|
write $ANDROID_USB/enable 0
|
|
write $ANDROID_USB/idVendor $USB_IDVENDOR
|
|
write $ANDROID_USB/idProduct $USB_IDPRODUCT
|
|
write $ANDROID_USB/iManufacturer "$USB_IMANUFACTURER"
|
|
write $ANDROID_USB/iProduct "$USB_IPRODUCT"
|
|
write $ANDROID_USB/iSerial "$USB_ISERIAL"
|
|
write $ANDROID_USB/functions $USB_FUNCTIONS
|
|
write $ANDROID_USB/enable 1
|
|
}
|
|
|
|
# This determines which USB setup method is going to be used
|
|
usb_setup() {
|
|
mount -t configfs none /sys/kernel/config || true
|
|
|
|
if [ -d $ANDROID_USB ]; then
|
|
usb_setup_android_usb
|
|
elif [ -d $GADGET_DIR ]; then
|
|
usb_setup_configfs
|
|
fi
|
|
}
|
|
|
|
usb_info() {
|
|
sleep 1
|
|
write $G_USB_ISERIAL "$1"
|
|
echo "$1" >> /var/log/usb_info.log
|
|
}
|
|
|
|
ip_setup() {
|
|
local candidate
|
|
|
|
if [ -n "$USB_IFACE" ]; then
|
|
# If the specified interface fails, fallback to auto-detection.
|
|
ip link set dev "$USB_IFACE" up || USB_IFACE=""
|
|
fi
|
|
|
|
if [ -z "$USB_IFACE" ]; then
|
|
# Prioritise usb0 over rndis0. On some devices (e.g. Sony Xperia X),
|
|
# both would show up but only usb0 is usable. If, on some device, the
|
|
# opposite happens, then I don't know what to do.
|
|
for candidate in usb0 rndis0; do
|
|
if ip link set dev "$candidate" up; then
|
|
USB_IFACE="$candidate"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -z "$USB_IFACE" ]; then
|
|
usb_info "could not setup USB tethering!"
|
|
return 1
|
|
fi
|
|
|
|
ip address add "${LOCAL_IP}/24" dev "$USB_IFACE"
|
|
|
|
usb_info "$USB_IMANUFACTURER on $USB_IFACE $LOCAL_IP"
|
|
}
|
|
|
|
dhcpd_start() {
|
|
mkdir -p /run/hybris-usb
|
|
touch /run/hybris-usb/dhcpd4.leases
|
|
/usr/sbin/dhcpd -4 -q \
|
|
-cf /etc/hybris-usb/dhcpd.conf \
|
|
-pf /run/hybris-usb/dhcpd4.pid \
|
|
-lf /run/hybris-usb/dhcpd4.leases \
|
|
"$USB_IFACE"
|
|
}
|
|
|
|
usb_setup
|
|
ip_setup && dhcpd_start
|
|
|
|
exit $?
|