您尚未登录。

楼主 #1 2021-03-30 15:24:49

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

全志平台上通过configfs(libcomposite)配置RNDIS Gadget(u_ether)及Windows下的驱动

目前网上配置RNDIS Gadget的教程大部分是通过Precomposed Configurations (g_ether)的,通过configfs来配置gadget相对于Precomposed Configurations要更加麻烦,但稍微灵活一点,可以在用户空间动态设置设备的信息和功能啥的。昨晚我把configfs配置RNDIS gadget的方法添加到了Linux sunxi的USB Gadget/Ethernet Wiki页面上,不过是英文的。这贴里用中文简单介绍一下,并补充在Windows下驱动RNDIS gadget的方法。

离线

楼主 #2 2021-03-30 15:37:43

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

Re: 全志平台上通过configfs(libcomposite)配置RNDIS Gadget(u_ether)及Windows下的驱动

内核配置和编译

要开启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下。

离线

楼主 #3 2021-03-30 15:51:52

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

Re: 全志平台上通过configfs(libcomposite)配置RNDIS Gadget(u_ether)及Windows下的驱动

下面都是在设备上的操作了,正常使用gadget前要先加载模块再配置。

加载内核模块

配置gadget前要加载这些模块:

modprobe sunxi
modprobe configfs
modprobe libcomposite
modprobe u_ether
modprobe usb_f_rndis

懒得每次开机都手动加载的可以把模块的名字写到/etc/modules里。

configfs里的配置
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)

离线

楼主 #5 2021-03-30 16:02:07

SdtElectronics
会员
注册时间: 2020-07-27
已发帖子: 101
积分: 379.5
个人网站

Re: 全志平台上通过configfs(libcomposite)配置RNDIS Gadget(u_ether)及Windows下的驱动

Windows下的驱动

原生Linux连接gadget我还没试,据说是直接就能认的,我这里Windows10还认不了,设备管理器里会显示一个感叹号:
devmgmt
有两个办法解决,第一个是去这里下一个驱动,然后右键那个RNDIS点更新驱动程序,手动查找和安装,选择上面下载下来的文件解压出的目录就行了。
第二个方法,我后来查了一下,其实Windows10里有那两个id的INF,但是不知道为啥还是认不出来。那只好手动指定一下驱动了,还是右键那个RNDIS点更新驱动程序,手动查找和安装,但是之后选择“从计算机的可用驱动程序列表中选取”。然后选择“网络适配器”,之后的窗口里把“显示兼容硬件”的勾点掉。下面厂商里选择Microsoft,型号拖到最后,选“远程NDIS兼容设备”。这样也能装上,就是稍微有点麻烦,不过不用下载别的东西。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn