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

相关文章
|
8月前
|
传感器 监控 自动驾驶
智能犁具与播种设备
智能犁具与播种设备
51 2
|
5月前
|
安全 数据安全/隐私保护
设备安全
【8月更文挑战第11天】
54 2
|
8月前
|
安全 数据安全/隐私保护 智能硬件
智能家电设备连接与验证的流程
智能家电设备连接与验证的流程
239 1
|
8月前
|
JavaScript
亚丁号云控之云控设备
亚丁号云控之云控设备
54 0
计算机维修的工具与设备
计算机维修的工具与设备。
101 1
|
算法 编译器 C语言
达夫设备简单介绍
达夫设备简单介绍
165 1
|
物联网 API
设备端和服务端检测设备是否在线的方法
使用物联网时,有时设备端和服务端都需要检测设备是否在线。
1396 0
|
传感器 数据采集 编解码
基于STM32设计的环境检测设备
设计以STM32微控制器为平台,采用DHT11温湿度传感器、烟雾传感器MQ-2、易燃气体传感器MQ-4、空气质量检测传感器MQ-135对室内温湿度和危险气体进行采集。通过wifi无线网络将数据传送给微控制器,STM32微控制器处理数据后,由自带oled液晶屏显示。当室内温度达到预警值或有危险气体时,系统将会自动警报并将警报信息通过wifi网络传输给客户手机。且每隔一段时间会通过wifi自动发送监测信息到手机,从而实现对室内环境的监测及报警功能。
808 0
服务开发+虚拟设备完成设备属性变更模拟
为了测试物联网平台数据分析的GIS组件,我们准备模拟一个设备随机在一定范围内(比如在(120±0.05,30±0.01)附近,避免一下子跑到非洲,一下子跑到南极)上报地理信息。由于物联网平台的虚拟设备推送只能定时推送+全取值范围随机数值,不能满足有一定数学表达式的推送策略。如果手上没有设备(尤其是正常设备无法通过热点WIFI接入测试环境),又想在云端持续的模拟设备行为,怎么办呢?通过服务开发+虚拟
1358 0