Linux指定某个USB口虚拟网卡

文章探讨了Linux系统中USB虚拟网卡的通信问题,特别是针对不能使用USB2作为虚拟网卡的情况。作者分析了LinuxUSB子系统框架,解释了设备驱动模型的三层结构,并指出在g_ether模块驱动中如何注册和绑定USB设备控制器。通过修改内核代码,使能指定udc_name,解决了绑定问题。经过编译和测试,实现了USB虚拟网卡在不同接口上的正确工作。
摘要由CSDN通过智能技术生成

        上一篇文章 Linux USB虚拟网卡多板级联通信_Dingdanjun798077632的博客-CSDN博客 中,虚拟网卡必须用USB0,可不可以用USB2虚拟网卡,当时的配置usb2也是用作peripheral(如下图),当时试了一下,接usb2是不行的。

后来想想为什么usb2不行,或者怎么修改可以使用usb2虚拟网卡,没有找到相关文章,那就自己分析内核代码吧。

以下第一部分Linux USB子系统框架,来自文章[图解linux][USB子系统系列]:图解USB设备驱动结构 - 灰信网(软件开发博客聚合) 分析代码需要,这里copy过来,在此说明。

一、Linux USB子系统框架

USB子系统分主机和设备两部分,usb虚拟网卡自然是属于设备部分。

Linux系统内核中早已集成了较为完善的USB协议栈,由于其规模庞大,包含多个类别的设备驱动,所以Linux系统中的USB协议栈也被称为USB子系统。

LINUX USB 设备驱动结构

Gadget驱动指的是运行在设备中的固件,也就是USB设备驱动模型。

Linux Gadget 三个软件层:

  1. USB设备控制器层
  2. Gadget设备层
  3. USB功能驱动层

完整的 USB设备端软件是由这三层软件层融合在一起来实现 USB 设备的功能,下面我们看下他们是如何串起来的。

在 USB 设备层定义了并初始化了一个结构体 struct usb_composite_driver。这个结构体中定义了一些函数指针,并且在 USB 设备层实现了这些函数。这些函数是融合 USB 设备层与上层软件功能驱动层的关键函数。数据结构只是完成了软件架构的构建, 如果需要融合还需 要函数的调用,在这里这个函数就是usb_composite_register。这个函数在 USB 设备层中实现,提供给上层软件功能驱动层来调用。当功能软件层调用这个函数成功后,USB 设备层与上层软件就融合在了一起,这个函数调用还触发了 USB 设备层调用 usb_gadget_register_driver,从而完成USB 设备层与下层软件的融合。这样三层软件都融合在了一起,组成了完整的 USB 设备端软件。

 

二、指定USB口用做虚拟网卡

代码分析

对照上面的框架分析代码USB虚拟网卡模块驱动g_ether入口代码,

 

 

 

        可以看到注册USB虚拟网卡模块驱动g_ether是,在usb_gadget_probe_driver函数中,调用udc_bind_to_driver将udc和g_ether driver关联(绑定)。代码1426行,如果driver有指定udc_name,则通过名字查找对应的udc(USB设备控制器,实际这段代码未起作用,应为usb_composite_probe函数中driver->gadget_driver设置为了composite_driver_template),如果没有udc_name则直接采用udc_list上的第一个注册到内核的udc,显然上面代码没有指定udc_name。

修改内核代码

        驱动绑定udc时,优先检查driver有没有指定udc_name(这段代码未起作用),自然也可以采用指定udc_name的方式,但是不同芯片厂商udc_name不一样,这大概是也内核中没这么做的原因吧。

        我们可以改一下代码,让udc_name配备起效,然后在g_ether中指定udc_name。

上面的udc_name 和dtsi usb_otg中对应,各个厂家都不一样。

编译下载测试

重新编译,重启开发板, Borad2做usb虚拟网卡设备端连接到Borad1 USB Host(也可以虚拟网卡设备连接到电脑)。

        Borad2做usb虚拟网卡设备端,上 ifconfig -a看到还是usb0虚拟网卡,其实这个usb0并不对应usb_otg0(想想下面的usb1做host,如果接个hub,再接5个usb网卡,难道5个网卡都叫usb1,显然不可能),这个名字是和驱动注册到内核顺序每次加1得到的。

        Borad1,USB Host端,usb0是网卡设备(和上面Borad2的一样),usb1是在接入Board2 usb_otg2口连接到Borad1 usb_otg1后,内核自动添加了(设备插入,枚举后主机端添加的usb设备),断开usb线,usb1就会自动删除,usb0一直存在。

ifconfig 配置IP后也可以ping通。

 

 对比修改前和修改后的日志,修改前g_ether绑定到udc 11c0000.usb

修改后,g_ether绑定到udc 1240000.usb

 不修改代码只修改dtb将usb_otg2移到usb_otg0前面好像也可以(简单试了一下可以,不确定)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值