libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比开发内核驱动相对容易的多。
2.1 核心初始化函数
1) usb_init
函数定义: void usb_init(void);
函数功能:libusb 初始化,这一步必须首先执行。
2) usb_find_busses
函数定义: int usb_find_busses(void);
寻找系统上的usb总线,任何usb设备都通过usb总线和计算机总线通信。此函数返回总线数,失败返回负值。
3) usb_find_devices
函数定义: int usb_find_devices(void);
寻找总线上的usb设备,这个函数必要在调用usb_find_busses()后使用。此函数成功返回设备数目,失败返回负值。
4) usb_get_busses
函数定义: struct usb_bus *usb_get_busses(void);
函数功能:返回全局变量 usb_busses,用于遍历总线链表,查找总线 usb 设备。失败返回 NULL。
2.2 设备操作函数
5)usb_open
函数定义: usb_dev_handle *usb_open(struct *usb_device dev);
函数功能:打开 usb 设备,引用的 usb_dev_handle 以及 usb_device 结构体分别为usb设备操作句柄和usb设备描述符,具体定义可见头文件。函数返回 usb 设备的操作句柄,之后的对该 usb 设备的操作都通过该句柄进行。
6) usb_close
函数定义: int usb_close(usb_dev_handle *dev);
函数功能:与usb_open相对应,关闭设备,是必须调用的, 返回0成功,<0 失败。
7) usb_set_configuration
函数定义: int usb_set_configuration(usb_dev_handle *dev, int configuration);
函数功能:设置当前设备使用的configuration(配置模式),参数configuration 是你要使用的configurtation descriptoes中bConfigurationValue, 函数返回0成功,<0失败( 一个设备可能包含多个configuration,比如同时支持高速和低速的设备就有对应的两个configuration,详细可查看usb标准和具体的usb设备)
8) usb_claim_interface
函数定义: int usb_claim_interface(usb_dev_handle *dev, int interface);
函数功能:注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,才能做相应的操作(比如收发数据)。
Interface 指 bInterfaceNumber. (下面介绍的usb_release_interface 与之相对应,也是必须调用的函数)
9) usb_release_interface
函数定义: int usb_release_interface(usb_dev_handle *dev, int interface);
函数功能:注销被usb_claim_interface函数调用后的接口,释放资源,和usb_claim_interface对应使用。程序结束时记得一定要注销接口,否则,下次注册接口时可能会报错。
10) usb_set_altinterface
函数定义: int usb_set_altinterface(usb_dev_handle *dev, int alternate);
函数功能:设定当前接口中的活跃(起作用的)设置,即激活当前接口,alternate 为接口描述符中 bAlternateSetting 字段。成功返回0,失败返回负值。
11) usb_clear_halt
函数定义: int usb_clear_halt (usb_dev_handle *dev, unsigned int ep);
函数功能:复位指定的endpoint,参数ep 是指bEndpointAddress。这个函数用来替代usb_resetep函数。
注:libusb四种传输方式详细介绍可见http://blog.chinaunix.net/uid-25314474-id-3040231.html
2.3 数据通讯
12) usb_bulk_write
函数定义:int usb_bulk_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);
函数功能:向usb设备批量写数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为发送的数据地址,size为发送的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。
13) usb_bulk_read
函数定义:int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
函数功能:批量读usb设备传过来的数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为接收的数据地址,size为预计接收的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。
14) usb_interrupt_write
函数定义:int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);
函数功能:以中断的方式向usb设备写数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为发送的数据地址,size为发送的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。
15) usb_interrupt_read
函数定义:int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);
函数功能:以中断的方式usb设备传过来的数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为接收的数据地址,size为预计接收的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。
16) usb_control_msg
函数定义:int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
函数功能:以控制请求的方式读写数据,从默认的管道发送和接受控制数据传入参数与 usb 协议保持一致。成功返回实际读写的字节数,失败返回负值。
17) usb_get_string
函数定义:int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, size_t buflen);
函数功能:获取设备的字符串描述,通过index和langid索引。返回Unicode字符串到buf中。返回实际写入buf的字节数,负数失败。
18) usb_get_string_simple
函数定义:int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen);
函数功能:包装了 usb_get_string() 函数,返回指定index索引的字符串描述,并转换到C风格的ASCII。返回写入buf字节数,负数失败。
19) usb_get_descriptor
函数定义:int usb_get_descriptor(usb_dev_handle *dev, unsigned char type, unsigned char index, void *buf, int size);
函数功能:获取设备缺省控制管道的描述符,通过type和index索引。返回实际写入buf的字节数,负数失败。
20) usb_get_descriptor_by_endpoint
函数定义:int usb_get_descriptor(usb_dev_handle *dev, unsigned char type, unsigned char index, void *buf, int size);
函数功能:从设备获取描述符,以type和index索引,以ep标志的控制管道。返回读取字节数,负数失败。
2.3 辅助函数
21) usb_strerror
函数定义:char *usb_strerror(void);
函数功能:根据错误返回值 errno,返回错误码码对应的字符串。
22) usb_set_debug
函数定义:void usb_set_debug(int level);
函数功能:设置 libusb 的调试级别,libusb 支持打印调试信息,level 值为指定的调试级别。
23) usb_device
函数定义struct usb_device *usb_device(usb_dev_handle *dev);
函数功能:根据操作句柄返回对应的 usb_device。
libusb 的接口函数相关参数是依据usb设备本身的硬件参数(如配置模式、接口地址等)所决定的,而查询这些参数的方式有很多,如调用libusb本身的查询函数,但我推荐一个更好的方法,用“USB查看器usbtreeviewV3.1.0软件”可以清晰的获取usb本身的硬件设备。
本文第二部分所列举的函数只是libusb的一部分常用函数,想查看更多的函数,可上http://libusb.sourceforge.net/api-1.0/api.html
参考链接
https://www.cnblogs.com/Daniel-G/archive/2013/04/22/3036730.html
https://blog.csdn.net/jazzsoldier/article/details/71599365
https://www.cnblogs.com/ele-eye/p/3261970.html