USB设备被识别流程【转】

简介: 转自:http://blog.csdn.net/myarrow/article/details/8286876 USB模块包括usb core,host,hub,device驱动,其中hub会启动一个内核线程名曰:khubd(hub_events一直在查询(hub使用的是中断传输), 当usb 设...

转自:http://blog.csdn.net/myarrow/article/details/8286876

USB模块包括usb core,host,hub,device驱动,其中hub会启动一个内核线程名曰:khubd(hub_events一直在查询(hub使用的是中断传输), 当usb 设备连接在 hub 的某个端口上,hub检测到有设备连接了进来,hub会去调用hub_port_status函数去获取hub端口状态,要是真有设备了,会调用hub_port_connect_change函数会调用usb_alloc_dev函数为设备分配一个struct usb_device 结构的对象并初始化,这个初始化将usb设备的状态设置为 Attached,调用usb_set_device_state函数将设备的状态设置成USB_STATE_POWERED上电状态,然后复位设备,复位成功后,设备就会进入Default状态(这个状态可以接收hcd的回应了);

        然后设备又该进入 Address状态,首先调用 hub_set_address设置address状态需要发送usb_control_msg函数去设置,在usb_control_msg里面调用了usb_internal_control_msg函数,这个函数主要的功能就是创建一个控制 urb,并把它发送给 usb 设备,然后等待它完成,这个过程包括了(usb_alloc_urb、usb_fill_control_urb、usb_start_wait_urb)这三个函数调用,完了以后,调用usb_hcd_submit_urb将urb发送到HCD,HCD 每收到urb,就会将它添加到这个 urb指定的urb_list中,形成链表,现在进入了HCD模块(略),处理完以后,会返回一个状态,最后usb_api_blocking_completion会去处理这次urb的收尾工作,如果成功的话设备就是正式进入了address状态;

       接下来设备要进入configer状态,这个过程需要先获取配置usb_get_device_descriptor->usb_get_descriptor先得到配置描述符中的wTotalLength字段,然后通过wTotalLength长度,获取所以配置信息,然后将获取的配置解析出来处理(此过程较为繁琐),配置好以后调用usb_new_device说明发现了设备驱动;

        然后tell the world(announce_device)说明设备已经找到了,最后调用设备模型提供的接口device_add将设备添加到 usb 总线的设备列表里,然后 usb总线会遍历驱动列表里的每个驱动,调用自己的 match(usb_device_match) 函数看它们和你的设备或接口是否匹配,匹配的话调用device_bind_driver函数,现在就将控制权交到设备驱动了。

   函数调用流程如下所示:

usb_hub_init(kthread_run(hub_thread, NULL, "khubd"))->
  hub_thread->
    hub_events->
       hub_port_connect_change->
         usb_new_device->
              usb_enumerate_device(udev); /* Read descriptors */
              announce_device(udev); /* Tell the world! */
              device_add
              usb_create_ep_devs

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
NoSQL 应用服务中间件 Redis
在华为鲲鹏OpenEuler20.03系统上安装Redis, Zookeeper, Nginx
在华为鲲鹏OpenEuler20.03系统上安装Redis, Zookeeper, Nginx
3633 0
在华为鲲鹏OpenEuler20.03系统上安装Redis, Zookeeper, Nginx
|
算法 Unix 调度
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
1134 0
|
9月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
11月前
|
小程序 API 开发工具
支付宝支付对接案例详解
支付宝支付对接指南,涵盖电脑网站、当面付和手机网站支付方式。对接前需了解支付宝开放平台和商家平台的区别,完成注册、实名认证、创建应用及签约产品等步骤。配置支付环境包括API密钥、回调地址和开发环境搭建。提供三种SDK供选择,推荐使用alipay-easysdk。详细步骤和示例代码可参考官方文档。
1056 15
|
数据采集 JavaScript 前端开发
JavaScript重定向对网络爬虫的影响及处理
JavaScript重定向对网络爬虫的影响及处理
|
存储 JavaScript vr&ar
three.js中的矩阵变换(模型视图投影变换)
three.js中的矩阵变换(模型视图投影变换)
392 1
|
存储 关系型数据库 定位技术
GeoServer发布地图服务(WMS、WFS)
GeoServer发布地图服务(WMS、WFS)
1525 0
|
存储 Python
Python 还能播放音频,而且花样多多?
Python 还能播放音频,而且花样多多?
|
存储 安全 Ubuntu
快速理解容器技术的实现原理
与 Docker 类似的容器技术并不是操作系统与生俱来的能力,而是通过组合一些 Linux 特性,实现**进程组隔离**的一种技术。 本篇文章将从介绍容器技术的发展开始,进而说明哪些 Linux 特性组成了容器技术的核心部分。希望您能够借由阅读本篇文章,对 Docker 等容器技术有更深刻的认识。 ## 1. 为什么我们需要容器 容器技术并不是凭空出现的,它来源自时代发展中人们对于如何更高效
549 0
|
存储 Linux
如何查看Linux设备的硬盘信息?
【4月更文挑战第12天】在Linux系统中,查看硬盘信息的常用命令。
484 4