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

转自: http://zyg0227.blog.51cto.com/1043164/560575

USB设备被识别流程相关推荐

  1. usb阅读笔记-----USB设备被识别流程

    Usb设备识别加载过程 (1)集线器检测新设备 主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察.(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5k ...

  2. USB设备被识别流程【转】

    转自:http://blog.csdn.net/myarrow/article/details/8286876 USB模块包括usb core,host,hub,device驱动,其中hub会启动一个 ...

  3. 计算机老是跳出usb设备无法识别,如何解决电脑一直弹出USB设备无法识别的问题?...

    如何解决电脑一直弹出USB设备无法识别的问题? 我们在电脑上传输文件的时候都会使用到USB,但是有的时候会出现USB无法识别的情况,如果我们碰到这种问题应该如何操作呢?今天,小编就教大家解决电脑一直弹 ...

  4. USB设备无法识别也无法读取怎么办?

    文章来源:https://www.reneelab.com.cn/usb-device-not-recognized.html 目录 一.导致USB无法识别/读取的原因 二.USB设备无法识别也无法读 ...

  5. 插鼠标出现 usb设备无法识别 解决办法

    今天早晨插鼠标的时候遇见了这个错误,总是出现USB设备无法识别.遇见这种事情第一反应就是重启,但是无济于 事,后来觉得应该是驱动的问题,然后顺利解决,下面贴上我的解决办法,希望能够帮助遇见同样错误的朋 ...

  6. 跟计算机usb无法识别,手把手教你解决电脑usb设备无法识别

    如今我们身边的USB设备越来越多,我们平时都会用来拷贝文件资料什么的,但还是也会遇到无法识别的usb设备这类问题的时候,而有些用户还不知道该怎么去解决,下面,小编就来跟大家解析如何去解决usb设备无法 ...

  7. 计算机引起usb设备无法识别的原因有哪些,计算机无法识别USB设备是什么原因

    当我们在计算机中插入U盘等相关的移动设备的时候,经常会看到系统无法识别USB,导致系统不能正常的安装硬件,为什么会出现这种情况呢?我们又该怎么解决这个问题呢?在这里给大家说一下出现这个问题的一般原因, ...

  8. 计算机老是跳出usb设备无法识别,电脑一直弹出无法识别的USB设备的解决办法

    电脑一直弹出无法识别的USB设备的解决办法 2020-09-22 电脑一直弹出无法识别的USB设备的解决办法 xp一直弹出"无法识别的USB设备" xp在默认的情况下是已经开启了U ...

  9. 计算机识别不了usb设备,电脑识别不了USB设备怎么办

    电脑识别不了USB设备怎么办呢.教您用以下六种方法解决,赶快学一下,看看哪种方式适合您的电脑. 1 升级UCB驱动 2 还有一种原因是,插口的问题,你可以换一个插口,一般情况下电脑有4个USB插口,前 ...

最新文章

  1. PL/SQL配置文件解析
  2. CentOS 6.5高可用集群LVS+Keepalived
  3. ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM
  4. wordpress安装记录
  5. webfigure显示到网页上所踩过的坑--自写servlet
  6. C++ STL源码剖析之哈希表
  7. cmd下重启iis命令
  8. Android端投影演示方案
  9. 一款JavaScript 混淆(Obfuscator)工具(Tool)的研究(六)更新
  10. Windows 驱动开发 新手入门(一)
  11. hbase2.1.6 mr
  12. MySql怎么附加数据库
  13. 利用同义词简化SQL Server 2005开发
  14. 领导圈子里流传的10个小故事
  15. 上海国际能源交易中心大户持仓报告制度 操作指南
  16. 数据手册中的英语小屁孩
  17. 浅谈主键索引与唯一索引
  18. 整理了一些关于USB开发的常见知识,后续持续更新
  19. 2018-001-《解忧杂货店》
  20. 经典CNN结构之AlexNet 复兴号角

热门文章

  1. PHP的优势是什么?
  2. u盘文件不见但还占用容量文件办法?
  3. sap税码配置_SAP税务管辖码Tax Jurisditcion code功能(1)
  4. AP: Oracle EBS AP INVOICE TAX 税码计算规则(ZT)
  5. lotus miner 元数据 删除 重建
  6. 球球大作战显示短信服务器出错,《球球大作战》新版本常见问题解决方案汇总...
  7. Unity 的阴影实现原理
  8. Layout室内设计施工图——PDF矢量图纸输出和显示模式区别
  9. 使用minikube快速部署k8s集群
  10. java备忘--20190828