工作中接触了USB转网口设备,通过USB口连接到电视盒子上,会被识别成一个网卡,遇到USB转网口无法获取IP的问题,学习和调试了这部分usb host端的usbnet驱动,进行一下总结。

USB host端的驱动,包括usb host controller(如xhci, ehci), usb core(负责usb设备插入识别,枚举,设备与驱动匹配), usb driver (具体某种USB设备的驱动,如鼠标,USB网卡,U盘)
本篇文章主要介绍USB网卡驱动,属于usb driver。
USB网卡驱动的代码目录在:/kernel/drivers/net/usb/
主要文件包括usbnet.c: 通用核心代码,每个usb网卡驱动都会用到
不同的USB网卡设备会有各自的.c驱动文件,如ax88179_178a.c,rtl8150.c等
每一个这种.c文件中,都会有一个usb_driver结构体,初始化了一些回调函数,如:
static struct usb_driver ax88179_178a_driver = {
.name = "ax88179_178a",
.id_table = products,
.probe = usbnet_probe,
……………..
}
当usb设备插入usb口时,通过id_table,使设备与具体的usb driver匹配上。然后会调用到usb_driver结构体中赋值的probe函数,会调用到usbnet.c中的代码。

usbnet_probe:

net = alloc_etherdev(sizeof(*dev));  // 申请网卡结构体
init_waitqueue_head(&dev->wait);
skb_queue_head_init (&dev->rxq);
 skb_queue_head_init (&dev->txq);
skb_queue_head_init (&dev->done);
dev->bh.func = usbnet_bh;
net->netdev_ops = &usbnet_netdev_ops;
driver_info->bind() // 调用不同USB网卡各自注册的bind函数,主要作用是,获取in, out, status(接收,发送,状态查询)的endpoint,注册特定设备特有的netdev_ops,启动配置网卡phy
init_status (dev, udev); //根据之前bind()获取到的interrupt ep,配置用于传输网卡状态(如link up/down)的 interrupt pipe, alloc_urb, fill_int_urb。
status = register_netdev (net);  //网卡设备初始化的最重要一步,向上层注册这个网卡设备,协议层就可以通过这个设备的tx rx接口发送接收数据。
usbnet_open
usbnet_probe之后,kernel已经知道了这个net_device, 会调用之前注册的net_device_ops.ndo_open函数,也就是调用 usbnet_open (struct net_device *net):
usbnet_status_start(dev, GFP_KERNEL); //submit之前准备好的interrupt urb, 开始查询网卡状态。

netif_start_queue (net); // Allow upper layers to call the device hard_start_xmit routine.

bulk in  ep: 通过rx_submit函数提交接收数据的urb,urb完成之后调用rx_complete回调函数,取出urb中的数据,把skb(网络专用数据结构)往业务层传递

bulk out ep: usbnet_probe和usbnet_open之后,业务层会调用usbnet_start_xmit (struct sk_buff *skb,struct net_device *net), 把skb数据转换成urb,提交给usb,通过USB网卡向外发送网络包。urb完成之后调用tx_complete,启动tasklet_schedule(&dev->bh); 处理完成的skb。

interrutp ep: 网络状态发生改变时,如link down/up, interrupt urb完成,调用intr_complete, 更新网络状态。

比较粗略的usbnet总结,包括注册net_device结构体,数据发送,接收,link状态查询。如果要更细节地了解的话,还需要看一下数据发送接收的流程,以太网相关的知识。

linux usbnet驱动相关推荐

  1. linux usbnet网络驱动,[技术资料]基于usb设备的linux网络驱动程序开发

    1 引言 做为开放源代码 (open source) 运动重要组成部分,linux操作系统吸引了数以万计的程序员共同开发.由于linux比较完整的继承了各种unix版本的稳定和高效,并且克服和改进了传 ...

  2. Linux音频设备驱动

    在Linux中,先后出现了音频设备的两种框架OSS和ALSA,本节将在介绍数字音频设备及音频设备硬件接口的基础上,展现OSS和ALSA驱动的结构. 17.1-17.2节讲解了音频设备及PCM.IIS和 ...

  3. linux设备驱动第五篇:驱动中的并发与竟态

    目录[-] 综述 信号量与互斥锁 Completions 机制 自旋锁 其他的一些选择 不加锁算法 原子变量与位操作 seqlock(顺序锁) 读取-拷贝-更新(RCU) 小结 综述 在上一篇介绍了l ...

  4. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  5. linux音频驱动dma数据,Linux音频驱动简述

    3.2 mixer接口 int register_sound_mixer(structfile_operations *fops, int dev); 上述函数用于注册1个混音器,第1个参数fops即 ...

  6. Linux驱动无硬件设备,Linux设备驱动与硬件通信

    Linux物理设备驱动,主要有几种类型,如:IO类.内存类.总线类.IO类我们平时接触的最多,其主要特点是,通过IO设备的寄存器操作硬件,具体需要去查看硬件手册. 1. IO端口和IO内存 在硬件层, ...

  7. Linux主机驱动与外设驱动分离思想

    - by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设,在 ...

  8. Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)

    在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...

  9. 《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

    本节书摘来自异步社区<Android深度探索(卷1):HAL与驱动开发>一书中的第1章,第1.6节 Linux设备驱动,作者李宁,更多章节内容可以访问云栖社区"异步社区" ...

最新文章

  1. 一文看全北科智能车创新历程
  2. 关于captive portal
  3. numpy(3)-numpy.random.random() ,random_sample()连续均匀分布
  4. vim比vi做的一些改进
  5. 盘点 GitHub 上那些沙雕项目
  6. find函数常见错误_终于找到你,查找函数,find必不可少
  7. 教育|仝卓高考舞弊案细节曝光:为“恢复高考成绩”已起诉1年多
  8. Mysql 中创建数据库并插入数据
  9. Compiled from Servlet.java (version 1.7 : 51.0 查看Servlet源码
  10. 插入css样式表的三种方法
  11. 创建Java源代码文件----开始编写代码
  12. 在禁用UAC时无法激活此应用
  13. java为什么 foreach比for效率高
  14. 《一个人工智能的诞生》学习记录
  15. 小学生3年级100以内加减法
  16. linux系统常用命令列举
  17. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第一周作业
  18. 电脑回收站清空了怎么恢复回来
  19. flink入门3-Flink连接Kafka、Redis,实现Kafka Source/Redis Sink
  20. 数值分析各种算法C语言

热门文章

  1. SPC在SAPQM模块中的应用
  2. android contentprovider api,android, contentProvider 获取通讯录
  3. 用Java实现递归策略算法的编写汇总
  4. C盘爆满?两个超简单的解决办法
  5. ASEMI-US1M是什么二极管,US1M二极管分正负极吗
  6. AngularJS+RequireJs实现动态加载JS和页面的方案研究
  7. 深度强化学习和强化学习_强化强化学习背后的科学
  8. Linux系统工程师--(1)Vsftpd服务的部署及优化与linux中内核级加强型火墙的管理
  9. Java (高级)软件工程师面试考纲
  10. 创建型设计模式——抽象工厂模式