首页 > 其他分享 >libusb系列-005-部分API简介

libusb系列-005-部分API简介

时间:2022-10-29 23:05:12浏览次数:89  
标签:API handle int interface libusb 005 device open


libusb系列-005-部分API简介

文章目录

  • ​​libusb系列-005-部分API简介​​
  • ​​摘要​​
  • ​​libusb_init​​
  • ​​libusb_open_device_with_vid_pid​​
  • ​​libusb_kernel_driver_active​​
  • ​​libusb_detach_kernel_driver​​
  • ​​libusb_claim_interface​​
  • ​​libusb_release_interface​​
  • ​​libusb_attach_kernel_driver​​
  • ​​libusb_close​​
  • ​​libusb_exit​​
  • ​​libusb_interrupt_transfer​​
  • ​​libusb_bulk_transfer​​


关键字:

​Debian​​、

​Linux​​、

​Qt​​、

​libusb​​、

​API​

内容背景:

最近项目终于切到Linux下开发了,所以最近的记录都是发生在​​Debian 10​​​ 以及​​Arm Debain 10​​​ 下,​​Qt​​​版本​​5.12.3​​。这几天真是问题多多,收获满满,不过目前阶段仅仅停留在解决问题,至于原理性的东西,还得慢慢消化。最近好多问题都是直接群里问大神,感谢各位大神助我成长。

开始本来USB传世使用的是HIDUSB,后面计划开发一个专用的驱动,到最后,因为最终系统一直定不下来,最终成了使用libusb了。大部分人都是直接使用libusb 的库的,把源码直接放在项目中参与编译的应该很好,哎,我就是那个大冤种,那么请跟随我一起看我如何给自己完坑踩坑吧。

摘要

本着现用现学,现学现卖的原则,这篇就简单介绍一下我在项目中实际使用的几个接口,其他接口等用到再说,或者后期有精力且闲的蛋疼了再研究(就是没有了)。

libusb系列-005-部分API简介_1024程序员节

libusb_init

名字就说明了一切了,就是libusb库的初始化函数,也可以理解为libusb 的入口函数吧,最先调用

int libusb_init(libusb_context **ctx);

✍参数:

ctx 通常设置为NULL。

☄返回值:

​ 返回0表示成功,非零表示失败 ,可以通过​​libusb_error_name​​打印错误信息。

这里放下我在代码中的使用

if((libusb_init(NULL) < 0))
{
qDebug() <<"failed to initialise libusb" << LOGINFOR;
return false;
}

libusb_open_device_with_vid_pid

通过VID和PID打开一个USB 设备,并返回设备句柄libusb_device_handle的指针

libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(libusb_context *ctx,
uint16_t vendor_id,
uint16_t product_id);

✍参数:

ctx 通常为NULL

vendor_id 设备的VID

product_id 设备的PID

☄返回值:

成功返回libusb_device_handle的指针 ,失败返回NULL

我在项目中的使用

devhandle = libusb_open_device_with_vid_pid(NULL, USB_DEV_VID, USB_DEV_PID);

libusb_kernel_driver_active

确定指定接口的内核驱动程序是否已经激活。如果一个内核驱动程序是激活的,libusb_claim_interface调用的会失败

int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev,
int interface_number);

✍参数:

dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

interface_number 接口号,这个对应接口描述符的 bInterfaceNumber

☄返回值:

1 已经激活,非1 没有激活

libusb_detach_kernel_driver

卸载指定接口的内核驱动程序。如果一个内核驱动程序是激活的,必须先调用这个函数,再调用libusb_claim_interface

int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev,
int interface_number);

✍参数:

dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

interface_number 接口号,这个对应接口描述符的 bInterfaceNumber

☄返回值:

0 成功,非0失败

libusb_claim_interface

为指定的设备申请接口

int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev,
int interface_number);

✍参数:

dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

interface_number 接口号,这个对应接口描述符的 bInterfaceNumber

☄返回值:

0 成功,非0失败

libusb_release_interface

释放之前为指定的设备申请接口,注意这个函数只是释放接口,不会重新加载内核驱动

int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev,
int interface_number);

✍参数:

dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

interface_number 接口号,这个对应接口描述符的 bInterfaceNumber

☄返回值:

0 成功,非0失败

libusb_attach_kernel_driver

加载指定接口的内核驱动

int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev,
int interface_number);

✍参数:

dev 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

interface_number 接口号,这个对应接口描述符的 bInterfaceNumber

☄返回值:

0 成功,非0失败

libusb_close

关闭 libusb_open或者libusb_open_device_with_vid_pid打开的设备

void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle);

✍参数:

dev_handle 调用libusb_open或者libusb_open_device_with_vid_pid返回的设备句柄libusb_device_handle的指针

libusb_exit

和libusb_init成对使用,释放相应的资源。

void  libusb_exit(libusb_context *ctx);

✍参数:

ctx通常设置NULL

libusb_interrupt_transfer

执行USB中断传输。该函数可以处理输入和输出,根据端点地址的方向位推断传输方向,该函数采用同步模式,数据传输完毕才返回

int LIBUSB_CALL libusb_interrupt_transfer(
libusb_device_handle *dev_handle,
unsigned char endpoint,
unsigned char *data,
int length,
int *actual_length,
unsigned int timeout);

✍参数:

dev_handle 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

endpoint 端点地址 最高位为1表示输入

data 发送或者接收缓冲区指针

length 缓冲区长度

actual_length 带回实际传输长度

timeout 超时的毫秒数,0 永不超时

☄返回值:

0 成功,非0失败

libusb_bulk_transfer

执行USB批量传输。该函数可以处理输入和输出,根据端点地址的方向位推断传输方向,该函数采用同步模式,数据传输完毕才返回

int LIBUSB_CALL libusb_bulk_transfer(
libusb_device_handle *dev_handle,
unsigned char endpoint,
unsigned char *data,
int length,
int *actual_length,
unsigned int timeout);

✍参数:

dev_handle 调用 libusb_open或者libusb_open_device_with_vid_pid返回的libusb_device_handle的句柄

endpoint 端点地址 最高位为1表示输入

data 发送或者接收缓冲区指针

length 缓冲区长度

actual_length 带回实际传输长度

timeout 超时的毫秒数,0 永不超时

☄返回值:

0 成功,非0失败

目前我只用到这么多,其他的,可以参考官方文档。参考链接​​https://blog.51cto.com/u_3078781/3288743​




标签:API,handle,int,interface,libusb,005,device,open
From: https://blog.51cto.com/DreamLife/5806576

相关文章