http://blog.csdn.net/kingbeful/article/details/638612
标识域
数据包类型 |
标识域名称 |
标识符值PID[3:0] |
标识域意义 |
令牌包 |
输出(OUT) |
0001 |
启动一个方向为主机到设备的数据传输,并且包含了设备地址和端点信号 |
输入(IN) |
1001 |
启动一个方向为设备到主机的数据传输,并且包含了设备地址和端点信号 |
|
帧起始(SOF) |
0101 |
表示一个帧的开始,并且包含了相应的帧号 |
|
设置(SETUP) |
1101 |
启动一个方向为通过控制传输管道进行的数据传输,并且包含了设备地址和端点信号 |
|
数据包 |
数据0(DATA0) |
0011 |
偶数据包 |
数据1(DATA1) |
1011 |
奇数据包 |
|
握手包 |
确认(ACK) |
0010 |
接收到没有错误的数据包 |
无效(NAK) |
1010 |
接收端无法接收或发送端无法发送数据 |
|
错误(STALL) |
1110 |
端点被禁止或不支持控制管道请求 |
|
特殊包 |
前导(PRE) |
1100 |
用于启动下行端口的低速设备的数据传输 |
完整的PID
标识域名称 |
标识符值(二进制) |
标识符值(十六进制) |
OUT |
1000 0111 |
0x87 |
IN |
1001 0110 |
0x96 |
SOF |
1010 0101 |
0xa5 |
SETUP |
1011 0100 |
0xb4 |
DATA0 |
1101 0010 |
0xc3 |
DATA1 |
1101 0010 |
0xd2 |
ACK |
0100 1011 |
0x4b |
NAK |
0101 1010 |
0x5a |
STALL |
0111 1000 |
0x78 |
PRE |
0011 1100 |
0x3c |
令牌包
8bit |
8bit |
7bit |
4bit |
5bit |
SYNC |
PID |
ADDR |
ENDP |
CRC5 |
IN、OUT、SETUP包的数据格式
数据包
8bit |
8bit |
0~1023Byte |
5bit |
SYNC |
PID |
DATA |
CRC5 |
数据包DATA0、DATA1的数据格式
握手包
8bit |
8bit |
SYNC |
PID |
确认包ACK:用于表示数据包被成功接收,具体说
l 标识域PID被正确接收
l 并没有发生数据位错误
l 没有发生数据域的CRC校验错误
无效包NAK:属于暂态,设备结束“忙”后,就会处于空闲,主要应用于2种场合
l 接到主机发送的OUT命令后,设备无法接收数据
l 接到主机发送的IN命令后,设备没有数据发送给主机
错误包STALL:主要应用于3种场合
l 设备无法发送数据
l 设备无法接收数据
l 不支持某一种控制管道的命令
数据传输类型
数据传输类型 |
支持设备类型 |
包含的基本事务 |
||||
低速 |
全速 |
高速 |
IN |
OUT |
SETUP |
|
中断传输 |
○ |
○ |
○ |
○ |
○ |
× |
批量传输 |
× |
○ |
○ |
○ |
○ |
× |
同步传输 |
× |
○ |
○ |
○ |
○ |
× |
控制传输 |
○ |
○ |
○ |
○ |
○ |
○ |
写不动了,明天再补吧
//-------------------------------------------------//
//-------------以下为3月26日补充-------------//
标准USB描述符
l 设备描述符(Device Descriptor)
l 配制描述符(Configuration Descriptor)
l 接口描述符(Interface Descriptor)
l 端点描述符(Endpoint Descriptor)
l 字符描述符(String Descriptor,可选)
USB描述符编号
编号 |
描述符类型 |
1 |
设备描述符 |
2 |
配置描述符 |
3 |
接口描述符 |
4 |
端点描述符 |
5 |
字符描述符 |
设备描述符的字段组成
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
设备描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
设备描述符类型编号 |
2 |
bcdUSB |
2 |
BCD码 |
USB版本号 |
4 |
bDeviceClass |
1 |
类 |
USB分配的设备类代码 |
5 |
bDeviceSubClass |
1 |
子类 |
USB分配的子类代码 |
6 |
bDeviceProtocol |
1 |
协议 |
USB分配的设备协议代码 |
7 |
bMaxPacketSize0 |
1 |
数字 |
端点0的最大包的大小 |
8 |
idVendor |
2 |
ID编号 |
厂商编号 |
10 |
idProduct |
2 |
ID编号 |
产品编号 |
12 |
bcdDevice |
2 |
BCD码 |
设备出厂编号 |
14 |
iManufacturer |
1 |
索引 |
描述厂商字符串的索引 |
15 |
iProduct |
1 |
索引 |
描述产品字符串的索引 |
16 |
iSerialNumber |
1 |
索引 |
描述设备序列号字符串的索引 |
17 |
bNumConfigurations |
1 |
索引 |
可能的配制数量 |
字段名称 |
说明 |
bLength |
0x12 |
bDescriptorType |
0x01 |
bcdUSB |
USB1.1->0x0110 USB2.0->0x0200 |
bDeviceClass |
USB标准设备类:0x00~0xfe 厂商定义设备类:0xff |
bDeviceSubClass |
USB标准设备子类:0x00~0xfe 厂商定义设备子类:0xff |
bDeviceProtocol |
USB标准设备协议:0x00~0xfe 厂商定义设备协议:0xff |
bMaxPacketSize0 |
低速:0x08 全速:0x08、0x10、0x20、0x40 高速:0x40 |
idVendor |
厂商从USB IF获得的ID |
idProduct |
厂商定义的产品ID |
bcdDevice |
厂商定义设备出厂编号(版本号) |
iManufacturer |
0表示没有使用该字段 |
iProduct |
0表示没有使用该字段 |
iSerialNumber |
每个设备都有一个特定的序列号,供主机识别不同的设备 |
bNumConfigurations |
该设备总共支持的配置描述符的数量 |
配置描述符的字段组成
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
配置描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
配置描述符类型编号 |
2 |
wTotalLength |
2 |
数字 |
此配置所返回的所有数据大小 |
4 |
bNumInterfaces |
1 |
数字 |
此配置所支持的接口数量 |
5 |
bConfigurationValue |
1 |
数字 |
Set_Configuration命令需要的参数值 |
6 |
iConfiguration |
1 |
索引 |
描述该配制的字符串的索引值 |
7 |
bmAttributes |
1 |
位图 |
供电模式的选择 |
8 |
MaxPower |
1 |
mA |
设备从总线提取的最大电流 |
字段名称 |
说明 |
bLength |
0x09 |
bDescriptorType |
0x02 |
wTotalLength |
返回的所有描述符(配置、接口和端点)的数据大小总和 |
bNumInterfaces |
|
bConfigurationValue |
可被Get_Configuration和Set_Configuration命令调用 |
iConfiguration |
0表示没有使用字符串描述该配置 |
bmAttributes |
D7=1,固定(保留); D6=1自供电,D6=0总线供电; D5=1支持远程唤醒,D5=0不支持; D4D3D2D1D0 =00000,固定 |
MaxPower |
最大电流=2* MaxPower(mA),且必须<500mA(总线供电最大值),否则此配置会被主机禁止 |
接口描述符的字段组成
偏移量 |
字段名称 |
长度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
接口描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
接口描述符类型编号 |
2 |
bInterfaceNumber |
1 |
数字 |
该接口的编号 |
3 |
bAlternateSetting |
1 |
数字 |
备用的接口描述符编号 |
4 |
bNumEndpoints |
1 |
数字 |
接口使用的端点数,不含端点0 |
5 |
bInterfaceClass |
1 |
类 |
接口类型 |
6 |
bInterfaceSubClass |
1 |
子类 |
接口子类型 |
7 |
bInterfaceProtocol |
1 |
协议 |
接口遵循的协议 |
8 |
iInterface |
1 |
索引 |
描述该接口的字符串的索引值 |
字段名称 |
说明 |
bLength |
0x09 |
bDescriptorType |
0x04 |
bInterfaceNumber |
默认值:0 |
bAlternateSetting |
一个接口可以有多个接口描述符 |
bNumEndpoints |
若为0 表示该接口只使用了端点0 |
bInterfaceClass |
USB接口类:0x01~0xfe,0x00保留 厂商定义接口类:0xff |
bInterfaceSubClass |
USB接口子类:0x01~0xfe,0x00保留 厂商定义接口子类:0xff |
bInterfaceProtocol |
与bInterfaceClass和bInterfaceSubClass相关 0x00:接口不遵循任何类协议 0x01~0xfe:USB不同标准设备类的协议 0xff:接口应用了厂商定义的类协议 |
iInterface |
0表示没有使用字符串描述 |
端点描述符的字段组成
偏移量 |
字段名称 |
长 度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
端点描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
端点描述符类型编号 |
2 |
bEndpointAddress |
1 |
端点 |
端点地址及输入输出属性 |
3 |
bmAttributes |
1 |
位图 |
端点的传输类型属性 |
4 |
wMaxPacketSize |
2 |
数字 |
端点收发的最大包的大小 |
6 |
bInterval |
1 |
数字 |
主机查询端点的时间间隔 |
字段名称 |
说明 |
bLength |
0x07 |
bDescriptorType |
0x05 |
bEndpointAddress |
D7=1输出OUT端点,D7=0输入IN端点; D6D5D4=000,固定(保留); D3D2D1D0:表示该端点端点号 |
bmAttributes |
D1D0=00控制传输, D1D0=01同步传输, D1D0=10批量传输, D1D0=11中断传输, D7D6D5D4D3D2:USB1.1中保留,USB2.0有新含意 |
wMaxPacketSize |
D10~D0为有效内容,且范围是0~1023; D 15~D11 USB1.1中保留,值为0 |
bInterval |
中断端点:1~255,时间单位m S 同步端点:1 批量端点和控制端点:忽略 |
字符串描述符的字段组成
偏移量 |
字段名称 |
长 度(字节) |
字段值 |
意义 |
0 |
bLength |
1 |
数字 |
字符串描述符的字节数大小 |
1 |
bDescriptorType |
1 |
常数 |
字符串描述符类型编号 |
2 |
bEndpointAddress |
N |
数字 |
Unicode编码的字符串 |
字段名称 |
说明 |
bLength |
2+N |
bDescriptorType |
0x03 |
bEndpointAddress |
|
标准USB请求命令的格式
偏移量 |
0 |
1 |
2 |
4 |
6 |
请求 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
大小 |
1字节 |
1字节 |
2字节 |
2字节 |
2字节 |
bmRequestType
位 |
描述 |
说明 |
D7 |
选择数据传输方向 |
D7=0,主机->从机;D7=1,从机->主机, |
D6 |
命令类型 |
D6 D5=00,标准请求命令;D6D5=01,类请求命令; D6 D5=10,用户定义请求命令;D6D5=11,保留; |
D5 |
||
D4 |
命令接收者的类型 |
D4D3D2D1D0=00000,接收者为设备 D4D3D2D1D0=00001,接收者为接口 D4D3D2D1D0=00010,接收者为端点 D4D3D2D1D0=00011,其他接收者 D4D3D2D1D0=其他,保留 |
D3 |
||
D2 |
||
D1 |
||
D0 |
bRequest
标准请求命令的编号
请求命令名称 |
编号(bRequest字段的值) |
GET_STATUS |
0x00 |
CLEAR_FEATURE |
0x01 |
SET_FEATURE |
0x03 |
SET_ADDRESS |
0x05 |
GET_DESCRIPTOR |
0x06 |
SET_DESCRIPTOR |
0x07 |
GET_CONFIGURATION |
0x08 |
SET_CONFIGURATION |
0x09 |
GET_INTERFACE |
0x0A |
SET_INTERFACE |
0x0B |
SYNC_FRAME |
0x0C |
GET_STATUS
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x80 0x81 0x82 |
0x00 |
0 |
0 bInterfaceNumber bEndpointAddress |
2 |
设备、接口或端口的状态 |
CLEAR_FEATURE
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x00 0x01 0x02 |
0x01 |
特性选择器 |
0 bInterfaceNumber bEndpointAddress |
0 |
无 |
特性选择器
选择器特性 |
接收者 |
wValue的值 |
说明 |
DEVICE_REMOTE_WAKEUP |
设备 |
1 |
禁用 |
ENDPOINT_HALT |
端点 |
0 |
解禁 |
注:由于接收者不同,此字段的值要与bmRequestType字段的值匹配
SET_FEATURE
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x00 0x01 0x02 |
0x03 |
特性选择器 |
0 bInterfaceNumber bEndpointAddress |
0 |
无 |
注:特性选择器用法与CLEAR_FEATURE相同,只是在禁用和解禁方面是相反的
SET_ADDRESS
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x00 |
0x05 |
主机分配的设备地址 |
0 |
0 |
无 |
GET_DESCRIPTOR
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x80 |
0x06 |
High byte: bDescriptorType Low byte: iDescriptor |
0(设备、配置)或语言ID(字符串) |
描述符长度 |
描述符 |
SET_DESCRIPTOR
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x00 |
0x07 |
High byte: bDescriptorType Low byte: iDescriptor |
0(设备、配置)或语言ID(字符串) |
描述符长度 |
描述符 |
GET_CONFIGURATION
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x80 |
0x08 |
0 |
0 |
1 |
bConfigurationValue |
SET_CONFIGURATION
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x00 |
0x09 |
bConfigurationValue |
0 |
0 |
无 |
GET_INTERFACE
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x81 |
0x0A |
0 |
bInterfaceNumber |
1 |
bAlternateSetting |
SET_INTERFACE
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x01 |
0x0B |
bAlternateSetting |
bInterfaceNumber |
0 |
无 |
SYNC_FRAME
字段 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
内容 |
0x82 |
0x0C |
0 |
bEndpointAddress |
2 |
帧号 |