欢迎来到kaffeel的博客

点滴积累,快乐分享-kaffeel.org
  首页  :: 新随笔  :: 订阅 订阅  :: 管理

USB 枚举过程分析

Posted on 2013-01-11 17:22  kaffeel  阅读(232)  评论(0编辑  收藏  举报

本文结合USB Monitor工具来分析USB的枚举过程。
1. 枚举第一个来回分析
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)当主机检测到设备后,发送总线复位信号,设备产生复位中断。
主机发起第一个控制传输:
1.1 主机SETUP包(发往地址0端点0)、主机数据包(请求设备描述符)、设备握手包ACK。设备产生端点0数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是在端点0输入缓冲区准备好设备描述符。
1.2 数据过程:主机先发一个IN令牌包、设备发一个数据包(这个数据已经准备好,SIE收到IN令牌后,直接送到总线上,用户此时不干预)、主机发ACK包。此时SIE产生端点0数据输入中断,表明主机已经取走了设备所准备的数据,用户也可以在该中断处理程序中作自己的处理。此时,主机只接受一次数据,最少8个字节。如果用户数据没有发完,又在控制端点输入缓冲区,准备了数据,主机也不理会。
1.3 状态过程:主机发OUT包(通知设备要输出)、主机发0字节状态数据包(这个是0字节,表明自己收到设备描述符)、设备发握手ACK包。此时设备不会产生端点0数据输出中断,此时没有数据。

2. 枚举第二个来回分析
第一个来回成功以后,主机再次复位总线,进入地址设置控制传输阶段。
2.1 主机SETUP包(发往地址0端点0)、主机数据包(请求设置地址)、设备握手包ACK。SETUP包后面都会跟一个表明主机SETUP目的的数据包,要么GET,要么SET。设备产生端点0数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是在根据主机发来的地址写入自己的地址控制寄存器。
2.2 数据过程:本次传输没有数据。
2.3 状态过程:主机发IN包(通知设备要返回数据)、设备发0字节状态数据包(表明地址设置已经成功)、主机发握手ACK包(地址设置已经生效)。此时设备不会产生端点0数据输入中断,此时没有数据。

3. 枚举第三个来回分析
枚举的第三个来回中主机将使用新地址获取完整的设备描述符。
主机采用新地址发起第一个控制传输:
3.1 主机SETUP包(发往新的地址端点0)、主机数据包(请求设备描述符)、设备握手包ACK。设备产生端点0数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是在端点0输入缓冲区准备好设备描述符。
3.2 数据过程:主机先发一个IN令牌包、设备发一个数据包(这个数据已经准备好,SIE收到IN令牌后,直接送到总线上,用户此时不干预)、主机发ACK包。此时SIE产生端点0数据输入中断,表明主机已经取走了设备所准备的数据,用户可以该中断处理程序中要做如下处理:如果一次没有将描述符送完,要再次将剩下的内容填充端点0输入缓冲区。
第二次数据传输:主机再发一个IN令牌包、设备发一个数据包、主机发ACK包。此时SIE再次产生端点0数据输入中断,如果数据已经发完了。这里就不处理了。进入状态过程。
3.3 状态过程:主机发OUT包(通知设备要输出)、主机发0字节状态数据包(表明自己收到设备描述符)、设备发握手ACK包。接下来获取配置描述符、配置集合、字符串描述符、报告描述符的过程差不多,这里就不再叙述了。



文章来源:http://kaffeel.org/20130111/usb-%e6%9e%9a%e4%b8%be%e8%bf%87%e7%a8%8b%e5%88%86%e6%9e%90/