目前网上配置RNDIS Gadget的教程大部分是通过Precomposed Configurations (g_ether)的,通过configfs来配置gadget相对于Precomposed Configurations要更加麻烦,但稍微灵活一点,可以在用户空间动态设置设备的信息和功能啥的。昨晚我把configfs配置RNDIS gadget的方法添加到了Linux sunxi的USB Gadget/Ethernet Wiki页面上,不过是英文的。这贴里用中文简单介绍一下,并补充在Windows下驱动RNDIS gadget的方法。
离线
要开启configfs RNDIS Gadget功能需要在menuconfig中配置如下选项:
Device Drivers --->
[*] USB support --->
<M> Inventra Highspeed Dual Role Controller (TI, ADI, AW, ...)
MUSB Mode Selection (Dual Role mode) --->
*** Platform Glue Layer ***
<M> Allwinner (sunxi)
*** MUSB DMA mode ***
[*] Disable DMA (always use PIO)
USB Physical Layer drivers --->
<M> NOP USB Transceiver Driver
<M> USB Gadget Support --->
<M> USB Gadget functions configurable through configfs
[*] RNDIS
有人说还要开启libcomposite和configfs的支持,不过我这里貌似默认已经勾选了,没做额外操作也可以。
在全志全平台通用的defconfig基础上配置好的Kconfig我发布在了Github上,懒得自己配置的也可以直接用这个:
https://github.com/SdtElectronics/sun7i-std-dvr/blob/master/src/.config
然后重新编译内核和模块就行了。不知道怎么编译的可以参考sunxi Wiki上的Kernel Compilation
编译好之后把内核放到boot分区,然后把对应内核的模块目录放到/lib/modules下。
离线
下面都是在设备上的操作了,正常使用gadget前要先加载模块再配置。
配置gadget前要加载这些模块:
modprobe sunxi
modprobe configfs
modprobe libcomposite
modprobe u_ether
modprobe usb_f_rndis
懒得每次开机都手动加载的可以把模块的名字写到/etc/modules里。
cd /sys/kernel/config/usb_gadget
mkdir g1
cd g1
echo "0x0502" > idVendor
echo "0x3235" > idProduct
mkdir functions/rndis.rn0
mkdir configs/c1.1
ln -s functions/rndis.rn0 configs/c1.1/
这里idVendor和idProduct是让host的操作系统识别gadget的,不过我的Windows10直接认不了这两个id,所以后面还要解决驱动问题。按说把这两个id改成Windows的RNDIS驱动兼容的就不用另外搞驱动了,但我懒得去找Windows自带的驱动兼容哪些id了。
配置完之后终于可以开启gadget了:
echo <udc name> > UDC
<udc name>要换成
ls /sys/class/udc/
看到的文件名。我这里的名称是musb-hdrc.1.auto。这步做完,host电脑上应该能识别出来一个新设备了,识别正不正确另说。
要是不想启用gadget功能了还能这样关掉:
echo "" > UDC
把以下内容加入到/etc/network/interfaces
iface usb0 inet static
address 192.168.137.2
netmask 255.255.255.0
network 192.168.137.0
broadcast 192.168.137.255
gateway 192.168.137.1
选择192.168.137.x网段是因为Windows网卡间共享网络就是在这个网段,你可以根据自己需求修改。然后
ifconfig usb0 up
这时候再ifconfig一下应该能看到usb0这个interface了。
最近编辑记录 SdtElectronics (2021-03-30 16:03:05)
离线
原生Linux连接gadget我还没试,据说是直接就能认的,我这里Windows10还认不了,设备管理器里会显示一个感叹号:
有两个办法解决,第一个是去这里下一个驱动,然后右键那个RNDIS点更新驱动程序,手动查找和安装,选择上面下载下来的文件解压出的目录就行了。
第二个方法,我后来查了一下,其实Windows10里有那两个id的INF,但是不知道为啥还是认不出来。那只好手动指定一下驱动了,还是右键那个RNDIS点更新驱动程序,手动查找和安装,但是之后选择“从计算机的可用驱动程序列表中选取”。然后选择“网络适配器”,之后的窗口里把“显示兼容硬件”的勾点掉。下面厂商里选择Microsoft,型号拖到最后,选“远程NDIS兼容设备”。这样也能装上,就是稍微有点麻烦,不过不用下载别的东西。
离线