USB设备的传输方式主要有四种:控制传输(Control Transfer)、中断传输(Interrupt Transfer)、批量传输(Bulk Transfer)和实时传输(Isochronous Transfer)。
具体内容可以参考https://blog.youkuaiyun.com/ljr1433223/article/details/130049625
libusb 1.0 API中的数据传输接口都是双向的,也就是说不分读写都是使用相同的函数。唯一的区别在于Request type或者端口地址。当它的最高位是0,就表示这次传输的是主机到设备的,主机角度来说就是写操作;反之是1的话就是设备到主机的,主机角度来说就是读操作。这是libusb 1.0 API传输函数的特点。
1. 控制传输(Control Transfer)
控制传输是USB必备的传输方式,它用于传输Control Setup包。它一般用于获取设备信息、状态,选择设备配置等的一系列命令式工作。关于Control Setup包的定义,可参考https://blog.youkuaiyun.com/wdsfup/article/details/49945205。
因为libusb API已经实现了一套获取USB设备信息的接口(具体可查看前面“ USB设备的基本操作”这一节),所以一般我们不用直接实现控制传输。只有在实现特定设备的特定控制命令时,比如获取PS3、XBOX主机的基本信息,才会需要自己实现控制传输。
libusb使用函数libusb_control_transfer来实现控制传输。函数定义如下:
int libusb_control_transfer (
libusb_device_handle *dev_handle,
uint8_t bmRequestType,
uint8_t bRequest,
uint16_t wValue,
uint16_t wIndex,
unsigned char *data,
uint16_t wLength,
unsigned int timeout)
其中:
dev_handle:为上一节“USB设备的打开与关闭”中介绍的获取的USB设备句柄,后续不再赘述
bmRequestType: 为Control Setup包的request type部分。libusb有预定义了枚举