brax3-ubports/overlay/system/usr/bin/usb-tethering
erascape 59281ccd87 initial brax3 device makefiles
* boots and works fine

Signed-off-by: erascape <erascape@proton.me>
2025-09-24 08:38:38 +00:00

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 $?