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设备的管道接口现已完全运行。