usbnet_probe

CDC EEM-USB网络共享 客户用我们的台式Android 7 高通设备通过母口USB上网,开机一段时间内会出现ping不通的问题排查。 1.CDC EEM USB设备插入上位机时,会被usbnet_probe()识别为USB网卡设备,然后进一步被识别为CDC EEM设备,是根据CLASS=2,SUBCLASS=0x0c,PROTO=7来识别的。 CDC EEM设备: cdc_emm.c #define USB_CLASS_COMM 2 #define USB_CDC_SUBCLASS_EE. 阅读详情

https://www.daimajiaoliu.com/daima/3bfcb8152100407

1、驱动流程:

 

2、明确probe函数的功能:

probe有usb core 经枚举过程,匹配 id_table ,识别到驱动,并调用probe来初始化一些信息。

如 dev->driver_info = info 只是取得注册时的一些信息,用于一些比较特殊的设备,如bind 与收发与普通的网卡不同时,增加或减少一些配置。

主要做了:

 skb_queue_head_init (&dev->rxq);
skb_queue_head_init (&dev->txq);
skb_queue_head_init (&dev->done);

/*tasklet 软中断初始化,数据接收发送关键函数*/

 dev->bh.func = usbnet_bh;
dev->bh.data = (unsigned long) dev;

/*初始化关键队列,通过usbnet_defer_kevent 设置USB数据传输过程错误,并设置标志,调用schedule_work,提交到工作队列来处理错误事件*/
INIT_WORK (&dev->kevent, kevent);

/*内核定时器初始化,用来处理USB传输过程的一些错误,如一些CRC错误,调用mod_timer启动内核定时器*/
dev->delay.function = usbnet_bh;
dev->delay.data = (unsigned long) dev;
init_timer (&dev->delay);

初始化了三个队列,分别是发送 接收 处理;

1)数据发送完成后通过 defer_bh 函数移动到 done队列,触发软中断tasklet,来处理tx_done;

2)数据接收完成后 与发送数一样 通过 defer_bh 来处理rx_done,其中调用了netif_rx来提交数据到网络层。

 net->change_mtu = usbnet_change_mtu;
net->get_stats = usbnet_get_stats;
net->hard_start_xmit = usbnet_start_xmit;
net->open = usbnet_open;
net->stop = usbnet_stop; SET_NETDEV_DEV(net, &udev->dev);/*net关联usb接口*/
status = register_netdev (net);/*注册网络设备*/

需要注意的函数为 usbnet_start_xmit 与 usbnet_open 。

 

获取usb端点地址,有当前的配置获取bulk in out 的地址,用来收发数据,这部分过程可以参考usb-skeleton.c程序,不做详细介绍。

 

3、数据发送

其中 usbnet_start_xmit 为网卡发送函数,有上层调用send函数时,传下skb数据包。

在 usbnet_start_xmit 中,usb_alloc_urb (0, GFP_ATOMIC)分配内存---->usb_fill_bulk_urb (urb, dev->udev, dev->out,  skb->data, skb->len, tx_complete, skb) 填充urb----->usb_submit_urb (urb, GFP_ATOMIC)提交urb。

成功时__skb_queue_tail (&dev->txq, skb),在完成函数 tx_complete 函数中 会设置tx_done标志等,然后调用defer_bh来处理。

 

4、数据的接收

 

第一种可能:

这是这部分驱动中最难的一部分。接收数据关键起始点为 usbnet_open 函数,上层 通过 ifconfig usb0 up 时,open函数被调用了,open函数中 触发了软中断 tasklet_schedule();

static void usbnet_bh (unsigned long param)
{
struct usbnet  *dev = (struct usbnet *) param;
struct sk_buff  *skb;
struct skb_data  *entry;

 while ((skb = skb_dequeue (&dev->done))) {
entry = (struct skb_data *) skb->cb;
switch (entry->state) {
case rx_done:
entry->state = rx_cleanup;
rx_process (dev, skb);
continue;
case tx_done:
case rx_cleanup:
usb_free_urb (entry->urb);
dev_kfree_skb (skb);
continue;
default:
devdbg (dev, "bogus skb state %d", entry->state);
}
}

···

 if (netif_running (dev->net)
&& netif_device_present (dev->net)
&& !timer_pending (&dev->delay)
&& !test_bit (EVENT_RX_HALT, &dev->flags)) {
int temp = dev->rxq.qlen;
int qlen = RX_QLEN (dev);

  if (temp < qlen) {
struct urb *urb;
int  i;

**   for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) {
urb = usb_alloc_urb (0, GFP_ATOMIC);
if (urb != NULL)
rx_submit (dev, urb, GFP_ATOMIC);
}
**   if (temp != dev->rxq.qlen && netif_msg_link (dev))
devdbg (dev, "rxqlen %d --> %d",
temp, dev->rxq.qlen);
if (dev->rxq.qlen < qlen)
tasklet_schedule (&dev->bh);
}
···

}

个人认为蓝色部分为接收提供了4个urb来接收数据(full speed),从rx_complete 中可以看出,urb 没有数据时阻塞 ,该函数未被调用,然后数据进来时,urb又有数据,又调用了rx_submit来提交数据,

 

rx_complete 函数部分代码:

···

 defer_bh(dev, skb, &dev->rxq);  /*在complete函数完成时调用tasklet_bh*/

 

if (urb) {
if (netif_running (dev->net)
&& !test_bit (EVENT_RX_HALT, &dev->flags)) {

**   rx_submit (dev, urb, GFP_ATOMIC);       /*接收数据*/        
**   return;
}
···

第二种可能:

 

由第一种中 tasklet_bh  蓝色部分开始接收数,由于没有数据进来提交urb时,进入default 又开始调用tasklet,形成循环。

rx_submit部分代码:

···

 switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) {
case -EPIPE:
usbnet_defer_kevent (dev, EVENT_RX_HALT);
break;
case -ENOMEM:
usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
break;
case -ENODEV:
if (netif_msg_ifdown (dev))
devdbg (dev, "device gone");
netif_device_detach (dev->net);
break;
**  default:
if (netif_msg_rx_err (dev))
devdbg (dev, "rx submit, %d", retval);
tasklet_schedule (&dev->bh);
**   break;
case 0:
__skb_queue_tail (&dev->rxq, skb);
}

···

 

个人总结:

啃了一个礼拜终于啃完了,只是对urb的整体机制不够深入了解呀,但还是把usbnet给裁了,只支持bulk。欢迎技术交流呀!

奶奶的第一次写技术博客。不容易,希望对大家有帮助。USB驱动是个不错的东西。QQ:497067994

 

哥的处女请尊重原创!!!
USB linux NCM usbnet驱动详解 cdc_ncm -> usbnet device -> net_device enum流程,cdc_ncm的probe中直接调用usbnet_probe,usbnet_probe中会分配network_device和usbnet,并调用cdc_ncm的bind回调进行cdc_ncm的附加descriptor的解析,之后调用init_status对NCM的 第一个 阅读详情

相关推荐

Network 之十二 iPXE 源码、编译过程、Linker tables 机制、移植新驱动、固件使用

iPXE 是由最初开发 gPXE(从 Etherboot 演化而来)的人开发的,是 gPXE 的官方替代品。它具有 gPXE 的所有功能,用户可以从 gPXE 无缝升级到 iPXE。iPXE 是先前的 PXE 实现的超集,支持更多协议。

技术干货 3405

USB-NET说明

<br />1.    USB-NET说明<br />本分析是建立在linux2.6.20内核基础上。<br />2.    USB-NET系统结构图<br /><br />                             <br />a linux实现<br />    linux主要实现两个接口 – 发送接口(start_xmit) 和接收接口(netif_rx)<br />b windows实现<br />    Windows中主要对上实现minport,对下实现usb接口。可以修改ndis

zh98jm的专栏 8046

RK3399平台开发系列讲解(USB网卡)5.47、USBNET驱动模型

本篇章将介绍USBNET驱动模型

内核笔记 2913

usbnet驱动深入分析-usb虚拟网卡host端

1、驱动流程:   2、明确probe函数的功能: probe有usb core 经枚举过程,匹配 id_table ,识别到驱动,并调用probe来初始化一些信息。 如 dev->driver_info = info 只是取得注册时的一些信息,用于一些比较特殊的设备,如bind 与收发与普通的网卡不同时,增加或减少一些配置。 主要做了:  skb_queue_head_init

zh98jm的专栏 1万+

LSTM时间序列预测实战:从RNN梯度消失到Python代码实现

循环神经网络(RNN)的梯度消失问题让长期依赖建模变得困难,而LSTM通过输入门、遗忘门、输出门组成的门控机制,为时间序列预测提供了稳定有效的解决方案。在销量预测、电力负荷预测、客流预测等典型场景中,LSTM能捕捉序列中的长期模式,但实际工程落地还需处理数据切分、归一化、多步预测等关键细节。本文从时间序列预测的基础概念出发,结合Python与Keras实现,完整演示了滑动窗口构造、多层LSTM搭建、训练评估、模型固化以及预测误差规避的流程,并总结了数据泄漏、误差累积等常见陷阱的排查方法,帮助开发者将LSTM

weixin_34006468的博客 426

usbnet 源码分析

linux 2.6.20上的usbnet源码分析,包括初始化和接收/发送流程。

usbnet驱动深入分析-usb虚拟网卡host端【转】

转自:http://blog.csdn.net/zh98jm/article/details/6339320 1、驱动流程:   2、明确probe函数的功能: probe有usb core 经枚举过程,匹配 id_table ,识别到驱动,并调用probe来初始化一些信息。 如 dev-&gt;driver_info = info 只是取得注册时的一些信息,用于一些比较特殊的设...

weixin_34185560的博客 281

LabVIEW 调用MATLAB 进行图像处理的实现

程机械及设备的变形、振动、冲击、粗糙度、刚度和强度等特性,还可用在土木结构、水利设施的变形测量[4][5]。因此,该技术在机械、土木、水利、电器、航空航天、兵器工业及生物医学等领域的检测中具有非常重要的地位。将物面前方空间的散斑用摄像设备记录下来,当物体运动或由于受力而变形时,这些随机分布的散斑图也随之在空间按一定的规律运动,因此能用记录的散斑图在计算机上分析物体的运动和变形,这就是电子散斑技术。当物体的漫反射表面被激光照射时,漫反射的光波在物体表面的前方相互干涉,由于漫反射光的。

qq_37971227的博客 3873

linux usbnet驱动

工作中接触了USB转网口设备,通过USB口连接到电视盒子上,会被识别成一个网卡,遇到USB转网口无法获取IP的问题,学习和调试了这部分usb host端的usbnet驱动,进行一下总结。 USB host端的驱动,包括usb host controller(如xhci, ehci), usb core(负责usb设备插入识别,枚举,设备与驱动匹配), usb driver (具体某种USB设备...

linken_yue的博客 3360

从零开始:使用Mask2Former训练你的专属数据集

本文详细介绍了如何从零开始使用Mask2Former训练自定义数据集。内容涵盖环境搭建、数据准备(将LabelMe格式转换为COCO格式)、数据集注册与模型配置、训练启动与调试,以及最终的模型推理与应用。通过实战步骤和常见问题解决方案,帮助读者掌握使用Mask2Former进行实例分割的核心流程,实现专属模型的训练与部署。

weixin_28678151的博客 440

告别连接难题:Windows 11下Multisim主数据库稳定运行终极配置指南

本文详细解析了Windows 11下Multisim 14.0主数据库连接失败的三大根源,并提供了四步终极解决方案,包括系统环境优化、软件权限配置、注册表修复和网络验证绕过技巧。通过实测数据对比,本方案显著提升了启动速度和稳定性,解决了电子仿真中的常见连接问题。

weixin_33738555的博客 430

记录:Android 下 USB 网卡修改 MAC 后,接口名从 eth1 变成 usb0 的原因分析

记录:Android 下 USB 网卡修改 MAC 后,接口名从 eth1 变成 usb0 的原因分析

OIDCAT的博客 443

ArcGIS Pro 3.0 加载天地图WMTS服务,解决偏移问题的保姆级教程(附最新Key申请流程)

本文详细介绍了在ArcGIS Pro 3.0中精准加载天地图WMTS服务的全流程,包括最新Key申请流程、解决地图偏移问题的关键配置步骤以及常见问题排查方法。通过设置`esri`参数和统一坐标参考,确保地理数据与天地图底图精确匹配,提升GIS空间分析的准确性。

weixin_28713947的博客 302

linux ncm网络性能优化,USB linux NCM usbnet驱动详解

cdc_ncm -> usbnet device -> net_deviceenum流程,cdc_ncm的probe中直接调用usbnet_probe,usbnet_probe中会分配network_device和usbnet,并调用cdc_ncm的bind回调进行cdc_ncm的附加descriptor的解析,之后调用init_status对NCM的第一个interface的inte...

weixin_42237496的博客 1001

SAP UI5 控件剖析系列之 sap.m.DatePicker:单日选择的工程化用法、最佳实践与常见坑

在 SAP UI5 的输入控件族里,是最常被使用的日期选择控件。它把一个可编辑的输入框与一个弹出的日历整合在一起,允许用户用触摸、鼠标或键盘在本地化格式下选择某一天;控件既可以从弹出的日历里点选,也可以直接在输入框里键入日期。官方 Fiori 设计规范对它的定位就是:完成单个日期的选择,不牵涉时间,也不负责跨天的范围选择。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 341

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1684

[usb]安卓内核 linux4.9.188 usb网络部分解读

usb 网络部分

赵撵猪的博客 749

手把手打通全流程:在华为昇腾310/Atlas 200DK上实现深度学习模型从移植到部署

通过以上步骤,你已成功在华为昇腾310 Atlas 200DK上完成深度学习模型的移植与推理。这一流程可复用到目标检测、语义分割等其他任务,快去尝试将自己的AI模型部署到昇腾设备上,打造属于你的边缘智能应用吧!上部署深度学习模型,这篇教程将带你走完从模型转换到推理运行的完整流程。无需担心技术壁垒,我们以通俗易懂的方式拆解每一步,让你轻松在昇腾嵌入式设备上实现AI应用。是专为边缘AI设计的高性能处理器,Atlas 200DK是其开发板形态,能高效运行图像分类、目标检测等深度学习任务。

FJN110的博客 181

usb转百兆修改usb0为eth1

所以需要修改net->dev_addr [0],使它不等于0x02,并且FLAG_ETHER和dev->driver_info->flags做位与运算不等于0。用到了cdc_ether.c驱动,可以看里面的driver结构体,里面用到了usbnet_probe,该函数在usbnet.c里面。使用的是AX88772的驱动,识别到了eth1,但是还有一种情况,使用cdc驱动,识别成了usb0。发现net->dev_addr [0]是9a,2进制展开10011010,2展开是10,

北极星的博客 1485

Loki 分布式日志中心服务

分布式日志中心 Loki + Promtail + Grafana

原名又逢乱世。不要放下学习的脚步,毕竟比天天打牌、钓鱼、打游戏更能从内在充实自己。 2351

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【随笔记】T507 Android10 EC200U-CN 4G Cat1 移植

基本信息硬件平台:T507 (Android 10 Linux 4.9)模组型号:EC200U-CN(Cat1)(展讯芯片)代理提供内核驱动系统适配。

szembed的博客 650

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

高通模组驱动和拨号程序

高通芯片的模组都一般都不是免驱的,使用GObiNet拨号的比较多。要想使用高通芯片的模组拨号一般有三块内容要移植。

l00102795的博客 1054

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

USB NCM usbnet 枚举流程代码分析

USB NCM usbnet 枚举流程代码分析一、cdc_ncm.c1.1 struct usb_device_id结构体1.1.1 match_flags 设备类型1.1.2 bInterfaceClass 接口类 一、cdc_ncm.c 在linux 驱动中,CDC NCM的驱动位于: kernel\drivers\net\usb\cdc_ncm.c static struct usb_driver cdc_ncm_driver = { .name = "cdc_ncm", .id_table =

|~~~热爱生活、努力学习的小伙汁~~~| 3627
上一篇: USB URB的status及其代表的意义
下一篇: JJJ:配置ubuntu虚拟机网络
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值