libusb常用函数

/*声明:本文是博主个人学习笔记,有不当之处敬请指正,不胜感激!*/


>>设备接口的初始化(寻找相关设备)

/*本节函数是按照实际使用次序整理,有些函数必须在指定的次序下调用,有些函数可选调用,有些函数需要嵌套循环调用*/


1、usb_init

原型:void usb_init(void);

功能:配置usb接口,使其能够正常使用。

说明:使用usb接口,第一步就要调用这个函数,不能缺省。

 

2、usb_find_busses

原型:int usb_find_busses(void);

功能:查找usb总线(总线就像高速公路,将计算机各个单元连接在一起,提供信息的传送通道)。

返回值:返回自上次调用本函数后改变的总线数(包括新增和移除的总线)。

说明:如果连续调用本函数,第二次调用的返回值一般为0(因为两次连续调用之间的总线数一般不变)。

注:总线数就是计算机内总线的根数(分为数据总线和地址总线),比如地址总线有8根(实际远不止8根),那么可可以访问的地址编号就是从0000 0000~1111 1111共2^8=256个地址编号。


3、usb_find_devices

原型:int usb_find_devices(void);

功能:查找总线上的usb设备(就像寻找高速路所连接的某一指定类型的城市)。

返回值:返回自上次调用本函数后改变的usb设备数(包括新增和移除的usb设备)。

说明:如果连续调用本函数,第二次调用的返回值一般为0(因为两次连续调用之间的usb设备数一般不变)。


>>注:以上三个函数都是使用usb通信编程一开始就应调用的函数,不能缺省,不能改变调用顺序。

 

4、usb_get_busses

原型:struct usb_bus   *usb_get_busses(void);

功能:返回总线的列表(就像列出一份高速公路的花名册)。

说明:本函数不是必须的,是否调用要视usb标准的版本而定。


  

>>设备接口的操作

 

1、usb_open

原型:usb_dev_handle   *usb_open(struct *usb_device    dev);

功能:打开要使用的设备(linux下一切皆文件),在使用文件前一定要打开它(就像windows下要编辑或浏览一个文档,首先要打开这个文档一样)。

说明:结构体 usb_dev_handle 和 usb_device 是我们在开发中经常遇到的,它们的定义在libusb 中的usb.h和usbi.h中。


2、usb_claim_interface

原型:int  usb_claim_interface(usb_dev_handle   *dev, int   interface);

功能:注册一个通信接口(参数interface是指“接口描述符”struct usb_interface_descriptor中的接口编号bInterfaceNumber)。

返回值:成功0;EBUSY接口无效,无法注册;ENOMEM内存不足。

说明:必须在进行任何接口操作之前调用此函数。


>>以下几个函数的背景说明:

主机与usb设备之间的通信是通过端点(可以看作是一个有名管道)实现的,不同端点有不同的功能(0号端点用于初始化设备参数等,1、2号端点一般为数据传输端点。每个端点的数据传输都是单向的),端点按照功能不同又可以组成不同的集合(称为接口),不是每个接口的功能都是用户所需要的。为了节约资源,用户在使用usb设备时就需要指定哪些接口需要,哪些不需要;同时还要指出需要的端口是什么类型、支持什么协议、包含的端口数等等信息。这些信息就需要通过以下两个函数给定(具体查看usb标准)。


3、usb_set_configuration

原型:int   usb_set_configuration(usb_dev_handle   *dev,   int   configuration);

功能:设置活跃配置参数(参数configuration是指“配置描述符”struct usb_config_descriptor中的bConfigurationValue)

返回值:成功0,失败<0。

说明:一个设备可能包含多个configuration值,比如既需要支持高速usb设备又需要支持低速usb设备就应设置两个不同的configuration值。


4、usb_set_altinterface

原型:int   usb_set_altinterface(usb_dev_handle    *dev,   int   alternate);

功能:设置活跃轮换参数(参数alternate是指“接口描述符”struct usb_interface_descriptor中的bAlternateSetting)。

返回值:成功0,失败<0。


5、usb_resetep

原型: int   usb_resetep(usb_dev_handle   *dev,   unsigned int   ep);

功能:重置指定端点的所有状态(参数ep是指“端点描述符”usb_endpoint_descriptor中的bEndpointAddress)。

返回值:成功0,失败<0。

说明:此函数最好不要调用,因为用户真正想要的效果应该是usb_clear_halt函数。


6、usb_clear_halt

原型:int   usb_clear_halt (usb_dev_handle   *dev,   unsigned int  ep);

功能:清理指定端点的所有停止状态(参数ep是指“端点描述符”usb_endpoint_descriptor中的bEndpointAddress)。

返回值:成功0,失败<0。

 

7、usb_reset

原型:int  usb_reset(usb_dev_handle  *dev);

功能:重置指定的usb设备(发送RESET指令,使指定的设备句柄停止工作。之后需要重新查找设备、重新获得列表

返回值:成功0,失败<0。


8、usb_release_interface

原型:int  usb_release_interface(usb_dev_handle  *dev,   int  interface);

功能:注销通信接口,回收资源()。

返回值:

说明:此函数是usb_claim_interface函数的反操作。


9、usb_close

原型:int   usb_close(usb_dev_handle   *dev);

功能:关闭一打开的设备。

返回值:成功0,失败<0。

说明:此函数是*usb_open函数的反操作。使用文件后一定要关闭(有些操作是将数据存储在客户缓存之中,只有关闭时才会真正对文件进行操作,所以关闭文件不仅是养成回收资源的好习惯,更是对操作的最终确认)。

 


>>控制传输接口


1、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);

功能:从默认的管道发送和接收控制数据。

返回值:成功时返回读写的字节数,失败<0。


2、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的字节数,失败<0。

 

3、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中)。

返回值:成功则返回实际写入buf的字节数,失败<0。


4、usb_get_descriptor

原型:int   usb_get_descriptor(

usb_dev_handle   *dev, 

unsigned char    type, 

unsigned char    index, 

void   *buf, 

int   size);

功能:获取设备缺省控制管道的描述符(通过type和index索引,将结果写入buf中)。

返回值:成功则返回实际写入buf的字节数,失败<0。


5、usb_get_descriptor_by_endpoint

原型:int   usb_get_descriptor_by_endpoint(

usb_dev_handle   *dev, 

int   ep, 

unsigned char   type, 

unsigned char   index, 

void   *buf, 

int   size);

功能:获取ep指定端点的控制管道描述符(通过type和index索引,将结果写入buf中)。

返回值:成功则返回实际写入buf的字节数,失败<0。


>>批传输接口


1、usb_bulk_write

原型:int   usb_bulk_write(

usb_dev_handle   *dev, 

int   ep, 

char   *bytes, 

int   size, 

int   timeout);

功能:写入一块数据到ep指定的端点。

返回值:成功则返回实际写入的字节数,失败<0。


2、usb_bulk_read

原型:int   usb_bulk_read(

usb_dev_handle   *dev, 

int   ep, 

char   *bytes, 

int   size, 

int   timeout);

功能:从ep指定的端点读取一块数据。

返回值:成功则返回实际读取的字节数,失败<0。





>>中断传输接口


1、usb_interrupt_write

原型:int usb_interrupt_write(

usb_dev_handle *dev, 

int ep, 

char *bytes, 

int size, 

int timeout);

功能:中断向ep指定的端点写入数据。

返回值:成功则返回实际写入的字节数,失败<0。


2、usb_interrupt_read

原型:int   usb_interrupt_read(

usb_dev_handle   *dev, 

int   ep, 

char   *bytes, 

int   size, 

int   timeout);

功能:中断从ep指定的端点读取数据。

返回值:成功则返回实际读取的字节数,失败<0。


>>具体例程请参考下一专题笔记。




版权声明:本文为weixin_41466668原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。