Files
airborne_CO2/mountrndis.sh
2025-12-24 09:09:03 +08:00

160 lines
5.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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