当前位置: 首页 > news >正文

libusb系列-005-部分API简介

头图

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

关键字: 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失败

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


博客签名2021

相关文章:

  • 深度学习提高模型准确率方法
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • HTML 学习总结
  • 网络安全:技术趋势
  • 现在都这么狂吗?面试了一个工作4年的测试工程师,一问连自动化基础都不清楚,还反过来怼我....
  • c++内存管理:
  • Hbase性能调优(一)
  • STM32CUBEMX(10)--内部Flash读写
  • 基于 Maven 的 MyBatis 逆向工程
  • 在阿里干了6年自动化测试,30岁即将退休的我,告诉你自动化测试工程师有多吃香...
  • 3.接口
  • LabVIEW-数据采集
  • Django全家桶
  • 内网渗透 Metasploit(MSF)基础使用
  • 机器学习笔记 - 使用TensorFlow Lite从头创建模型
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • angular学习第一篇-----环境搭建
  • java8 Stream Pipelines 浅析
  • php ci框架整合银盛支付
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Solarized Scheme
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 翻译--Thinking in React
  • 检测对象或数组
  • 那些年我们用过的显示性能指标
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​Python 3 新特性:类型注解
  • ​香农与信息论三大定律
  • #图像处理
  • (1)虚拟机的安装与使用,linux系统安装
  • (2.2w字)前端单元测试之Jest详解篇
  • (day6) 319. 灯泡开关
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)C#调用WebService 基础
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)ORM
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net程序集学习心得
  • .NET开源项目介绍及资源推荐:数据持久层
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @AutoConfigurationPackage的使用
  • @Autowired注解的实现原理
  • [ C++ ] STL---stack与queue
  • [2016.7 test.5] T1
  • [20160807][系统设计的三次迭代]
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android] Implementation vs API dependency
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)