最近从客户那边拿到一个usb抓包,让我们自己看,一个td s文件,刚开始有点懵圈,后面找了半天原来要用Data Cen ter软件打开。在国内好像都是wireshark?
打开之后大概如下:
- 同步数据包(SYNC):标识数据包的开始。
- 标识数据包(PID, Packet Identifier):表明这是一个数据包,比如
0xA1
表示数据IN包。 - 地址域(ADDR):键盘设备的地址,比如
0x03
。 - 端点域(ENDP):键盘设备的端点号,比如
0x01
。 - 数据域(DATA):实际传输的数据,比如按下'A'键的数据。
- 循环冗余校验(CRC, Cyclic Redundancy Check):用于校验数据包的完整性。
数据格式:
SYNC | PID | ADDR | ENDP | DATA | CRC
从上面转包的数据来看,ADDR | ENDP | DATA都是有的。ADDR是04,ENDP是00,DATA就是Record的部分。CRC应该是没显示,估计还是解析工具的问题。
按照USB协议,PID是标注这个表的用途,比如令牌,数据,握手,特殊。不知道为什么这边也没显示。
Data的部分,貌似这个工具会解析Data的内容,并且在summary中显示,这点还是不错。
刚打开真的一头懵,不过好在Get Max这些认识,因为在代码里面写过。看看Get Max分成三部分,一个是SETUP Txn,一个是IN Txn,还有一个STATUS Txn。每个部分里面还有很多细节。
不过感觉看外面的就好,里面的以后再学习吧,A1 83 00 0A 00 02 02 00,然后对应的就是上面解析好的内容,ProcessingUnitID那些。
下面的IN Txn,IN的话应该就是设备到服务端(一般是PC),也就是返回值,这里是64 19。
再说说Txn,查了下这个其实是transactions的缩写,也就是事务,一个事务包含一个或者多个数据包Package。用上面的SETUP事务举例。数据包里面有不同的域,比如PID这些。SETUP事务包含如下数据包:
SETUP Token Packet(令牌包):
- 用于标识一个SETUP事务的开始。
- 包含设备地址和端点号。
- PID(Packet Identifier):表示这是一个SETUP包(0x2D)。
- 地址(Address):目标设备的地址。
- 端点号(Endpoint Number):目标设备的端点号。
PID: 0x2D (SETUP) ADDR: Device Address ENDP: Endpoint Number CRC: Cyclic Redundancy Check
Data Packet(数据包):
- 包含具体的控制请求信息,例如请求类型、请求码、值、索引和长度等。
- PID:表示这是一个DATA0包(0xC3)。
- 数据(Data):包含请求类型(Request Type)、请求码(Request)、值(Value)、索引(Index)、长度(Length)等。
PID: 0xC3 (DATA0) Data: { bmRequestType: Request Type bRequest: Request wValue: Value wIndex: Index wLength: Length } CRC: Cyclic Redundancy Check
Handshake Packet(握手包):
- 用于确认数据包的正确接收。
- 常见的握手包有ACK(确认),NAK(否认)和STALL(停止)。
- PID:表示确认包(ACK,0xD2)。
PID: 0xD2 (ACK)
一个数据包中大概有这些域:
- 同步数据包(SYNC):标识数据包的开始。
- 标识数据包(PID, Packet Identifier):表明这是一个数据包,比如
0xA1
表示数据IN包。 - 地址域(ADDR):键盘设备的地址,比如
0x03
。 - 端点域(ENDP):键盘设备的端点号,比如
0x01
。 - 数据域(DATA):实际传输的数据,比如按下'A'键的数据。
- 循环冗余校验(CRC, Cyclic Redundancy Check):用于校验数据包的完整性。
事务之外还有阶段。比如SETUP是一个阶段stage,后续还有数据阶段(Data Stage)和状态阶段(Status Stage)。这个就和上面的显示一致了。
从目前工作的需要来说,倒是没必要关注Stage和Transaction这个层面,看看工具解析好的数据即可。
好吧,就先写这么多,年纪大了弄太多也记不住反而搞得很累,后面再写吧。
就酱。。。
参考:
USB协通讯议--深入理解_uvc set interface返回stall pid-CSDN博客
USB UVC实战笔记第3篇—枚举与Processing Unit描述符的关系详解_uvcview.x86-CSDN博客