Update for v2.1

This commit is contained in:
James Deng 2025-01-25 07:53:46 +08:00
parent 1ac1c1bcf0
commit b6a183ba87
2 changed files with 125 additions and 1 deletions

View file

@ -48,6 +48,14 @@ $ uvc-gadget-new
gadget-setup.sh rndis
```
另外最新脚本增加快捷运行 dhcp 服务器功能,依赖 busybox udhcpd只需要执行
```
gadget-setup.sh dhcp
```
就会自动为网卡配置ip地址并且支持给PC通过DHCP协议分配IP地址具体请查看脚本实现。
### PC端设置
目前最新版脚本已经支持Linux、Windows10下自动识别RNDIS设备驱动无需手动安装。
@ -55,6 +63,22 @@ gadget-setup.sh rndis
![img_v3_02dr_d968d898-83fe-4f63-a236-1dade8dc0c4g](20240819-112732.jpg)
## NCM
不同于RNDIS由微软维护NCM是USB-IF维护网络协议主流操作系统Linux,Windows 11,macOS等具备支持。
目前Windows 10的ncm驱动实现和Linux 6.6中ncm gadget兼容性不是最佳微软在Windows 11才进行修复。
```
gadget-setup.sh ncm
```
另外最新脚本增加快捷运行 dhcp 服务器功能,依赖 busybox udhcpd只需要执行
```
gadget-setup.sh dhcp
```
就会自动为网卡配置ip地址并且支持给PC通过DHCP协议分配IP地址具体请查看脚本实现。
## ADB
gadget-setup.sh 通用脚本集成了 ADB功能。

View file

@ -2,7 +2,7 @@
# In busybox ash, should use /bin/sh, but bianbu cannot use /bin/sh
name=`basename $0`
SCRIPT_VERSION="v0.5-SUPPORTROLESW"
SCRIPT_VERSION="v0.6-NCMDHCP"
CONFIG_FILE=$HOME/.usb_config
# USB Descriptors
@ -21,6 +21,10 @@ GFUNC_PATH=$GADGET_PATH/functions
GCONFIG=$GADGET_PATH/configs/c.1
[ "$USB_UDC" ] || USB_UDC=$(ls /sys/class/udc | awk "NR==1{print}")
# DHCP
MYNETMASK="255.255.255.0"
MYIP="192.168.36.101"
YOURIP="192.168.36.102"
# MSC Debug Ramdisk
RAMDISK_PATH=/var/sdcard
TMPFS_FOUND=`mount | grep tmpfs | grep -v devtmpfs | awk '{print $3}' | grep '/dev/shm' | wc -l`
@ -40,6 +44,7 @@ MSC_ARG=""
ADB=disabled
UVC=disabled
RNDIS=disabled
NCM=disabled
FUNCTION_CNT=0
DEBUG=
@ -66,6 +71,12 @@ usage()
echo -e "\tadb Android Debug Bridge over USB."
echo -e "\tuvc Webcam."
echo -e "\trndis RNDIS NIC function."
echo -e "\tncm NCM NIC function."
echo ""
echo -e "\tdhcp config busybox.udhcpd for NIC"
echo -e "\t func on usb0, NIC func need"
echo -e "\t to be configured first!"
echo ""
echo -e "\nSpacemiT gadget-setup tool $SCRIPT_VERSION"
echo ""
}
@ -475,6 +486,7 @@ rndis_link()
IFNAME=`cat $GFUNC_PATH/rndis.0/ifname`
gadget_info "rndis function enabled, mac(h): $HOST_ADDR, mac(g): $DEV_ADDR, ifname: $IFNAME."
gadget_info "execute ifconfig $IFNAME up to enable rndis iface."
gadget_info "run $name dhcp to start dhcp server, assign IP to your PC(debug only)"
}
rndis_unlink()
@ -489,6 +501,51 @@ rndis_clean()
g_remove $GFUNC_PATH/rndis.0
}
## NCM
ncm_config()
{
OVERRIDE_VENDOR_FOR_WINDOWS=$1
# create function instance
# functions/<f_function allowed>.<instance name>
# f_function allowed: ncm
mkdir -p $GFUNC_PATH/ncm.0
}
ncm_link()
{
echo 0xEF > $GADGET_PATH/bDeviceClass
echo 0x02 > $GADGET_PATH/bDeviceSubClass
echo 0x01 > $GADGET_PATH/bDeviceProtocol
echo 1 > $GADGET_PATH/os_desc/use
echo 0x1 > $GADGET_PATH/os_desc/b_vendor_code
echo "MSFT100" > $GADGET_PATH/os_desc/qw_sign
mkdir -p $GFUNC_PATH/ncm.0/os_desc/interface.ncm
echo WINNCM > $GFUNC_PATH/ncm.0/os_desc/interface.ncm/compatible_id
# echo 5162001 > $GFUNC_PATH/ncm.0/os_desc/interface.ncm/sub_compatible_id
echo 10 > $GFUNC_PATH/ncm.0/qmult
ln -s $GADGET_PATH/configs/c.1 $GADGET_PATH/os_desc/c.1
ln -s $GFUNC_PATH/ncm.0 $GCONFIG
HOST_ADDR=`cat $GFUNC_PATH/ncm.0/host_addr`
DEV_ADDR=`cat $GFUNC_PATH/ncm.0/dev_addr`
IFNAME=`cat $GFUNC_PATH/ncm.0/ifname`
gadget_info "ncm function enabled, mac(h): $HOST_ADDR, mac(g): $DEV_ADDR, ifname: $IFNAME."
gadget_info "execute ifconfig $IFNAME up to enable ncm iface."
gadget_info "run $name dhcp to start dhcp server, assign IP to PC(debug only)"
}
ncm_unlink()
{
[ -e $GFUNC_PATH/ncm.0/ifname ] && ifconfig `cat $GFUNC_PATH/ncm.0/ifname` down
g_remove $GADGET_PATH/os_desc/c.1
g_remove $GCONFIG/ncm.0
}
ncm_clean()
{
g_remove $GFUNC_PATH/ncm.0
}
## MTP
mtp_config()
@ -556,6 +613,9 @@ echo_udc()
gconfig()
{
# Override PID for function need driver install, windows sometimes cache vid/pid
[ $RNDIS = okay ] && PRODUC_ID=0x0020
[ $NCM = okay ] && PRODUC_ID=0x0019
gadget_info "config $VENDOR_ID/$PRODUC_ID/$SERNUM_STR/$MANUAF_STR/$PRODUC_STR."
mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config
[ -e $GADGET_PATH ] && die "ERROR: gadget already configured, should run stop first"
@ -572,6 +632,7 @@ gconfig()
mkdir $GCONFIG/strings/0x409
# Windows rndis driver requires rndis to be the first interface
[ $RNDIS = okay ] && rndis_config
[ $NCM = okay ] && ncm_config
[ $MSC = okay ] && msc_config
[ $UAS = okay ] && uas_config
[ $ADB = okay ] && adb_config
@ -584,6 +645,7 @@ gclean()
msc_clean
uas_clean
rndis_clean
ncm_clean
adb_clean
uvc_clean
# Remove string in gadget
@ -597,6 +659,7 @@ gclean()
glink()
{
[ $RNDIS = okay ] && rndis_link
[ $NCM = okay ] && ncm_link
[ $MSC = okay ] && msc_link
[ $UAS = okay ] && uas_link
[ $ADB = okay ] && adb_link
@ -607,6 +670,7 @@ gunlink()
{
[ -e $GADGET_PATH/UDC ] || die "gadget not configured yet"
rndis_unlink
ncm_unlink
msc_unlink
uas_unlink
adb_unlink
@ -649,6 +713,9 @@ select_one()
"rndis"|"network"|"net"|"if")
RNDIS=okay
;;
"ncm"|"cdc_ncm")
NCM=okay
;;
"mtp")
MTP=okay
;;
@ -690,6 +757,10 @@ gstart()
glink
[ $FUNCTION_CNT -lt 1 ] && die "No function selected, will not pullup."
echo_udc $1
## improve u_ether(rndis/ncm) performance
# echo "now enable usb0 rps, set rps_cpus to:"
# echo 70 > /sys/class/net/usb0/queues/rx-0/rps_cpus
# cat /sys/class/net/usb0/queues/rx-0/rps_cpus
}
gstop()
@ -790,6 +861,32 @@ set_role() {
}
}
config_dhcp()
{
rm -f /var/lib/misc/udhcpd.leases
gadget_info "old lease file destroyed (/var/lib/misc/udhcpd.leases)"
gadget_info "overriding /etc/udhcpd.conf..."
echo "start $YOURIP" > /etc/udhcpd.conf
echo "end $YOURIP" >> /etc/udhcpd.conf
echo "interface usb0" >> /etc/udhcpd.conf
echo "max_leases 1" >> /etc/udhcpd.conf
echo "pidfile /var/run/udhcpd.pid" >> /etc/udhcpd.conf
echo "lease_file /var/lib/misc/udhcpd.leases" >> /etc/udhcpd.conf
echo "opt router $MYIP" >> /etc/udhcpd.conf
echo "option subnet $MYNETMASK" >> /etc/udhcpd.conf
echo "option domain local" >> /etc/udhcpd.conf
echo "option lease 864000" >> /etc/udhcpd.conf
ifconfig usb0 down
ifconfig usb0 $MYIP netmask $MYNETMASK up
sleep 1
busybox udhcpd /etc/udhcpd.conf
gadget_info "udhcpcd now running..."
ps | grep udhcpd | grep -v grep
gadget_info "Configure your usb host ncm interface to dhcp mode"
gadget_info "The IP of USB host ncm iface: $YOURIP"
gadget_info "Our IP as router: $MYIP"
}
print_info()
{
echo "SpacemiT gadget-setup tool $SCRIPT_VERSION"
@ -841,6 +938,9 @@ case "$1" in
shift
set_role "$@"
;;
dhcp)
config_dhcp
;;
[a-z]*)
handle_select $1
gstart $2