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
USB设备被识别流程【转】的更多相关文章
- USB设备被识别流程
源: USB设备被识别流程
- usb设备无法识别
之前用飞线用旧板子飞线连接了一个wifi模块到usb0口上,调试ok的,现在新设计的板子回来了,wifi模块是连接在usb2口上的,系统起来后发现wlan0不存在,用lsusb查看wifi模块的usb ...
- 嵌入式Linux驱动学习之路(二十)USB设备驱动
USB在接入系统的时候,以0的设备ID和主机通信,然后由主机为其分配新的ID. 在主机端,D+和D-都是下拉接地的.而设备端的D-接上拉时,表明此设备为高速设备:12M/s. D+接上拉时则是全速设备 ...
- USB设备驱动程序学习笔记(一)
现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能知道 ...
- USB设备驱动总结
现象:把USB设备接到PC (韦老师总结) 1. 右下角弹出"发现android phone" 2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有" ...
- 12、USB设备驱动程序
linux-3.4.2\driver\hid\usbhid\usbmouse.c 内核只带USB驱动程序 (hub和usb是两个不同的设备,hub在内核上电的过程中在usb_hub_init函数中调用 ...
- CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备
一.前言 VirtualBox默认是不能识别USB设备的,但可以通过Oracle VM VirtualBox Extension Pack来增强VirtualBox的功能,增强的功能如下: 1. US ...
- VMware无法识别USB设备
VMware虚拟机开始还能识别USB设备/U盘,突然就不行了,在网上找了好久,提供的方法大致如下: 1. 首先Ctrl+R启动运行,输入services.msc,找到一个VMware USB dr ...
- USB接口无法识别设备
http://windows.microsoft.com/zh-cn/windows/answers?tId=14fa1e44-0a19-48ef-9ba7-b7e512a837a4 小琼子 提问 2 ...
随机推荐
- 红黑树 Java实现
概要 前面分别介绍红黑树的理论知识.红黑树的C语言和C++的实现.本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章.还是那句老话,红黑树的C/C+ ...
- Digits of Factorial LightOJ - 1045(数学题?)
原文地址: https://blog.csdn.net/fenghoumilin/article/details/52293910 题意:求 n 的阶乘在 base 进制下的位数,这里有一个简单的方法 ...
- hdu 5475 (线段树)
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- BZOJ 1013 | 一份写了一堆注释的高斯消元题解
题意 给出\(n\)维直角坐标系中\(n + 1\)个点的坐标,它们都在一个\(n\)维球面上,求球心坐标. 题解 设球面上某两个点坐标为\((a_1, a_2, ... a_n)\)和\((b_1, ...
- 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小
少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...
- Linux内核分析实验五
一.给MenuOS增加time和time-asm命令 1. 克隆并自动编译MenuOS rm menu -rf 强制删除原menu文件 git clone http: cd menumake root ...
- ip netns
虚拟化网络都是基于netns实现,不管是昨日的openstack,还是今日的docker. ip netns ip-netns - process network namespace manageme ...
- Java中的三目运算符可能出现的问题
你真的了解Java中的三目运算符吗? 原创 2018-04-27 刨根问底的 Hollis Hollis Hollis 微信号 hollischuang 功能介绍 一个对Coding有着独特追求的人. ...
- 【bzoj2795】【Poi2012】A Horrible Poem
题解: 询问区间的整循环节 设区间长度为$n$ 如果有循环节长为$x$和$y$,那由斐蜀定理得$gcd(x,y)$也一定为一个循环节: 假设最小的循环节长为$mn$,那么对于任何循环节长$x$,一定$ ...
- JDBC详解(一)
一.相关概念介绍 1.1.数据库驱动 这里驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理 ...