USB基础知识3
一、USB 专业术语中英对照表
英文 | 中文 |
---|---|
ACK | 确认信号 |
Active Device | 正在使用的设备 |
Asynchronous Data | 异步数据 |
Asynchronous RA | 异步自适应速率 |
Asynchronous SRC | 异步抽样转换率 |
Audio Device | 音频设备 |
AWG#(American Wire Gauge) | 美国电线标准 |
Babble | 帧传输中的总线动作 |
Bandwidth | 带宽 |
Big Endian | 大端 |
Bit | 比特 |
Bit Stuffing | 数据填充,以使PLL可以提取时钟信号 |
b/s | 每秒多少比特 |
B/s | 每秒多少字节 |
Buffer | 缓冲区 |
Bulk Transfer | 批量传送 |
Bus Enumeration | 总线标号 |
Byte | 字节 |
Capabilities | 能力 |
Characteristics | 特征 |
Client | 客户端 |
Configuring Software | 配置软件 |
Control Endpoint | 控制端口 |
Control Pipe | 控制通道 |
Control Transfer | 控制传送 |
CTI | 计算机电信组织 |
Cyclic Redundancy Check(CRC) | 循环冗余校验 |
Default Address | 缺省地址 |
Default Pipe | 缺省通道 |
Device | 设备、器件 |
Device Address | 设备地址 |
Device Endpoint | 设备端口 |
Device Resource | 设备资源 |
Device Software | 设备软件 |
Downstream | 下行 |
Driver | 驱动 |
DWORD | 双字 |
Dynamic Insertion and Removal | 动态插入与拆除 |
Electrically Erasable Programmable Read Only Memory EEPROM | 电擦写可编程只读存储器 |
End User | 终端用户 |
Endpoint | 端口 |
Endpoint Address | 端口地址 |
Endpoint Direction | 端口指向 |
Endpoint Number | 端口号 |
EOF | 帧结束 |
EOP | 包结束 |
External Port | 外设端口 |
False EOP | 错误的包结束标志 |
Frame | 帧 |
Frame Pattern | 帧结构 |
Full-duplex | 全双工 |
Function | 功能、功能部件 |
Handshake Packet | 握手包 |
Host | 主机 |
Host Controller | 主机控制器 |
Host Controller Driver(HCD) | 主机控制驱动 |
Host Resourses | 主机资源 |
Hub | 集线器 |
Hub Tier | Hub层 |
Interrupt Request(IRQ) | 中断请求 |
Interrupt Transfer | 中断传送 |
I/O Request Packet(IRP) | 输出/输入请求包 |
Isochronous Data | 同步数据 |
Isochronous Device | 同步设备 |
Isochronous Sink Endpoint | 同步接收端 |
Isochronous Sourse Endpoint | 同步源端 |
Isochronous Transfer | 同步传送 |
Jiffer | 抖动 |
kb/s | 传送速率每秒几千比特 |
Little Endian | 小端 |
LOA | 有始无终的总线传输 |
LSb | 最低比特 |
LSB | 最低字节 |
Mb/s \ MB/s | 传送速率每秒几兆比特 |
Message Pipe | Message Pipe 消息通道 |
MSb | 最高比特 |
MSB | 最高字节 |
NAK | 不确认 |
Non Return to Zero Invert(NRZI) | 非归零翻转码 |
Object | 对象 |
Packet | 数据包 |
Packet Buffer | 数据包缓冲区 |
Packet ID(PID) | 数据包标示位 |
Phase | 时项、相位 |
Phase Locked Loop(PLL) | 锁相环 |
Physical Device | 物理部件 |
Pipe | 通道 |
Polling | 查询 |
Port | 口、端口 |
Power On Reset(POR) | 电源复位 |
Programmable Data Rate | 可编程数据速率 |
Protocol | 协议 |
Rate Adaption(RA) | 自适应速率 |
Request | 请求、申请 |
Retire | 取消、终止 |
Root Hub | 根集线器、主机Hub |
Root Port | 根集线器的下游端口 |
Sample | 取样、抽样 |
Sample Rate(Fs) | 抽样速率 |
Sample Rate Conversion(SRC) | 抽样转换率 |
Service | 服务 |
Sevice Interval | 服务间隙 |
Service Jitter | 服务质量的抖动参数 |
Sevice Rate | 指定端口每单位时间的服务数目 |
SOP | 包开始 |
Stage | 控制传输的某个阶段 |
Start-of-Frame(SOF) | 帧开始 |
Stream Pipe | 流通道 |
Synchronization Type | 同步类型 |
Synchronous RA | 同步的RA |
Synchronous SRC | 同步的SRC |
Sysem Programming Interface(SPI) | 系统可编程接口 |
Terminaton Time Division Multiplexing(TDM) | 时分复用 |
Timeout | 超时 |
Token Packet | 标志包 |
Transaction | 处理事务 |
Transfer | 传送 |
Transfer Type | 传送类型 |
Turn-around Time | USB传输中包与包之间的间隔时间,以防止传输冲突 |
Universal Serial Bus Driver(USBD) | USB驱动器 |
Univeral Serial Bus Resources | USB提供的资源 |
Upstream | 上行 |
Virtual Device | 虚拟设备 |
Word | 字(16位) |
二、USB的标准请求
在USB基础知识1中已经介绍过枚举是由一系列标准请求组成。
USB定义了8个字节的标准请求,通过这些请求,可以对设备的状态进行更改或对设备进行枚举。
USB的标准请求的数据传输方式都是控制传输方式,所以使用的端点是设备的默认端点0。
USB这8个字节的的控制请求包括传输过程中的数据,但包括了控制请求的数据长度。当数据长度为不为0时,设备或主机向对方传输相应长的数据。这些数据有可能是设备返回给主机的回应数据,也可能是主机发给设备的控制参数。
为什么USB的标准请求命令(不包括数据)的长度是8呢?
这是因为USB协议规定,端点0的最大包长度至少为8字节,所以任何设USB备都可能通过端点0接收字节的标准请求。
括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节
2.1 USB标准请求的数据结构
USB标准请求的个字节分为5个部分,其变量分别定义为: 1字节的bmRequestType,1 字节的bReqest,2字节的wValue,2字节的wIndex和2字节的wLength.
2.1.1 bmRequestType字段(1字节)
- D7,下一步数据的传输方向
0 = 主机到设备(SET请求)
1 = 设备到主机(GET请求) - D6-D5,命令的类型
00 = 标准请求命令
01 = 类请求命令(UVC规范中的请求属于类请求命令)
10 = 用户定义的请求命令
11 = 保留 - D4-D0,命令接受者的类型
00000 = 接受者为设备
00001 = 接收者为接口
00010 = 接受者为端点
00011 = 其它
4…31 = 保留
其他值保留。
2.1.1.1 bmRequestType字段的USB标准请求(USB基本请求)
- 凡是以0x00开头的bmRequestType,都是主机向设备发送数据。
- 凡是以0x01开头的bmRequestType,都是主机向接口发送数据。
- 凡是以0x02开头的bmRequestType,都是主机向端点发送数据。
- 凡是以0x03开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
- 凡是以0x80开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
- 凡是以0x81开头的bmRequestType,都是设备的接口向主机发送数据。
- 凡是以0x82开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
- 凡是以0x83开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据
2.1.1.2 bmRequestType字段的类特定请求(HID,UVC,UAC,BOT)
类特定请求是在bmRequestType的基础上加0x20,所以是:
- 凡是以0x20开头的bmRequestType,都是主机向设备发送数据。
- 凡是以0x21开头的bmRequestType,都是主机向接口发送数据。
- 凡是以0x22开头的bmRequestType,都是主机向端点发送数据。
- 凡是以0x23开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
- 凡是以0xa0开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
- 凡是以0xa1开头的bmRequestType,都是设备的接口向主机发送数据。
- 凡是以0xa2开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
- 凡是以0xa3开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据
2.1.1.3 bmRequestType字段的厂商自定义请求(自定义,不常见)
类特定请求是在bmRequestType的基础上加0x40,所以是:
- 凡是以0x40开头的bmRequestType,都是主机向设备发送数据。
- 凡是以0x41开头的bmRequestType,都是主机向接口发送数据。
- 凡是以0x42开头的bmRequestType,都是主机向端点发送数据。
- 凡是以0x43开头的bmRequestType,都是主机向设备的其它类型发送数据,软件开发者可以自由定义。
- 凡是以0xc0开头的bmRequestType,都是设备向主机发送数据,且返回的数据来源于设备。
- 凡是以0xc1开头的bmRequestType,都是设备的接口向主机发送数据。
- 凡是以0xc2开头的bmRequestType,都是设备中某个接口的端点向主机发送数据。
- 凡是以0xc3开头的bmRequestType,这个是USB标准未规范的,可以自由定义,是其它类型向向主机发送数据
2.1.2 bRequest字段(1)
标准请求的及代码
bRequest | Value |
---|---|
GET_STATUS | 0 |
CLEAR_FEATURE | 1 |
SET_FEATURE | 3 |
SET_ADDRESS | 5 |
GET_DESCRIPTOR | 6 |
SET_DESCRIPTOR | 7 |
GET_CONFIGURATION | 8 |
SET_CONFIGURATION | 9 |
GET_INTERFACE | 10 |
SET_INTERFACE | 11 |
SYNCH_FRAME | 12 |
SET_ENCRYPTION | 13 (USB2.0以后) |
GET_ENCRYPTION | 14 |
SET_HANDSHAKE | 15 |
GET_HANDSHAKE | 16 |
SET_CONNECTION | 17 |
SET_SECURITY_DATA | 18 |
GET_SECURITY_DATA | 19 |
SET_WUSB_DATA | 20 |
LOOPBACK_DATA_WRITE | 21 |
LOOPBACK_DATA_READ | 22 |
SET_INTERFACE_DS | 23 |
SET_SEL | 48 |
SET_ISOCH_DELAY | 49 |
2.1.3 设备请求
bmRequestType | bRequest | 描述 |
---|---|---|
1000 0000b | GET_STATUS (0) | 返回设备的状态。主要用于确定设备是否能够远程唤醒,以及设备是自供电还是总线供电。 |
0000 0000b | CLEAR_FEATURE (01) | 禁用 DEVICE_REMOTE_WAKEUP 或 TEST_MODE 功能。 |
0000 0000b | SET_FEATURE (03) | 启用 DEVICE_REMOTE_WAKEUP 或 TEST_MODE 功能。 |
0000 0000b | 设置地址(05) | 在枚举期间,该指令用于为设备分配地址 (1 -127)。 |
1000 0000b | GET_DESCRIPTOR (06) | 返回由 wValue 参数选择的描述符表。 |
0000 0000b | SET_DESCRIPTOR (07) | 设置指定的描述符值。 |
1000 0000b | GET_CONFIGURATION (08) | 返回活动设备配置的索引值。 |
0000 0000b | 设置配置(09) | 使指定的设备配置变为活动状态。 |
2.1.4 接口请求
bmRequestType | bRequest | 描述 |
---|---|---|
1000 0001b | GET_STATUS (0) | 返回接口的状态。目前,两个返回的字节都“保留以备将来使用”。 |
0000 0001b | CLEAR_FEATURE (01) | 禁用界面功能。 |
0000 0001b | SET_FEATURE (03) | 启用指定的接口功能。 |
1000 0001b | GET_INTERFACE (0A) | 检索当前活动接口的索引。 |
0000 0001b | SET_INTERFACE (11) | 用界面指示激活。 |
2.1.5 端点请求
bmRequestType | bRequest | 描述 |
---|---|---|
1000 0010b | GET_STATUS (0) | 返回端点的状态。 |
0000 0010b | CLEAR_FEATURE (01) | 禁用端点功能 |
0000 0010b | SET_FEATURE (03) | 启用端点功能 |
1000 0010b | SYNCH_FRAME (12) | 用于上报端点同步帧。 |
2.1.6 集线器请求
- Get Hub Status (GET_STATUS)
- Get Port Status (GET_STATUS)
- Clear Hub Feature (CLEAR_FEATURE)
- Clear Port Feature (CLEAR_FEATURE)
- Get Bus State (GET_STATE) obsolete since USB 2.0
- Set Hub Feature (SET_FEATURE)
- Set Port Feature (SET_FEATURE)
- Get Hub Descriptor (GET_DESCRIPTOR)
- Set Hub Descriptor (SET_DESCRIPTOR)
- Clear TT Buffer (CLEAR_TT_BUFFER)
- Reset TT (RESET_TT)
- Get TT State (GET_TT_STATE)
- Stop TT (STOP_TT)
2.2 USB 读取状态GetStatus
GetStatus请求主要用于USB主机读取USB设备、接口或端点的状态。USB设备返回2字节的设备状态。
2.2.1 读取设备
请求数据
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
80 | 00 | 0000 | 0000 | 0002 |
- bmRequestType:0x80表示从设备到主机,请求标准命令,接收者为设备
- bRequest:0x00表示获取状态
- wLength:0x02,表示返回数据为2字节。
返回数据
D15-D2 | D1 | D0 |
---|---|---|
保留为0 | 远程唤醒 | 自供电 |
2.2.2 读取接口
请求数据
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
80 | 00 | 0000 | 接口ID | 0002 |
- bmRequestType:0x81表示从设备到主机,请求标准命令,接收者为接口
- bRequest:0x00表示获取状态
- wIndex:配置描述符续中的接口ID
- wLength:0x02,表示返回数据为2字节。
返回数据
D15-D0 |
---|
保留为0 |
2.2.3 读取端点
请求数据
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
80 | 00 | 0000 | 端点地址 | 0002 |
- bmRequestType:0x82表示从设备到主机,请求标准命令,接收者为端点
- bRequest:0x00表示获取状态
- wIndex:配置描述符中的端点地址
- wLength:0x02,表示返回数据为2字节。
返回数据
D15-D1 | D0 |
---|---|
保留为0 | 是否端点已经停止(1停止,0未停止) |
2.3 USB获取描述符GetDescriptor
GetDescriptor用于USB主机读取设备的描述符,在请求数据阶段,USB设备将向主机返回指定的描述符。
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
80 | 06 | 类型(高字节)和索引(低字节) | 0或语言ID | 接收的描述符长度 |
- bmRequestType:x80表示从设备到主机,请求标准命令,接收者为设备。
- bRequest:0x06,表示读取描述符。
- wValue表示要获取描述符的索类型。(高字节为描述符类型,低字节为描述符索引)
描述符的类型有:
1——设备描述符
2——配置描述符
3——字符串描述符
4——接口描述符 //随配置描述符一并获取
5——端点描述符 //随配置描述符一并获取 - wIndex字段表示字符串描述符的语言ID,其它描述符为0
- wLength指定了描述符的字节数。
一个配置描述符的请求将在一个请求事务中返回设备描述符和所有的接口、端点描述符。
- 端点描述符:不能直接通过 SetDescriptor/GetDescriptor 请求访问;
- 接口描述符:不能直接通过 SetDescriptor/GetDescriptor 请求访问;
- 字符串描述符:wIndex 中包含语言 ID,支持多语言。
2.4 USB 读取配置GetConfiguration
GetConfiguration用于主机读取USB设备当前的配置值,在 GetConfiguration的数据阶段,USB设备将向主机返回一个字节的配置值。
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
80 | 08 | 0 | 0 | 1 |
- bmRequestType:x80表示从设备到主机,请求标准命令,接收者为设备。
- bRequest:0x08,表示读取配置。
- wLength:01,表示设备应向主机报告1个字节的配置值。
在USB设备的不同状态,GetConfiguration请求具有不同的响应:
- USB设备处于地址状态,GetConfiguration请求返回0.
- USB设备处于配置状态时,GetConfiguration请求返回当前配置描述符中bGetConfigurationValue字段的值。
- USB设备处于默认状态时,GetConfiguration请求无效。
2.5 USB 读取接口GetInterface
GetInterface请求用于USB主机读取指定接口的设置值,即获取接口描述符中bAlternateSetting。
字段中的值。在GetInterface请求的数据阶段,USB设备向USB主机返回1个字节的可替换设置值。
bmRequestType(1) | bRequest(1) | wValue(2) | wIndex(2) | wLength(2) |
---|---|---|---|---|
80 | 0A | 0 | 接口 | 1 |
- bmRequestType:x80表示从设备到主机,请求标准命令,接收者为设备。
- bRequest:0x0A,表示读取接口。
- WIndex表示要获取接口的ID。
- wLength 为1,表示USB设备向主机报告1个字节,即指定日剧口ID中的bAlternateSetting。