Linux usb 2. 协议分析

时间:2022-11-04 18:47:17

文章目录

0. 背景

USB使用以下方法来满足多种类型的数据在一条共享通道上传输:

  • 时间延迟。从时间维度上把数据传输切成多个时间片,在每个时间片内绝大部分份额(最多80%)优先传输对时间延迟有要求的数据,如Interrupt TransfersIsochronous Transfers。在时间片剩下的额度内传输对时间延迟没要求的数据,如Control TransfersBulk Transfers
  • 完整性校验。对需要保证数据完整性的数据加上了CRC 校验,接收端使用 ACK 来知会发送端正确接收,如果没有收到 ACK 发端会尝试重发 3 次。
    Linux usb 2. 协议分析

如上图,USB从时间维度上把数据传输切成多个时间片:

  • Frames。Low-speed 和 Full-speed 的时间切片大小为 1ms,USB 控制器每1ms重新调度一下传输。
  • Microframes。High-speed 的时间切片大小为 125us,USB 控制器每125us重新调度一下传输。

这个时间切片,和操作系统上 schedule tick 的概念是一样的。

在数据格式传输上又会进一步细分:

  • Transfer。每个时间片的所有传输称之为一个 Transfer,或者为一个 Frames/Microframes。
  • Transcation。根据某次数据传输的目的,一个 Transfer 可以分成多个 Transcation 事务。
  • Packet。数据传输的最小单位,一个 Transcation 可能由多个 Packet 事务组成。

1. USB 协议传输格式

Linux usb 2. 协议分析

  • 1、Transfer/Frame (传输): 从时间的维度看,USB通信是由一系列的Transfer(传输)组成的。包括四种传输类型:

    • Control Transfers 控制传输
    • Isochronous Transfers 同步传输
    • Interrupt Transfers 中断传输
    • Bulk Transfers 批量传输
      Linux usb 2. 协议分析
  • 2、Transaction (事务): 每一个Transfer(传输)又可以分成不同的Transaction, 具体的Transaction类型为以下3种:

    • IN/Read/Upstream Transaction 输入(Host)事务
    • OUT/Write/Downstream Transaction 输出(Host)事务
    • Control Transaction 控制事务
      Linux usb 2. 协议分析
  • 3、Packet 每一次Transaction又由不同的Packets所组成

    • Token Packet
    • Data Packet
    • Handshake Packet
    • Special Packet
      Linux usb 2. 协议分析
  • 4、Field 每一个Packet又由不同的Field组成:

    • Sync 同步域
    • PID 标识域
    • ADDR 设备地址域
    • ENDP 端点域
    • FRAM 帧号域
    • DATA 数据域
    • CRC 校验域

1.1 Packet

Linux usb 2. 协议分析

通常一个Packet由5个部分组成。

  • PID: Packet ID
  • ADDR: Device Address
  • EP: Endpoint Number
  • Payload DATA
  • CRC: 5/16 bits CRC

以下是四种 Packet 的具体格式。

1.1.1 Token Packet

Linux usb 2. 协议分析
Token Packets主要分四种:

  • IN,
  • OUT,
  • SETUP,
  • SOF

1.1.2 Data Packet

Linux usb 2. 协议分析

Data Packets主要由三部分组成:

  • Packet ID (DATA1/DATA0, toggle),
  • Payload data,
  • CRC16

1.1.3 Handshake Packet

Linux usb 2. 协议分析
Handshake Packets主要有4种:

  • ACK: 返回成功
  • NAK: Device忙,或者没有什么需要执行。
  • STALL: Device出错
  • NYET: Host only, Not ready.

1.1.4 Special Packet

Linux usb 2. 协议分析

  • PRE: 由host向hubs发送,指示下一个packet是low speed
  • SPLIT: Host only, split transaction
  • ERR: Host only, 由hub向host发送,指示在一次split transaction中出错
  • PING: Host only, check status

1.2 Transaction

USB Transactions主要由四种Packet组成:Token Packet, Data PacketHandshake PacketSpecial Packet。但通常的一次 Transaction 由3个Packets组成:Token -> Data -> Handshake
Linux usb 2. 协议分析

1.2.1 IN/Read/Upstream Transaction

Linux usb 2. 协议分析

IN Transaction主要用于Device向Host发送数据。

  • Host 向 Deivce发送一个IN Token Packet
  • Device如果忙,则回复NAK Packet, Host 在收到NAK Pakcet之后则持续向 Device 发送IN Token Packet
  • 当Device准备好时,回复Data Packet, Host在收到 Data packet 之后回复一个 ACK handshake

1.2.2 OUT/Write/Downstream Transaction

Linux usb 2. 协议分析
OUT Transaction主要用于Host向Device发送数据。

  • Host 向 Deivce 发送一个 OUT Token Packet 和一个 DATA Packet
  • Device忙,则回 NAK, Host则会复发 OUTDATA
  • Device在成功收到数据后,回 ACK handshake packet

1.2.3 Control Transaction

Control Transaction最多由3个Stage组成, Setup stage, Data stage, Status stage。其中Data stage不是必需的,有的control transaction没有data stage

1.2.3.1 Setup Stage (Transaction)

Setup stage中的setup packet只会出现在control transaction中, device必须回ACK, 不能回NAK。
Linux usb 2. 协议分析

1.2.3.2 Data Stage (Transaction)

Data Stage可以有若干的Data transaction。这个stage只有在host和device需要data传输时才会存在,通常setup stage的payload可以cover, 这个时候就不需要data stage.
Linux usb 2. 协议分析

1.2.3.3 Status Stage (Transaction)

以下是control read transaction和control write tranasaction分别对应的status stage。
Linux usb 2. 协议分析

1.3 Control Transfers

1.3.1 Control No Data (Transfer)

Linux usb 2. 协议分析

1.3.2 Control Read (Transfer)

Linux usb 2. 协议分析

1.3.3 Control Write (Transfer)

Linux usb 2. 协议分析

2. USB 枚举通讯过程

Linux usb 2. 协议分析

USB设备在正常工作之前,第一件要做的事情就是枚举。枚举的作用就是让设备从上述状态图中的 Powered 逐步进入 Configured 模式。

另外一个USB设备的逻辑结构如下:
Linux usb 2. 协议分析

  • 每个USB设备都可以包含一个或者多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接器件需从中选择一个)
  • 配置有多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本的功能。看下面的一个例子:
例:一个USB播放器带有音频视频功能还有旋钮和按钮

配置1:音频(接口)+旋钮(接口)
配置2:音频(接口)+视频(接口)+按钮(接口)
配置3:视频(接口)+旋钮(接口) 音频接口视频接口按钮接口旋钮接口均需要一个驱动程序。
  • 端点是USB设备中唯一可寻址部分,它是位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。主机与设备的通信最终作用于设备的各个端点,它是主机与设备间通信交流的一个逻辑终端。
    • 设备枚举:基于pnp机制,设备被枚举时,他必须向主机报告各个端点的特性,包括端点号,通信方向,端点支持的最大包大小,带宽要求。
    • 端点0:每个设备必须有端点0,他用于设备枚举和对设备进行一些基本的控制功能。除了端点0,其余的端点在设备配置前不能与主机通信。
    • 每个USB设备有一个唯一的地址,这个地址实在设备连接上主机时,由主机分配的。而设备中的每个端点在设备内部有唯一的端点号。

USB 枚举的主要目的是读出设备的所有配置信息,例如:

Linux usb 2. 协议分析

2.1 USB设备枚举总体流程

是让HOST认得这个USB设备,并且为该设备准备资源,建立好主机和设备之间的数据传递机制。一个设备枚举的过程分为如下8步:

  • 1.获取设备描述符

    • Host/Hub通过数据线上拉电阻的阻值变化检测到新设备接入。Host等待100ms以保证设备电源稳定。
    • Host向device发Bus Reset使得设备进入default状态,从此之后,设备可以响应默认地址0.
    • Host请求Device发送Device Descriptor的前64个字节。
  • 2.复位

    • Host在收到Device Descritptor的前8个字节后,再次向Device发出Bus Reset。
  • 3.设置地址

    • Host发送一个Set Address命令给Deivce, 从此Device有个通信地址,不再使用默认地址0进行通信。
  • 4.再次获取设备描述符

    • Host请求获取完整的Device Descritpor, 总计18字节。
  • 5.获取配置描述符

    • Host请求获取9个字节的Configuration Descriptor以了解 Configuration descriptor的总大小。
    • Host请求255字节的Configuration Descritpor。
  • 6.获取接口,端点描述符

  • 7.获取字符串描述符

  • 8.选择设备配置

下图是接入一个USB鼠标之后完整的枚举过程,后面详细逐步分析:
Linux usb 2. 协议分析

2.2 Tranfser 0 (Control Read) (Get Device Descriptor)

Transfer 0 的作用是 Get Device Descriptor,它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 0Setup Stage
  • Transaction 1~3Data Stage
  • Transaction 4Status Stage
    Linux usb 2. 协议分析

2.2.1 Transaction 0 (Setup Stage)

Transfer 0 的第一个事务 Transaction 0 如上图。可以看出,这是一个 Control 事务,设备要执行的命令就是 GET_DESCRIPTOR 也就是获取描述符。其中分为三个包:

  • Packet 134 第一个为令牌包 Setup Token (主机传输给设备)
  • Packet 135 第二个为数据包 Setup Data (主机传输给设备)
  • Packet 136 第三个为握手包 ACK (设备传输给主机)

2.2.1.1 Packet 135 (Setup Data)

主要分析一下第二个包数据包中的DATA字段,包含的就是命令。Data中总共有 8 字节,每字节的含义如下 (USB协议报文是小端模式):
Linux usb 2. 协议分析
在 Linux kernel 中,使用一个结构体来表示:

struct usb_ctrlrequest {
__u8 bRequestType;
__u8 bRequest;
__le16 wValue;
__le16 wIndex;
__le16 wLength;
} __attribute__ ((packed));
  • bmRequestType
Offset Field Size Value Description
0 bmRequestType 1 0x80 表示期望的数据传输方向为设备传输给主机,这条命令的接收者为设备。
  • bRequest
Offset Field Size Value Description
1 bmRequest 1 0x06 代表了一个命令,根据Table 9-4可以得知代表的命令为获取描述符 GET_DESCRIPTOR

Linux usb 2. 协议分析

  • wValue
Offset Field Size Value Description
2 wValue 2 0x00 0x01 根据Table 9-3可以得知,此时代表的是:Descriptor Type + Descriptor Index
2 Descriptor Index 1 0x00 想要获取的描述符 index 为 0
3 Descriptor Type 1 0x01 根据Table 9-5可以得知,想要获取的描述符为 Device Descriptor

Linux usb 2. 协议分析
Linux usb 2. 协议分析

  • wIndex
Offset Field Size Value Description
4 wIndex 2 0x00 0x00 根据Table 9-3可以得知,此时代表的是:Zero or Language ID
  • wLength
Offset Field Size Value Description
6 wLength 2 0x40 0x00 根据Table 9-3可以得知,此时代表的是:Description Length
即:请求Device发送Device Descriptor的前64个字节

2.2.2 Transaction 1 ~ Transaction 3 (Data Stage)

可以看到 Transaction 1 ~ Transaction 3 联合起来从 Device 传递回了 18 个字节的数据给 Host,Transaction 1Transaction 2 分别传输了 8 个字节数据,Transaction 2 传递了 2 个字节数据。

12 01 00 02 00 00 00 08
6D 04 18 C0 01 43 01 02
00 01

这 18 个字节数据就是 Transfer 0 指定要读取的 Device Descriptor,其具体的格式如 Table 9-8 所示:
Linux usb 2. 协议分析
注意在这个阶段当中的几个全局 Field 的值:

  • ADDR:Device Address = 0
  • ENDP:EndPoint = 0
  • DATA0/DATA1:如果多次 Data Transaction 传输的是一段连续数据,DATA0 DATA1连续翻转。如果多次 Data Transaction 传输的数据是不相关的,则不会翻转。

读回的具体 Device Descriptor 解析如下:
Linux usb 2. 协议分析

2.2.3 Transaction 4 (Status Stage)

状态阶段用于表示一次控制传输的结束。

首先发送一个OUT包,注意令牌包主要是指明传输类型,这里就为OUT类型。然后发一个大小为0的DATA包,device回一个ACK握手包。本次传输结束。

2.3 Reset (PoweredDefault)

Linux usb 2. 协议分析
host向device发送了一个Reset信号,由上边的状态图可以看出,USB由Powered模式进入了Default模式。

2.4 Tranfser 1 (Control No Data) (Set Device Address) (DefaultAddress)

Tranfser 1 的主要作用是设置 Device Address,USB由状态图中的Default模式进入了Address模式,是一个 Control No Data 类型的 Transfer。其中:

  • Transaction 5Setup Stage
  • Transaction 6Status Stage
    Linux usb 2. 协议分析

2.4.1 Transaction 5 (Setup Stage)

Packet 275 是核心,其中的Setup Data具体解析如下:

Offset Field Size Value Description
0 bmRequestType 1 0x00 表示期望的数据传输方向为主机传输给设备。
1 bmRequest 1 0x05 代表了一个命令,根据Table 9-4可以得知代表SET_ADDRESS
2 wValue 2 0x03 0x00 根据Table 9-3可以得知,此时代表的是:Device Address
即:Device Address = 0x03
4 wIndex 2 0x00 0x00 根据Table 9-3可以得知,此时代表的是:Zero
6 wLength 2 0x00 0x00 根据Table 9-3可以得知,此时代表的是:Zero

2.4.2 Transaction 6 (Status Stage)

状态阶段用于表示一次控制传输的结束。

2.5 Tranfser 2 (Control Read) (Get Device Descriptor)

Transfer 2 的作用是重新获取了一遍设备描述符 Get Device Descriptor,不同之处不是用默认地址0获取的,而是用刚才配置的 Device Address 0x03 来获取的。它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 7Setup Stage
  • Transaction 8~10Data Stage
  • Transaction 11Status Stage
    Linux usb 2. 协议分析

Transfer 2Transfer 0的主要区别在于,一是有了明确的设置地址。另外:

  • Transfer 0第一次获得设备描述符主要为了得到端点0可以发送的数据的大小,所以只要一个Transaction 1的8个字节数据就可。
  • Transfer 2完成了整个设备描述符的读取工作。

2.6 Tranfser 3 (Control Read) (Get Config Descriptor)

Transfer 3 的作用是获取配置描述符 Get Configuration Descriptor,它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 12Setup Stage
  • Transaction 13~14Data Stage
  • Transaction 15Status Stage
    Linux usb 2. 协议分析

2.6.1 Transaction 12 (Setup Stage)

Packet 275 是核心,其中的Setup Data具体解析如下:

Offset Field Size Value Description
0 bmRequestType 1 0x80 表示期望的数据传输方向为设备传输给主机,这条命令的接收者为设备。
1 bmRequest 1 0x06 代表了一个命令,根据Table 9-4可以得知代表的命令为获取描述符 GET_DESCRIPTOR
2 wValue 2 0x00 0x02 根据Table 9-3可以得知,此时代表的是:Descriptor Type + Descriptor Index
2 Descriptor Index 1 0x00 想要获取的描述符 index 为 0
3 Descriptor Type 1 0x02 根据Table 9-5可以得知,想要获取的描述符为 Configuration Descriptor
4 wIndex 2 0x00 0x00 根据Table 9-3可以得知,此时代表的是:Zero or Language ID
6 wLength 2 0x09 0x00 根据Table 9-3可以得知,此时代表的是:Description Length
即:请求Device发送Configuration Descriptor的9个字节

2.6.2 Transaction 13~14 (Data Stage)

可以看到 Transaction 13~14 联合起来从 Device 传递回了 9 个字节的数据给 Host,Transaction 13 传输了 8 个字节数据,Transaction 14 传递了 1 个字节数据。

09 02 22 00 01 01 00 A0
32

这 9 个字节数据就是 Transfer 12 指定要读取的 Configuration Descriptor,其具体的格式如 Table 9-10 所示:
Linux usb 2. 协议分析
读回的具体 Configuration Descriptor 解析如下:
Linux usb 2. 协议分析

2.6.3 Transaction 15 (Status Stage)

状态阶段用于表示一次控制传输的结束。

2.7 Tranfser 4 (Control Read) (Get 4 Descriptors)

Transfer 4 的作用是一次性获取了4个描述符 Get 4 Descriptors,它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 16Setup Stage
  • Transaction 17~21Data Stage
  • Transaction 22Status Stage

从格式上看它使用的命令 Setup DataTransfer 3 一样,仅仅读取长度从 0x09 改成了 0x22,就一次性读出了 4 个描述符。Transfer 3 的主要作用是读取 Descriptors 的总长度,Transfer 4 根据这个长度读取了所有 Descriptors
Linux usb 2. 协议分析

2.7.1 Configuration Descriptor

09 02 22 00 01 01 00 A0
32

Transaction 17~18 提供了 9 字节的 Configuration Descriptor 数据,具体内容和解析如上一节一样。

2.7.2 Interface Descriptor

   09 04 00 00 01 03 01
02 00

Transaction 18~19 提供了 9 字节的 Interface Descriptor 数据,具体内容和解析如下:
Linux usb 2. 协议分析
Interface Descriptor具体的格式如 Table 9-12 所示:

Linux usb 2. 协议分析

2.7.3 HID Descriptor

      09 21 11 01 00 01
22 34 00

Transaction 19~20 提供了 9 字节的 HID Descriptor 数据,具体内容和解析如下:
Linux usb 2. 协议分析
HID Descriptor具体的格式如下所示:
Linux usb 2. 协议分析

2.7.4 Endpoint Descriptor

         07 05 81 03 05
00 0A

Transaction 20~21 提供了 7 字节的 Endpoint Descriptor 数据,具体内容和解析如下:
Linux usb 2. 协议分析
Endpoint Descriptor具体的格式如 Table 9-13 所示:
Linux usb 2. 协议分析

2.8 Tranfser 5 (Control Read) (Get String 0 Descriptor)

Transfer 5 的作用是获取了 index 0 的 String Descriptor,它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 23Setup Stage
  • Transaction 24Data Stage
  • Transaction 25Status Stage
    Linux usb 2. 协议分析

2.8.1 Transaction 23 (Setup Stage)

80 06 00 03 00 00 FF 00

Packet 366 是核心,其中的Setup Data具体解析如下:

Offset Field Size Value Description
0 bmRequestType 1 0x80 表示期望的数据传输方向为设备传输给主机,这条命令的接收者为设备。
1 bmRequest 1 0x06 代表了一个命令,根据Table 9-4可以得知代表的命令为获取描述符 GET_DESCRIPTOR
2 wValue 2 0x00 0x03 根据Table 9-3可以得知,此时代表的是:Descriptor Type + Descriptor Index
2 Descriptor Index 1 0x00 想要获取的描述符 index 为 0
3 Descriptor Type 1 0x03 根据Table 9-5可以得知,想要获取的描述符为 String Descriptor
4 wIndex 2 0x00 0x00 根据Table 9-3可以得知,此时代表的是:Zero or Language ID
6 wLength 2 0xFF 0x00 根据Table 9-3可以得知,此时代表的是:Description Length
即:请求Device发送String Descriptor最大长度255个字节

2.8.2 Transaction 24 (Data Stage)

可以看到 Transaction 24 联合起来从 Device 传递回了 4 个字节的数据给 Host。

04 03 09 04

index 0 String Descriptor,表示的是 设备支持的语言。解析格式如下:
Linux usb 2. 协议分析

所以 Transaction 24 读回的 Language ID0x0409 即美国英语。

2.9 Tranfser 6 (Control Read) (Get String 2 Descriptor)

Transfer 6 的作用是获取了 index 2 的 String Descriptor,它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 26Setup Stage
  • Transaction 27~31Data Stage
  • Transaction 32Status Stage
    Linux usb 2. 协议分析

2.9.1 Transaction 26 (Setup Stage)

80 06 02 03 09 04 FF 00

Packet 366 是核心,其中的Setup Data具体解析如下:

Offset Field Size Value Description
0 bmRequestType 1 0x80 表示期望的数据传输方向为设备传输给主机,这条命令的接收者为设备。
1 bmRequest 1 0x06 代表了一个命令,根据Table 9-4可以得知代表的命令为获取描述符 GET_DESCRIPTOR
2 wValue 2 0x02 0x03 根据Table 9-3可以得知,此时代表的是:Descriptor Type + Descriptor Index
2 Descriptor Index 1 0x02 想要获取的描述符 index 为 2
3 Descriptor Type 1 0x03 根据Table 9-5可以得知,想要获取的描述符为 String Descriptor
4 wIndex 2 0x09 0x04 根据Table 9-3可以得知,此时代表的是:Language ID
即 0x0409 美国英语
6 wLength 2 0xFF 0x00 根据Table 9-3可以得知,此时代表的是:Description Length
即:请求Device发送String Descriptor最大长度255个字节

2.9.2 Transaction 27~31 (Data Stage)

可以看到 Transaction 27~31 联合起来从 Device 传递回了 36 个字节的数据给 Host。

24 03 55 00 53 00 42 00
20 00 4F 00 70 00 74 00
69 00 63 00 61 00 6C 00
20 00 4D 00 6F 00 75 00
73 00 65 00

index 2 String Descriptor,表示的是一个字符串。解析格式如下:
Linux usb 2. 协议分析

即读回了一个 34 字节的 unicode 字符串 55 00 53 00 42 00 20 00 4F 00 70 00 74 00 69 00 63 00 61 00 6C 00 20 00 4D 00 6F 00 75 00 73 00 65 00 转成 Ascii 码为 USB Optical Mouse

在上几节读取 Device Descriptor 时, iProduct 字段的值为 0x2 即 index 2 String Descriptor,所以 iProduct 就是 USB Optical Mouse

2.10 Tranfser 7 (Control Read) (Get String 1 Descriptor)

Transfer 7 的作用是获取了 index 1 的 String Descriptor,它是一个 Control Read 类型的 Transfer。其中:

  • Transaction 33Setup Stage
  • Transaction 34~36Data Stage
  • Transaction 37Status Stage
    Linux usb 2. 协议分析

解析方式和上一节一样,最终读出了16字节的 unicode 字符串 4C 00 6F 00 67 00 69 00 74 00 65 00 63 00 68 00转成 Ascii 码为 Logitech

Device Descriptor中的 iManufacturer 字段为 Logitech

2.11 Tranfser 8 (Control No Data) (Set Configured) (AddressConfigured)

Tranfser 8 的主要作用是设置 Configured,USB由状态图中的Address模式进入了Configured模式,是一个 Control No Data 类型的 Transfer。其中:

  • Transaction 38Setup Stage
  • Transaction 39Status Stage
    Linux usb 2. 协议分析

2.11.1 Transaction 38 (Setup Stage)

00 09 01 03 00 00 00 00

Packet 439 是核心,其中的Setup Data具体解析如下:

Offset Field Size Value Description
0 bmRequestType 1 0x00 表示期望的数据传输方向为主机传输给设备
1 bmRequest 1 0x09 代表了一个命令,根据Table 9-4可以得知代表的命令为SET_CONFIGURATION
2 wValue 2 0x01 0x00 根据Table 9-3可以得知,此时代表的是:Configuration Value
即配置 0x01
4 wIndex 2 0x00 0x00 根据Table 9-3可以得知,此时Zero
6 wLength 2 0x00 0x00 根据Table 9-3可以得知,此时Zero

2.12 Tranfser 9

好像也没干成什么事。

2.13 Tranfser 10

获得HID描述符。

2.14 Tranfser 11

是枚举成功后,两次host与device之间传输数据。这里只截了部分图。Host每个bInterval这么多时间就对device查询一下,看有没有数据要传,比如有没有键子被按下。每次都是,host向device发送一个IN令牌包,如果没有数据,device就回一个NAK。
Linux usb 2. 协议分析

2.15 Tranfser 12

Linux usb 2. 协议分析

参考资料

1.USB系列(2)协议简介
2.USB OTG 学习笔记
3.USB原理简单叙述
4.linux USB 编程
5.USB驱动分析
6.USB 协议分析软件LeCroy USB Advisor
7.USB系列(3) Windows USB枚举过程
8.usb鼠标枚举过程深度解析(上)
9.usb鼠标枚举过程深度解析(中)
10.usb鼠标枚举过程深度解析(下)
11.和菜鸟一起学linux总线驱动之初识USB鼠标抓包数据
12.USB 2.0 Specification
13.USB 之枚举过程概述

Linux usb 2. 协议分析的更多相关文章

  1. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  2. Linux USB驱动框架分析【转】

    转自:http://blog.csdn.net/jeffade/article/details/7701431 Linux USB驱动框架分析(一) 初次接触和OS相关的设备驱动编写,感觉还挺有意思的 ...

  3. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

  4. Hi3559AV100外接UVC/MJPEG相机实时采图设计(一):Linux USB摄像头驱动分析

    下面将给出Hi3559AV100外接UVC/MJPEG相机实时采图设计的整体流程,主要实现是通过V4L2接口将UVC/MJPEG相机采集的数据送入至MPP平台,经过VDEC.VPSS.VO最后通过HD ...

  5. Linux下 USB设备驱动分析(原创)

    之前做过STM32的usb HID复合设备,闲来看看linux下USB设备驱动是怎么一回事, 参考资料基于韦东山JZ2440开发板,以下,有错误欢迎指出. 1.准备知识 1.1USB相关概念: USB ...

  6. Linux 串口、usb转串口驱动分析(2-1) 【转】

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26807463&id=4186851 Linux 串口.usb转 ...

  7. linux驱动基础系列--Linux 串口、usb转串口驱动分析

    前言 主要是想对Linux 串口.usb转串口驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如字符设备驱动.平台驱动等也不进行详细说明原理.如果有任何错误地方,请指出, ...

  8. Linux下USB驱动框架分析【转】

    转自:http://blog.csdn.net/brucexu1978/article/details/17583407 版权声明:本文为博主原创文章,未经博主允许不得转载. http://www.c ...

  9. usb协议分析-设备描述符配置包-描述符

    /* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_ ...

随机推荐

  1. Python常用函数笔记

    1.lambda lambda其实就是一条语句,lambda(x):body.x是lambda函数的参数,参数可以有任意多个(包括可选参数);body是函数体,只能是一个表达式,并且直接返回该表达式的 ...

  2. NOJ1012-进制转换

    进制转换 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 2214            测试通过 : 645  ...

  3. Android Toast和Notification

    1. Toast用法 Toast 可以设置:时间,位置,自定义View 1.1 最普通的Toast Toast.makeText(ToastActivity.this, "CarloZ Sh ...

  4. vs2012 网站无法使用自定义服务器的解决方法

    我已经习惯新建一个Asp.net网站时把它挂载在IIS下调试运行,在使用Visual Studio 2012后,新建网站配置启动选项时,自定义服务器居然不可用 原来是Visual Studio 201 ...

  5. Dapper官方库 在guid和string互转的问题

    之前在和老何谈论他的开源项目Util中使用MySql的过程中发现了官方dapper在转换guid到string时候的一个错误 Error parsing column 0 (ID=6c2adb93-d ...

  6. Web 前端技术图谱-菜鸟教程

  7. python将图片转换为Framebuffer裸数据格式(终端显示图片)【转】

    转自:https://www.cnblogs.com/zqb-all/p/6107905.html 要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口, ...

  8. go 数据类型type尝试

    package main import "fmt" import "encoding/json" type Human struct{ Name string ...

  9. JAVA每日一旅2

    1.关于类型转换 两个数值进行二元操作时,会有如下的转换操作: 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型. 否则,如果其中一个操作数是float类型,另一个将会 ...

  10. Shell xargs

    from here 简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的find /sbin -perm + ...