USB设备的初始化

这节描述检测和初始化连接到xHC根集线器端口上的USB设备

无论连接的设备是Function还是集线器,设备的初始化进程都是一样的。一旦与一个外部集线器关联的管道被建立,集线器驱动将会通过标准集线器类命令序列来枚举连接在外部集线器上的设备。这节将重点描述当设备连接到跟集线器上时的初始化进程。

芯片硬件复位,HCRST(Host Controller Reset),或进入PLS(Port Link State) = RxDetect state后,所有根集线器端口均应处于Disconnected state,即Port是处于供电状态(port power,PP="1"),等待设备的连接.

如果USB设备连接到一个Disconnected state的端口:

  • USB3协议端口应该:

进入轮询状态polling State:

1.如果轮询成功,Port将会进入可使用状态(Enable state),并且当前连接状态(Current Connect Status,CCS)和连接状态改变(Connect Status Change,CSC)falgs(信号)将会设置为1。

2.如果轮询失败,Port将会进入无连接状态(Disconnectd state)。

  • USB2协议端口应该:

进入不可使用状态(Disabled State)并且设置当前连接状态(Current Connect Status,CCS)并且连接状态改变(CSC)信号为‘1’。

下面步骤描述一个典型USB设备初始化进程:

1.当xHC检测到设备(这个是根据Port registers来的,端口寄存器可以检测设备的连接和脱离)连接,它会设置当前连接状态(CCS)和连接状态改变信号(CSC)为1。如果CSC的声明导致从“ 0”到“ 1”的转换端口状态更改事件生成(Port status Change Event Generation,PSCEG,第4.19.2节),则xHC应生成端口状态更改事件(Port Status Change Event)。

2.接收到端口状态改变事件(Port Status Change Event),系统软件评定Port ID(端口号)字段来确定生成事件的端口。

3.接着系统软件读取生成事件的Port的PORTSC寄存器。如果事件是由于连接(CCS=‘1’)或脱离(CCS=‘0’)导致则CSC=‘1’。假设事件是由于连接导致的:

a. USB3协议端口尝试自动进入可使用状态。

如果成功,Port将应该转移到可使用状态,即,Port Enabled/Disable (PED)信号(flag)应该设置为“1”,并 且端口重置(Port Reset,PR)信号(flag)和端口连接状态(Port Link State,PLS)字段应该为“0”(usb 3的max power连接诶状态)。连接的USB设备应该处于默认状态(Default State)。

如果失败,Port应该转移到不可连接状态即PED和PR信号应该设置为“0”,并且Port Link State(PLS)字段应该设置为(“5”)。连接的USB设备仍然在供电状态。

b.   USB2 协议端口需要软件重置端口使端口进入Enabled state并且使USB设备从供电状态进入默认状态。在一个连接事件后,在PORTSC寄存器中的PED和PR信号应该为0并且PLS字段应该为‘7’(Polling,轮询)

系统软件通过重置端口(在POSTSC PR位写入1)使得端口进入可使用状态(Enable),然后等待由于端口重置信号申明(Assertion of Port Reset Change (PRC) flag)导致的一个端口状态改变事件(Port Status Change Event)。

端口重置的完成应该导致PORTSC的寄存器 PRC和 PED信号被设置为“1”  ,PR信号被清除“0”。并且PLS字段设为U0(“0”)。如果PRC申明导致‘0’到‘1’的转变过渡PSCEG,xHC应该生成一个端口状态改变事件作为PRC过渡转变的结果。重置操作使得USB设备进入默认状态,准备接受SET_ADDRESS request.(最终各个寄存器值为:PRC=PED=1,PR=0,PLS=0,CCS=1,PED=1,PR=0,LWS=0,PP=1)

4.在端口成功到达Enable 状态,系统软件应该通过Enable slot Command获取一个设备槽给新连接的设备,如4.3.2节所描述的那样。

5.在成功或取设备槽(slot)后,系统软件应该初始化与槽(slot)相关的数据结构,如4.3.3

6一旦槽相关的数据结构初始化后,系统软件应该使用Address Device Command来配置一个地址给设备,使其默认控制端点可用(Default Control Endpoint)。如4.3.4

7.对于LS,HS和SS设备;只有8,64,和512字节是默认控制端点允许的包大小。可以跳过步骤a。

8.现在默认控制端点完全运行, 系统软件可以读取完整的USB设备描述符,也可以读取配置描述符,以便可以将设备交给适当的类驱动程序。 要读取USB描述符,软件将通过设备的默认控制端点发出USB GET_DESCRIPTOR请求。

9. 阅读配置描述符后,软件可能会通过“添加上下文”位0(A0)设置为“ 1”来发出评估上下文命令,以通知xHC最大退出延迟参数的值。 注意,“输出插槽上下文中断目标”字段的值也可以通过此命令进行修改。

10.接着类驱动程序可以通过配置端点命令来配置设备插槽如4.3.5节, 并通过设备的默认控制端点发出USB SET_CONFIGURATION请求来配置USB设备本身。 必须成功完成这两项操作,才能将USB设备的状态从“地址”推进到“已配置”,将xHC设备插槽的状态从“已寻址”推进到“已配置”

11. 如果需要,系统软件可以配置备用接口。 对于每个备用接口,请按照第4.3.6节中的说明设置备用接口。

12. USB设备的管道接口现已完全运行。

xHCI1.1-USB设备的初始化相关推荐

  1. 记:USB设备的初始化、操作、实现——前导

    0x00 前言与吐槽 笔者最近在搞USB(需要使用几乎达到USB枚举上线的操作/(ㄒoㄒ)/~~),因为本身嵌入式的芯片限制,这里主要使用USB2.0搭载USB1.1总线.这里主要使用了如下功能: C ...

  2. STM32 usb 设备实现自动重枚举

    在开发USB设备时可能会经常遇到烧录程序后要重新拔插USB接口才能使USB设备正常工作,原因是因为重新烧录后,PC没有对USB设备进行重枚举,导致无法正常工作,解决方法很简单,我们只要在程序启动后第一 ...

  3. linux bios 禁用usb设备,当USB在UEFI / BIOS中工作时,为什么USB在Linux中不工作?

    作为背景,我刚刚用现代硬件制造了一台新机器,包括: AMD FX-8350 技嘉GA-990FXA-UD3主板 16GB RAM 英伟达GTX 650 Ti 金士顿固态硬盘 鉴于此,我尝试在SSD上安 ...

  4. USB设备驱动之设备初始化(设备枚举)

    USB设备从接入HUB到正常工作之前.都属于设备枚举阶段.所谓设备枚举.就是让host控制器认识USB设备,并为其准备资源.建立好主机与设备间的数据传递机制. 该阶段的工作,是USB通信协议规定的,所 ...

  5. Parallels Desktop 16 网络初始化失败和不能连接USB设备解决方法

    Parallels Desktop 16 在最新的macOS Big Sur 11.0系统上无法联网,并且无法连接USB设备.之前解决联网的办法是在终端通过命令启动parallels desktop的 ...

  6. linux 设备驱动程序 过滤,Linux驱动发开,usb设备的probe全过程

    本文将详细讲述2.6.22 下的一个USB 设备插上linux 系统的PC 后是如何一步一步调到我们的usb 设备驱动的probe 函数的,我们知道我们的USB 驱动的probe 函数中的一个参数是i ...

  7. libusb usb设备访问接口库

    libusb 是一个用C语言开发的跨平台的USB设备访问接口库. 驱动开发向来是内核开发中工作量最多的一块,随着USB设备的普及,大量的USB设备的驱动开发也成为驱动开发者手头上做的最多的事情.本文主 ...

  8. 基于libUSB的USB设备固件更新程序(下载数据)(转)

    源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...

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

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

最新文章

  1. 用Python进行诗歌接龙
  2. LeetCode【1--两数之和】 LeetCode【2--两数相加】
  3. 【数据结构与算法】顺序表V3.0的Java实现
  4. Windows Terminal Preview 1909 发布
  5. metasploit下载教程linux,在Debian 10/9系统上安装Metasploit Framework的方法
  6. 【知识图谱系列】基于Randomly Perturb的图谱预训练模型GraphCL
  7. C++ ——Qt的信号和槽的详解
  8. Windows XP 禁用屏幕保护功能
  9. 【数据集】PASCAL VOC2012数据集百度网盘链接
  10. 跳转微信公众号首页方式
  11. 倾斜摄影在高速道路勘测中的应用-案例
  12. orcad的瞬态分析
  13. MER 音乐情感识别-论文笔记7
  14. go---- mgo
  15. NPC内网穿透教程-入门
  16. oracle数据库中小数小于1时0不显示
  17. uni-app 微信小程序 引入iconfont
  18. ssssssssssss
  19. 可视化-three.js 城市 波浪特效 城市 扫光 掠过效果
  20. 胡适最著名演讲:天下没有白费的努力!

热门文章

  1. ajax 短轮询_ajax轮询导致浏览器内存每次递增
  2. mac kafka安装
  3. 如何使用Movie Studio制作幻灯片?
  4. Linux 查看系统相关信息命令
  5. android13(T) 通过烧写客制分区(customer)实现替换默认壁纸
  6. Java GUI面板的布局方式
  7. ICG-PEG-MAL,吲哚箐绿-聚乙二醇-马来酰亚胺;用于标记肽,蛋白质,寡核苷酸和一些小分子中的巯基
  8. 计算机毕业设计PHP高校体育场馆管理系统(源码+程序+VUE+lw+部署)
  9. C++网络编程(四):多进程并发服务器
  10. pythonmt4通讯swot矩阵_SWOT矩阵表