USB 枚举过程分析


本文结合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/
优质内容筛选与推荐>>
1、【Qt】Qt Linguist介绍【转】
2、阿里知识图谱首次曝光:每天千万级拦截量,亿级别全量智能审核
3、通过接口标准化ABAP OO开发
4、C++多例模式下对Instance的使用
5、websocket通信随笔


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号