USB学习系列之三——USB设备的枚举
2.在USB设备的枚举过程中使用了控制传输,这种传输保证数据传输的正确性。控制传输分为:建立过程(主机发起)、可选的数据过程和状态过程。
3.控制传输解析:
(1)主机发起建立过程,建立过程开始于一个SETUP令牌包,后面紧跟一个DATA0数据包,接着就是数据过程。
(2)如果是控制读传输,那么数据过程就是输入数据(相对于USB主机来说的);如果是控制写传输,那么数据过程就是输出数据。如果在建立过程中指定了数据长度为0,那么就没有数据过程。数据过程之后是状态过程。
(3)状态过程刚好与数据过程的数据传输方向相反:如果是控制读传输,则状态过程是一个输出数据包(相对于USB主机来说的);如果是控制写传输,则状态过程是一个输入数据包。状态过程是用来确认所有的数据是否都已经正确传输完成。
4.枚举过程的解析:
(1)复位并读取端点0最大包长度:
主机监测到设备插入后,首先对设备进行复位(也就是将差分数据线同时拉低一段时间,因为差分数据线正常状态是一高一低)。USB设备复位之后地址为0,USB主机往地址为0的设备的端点0发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。设备收到请求后,在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述符并且确认没有错误后,就会返回一个0长度的确认数据包(状态过程)。然后就会进入到设置地址的阶段。
注意:标准的设备描述符有18个字节,但是有些USB设备端点0大小不足18字节,理论上说USB主机只有通过多次读取才能读取到18字节的数据,但是在此阶段USB主机仍然只读取一次,这一次读取的数据大小最小为8字节(USB协议规定端点0至少为8字节),在这8字节的数据中已经包含了USB主机在这个阶段需要知道的信息,也就是端点0的最大包长度。端点0的最大包长度存放于设备描述符的第8字节处。
(2)地址设置
USB主机往地址为0的设备的端点0发送一个设置地址的请求(建立过程),新的设备地址包含在建立过程的数据包中。具体的地址由USB主机负责管理,主机会分配一个唯一的地址给刚接入的设备。USB设备在收到这个建立过程之后就直接进入到状态过程,因为这里数据过程是不需要的。设备等待主机请求状态返回(一个输入令牌包),收到输入令牌包后,设备就返回0长度的状态数据包。如果主机成功接收到该状态包,就会发送应答包ACK(确认字符)给设备,设备收到ACK之后,就要启用新的地址,以后主机就通过这个地址来访问该设备。
注意:D12USB接口芯片会自动等待ACK之后才启用新的地址,所以要在返回0长度的状态包之前,将地址写到D12芯片的地址寄存器中。
(3)获取设备描述符
使用新的地址,获取完整的18字节的设备描述符。如果端点0的最大包长小于18字节,那么就会有多多次请求数据输入。
(4)主机获取配置描述符和配置集合
配置描述符总共为9字节。主机在获取到配置描述符之后就获取配置集合。
(5)获取字符串描述符等其他的描述符。
注意:设备返回的数据长度可以小于主机请求的长度。
USB学习USB设备枚 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)