libusb系列-005-部分API简介

960 阅读4分钟

“我正在参加「掘金·启航计划」”

头图

libusb系列-005-部分API简介

libusb系列-005-部分API简介摘要libusb_initlibusb_open_device_with_vid_pidlibusb_kernel_driver_activelibusb_detach_kernel_driverlibusb_claim_interfacelibusb_release_interfacelibusb_attach_kernel_driverlibusb_closelibusb_exitlibusb_interrupt_transferlibusb_bulk_transfer

关键字: DebianLinuxQtlibusbAPI

内容背景:

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

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

摘要

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

image-20221022151419704

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失败

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


cba67a62214f47c4be66d1024543cf80.png