USB/IP协议遵循C/S架构。服务器端导入USB设备,客户端导出USB设备。导出USB设备的驱动程序运行在客户端机器上。大致可分为2个部分:
1、 客户端获取USB设备的列表
客户端通过TCP/IP协议连接上服务器,并发送一个OP_REP_DEVLIST数据包到服务器,服务器收到后,发回OP_REP_DEVLIST 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。具体流程如下:
/*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));
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;
数据交互过程中全部使用网络字节序(big endian)。
NO. |
偏移(字节) |
长度(字节) |
数值 |
描述 |
1 |
0 |
2 |
0X100 |
版本号 V1.1.1(当前) |
2 |
2 |
2 |
0X8005 |
命令OP_REQ_DEVLIST |
3 |
4 |
4 |
0 |
状态:未使用,设置为0 |
4 |
|
32 |
|
Busid (新改动) |
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设备开始区域 |
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: |
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此配置的接口数量 |
首先了解下USB设备方向:
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 |
|
|
传输数据 |
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 |
|
|
传输数据 |
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传输数据 |
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、 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 |
具体参见博客:http://blog.csdn.net/lidaqiang99/article/details/6591024
或者下载宋宝华的 《Linux 设备驱动开发详解》USB驱动设备一章有详细的介绍