关于libusb库的安装
关于libusb库的安装教程网上一大堆,就不具体介绍了。
libusb官网: link
查看libusb API的网址: link
关于libusb库的使用
在安装了libusb库后,在它的目录下会有几个demo可以用来参考。
开始时和结束时使用来初始化了关闭libusb库
int libusb_init(libusb_context **context)
int libusb_exit(libusb_context **context)
demo里面使用了
libusb_device_handle* libusb_open_device_with_vid_pid(libusb_context * ctx,uint16_t vendor_id,uint16_t product_id )
来打开USB设备,但是在我这个项目中,USB设备的PID、VID可能是一样的,所以无法用来区分USB设备。
后来在提供的API中找到了
int libusb_open (libusb_device * dev, libusb_device_handle ** dev_handle )
这个函数可以根据设备描述符来打开USB设备进行操作。
接着又找到了获取设备描述符的函数
int libusb_get_device_descriptor (libusb_device *dev, struct libusb_device_descriptor *desc)
在打开设备后,紧接着就是获取设备输入输出端点地址,从而才能控制数据传输。获取描述符的函数为
int libusb_get_config_descriptor (libusb_device *dev, uint8_t config_index, struct libusb_config_descriptor **config)
这个函数获取描述符比较迟内存,所以在获取到我们需要的信息并转存后,我们要释放掉config结构体。释放函数为
void libusb_free_config_descriptor (struct libusb_config_descriptor *config)
释放完成后,我们要继续使能libusb内核驱动自动卸载,然后在需要的设备句柄上声明接口,必须声明接口才可以操作I/O,它们通过下面两个函数实现
int libusb_set_auto_detach_kernel_driver(libusb_device_handle * dev_handle,int enable)
int libusb_claim_interface(libusb_device_handle * dev_handle,int interface_number)
在完成上述操作后,我们就可以使用libusb库正式来操作我们的USB设备了。
下面是几个常用的传输数据的函数
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 )
int libusb_bulk_transfer(struct libusb_device_handle * dev_handle,unsigned char endpoint,unsigned char * data,int length,int * transferred,unsigned int timeout )
int libusb_interrupt_transfer(struct libusb_device_handle * dev_handle,unsigned char endpoint,unsigned char * data,int length,int * transferred,unsigned int timeout )
它们分别是控制传输、批量传输、终端传输,后两个的传输方向由endpoint也就是端点地址来决定。
在所有操作完成以后,要使用
int libusb_release_interface(libusb_device_handle * dev_handle,int interface_number)
int libusb_close(libusb_device_handle * dev_handl)
来关闭声明的接口和设备句柄
使用过程中遇到的一些问题
项目的USB设备需要先传入一个bin文件后才能开始通信,所以我使用U盘拷贝了一份bin文件到了arm板子上,去读文件时发现总是打开失败,后来发现是bin文件拷贝到U盘后失去了权限,但是使用chmod无法赋与它权限,后来百度找到了解决办法
使用 mount -t vfat /dev/sdb1 /mnt/usb 重新挂载U盘就可以解决。