M350b版本
This commit is contained in:
159
mountrndis.sh
Normal file
159
mountrndis.sh
Normal file
@ -0,0 +1,159 @@
|
||||
#!/bin/bash
|
||||
apt-get install bridge-utils
|
||||
rmmod g_mass_storage
|
||||
|
||||
|
||||
# 定义USB Gadget的根目录
|
||||
GADGET_ROOT="/sys/kernel/config/usb_gadget/nanopi"
|
||||
|
||||
# *** 重要:请根据你的实际情况修改这个值! ***
|
||||
# 你可以通过运行 'ls /sys/class/udc/' 命令来查看可用的 UDC 设备名称。
|
||||
# 常见的名称有:musb-hdrc.0, musb-hdrc.4.auto, ci_hdrc.0, 20a00000.usb
|
||||
UDC_DEVICE="musb-hdrc.4.auto"
|
||||
|
||||
# 确保脚本以root权限运行
|
||||
if [ "$(id -u)" -ne 0 ]; then
|
||||
echo "This script must be run as root. Please run with 'sudo'."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "--------------------------------------"
|
||||
echo "Configuring USB Gadget for RNDIS Only"
|
||||
echo "--------------------------------------"
|
||||
|
||||
# 1. 卸载并清理旧的 gadget 配置 (可选,但推荐在测试时使用以确保干净状态)
|
||||
if [ -d "${GADGET_ROOT}" ]; then
|
||||
echo "Disabling existing gadget '${GADGET_ROOT##*/}'..."
|
||||
# 尝试解绑当前的 UDC (如果已经绑定)
|
||||
# 这需要先进入 gadget 目录,然后才能 echo "" > UDC
|
||||
if [ -f "${GADGET_ROOT}/UDC" ]; then
|
||||
current_udc=$(cat "${GADGET_ROOT}/UDC")
|
||||
if [ -n "$current_udc" ]; then
|
||||
echo "Unbinding ${current_udc} from previous gadget..."
|
||||
echo "" > "${GADGET_ROOT}/UDC" # 解绑 UDC
|
||||
sleep 1
|
||||
fi
|
||||
fi
|
||||
rm -rf "${GADGET_ROOT}" # 删除所有旧的配置
|
||||
echo "Old gadget configuration removed."
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
# 2. 进入 gadget 根目录并创建
|
||||
echo "Creating new gadget configuration at ${GADGET_ROOT}..."
|
||||
mkdir -p "${GADGET_ROOT}"
|
||||
cd "${GADGET_ROOT}" || { echo "ERROR: Failed to cd to ${GADGET_ROOT}. Exiting."; exit 1; }
|
||||
|
||||
# 3. 设置设备描述符
|
||||
echo "Setting device descriptors..."
|
||||
echo 0x0955 > idVendor # FriendlyElec's Vendor ID (or your preferred)
|
||||
echo 0x7020 > idProduct # Product ID for NanoPi-NEO-Core (or your preferred)
|
||||
echo 0x0100 > bcdDevice # Device Version 1.0 (0x0100)
|
||||
echo 0x0200 > bcdUSB # USB 2.0 (0x0200)
|
||||
|
||||
# RNDIS 复合设备通常使用特定的设备类/子类/协议
|
||||
echo 0xEF > bDeviceClass # Miscellaneous Device Class
|
||||
echo 0x02 > bDeviceSubClass # Common Class
|
||||
echo 0x01 > bDeviceProtocol # Interface Association Descriptor (IAD)
|
||||
|
||||
# 4. 设置字符串描述符
|
||||
echo "Setting string descriptors (Manufacturer, Product, Serial)..."
|
||||
mkdir -p strings/0x409 # English (0x409)
|
||||
|
||||
# 获取设备树中的序列号,如果没有则使用默认值
|
||||
if [ -f /proc/device-tree/serial-number ]; then
|
||||
serialnumber="$(cat /proc/device-tree/serial-number|tr -d '\000')"
|
||||
else
|
||||
serialnumber="1234567890ABCD" # Default serial number
|
||||
fi
|
||||
echo "${serialnumber}" > strings/0x409/serialnumber
|
||||
echo "FriendlyElec" > strings/0x409/manufacturer
|
||||
echo "NanoPi-NEO-Core" > strings/0x409/product
|
||||
|
||||
# 5. 创建配置 c.1
|
||||
echo "Creating configuration 'c.1'..."
|
||||
cfg="configs/c.1"
|
||||
mkdir -p "${cfg}/strings/0x409"
|
||||
echo 0x80 > "${cfg}/bmAttributes" # Self-powered
|
||||
echo 250 > "${cfg}/MaxPower" # Max power consumption (250mA)
|
||||
echo "RNDIS Ethernet" > "${cfg}/strings/0x409/configuration" # Configuration description
|
||||
|
||||
# 6. 配置 RNDIS 功能
|
||||
echo "Enabling RNDIS function (rndis.usb0)..."
|
||||
func_rndis="functions/rndis.usb0"
|
||||
mkdir -p "${func_rndis}"
|
||||
ln -sf "${func_rndis}" "${cfg}" # Link RNDIS function to configuration c.1
|
||||
|
||||
# RNDIS OS Descriptors for Windows auto-detection
|
||||
echo "Setting RNDIS OS Descriptors..."
|
||||
echo 1 > os_desc/use
|
||||
echo 0xcd > os_desc/b_vendor_code
|
||||
echo MSFT100 > os_desc/qw_sign
|
||||
echo "RNDIS" > "${func_rndis}/os_desc/interface.rndis/compatible_id"
|
||||
echo "5162001" > "${func_rndis}/os_desc/interface.rndis/sub_compatible_id"
|
||||
ln -sf "${cfg}" os_desc # Link configuration c.1 to os_desc
|
||||
|
||||
# 7. 绑定到 UDC 以激活 Gadget
|
||||
echo "Activating USB Gadget on UDC: ${UDC_DEVICE}..."
|
||||
# Check if UDC device exists in /sys/class/udc/
|
||||
if [ -e "/sys/class/udc/${UDC_DEVICE}" ]; then
|
||||
echo "${UDC_DEVICE}" > UDC
|
||||
echo "USB Gadget successfully activated."
|
||||
else
|
||||
echo "ERROR: UDC device '${UDC_DEVICE}' not found in /sys/class/udc/."
|
||||
echo " Please check your UDC_DEVICE variable and 'ls /sys/class/udc/' output."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 8. 配置 RNDIS 网络接口
|
||||
echo "Configuring RNDIS network interface (usb0)..."
|
||||
NET_IP="192.168.55.1"
|
||||
NET_MASK="255.255.255.0"
|
||||
|
||||
# 等待 usb0 接口出现
|
||||
echo "Waiting for 'usb0' interface to appear..."
|
||||
interface_ready=0
|
||||
for i in $(seq 1 10); do # 等待最多10秒
|
||||
if ip link show usb0 &> /dev/null; then
|
||||
echo "'usb0' interface found."
|
||||
interface_ready=1
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ "$interface_ready" -eq 0 ]; then
|
||||
echo "ERROR: 'usb0' interface did not appear after 10 seconds. RNDIS network configuration failed."
|
||||
echo " Check kernel modules (g_ether, usb_f_rndis) and dmesg for errors."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查并安装 bridge-utils (如果需要)
|
||||
if ! command -v brctl &> /dev/null; then
|
||||
echo "WARNING: 'brctl' command not found. Please install 'bridge-utils' package."
|
||||
echo " (e.g., 'sudo apt install bridge-utils' on Debian/Ubuntu)"
|
||||
# 如果没有 brctl,尝试直接配置 usb0 接口,但不推荐
|
||||
echo "Attempting to configure 'usb0' directly (without bridge)..."
|
||||
ifconfig usb0 "${NET_IP}" netmask "${NET_MASK}" up
|
||||
echo "RNDIS network configured to ${NET_IP} on usb0 directly."
|
||||
else
|
||||
# 清理旧的桥接设备 (如果存在)
|
||||
if ip link show zzbr0 &> /dev/null; then
|
||||
echo "Removing existing bridge 'zzbr0'..."
|
||||
brctl delbr zzbr0
|
||||
fi
|
||||
|
||||
brctl addbr zzbr0 # 创建一个名为 zzbr0 的网络桥接
|
||||
ifconfig zzbr0 "${NET_IP}" netmask "${NET_MASK}" up # 配置桥接接口的IP地址
|
||||
brctl addif zzbr0 usb0 # 将 RNDIS 接口 usb0 添加到桥接
|
||||
ifconfig usb0 up # 确保 usb0 接口被激活
|
||||
|
||||
echo "RNDIS network configured to ${NET_IP} on 'zzbr0' (bridging 'usb0')."
|
||||
fi
|
||||
|
||||
echo "--------------------------------------"
|
||||
echo "USB Gadget RNDIS setup complete."
|
||||
echo "Connect your device to a PC."
|
||||
echo "--------------------------------------"
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user