转自: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博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5066503.html,如需转载请自行联系原作者

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

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

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

  2. USB设备被识别流程

    USB模块包括usb core,host,hub,device驱动,其中hub会启动一个内核线程名曰:khubd(hub_events一直在查询(hub使用的是中断传输), 当usb 设备连接在 hu ...

  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. ADPLUS使用配置文件设置断点时无法创建DUMP文件原因分析
  2. 如何在调用线程的时候传递参数
  3. 关于启动 SecureCRT 遇到一个致命的错误且必须关闭
  4. SpringBoot生成日志文件---logback和log4j
  5. SpringBoot使用外置的Servlet容器
  6. Program Library HOWTO(1)
  7. Servlet生命周期与线程安全
  8. 用 logisim写一个 cpu
  9. 如何安装.nupkg文件
  10. 春节过后,外贸人如何快速抓住采购旺季,高效跟进客户
  11. java 毕向东 内部类_毕向东视频学习笔记【Java_Day10 多态+内部类】
  12. 让你终身受用的世界顶级思维
  13. gerrit is not registered in your account, and you lack ‘forge author‘ permission.
  14. 利用TCGA癌症基因进行差异分析
  15. 关于oracle的递归查询
  16. Unity制作圆环进度条加载场景资源
  17. java服务端用到的javase的基础知识_javase基础篇知识归纳
  18. JavaScript 获取字符串的最后一个字符
  19. office连接oracle,office2013怎么连接32位oracle
  20. LAC+CELLID定位手机位置

热门文章

  1. 福州大学软工 1715 | K 班 - 启航
  2. [j2me]手机也可以玩播客(Podcast)! Geek开发说明[开源]
  3. shutdown,halt,reboot,init
  4. 进程外COM组件的一个实例
  5. Windows下 Apache+PHP5+MYSQL5+phpmyadmin 规范安装
  6. 当 JS 工程师遇到了 TypeScript 会发生什么?
  7. java swftools linux_swftools linux下安装
  8. 自定义JWT认证过滤器
  9. 简单异常处理器SimpleMappingExceptionResolver
  10. 序列化和反序列化的概述