libusb系列-005-部分API简介

Posted DreamLife.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了libusb系列-005-部分API简介相关的知识,希望对你有一定的参考价值。

libusb系列-005-部分API简介

文章目录


关键字: DebianLinuxQtlibusbAPI

内容背景:

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

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

摘要

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

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


以上是关于libusb系列-005-部分API简介的主要内容,如果未能解决你的问题,请参考以下文章

libusb简介

在 QT 中使用 libusb 检测 MAC 上的 USB 设备

005推断两个字符串是否是变位词 (keep it up)

libusb系列-002-Windows下libusb源码编译

libusb系列-003-Linux下libusb源码编译

libusb系列-004-Qt下使用libusb库