当前位置: 首页 > news >正文

USB枚举详细过程剖析

(1)集线器检测新设备
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)
(2)主机知道了新设备连接后
每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。
(3)集线器重新设置这个新设备
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。
(4)集线器在设备和主机之间建立一个信号通路
主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于默认状态了,即设备已经准备好通过Endpoint 0 的默认流程响应控制传输。即设备现在使用默认地址0x0与主机通信。
(5)集线器检测设备速度
集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。
以下,需要USB的firmware进行干预
(6)获取最大数据包长度
PC向address 0发送USB协议规定的Get_Device_Descriptor命令,以取得却缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能列举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0。
以下操作雷同,不同操作系统设定时延是不一样的,比如说win2k大概是几毫秒,如果没有反应就再发送一次命令,重复三次。
(7)主机分配一个新的地址给设备
主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地址。从此开始所有通信都使用这个新地址。
(8)主机向新地址重新发送Get_Device_Descriptor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
(9)主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。
(10)主机发送Get_Device_String命令,获得字符集描述(unicode),比如产商、产品描述、型号等等。
(11)此时主机将会弹出窗口,展示发现新设备的信息,产商、产品描述、型号等。
(12)根据Device_Descriptor和Device_Configuration应答,PC判断是否能够提供USB的Driver,一般win2k能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操作就在后台运行。但是Win98却不可以,所以在此时将会弹出对话框,索要USB的Driver。
(13)加载了USB设备驱动以后,主机发送Set_Configuration(x)命令请求为该设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入“配置”状态,并可以和客户软件进行数据传输。
此时,常规的USB完成了其必须进行的配置和连接工作。查看注册表,能够发现相应的项目已经添加完毕,至此设备应当可以开始使用。不过,USB协议还提供了一些用户可选的协议,设备如果不应答,也不会出错,但是会影响到系统的功能。

相关文章:

  • java 死循环排查_java2如何排查线上死循环
  • Java SE 6 中实现 Cookie 功能
  • redis入门java_java面试基础知识-Redis基础
  • java 库 方法内部_java 构造函数内部的多态方法 完全剖析
  • 中国将承接世界文明
  • 浅谈持续集成CC
  • java架构和iis_防止IIS文件被下载方法
  • java数字循环求最小值_从键盘上接收一些数字,比较输出中的最大值和最小值,输入0结束循环。java写出来...
  • 持续集成工具CC介绍
  • java随机数_Java随机数Random()
  • Delphi调用WMI读取USB设备的PID和VID
  • java 计算器程序_java计算器程序
  • Log4j被OSGI撞了一下腰
  • 比较分析Vector、ArrayList和hashtable hashmap数据结构
  • java二进制类型_Java数据类型 - 原始和二进制文字
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • C++入门教程(10):for 语句
  • CSS 三角实现
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • gcc介绍及安装
  • js 实现textarea输入字数提示
  • Promise初体验
  • Python打包系统简单入门
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Swoft 源码剖析 - 代码自动更新机制
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue-router的history模式发布配置
  • 测试开发系类之接口自动化测试
  • 电商搜索引擎的架构设计和性能优化
  • 利用DataURL技术在网页上显示图片
  • 一份游戏开发学习路线
  • 原生js练习题---第五课
  • Java数据解析之JSON
  • 数据可视化之下发图实践
  • 移动端高清、多屏适配方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C#)获取字符编码的类
  • (HAL库版)freeRTOS移植STMF103
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四) Graphivz 颜色选择
  • (转)母版页和相对路径
  • .FileZilla的使用和主动模式被动模式介绍
  • .form文件_SSM框架文件上传篇
  • .htaccess配置重写url引擎
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET BackgroundWorker
  • .net core 6 redis操作类
  • .Net MVC + EF搭建学生管理系统