内核模块USBIP协议描述

1   USBIP协议

1.1USBIP协议基本介绍

USB/IP协议遵循C/S架构。服务器端导入USB设备,客户端导出USB设备。导出USB设备的驱动程序运行在客户端机器上。大致可分为2个部分:

1、  客户端获取USB设备的列表

客户端通过TCP/IP协议连接上服务器,并发送一个OP_REP_DEVLIST数据包到服务器,服务器收到后,发回OP_REP_DEVLIST USB设备信息数据包列表。具体流程如下:

内核模块USBIP协议描述_第1张图片

2、  客户端导入USB设备

一旦客户端获知USB设备的列表,会创建虚拟USB设备,并使用已经创建好的套接字向服务器发送一个OP_REQ_IMPORT请求包,服务器回复OP_REP_IMPORT包。这样就会建立一个通道。客户端发送两种类型的数据包: :USBIP_CMD_SUBMIT提交URB请求、,USBIP_CMD_UNLINK放弃提交的URB请求。服务器分别回复USBIP_RET_SUBMIT和USBIP_RET_UNLINK。具体流程如下:

 内核模块USBIP协议描述_第2张图片

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设备方向:

                       内核模块USBIP协议描述_第3张图片                                             

 

 

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驱动设备一章有详细的介绍

你可能感兴趣的:(USBIP协议)