通过libusb实现USB设备数据的异步传输主要有如下几步:
- 创建libusb_transfer对象
- 根据不同的传输方式填充相应信息给libusb_transfer对象
- 提交libusb_transfer对象给libusb API进行执行
- 在传输回调函数中检查libusb_transfer对象中的状态信息
- 释放libusb_transfer对象
下面我们来依次介绍
1. 创建libusb_transfer对象
可以使用libusb_alloc_transfer函数来创建libusb_transfer对象,函数定义如下:
struct libusb_transfer * libusb_alloc_transfer (int iso_packets)
其中:
iso_packets:用于指明在实时传输时需要传输的包的数量。对于其它三种传输方式设为0即可
返回值:libusb_transfer对象指针
2. 填充libusb_transfer对象
填充libusb_transfer对象的函数根据传输方式各不相同。
2.1 控制传输
控制传输主要使用libusb_fill_control_setup和libusb_fill_control_transfer函数把控制传输所需信息填充到libusb_transfer对象中。
static void libusb_fill_control_setup (
unsigned char *buffer,
uint8_t bmRequestType,
uint8_t bRequest,
uint16_t wValue,
uint16_t wIndex,
uint16_t wLength)
大多数的参数和同步模式传输函数libusb_control_transfer中的类似,可参考上一节的内容。其中:
buffer:为待生成的Setup命令的Buffer指针,大小必须是2的倍数
bmRequestType: 为Control Setup包的request type部分
bRequest: 为Control Setup包的request命令
wValue: 为Control Setup包的value部分,该值需要根据Request命令设定相应的值
wIndex: 为Control Setup包的index部分,设置方式和wValue类似
wLength:为Control Setup包请求读取数据时传入buffer的最大长度,只有从USB设备读取数据时需要。
而后需要使用函数libusb_fill_control_transfer把使用libusb_fill_control_setup构建的Setup包和额外数据buffer填充给libusb_transfer对象。libusb_fill_control_transfer函数定义如下:
static void libusb_fill_control_transfer (
struct libusb_transfer *transfer,
libusb_device_handle *dev_handle,
unsigned char *buffer,
libusb_transfer_cb_fn callback,
void *user_data,
unsigned int timeout)
其中:
transfer:为待填充的libusb_transfer对象,后续不再赘述
dev_handle:为待传输的USB设备的设备句柄,后续不再赘述
buffer: 为刚刚构建的Setup包和额外的数据Buffer,额外的数据Buffer追加在Setup包后
callback: 为本次传输的回调函数,关于libusb_transfer_cb_fn回调函数后续会详细介绍
user_data: 为传入回调函数的user data
timeout:为传输的超时时间,单位ms。0表示永不超时
2.2 中断传输
中断传输使用libusb_fill_interrupt_transfer来填充信息到libusb_transfer对象中。函数定义如下: