USB枚举过程及AOA连接波形分析 |
您所在的位置:网站首页 › usb30协议分析仪 › USB枚举过程及AOA连接波形分析 |
本文记录为了解决AOA协议连接异常问题,学习USB协议及驱动工作原理过程中整理的笔记。 方法: 阅读Universal Serial Bus Specification Revision 2.0,理解USB设备的识别及通信过程,理解高速通信握手过程,分析USB总线上的数据包。 工具: 示波器,usbmon 参考文档: Universal Serial Bus Specification Revision 2.0,Linux USB驱动源码 主机:USB HOST 设备:USB DEVICE HUB:介于主机与设备之间的通信设备,位于主机端 文章目录 波形一览阶段A:发现设备阶段B:枚举设备阶段C:分配地址与配置阶段D:发现设备(2)阶段E:枚举设备(2)阶段F:分配地址与配置(2) 注意1:为什么设备连接过程中出现了两次High-Speed握手配对?2:usbmon log数据分析错误? 波形一览截一个AOA连接正常的波形,先把波形图分为了几部分后面根据每个部分单独分析。 A:该部分为HUB发现USB设备接入,D+数据线上设备端的3.3V上拉电阻拉高,此时HOST端的HUB检测到设备接入。稳定100ms后HOST发出reset信号。reset部分放在B阶段讨论。 阶段B:枚举设备首先将B处波形放大图贴出来: Device在接收到53指令后,会断开自己的UBS连接,之后进行重新连接,重新连接后的设备描述符就发生了变化(18D1) 阶段D:发现设备(2)device接收到了53指令后,自己断开了USB设备后重新连接,因此阶段D只是重复了阶段A的工作 阶段E:枚举设备(2)阶段E重复了阶段B的工作,唯一不同的此时HOST检测到的device虽然在物理上没有变化,实际上device的属性与阶段B完全不同,设备描述符也是不一致的。附上此处的usbmon日志,其中d118002d–表明着这是一个vid=0x18d1,pid=0x2d00的设备 e524a900 890157575 S Ci:1:003:0 s 80 06 0100 0000 0012 18 < e524a900 890157799 C Ci:1:003:0 0 18 = 12011002 00000040 d118002d 23020102 0301此处的PID与VID与阶段B的时候发生了变化,说明手机的配件模式切换成功啦~ 阶段F:分配地址与配置(2)阶段F重复了阶段C的工作,后续就保持正常的连接通信啦!!!至此手机与车机连接成功! 注意在学习过程中遇到了两个问题 1:为什么设备连接过程中出现了两次High-Speed握手配对?在“Universal Serial Bus Specification Revision 2.0”中找到了关键信息: 在reset之后,device撤销了之前在高速握手阶段对电阻的动作,此时恢复到了full-speed模式 If the device is being reset from a non-suspended high-speed state, then the device must wait no less than 3.0 ms and no more than 3.125 ms (TWTREV) before reverting to full-speed. Reversion to fullspeed is accomplished by removing the high-speed termination and reconnecting the D+ pull-up resistor. The device samples the bus state, and checks for SE0 (reset as opposed to suspend), no less than 100 µs and no more than 875 µs (TWTRSTHS) after starting reversion to full-speed. If SE0 (reset) is detected, then the device begins a high-speed detection handshake.(P154) 2:usbmon log数据分析错误?usbmon log打出来的16位数据(word)是以小端模式根据内存地址由低到高进行打印的,与Specification中的数据对应关系如下:word数据的低8位在前面,高8位在后面 例: usbmon log: e4ab4000 32898545 S Ci:1:001:0 s a3 00 0000 0001 0004 4 < //Host向Hub请求当前的port口状态 e4ab4000 32898596 C Ci:1:001:0 0 4 = 0305 1000 //Hub向Host反馈当前port口状态 串口log: 03-11 12:08:27.453 0 0 E hub 1-0 : 1.0: hub_port_status (status = 0503)(change = 0010)以word:0305 为例,此处的数据应该转换为0x0503与Specification中Table 11-21. Port Status Field, wPortStatus对应。 开始一直以0x0305去分析,怎么分析都是错误的,只好在驱动里加个log看一下,发现 usbmon中的数据包是小端模式储存 的需要注意!!! to be continued |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |