1 USBIP协议1.1USBIP协议基本介绍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。具体流程如下: 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.偏移(字节)长度(字节)数值描述1020X100版本号 V1.1.1(当前)2220X8005命令OP_REQ_DEVLIST3440状态:未使用,设置为04 32 Busid (新改动) 1.3.2 回复USB设备列表信息(OP_REP_DEVLIST)NO.偏移(字节)长度(字节)数值描述1020X100版本号 V1.1.1(当前)2220X0005命令OP_REP_DEVLIST3440状态:0 :OK484n导出设备的数量。0:无50X0c256 60x10c32 busid总线ID(字符串)70x12c4 Busnum总线数量80x1304 Devnum设备数量90x1344 Speed传输速率100x1382 idVendor生产厂商编号(由USB官方分配)110x13A2 idProduct产品编号(制造厂商分配)120x13C2 bcdDevice设备出厂编号 130x13E1 bDeviceClass设备类代码(由USB官方分配)140x13F1 bDeviceSubClass子类代码(由USB官方分配)150x1401 bDeviceProtocol设备协议代码(由USB官方分配)160x1411 bConfigurationValueSet_Configuration命令所需要的参数值170x1421 bNumConfigurations当前速度下能支持的配置数量180x1431 bNumInterfaces此配置的接口数量190x1441M_0bInterfaceClass接口类型200x1451 bInterfaceSubClass接口子类型210x1461 bInterfaceProtocol接口遵循的协议220x1471 填充字节,设置0230XC+i*0x138+m_(i-1)*4 第二个导出USB设备开始区域1.3.3 请求导入远程USB设备(OP_REQ_IMPORT)NO.偏移(字节)长度(字节)数值描述1020X100版本号 V1.1.1(当前)2220X0005命令OP_REP_DEVLIST3440状态:0 :OK4832 Busid:1.3.4 回复导入远程USB设备(OP_REP_IMPORT)NO.偏移(字节)长度(字节)数值描述1020X100版本号 V1.1.1(当前)2220X0005命令OP_REP_DEVLIST3440状态:0 :OK40X0c256 路经:主机出口设备的USB设备,字符串以零字节50x10832 busid总线ID(字符串)60x1284 Busnum总线数量70x12C4 Devnum设备数量80x1304 Speed传输速率90x1342 idVendor生产厂商编号(由USB官方分配)100x1362 idProduct产品编号(制造厂商分配)110x1382 bcdDevice设备出厂编号 120x1391 bDeviceClass设备类代码(由USB官方分配)130x13A1 bDeviceSubClass子类代码(由USB官方分配)140x13B1 bDeviceProtocol设备协议代码(由USB官方分配)150x13C1 bConfigurationValueSet_Configuration命令所需要的参数值160x13D1 bNumConfigurations当前速度下能支持的配置数量170x14E1 bNumInterfaces此配置的接口数量1.3.5 提交URB请求(USBIP_CMD_SUBMIT)首先了解下USB设备方向: NO.偏移(字节)长度(字节)数值描述1040X001命令(USBIP_CMD_SUBMIT)244 序列号3840Devid40xC4 方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN50x104 Ep:端口号:0-1560X144 传输标志(看下面介绍)70X184 传输数据buffer长度80x1C4 开始帧90X204 包的个数(ISO等时传输模式下使用)100X244 时间间隔:(最长时间的请求服务器)110X288 USB数据字节设置,没有使用写0120x30 传输数据1.3.6 回复URB请求(USBIP_RET_SUBMIT)NO.偏移(字节)长度(字节)数值描述1040X003命令(USBIP_RET_SUBMIT)244 序列号3840Devid40xC4 方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN50x104 Ep:端口号:0-1560X144 URB传输成功为0,其他错误发生70X184 传输数据buffer长度80x1C4 开始帧90X204 包的个数(ISO等时传输模式下使用)100X244 错误数110X288 USB数据字节设置,没有使用写0120x30 传输数据1.3.7 取消一个URB请求(USBIP_CMD_UNLINK)NO.偏移(字节)长度(字节)数值描述1040X002命令(USBIP_CMD_UNLINK)244 URB unlink序列号3840Devid40xC4 方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN50x104 Ep:端口号:060X144 序列号,已提交URB 请求的序列号70x30n URB传输数据 1.3.8 回复取消URB请求(USBIP_RET_UNLINK)NO.偏移(字节)长度(字节)数值描述1040X004命令(USBIP_RET_UNLINK)244 URB unlink序列号3840Devid40xC4 方向 :0:USBIP_DIR_OUT 1:USBIP_DIR_IN50x104 Ep:端口号:060X144 状态70x30n URB传输数据1.3.9 传输标志transfer_flags传输标志值得设置具体参考:1、 http://www.deansys.com/doc/ldd3/ch13s03.html2、 http://blog.csdn.net/myarrow/article/details/7025065 NO.传输标志值控制中断块等时1URB_SHORT_NOT_OK0x1Only inOnly inOnly inNo2URB_ISO_ASAP0x2NoNoNoYes3URB_NO_TRANSFER_DMA_MAP0x4YesYesYesYes4URB_NO_FSBR0x20YesNoNoNo5URB_ZERO_PACKET0x40NoNoOnly outNo6URB_NO_INTERRUPT0x80YesYesYesYes7URB_FREE_BUFFER0x100YesYesYesYes8URB_DIR_MASK0x200YesYesYesYes2 URB请求块具体参见博客:http://blog.csdn.net/lidaqiang99/article/details/6591024或者下载宋宝华的 《Linux 设备驱动开发详解》USB驱动设备一章有详细的介绍