标签:usbip协议
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。具体流程如下:
/*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)。
偏移(字节) | 长度(字节) | 数值 | 描述 | |
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设备方向:
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 |
|
| 传输数据 |
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驱动设备一章有详细的介绍
标签:usbip协议
原文地址:http://blog.csdn.net/sjin_1314/article/details/41344171