1 USBIP协议
1.1USBIP协议基本介绍
USB/IP协议遵循C/S架构。服务器端导入USB设备,客户端导出USB设备。导出USB设备的驱动程序运行在客户端机器上。大致可分为2个部分:
1、 客户端获取USB设备的列表
客户端通过TCP/IP协议连接上服务器,并发送一个OP_REP_DEVLIST数据包到服务器,服务器收到后,发回OP_REP_DEVLIST USB设备信息数据包列表。具体流程如下:
图2?1 客户端获取USB 设备列表流程
2、 客户端导入USB设备
一旦客户端获知USB设备的列表,会创建虚拟USB设备,并使用已经创建好的套接字向服务器发送一个OP_REQ_IMPORT请求包,服务器回复OP_REP_IMPORT包。这样就会建立一个通道。客户端发送两种类型的数据包: :USBIP_CMD_SUBMIT提交URB请求、,USBIP_CMD_UNLINK放弃提交的URB请求。服务器分别回复USBIP_RET_SUBMIT和USBIP_RET_UNLINK。具体流程如下:
1.2 主要结构体描述
/*Common header for all the kinds of PDUs. */
struct op_common{
uint16_t version;
#defineOP_REQUEST (0x80 << 8)
#define OP_REPLY (0x00 << 8)
uint16_t code;
/* add more error code */
#define ST_OK 0x00
#define ST_NA 0x01
uint32_t status; /* op_code status (forreply) */
}__attribute__((packed));
1.2.1
1.2.2 USBIP数据交互通用结构体
structusbip_header {
struct usbip_header_basic base;
union {
structusbip_header_cmd_submit cmd_submit;
structusbip_header_ret_submit ret_submit;
structusbip_header_cmd_unlink cmd_unlink;
structusbip_header_ret_unlink ret_unlink;
} u;
} PACKED;
1.3交互数据描述
数据交互过程中全部使用网络字节序(big endian)。
1.3.1 请求获得USB设备列表信息(OP_REQ_DEVLIST)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
2 |
0X100 |
版本号 V1.1.1(当前) |
2 |
2 |
2 |
0X8005 |
命令OP_REQ_DEVLIST |
3 |
4 |
4 |
0 |
状态:未使用,设置为0 |
4 |
32 |
Busid (新改动) |
1.3.2 回复USB设备列表信息(OP_REP_DEVLIST)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
2 |
0X100 |
版本号 V1.1.1(当前) |
2 |
2 |
2 |
0X0005 |
命令OP_REP_DEVLIST |
3 |
4 |
4 |
0 |
状态:0 :OK |
4 |
8 |
4 |
n |
导出设备的数量。0:无 |
5 |
0X0c |
256 |
||
6 |
0x10c |
32 |
busid总线ID(字符串) |
|
7 |
0x12c |
4 |
Busnum总线数量 |
|
8 |
0x130 |
4 |
Devnum设备数量 |
|
9 |
0x134 |
4 |
Speed传输速率 |
|
10 |
0x138 |
2 |
idVendor生产厂商编号(由USB官方分配) |
|
11 |
0x13A |
2 |
idProduct产品编号(制造厂商分配) |
|
12 |
0x13C |
2 |
bcdDevice设备出厂编号 |
|
13 |
0x13E |
1 |
bDeviceClass设备类代码(由USB官方分配) |
|
14 |
0x13F |
1 |
bDeviceSubClass子类代码(由USB官方分配) |
|
15 |
0x140 |
1 |
bDeviceProtocol设备协议代码(由USB官方分配) |
|
16 |
0x141 |
1 |
bConfigurationValueSet_Configuration命令所需要的参数值 |
|
17 |
0x142 |
1 |
bNumConfigurations当前速度下能支持的配置数量 |
|
18 |
0x143 |
1 |
bNumInterfaces此配置的接口数量 |
|
19 |
0x144 |
1 |
M_0 |
bInterfaceClass接口类型 |
20 |
0x145 |
1 |
bInterfaceSubClass接口子类型 |
|
21 |
0x146 |
1 |
bInterfaceProtocol接口遵循的协议 |
|
22 |
0x147 |
1 |
填充字节,设置0 |
|
23 |
0XC+i*0x138+m_(i-1)*4 |
第二个导出USB设备开始区域 |
1.3.3 请求导入远程USB设备(OP_REQ_IMPORT)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
2 |
0X100 |
版本号 V1.1.1(当前) |
2 |
2 |
2 |
0X0005 |
命令OP_REP_DEVLIST |
3 |
4 |
4 |
0 |
状态:0 :OK |
4 |
8 |
32 |
Busid: |
1.3.4 回复导入远程USB设备(OP_REP_IMPORT)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
2 |
0X100 |
版本号 V1.1.1(当前) |
2 |
2 |
2 |
0X0005 |
命令OP_REP_DEVLIST |
3 |
4 |
4 |
0 |
状态:0 :OK |
4 |
0X0c |
256 |
路经:主机出口设备的USB设备,字符串以零字节 |
|
5 |
0x108 |
32 |
busid总线ID(字符串) |
|
6 |
0x128 |
4 |
Busnum总线数量 |
|
7 |
0x12C |
4 |
Devnum设备数量 |
|
8 |
0x130 |
4 |
Speed传输速率 |
|
9 |
0x134 |
2 |
idVendor生产厂商编号(由USB官方分配) |
|
10 |
0x136 |
2 |
idProduct产品编号(制造厂商分配) |
|
11 |
0x138 |
2 |
bcdDevice设备出厂编号 |
|
12 |
0x139 |
1 |
bDeviceClass设备类代码(由USB官方分配) |
|
13 |
0x13A |
1 |
bDeviceSubClass子类代码(由USB官方分配) |
|
14 |
0x13B |
1 |
bDeviceProtocol设备协议代码(由USB官方分配) |
|
15 |
0x13C |
1 |
bConfigurationValueSet_Configuration命令所需要的参数值 |
|
16 |
0x13D |
1 |
bNumConfigurations当前速度下能支持的配置数量 |
|
17 |
0x14E |
1 |
bNumInterfaces此配置的接口数量 |
1.3.5 提交URB请求(USBIP_CMD_SUBMIT)
首先了解下USB设备方向:
IN
OUT
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
4 |
0X001 |
命令(USBIP_CMD_SUBMIT) |
2 |
4 |
4 |
序列号 |
|
3 |
8 |
4 |
0 |
Devid |
4 |
0xC |
4 |
方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN |
|
5 |
0x10 |
4 |
Ep:端口号:0-15 |
|
6 |
0X14 |
4 |
传输标志(看下面介绍) |
|
7 |
0X18 |
4 |
传输数据buffer长度 |
|
8 |
0x1C |
4 |
开始帧 |
|
9 |
0X20 |
4 |
包的个数(ISO等时传输模式下使用) |
|
10 |
0X24 |
4 |
时间间隔:(最长时间的请求服务器) |
|
11 |
0X28 |
8 |
USB数据字节设置,没有使用写0 |
|
12 |
0x30 |
传输数据 |
1.3.6 回复URB请求(USBIP_RET_SUBMIT)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
4 |
0X003 |
命令(USBIP_RET_SUBMIT) |
2 |
4 |
4 |
序列号 |
|
3 |
8 |
4 |
0 |
Devid |
4 |
0xC |
4 |
方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN |
|
5 |
0x10 |
4 |
Ep:端口号:0-15 |
|
6 |
0X14 |
4 |
URB传输成功为0,其他错误发生 |
|
7 |
0X18 |
4 |
传输数据buffer长度 |
|
8 |
0x1C |
4 |
开始帧 |
|
9 |
0X20 |
4 |
包的个数(ISO等时传输模式下使用) |
|
10 |
0X24 |
4 |
错误数 |
|
11 |
0X28 |
8 |
USB数据字节设置,没有使用写0 |
|
12 |
0x30 |
传输数据 |
1.3.7 取消一个URB请求(USBIP_CMD_UNLINK)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
4 |
0X002 |
命令(USBIP_CMD_UNLINK) |
2 |
4 |
4 |
URB unlink序列号 |
|
3 |
8 |
4 |
0 |
Devid |
4 |
0xC |
4 |
方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN |
|
5 |
0x10 |
4 |
Ep:端口号:0 |
|
6 |
0X14 |
4 |
序列号,已提交URB 请求的序列号 |
|
7 |
0x30 |
n |
URB传输数据 |
1.3.8 回复取消URB请求(USBIP_RET_UNLINK)
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
4 |
0X004 |
命令(USBIP_RET_UNLINK) |
2 |
4 |
4 |
URB unlink序列号 |
|
3 |
8 |
4 |
0 |
Devid |
4 |
0xC |
4 |
方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN |
|
5 |
0x10 |
4 |
Ep:端口号:0 |
|
6 |
0X14 |
4 |
状态 |
|
7 |
0x30 |
n |
URB传输数据 |
1.3.9 传输标志transfer_flags
传输标志值得设置具体参考:
1、 http://www.deansys.com/doc/ldd3/ch13s03.html
2、 http://blog.csdn.net/myarrow/article/details/7025065
NO. |
传输标志 |
值 |
控制 |
中断 |
块 |
等时 |
1 |
URB_SHORT_NOT_OK |
0x1 |
Only in |
Only in |
Only in |
No |
2 |
URB_ISO_ASAP |
0x2 |
No |
No |
No |
Yes |
3 |
URB_NO_TRANSFER_DMA_MAP |
0x4 |
Yes |
Yes |
Yes |
Yes |
4 |
URB_NO_FSBR |
0x20 |
Yes |
No |
No |
No |
5 |
URB_ZERO_PACKET |
0x40 |
No |
No |
Only out |
No |
6 |
URB_NO_INTERRUPT |
0x80 |
Yes |
Yes |
Yes |
Yes |
7 |
URB_FREE_BUFFER |
0x100 |
Yes |
Yes |
Yes |
Yes |
8 |
URB_DIR_MASK |
0x200 |
Yes |
Yes |
Yes |
Yes |
2 URB请求块
具体参见博客:http://blog.csdn.net/lidaqiang99/article/details/6591024
或者下载宋宝华的 《Linux 设备驱动开发详解》USB驱动设备一章有详细的介绍