I tried to use USB tethering on my OP6: not working at all (interface stays in MTP mode).
I found that RNDIS mode was just not implemented in /usr/share/usbinit/setupusb
... snif...
So I modified (with success) /usr/share/usbinit/setupusb
:
#!/bin/sh
CONFIG_FS=/sys/kernel/config
CONFIG_DIR=$CONFIG_FS/usb_gadget/
GADGET_DIR=$CONFIG_DIR/g1
CONFIG_NAME="c.1"
SERIALNUMBER=`getprop ro.serialno` # e.g. "0123456789ABCDEF"
MANUFACTURER=`getprop ro.product.vendor.manufacturer` # e.g. "Volla"
PRODUCT=`getprop ro.product.vendor.model` # e.g. "Phone"
CONTROLLER=`getprop sys.usb.controller` # e.g. "musb-hdrc"
write() {
test -w "$1" || return
printf "$2" > "$1"
}
symlink() {
ln -s "$1" "$2"
}
reset_usb() {
rm -f $GADGET_DIR/configs/$CONFIG_NAME/mtp.gs0
rm -f $GADGET_DIR/configs/$CONFIG_NAME/ffs.adb
rm -f $GADGET_DIR/configs/$CONFIG_NAME/rndis.usb0
}
setup_rndis() {
reset_usb
write $GADGET_DIR/configs/$CONFIG_NAME/strings/0x409/configuration "rndis"
symlink $GADGET_DIR/functions/rndis.usb0 $GADGET_DIR/configs/$CONFIG_NAME/
write $GADGET_DIR/UDC $CONTROLLER
setprop sys.usb.state rndis
}
setup_mtp() {
reset_usb
write $GADGET_DIR/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "mtp"
write $GADGET_DIR/configs/$CONFIG_NAME/strings/0x409/configuration "mtp"
symlink $GADGET_DIR/functions/mtp.gs0 $GADGET_DIR/configs/$CONFIG_NAME/
write $GADGET_DIR/UDC $CONTROLLER
setprop sys.usb.state mtp
}
setup_mtp_adb() {
reset_usb
write $GADGET_DIR/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "mtp_adb"
write $GADGET_DIR/configs/$CONFIG_NAME/strings/0x409/configuration "mtp_adb"
symlink $GADGET_DIR/functions/mtp.gs0 $GADGET_DIR/configs/$CONFIG_NAME/
symlink $GADGET_DIR/functions/ffs.adb $GADGET_DIR/configs/$CONFIG_NAME/
start android-tools-adbd
sleep 2
write $GADGET_DIR/UDC $CONTROLLER
setprop sys.usb.state mtp,adb
}
setup_boot() {
if [ -e $GADGET_DIR/functions/mtp.gs0 ]; then
echo "Boot setup done"
return
fi
if ! mount | grep -q "$CONFIG_FS"; then
mount -t configfs none $CONFIG_FS
mkdir -p $GADGET_DIR/strings/0x409
mkdir -p $GADGET_DIR/functions/rndis.usb0
mkdir -p $GADGET_DIR/configs/$CONFIG_NAME/strings/0x409
fi
write $GADGET_DIR/idVendor 0x18D1
write $GADGET_DIR/bcdDevice 0x0223
write $GADGET_DIR/bcdUSB 0x0200
write $GADGET_DIR/os_desc/use 1
write $GADGET_DIR/os_desc/b_vendor_code 0x1
write $GADGET_DIR/os_desc/qw_sign "MSFT100"
write $GADGET_DIR/strings/0x409/serialnumber $SERIALNUMBER
write $GADGET_DIR/strings/0x409/manufacturer $MANUFACTURER
write $GADGET_DIR/strings/0x409/product $PRODUCT
mkdir -p $GADGET_DIR/functions/mtp.gs0
mkdir -p $GADGET_DIR/functions/ffs.adb
symlink $GADGET_DIR/configs/$CONFIG_NAME $GADGET_DIR/os_desc/$CONFIG_NAME
mkdir -p /dev/usb-ffs/adb
mount -t functionfs -o uid=32011,gid=32011 adb /dev/usb-ffs/adb
chown root:plugdev /dev/usb-ffs
chmod 775 /dev/usb-ffs
chown root:plugdev /dev/usb-ffs/adb
chmod 775 /dev/usb-ffs/adb
chown root:plugdev /dev/mtp_usb
chmod 660 /dev/mtp_usb
}
setup_boot
if [ "$1" = "rndis" ]; then
setup_rndis
elif [ "$1" = "mtp" ]; then
setup_mtp
elif [ "$1" = "mtp_adb" ]; then
setup_mtp_adb
else
echo "No configuration selected."
fi
exit 0
and /usr/bin/tethering
:
#! /bin/sh
NMCONF=/etc/NetworkManager/system-connections/tethering
init_interface(){
bash /usr/share/usbinit/setupusb reset
bash /usr/share/usbinit/setupusb rndis
ifconfig rndis0 up
}
enable(){
MAC="$(ip -o link show rndis0 |sed -e 's/^.*ether //'|cut -d' ' -f1)"
UUID=ca16a21d-7d8b-4b49-926e-"$(echo $MAC|sed -e 's/://g')"
STAMP=$(date +%s)
if [ ! -e $NMCONF ];then
cat << EOF >$NMCONF
[802-3-ethernet]
duplex=full
mac-address=$MAC
[connection]
id=tethering
uuid=$UUID
type=802-3-ethernet
timestamp=$STAMP
[ipv6]
method=auto
[ipv4]
method=shared
may-fail=false
EOF
else
sed -i s/^mac-address=.*/mac-address=${MAC}/ $NMCONF
sed -i s/^uuid=.*/uuid=${UUID}/ $NMCONF
sed -i s/^timestamp=.*/timestamp=${STAMP}/ $NMCONF
fi
chmod 0600 $NMCONF
sleep 2
nmcli c reload
nmcli c up id tethering
}
disable(){
nmcli c down id tethering || true
rm $NMCONF || true
initctl start mtp-state
}
case $1 in
enable)
init_interface
enable
;;
disable)
disable
;;
*)
echo "need an argument (enable|disable)"
exit 0
;;
esac
RNDIS is now fully usable with /usr/bin/tethering enable/disable
and with UT Tweak Tool.
Enjoy!