Libusb开发教程二 API介绍与使用

背景介绍

上一篇博文主要介绍了 Libusb 在 Linux 系统下的详细安装过程,除了 libusb-1.0.9.tar.bz2 离线包之外,还安装了 libusb-compat-0.1.4.tar.bz2。顾名思义,第二个是先前版本的兼容包,因此在使用过程中,开发者就需要区分引用不同的 lib 版本了。libusb 较大版本变动以 V1.0 为分界线,访问官网:http://libusb.info 时也可以发现文档说明都以 V1.0 为主了。注意,libusb 已经从 libusb.org 切换到了 libusb.info。展示下最新网站首页:


分类十分明确,开发者可以直接从网站下载文档,API使用说明,例程等内容。V1.0 相对于之前版本,提供了更丰富的功能和接口,然而大部分情形下旧版本库提供的 API 函数功能已经可以满足我们应用的需要了,并且官网的源码安装包一直保持着对于老版本的兼容。出于兼容性以及大部分开发者使用习惯,本篇先基于老版本 Libusb 库 API 进行说明与使用介绍。

Libusb API 函数与功能

了解包含的 API 函数以及结构体相关定义等很简单,直接在安装路径下找到我们编程时需要引用的头文件即可,这里对应的头文件是 usb.h。我们打开 usb.h 可以看到,代码上部分为 usb 协议标准术语的宏定义,中间为相关结构体定义,后半部为我们编程引用的 API 声明,下面根据 API 功能和使用顺序进行分类描述:

核心初始化函数

1. void usb_init(void);

函数功能:libusb 初始化,这一步必须首先执行。

2. int usb_find_busses(void);

函数功能:查找系统上的 usb 总线,任何 usb 设备依附于 usb 总线和主机通信。成功返回 usb 总线数目,失败返回负值。

3. int usb_find_devices(void);

函数功能:查找总线上的 usb 设备,这个函数必须在调用 usb_find_busses() 后使用。成功返回设备数目,失败返回负值。

4. struct usb_bus *usb_get_busses(void);

函数功能:返回全局变量 usb_busses,用于遍历总线链表,查找总线 usb 设备。失败返回 NULL。这四步操作是任何程序必须首先执行的。

设备操作接口

1. usb_dev_handle *usb_open(struct usb_device *dev);

函数功能:打开 usb 设备,引用的 usb_dev_handle 以及 usb_device 结构体是 libusb 最常见的,定义可以参见头文件。函数返回 usb 设备的操作句柄,之后对该 usb 设备的操作都通过该句柄进行;

2. int usb_close(usb_dev_handle *dev);

函数功能:关闭 usb 设备,在所有操作完成后或者程序退出前调用,传入参数即上面提到的句柄,成功返回0;

3. int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, size_t buflen);

函数功能:获取设备的字符串描述,通过 index 和 langid 进行索引。返回Unicode字符串到buf中,成功返回实际写入buf 的字节数,失败返回负值。

4. int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen);

函数功能:包装了 usb_get_string() 函数,返回第一种语言指定 index 索引的字符串描述,并转换到C风格的 ASCII。成功返回实际写入buf 的字节数,失败返回负值。

5. int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, unsigned char type, unsigned char index, void *buf, int size);

函数功能:从设备获取描述符,以 type 和 index 索引,以ep标志的控制管道。成功返回实际写入buf 的字节数,失败返回负值。

6. int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, unsigned char index, void *buf, int size);

函数功能:获取设备缺省控制管道的描述符,通过 type 和 index 索引。成功返回实际写入buf 的字节数,失败返回负值。

7. int usb_set_configuration(usb_dev_handle *dev, int configuration);

函数功能:设置当前设备使用的configuration,参数configuration 是设备配置描述符中的 bConfigurationValue。成功返回0,失败返回负值。

8. int usb_claim_interface(usb_dev_handle *dev, int interface);

函数功能: 注册设备与操作系统通信的接口,interface 参数是接口描述符的 bInterfaceNumber 字段。这个函数必须被调用,因为只有注册接口,才能做相应的操作。必须在任何接口相关操作(如 usb_set_altinterface() 、 usb_bulk_write() 等)之前调用。成功返回0,失败返回负值。

9. int usb_release_interface(usb_dev_handle *dev, int interface);

函数功能:注销在 usb_claim_interface 中注册的通讯接口,释放相关资源,与注册函数成对使用。

10. int usb_set_altinterface(usb_dev_handle *dev, int alternate);

函数功能:设定当前接口中的活跃(起作用的)设置,alternate 为接口描述符中 bAlternateSetting 字段。成功返回0,失败返回负值。

11. int usb_resetep(usb_dev_handle *dev, unsigned int ep);

函数功能:复位指定的端点,参数 ep 为端点描述符中的 bEndpointAddress,此函数已被函数 usb_clear_halt 替代。成功返回0,失败返回负值。

12. int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);

函数功能:复位指定的端点,参数 ep 为端点描述符中的 bEndpointAddress。成功返回0,失败返回负值。

13. int usb_reset(usb_dev_handle *dev);

函数功能:重置指定设备,通过发送 RESET 指令过去。返回0成功,负数失败。在执行该函数之后,需要重新枚举设备,且之前的句柄无法再工作。因此现在使用 usb_close 函数来替代。

14. int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, unsigned int namelen);

函数功能:获取设备接口对应的驱动程序名称,也即遍历 sysfs 系统中驱动与设备的对应关系,查找当前系统中有无该接口驱动,成功驱动名写入到 name 中且函数返回0,失败返回负值。

15. int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);

函数功能:从内核中分离该接口驱动程序,也即禁止该驱动对设备起作用。这个步骤不可省略,不然会发现驱动和使用 Libusb 编写的应用程序同时对设备起作用,引起错误。使用时可以先通过 usb_get_driver_np 进行判断,如果有绑定的驱动程序,那么再调用此函数进行分离。成功返回0,失败返回负值。

数据通讯接口

1. int usb_bulk_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);

函数功能:批量端点写函数,传入指定的端点号,timeout 为超时时间,以 ms 为单位。成功返回实际写入设备的字节数,失败返回负值。

2. int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

函数功能:批量端点读函数,传入指定的端点号,timeout 为超时时间,以 ms 为单位。成功返回实际写入 buf 的字节数,失败返回负值。

3. int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);

函数功能:中断端点写函数,传入指定的端点号,timeout 为超时时间,以 ms 为单位。成功返回实际写入设备的字节数,失败返回负值。

4. int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

函数功能:中断端点读函数,传入指定的端点号,timeout 为超时时间,以 ms 为单位。成功返回实际写入 buf 的字节数,失败返回负值。

5. int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);

函数功能:控制请求读写函数,传入参数与 usb 协议保持一致,timeout 为超时时间,以 ms 为单位。成功返回实际读写的字节数,失败返回负值。

辅助函数接口

1. char *usb_strerror(void);

函数功能:根据错误返回值 errno,返回错误码码对应的字符串。

2. void usb_set_debug(int level);

函数功能:设置 libusb 的调试级别,libusb 支持打印调试信息,level 值为指定的调试级别。

3. struct usb_device *usb_device(usb_dev_handle *dev);

函数功能:根据句柄返回对应的 usb_device。


有想法或者疑问可以给我邮件或者评论,觉得有用就点赞吧~:-D


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tty,串口,控制台与驱动程序

tty 设备的名称是从过去的电传打字机缩写而来,最初是指链接到 Unix 系统上的物理或者虚拟终端。随着时间的推移,当通过串行口能够建立起终端连接后,这个名字也用来指任何的串口设备。物理 tty 设备的例子有串口、USB 到串口的转换器&#xff…

Linux 串口编程一 一些背景

在大部分讲解 Linux 编程书籍的时候会发现没有单独的串口编程章节,实际上串口编程已经被概括在了“终端”或者“终端IO”章节里面。在上一篇博客中对经常出现的几个容易混淆的概念进行简单描述:tty,串口,控制台与驱动程序。后面会…

Linux tty驱动程序一 架构

tty 核心概览如下图所示: 可以看到,tty 架构的划分层次,由下至上的逻辑关系为:硬件 -> tty 驱动 -> tty 线路规程(也译为行规程)-> tty 核心 -> 用户层。 内核负责控制 tty 设备的数据流&…

Linux 串口编程二 深入了解 termios

前言 这一系列串口编程重点在应用层编程,但是在讲解原理与相关概念时需要对驱动框架有个基础的认识。如果只是浅尝辄止,以后在遇到串口驱动与应用层程序调试难免遇到瓶颈。关于 tty驱动架构参见我的其他博客:Linux tty驱动程序架构。有时了解…

Linux 串口编程四 串口设备程序开发

Linux 串口编程和程序相对来说是很简单的,之所以用博客连载来展示,主要是想在学会使用的基础上掌握相关背景,原理以及注意事项。相信在遇到问题的时候,我们就不会对于技术的概念和 API 的使用浅尝辄止了。下面进入具体应用案例&am…

POSIX 串口编程指南

介绍 POSIX 串口编程指南将教会你在你的 UNIX 工作站或者 PC 上面如何成功、有效以及可移植性的对串口编程。每一章提供了使用 POSIX 终端控制函数的编程例程,可以基本不经修改地工作在 IRIX, HP-UX, SunOS, Solaris, Digital UNIX, Linux 以及其他大多数 UNIX 操作…

快速解决 Android SDK Manager 无法下载或者下载速度慢

在这里以 Windows 下的 Android SDK Manager 为例,其他系统下与此类似,只会存在部分工具栏名称不同的情况,不明之处可以追问。下面就进入具体配置流程: 1. 选择 Tools->Options 进入代理设置。 代理设置选项,在 H…

安卓之USB主机(Host)与配件(Accessory)模式

安卓设备与USB硬件通讯时有两种模式可以选择:USB Host 模式与 USB Accessory 模式。从 USB 逻辑角色来说,USB Host 模式是指安卓设备作为 USB 主机,所有活动均由安卓设备发起;USB Accessory 模式是指安卓设备作为 USB 设备&#x…

安卓USB开发教程 一 USB Host 与 Accessory

安卓通过两种模式:USB Accessory 与 USB Host 模式支持多种 USB 外设与安卓 USB 配件(实现安卓配件协议的硬件)。在 USB 配件模式下,外部 USB 硬件充当 USB 主机。配件实例可能包含机器人控制器、扩展坞、诊断和音乐设备、售货亭、…

轻松访问 Android 系统源码与下载

有时研究 Android 某个特性或者协议的时候需要参阅安卓系统源代码中代码实现或者协议文档等。通过正常的建立 repo,git 获取十分耗时,并且速度很慢,除非是需要重新编译系统,定制系统才需要这样做。因此,推荐一个 Andro…

Cygwin 下载极速源推荐

Cygwin 默认列表中的源下载速度太慢,国内使用时常用以下几个源,经过实际使用速度很快,下载时不妨几者都尝试下: 如上图所示,下载时在此栏填写 URL 地址即可,推荐地址: http://mirrors.sohu.com…

Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析

使用环境 前一篇在介绍 JavaStruct 类时指定了使用库使用环境为 Java 5 及以上,也即开发我们使用的 JDK 版本为1.5及以上就可以了。以下讲解的用例可以直接将 code 直接粘贴到 java 的 main 函数中执行就可以了,后面会给出测试用例和结果。 使用方法 Jav…

Java 结构体之 JavaStruct 使用教程三 JavaStruct 数组进阶

经过前面两篇博客的介绍,相信对于 JavaStruct 的认识以及编程使用,读者已经有一定的基础了。只要理解和实践结合起来,掌握还是很容易的。下面进行一些数组使用方面的实例说明及演示。 在结构体类中使用数组有几种方式,可以使用静…

Android开发如何使用JNA

1. JNA(Java Native Access)项目已经迁移到 github,最新的项目链接:https://github.com/java-native-access/jna 。首先前往该地址下载使用 JNA 需要的两个 jar 库文件,jna.jar,jna-platform.jar 。 2. 在…

JAVA循环队列

关于自定义循环队列的实现原理和要点可以参见之前的博文系列:循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构,为什么还要单独实现循环队列&#…

VMware 虚拟机占用磁盘空间

使用VMware创建的虚拟机尽管已经设定分配的磁盘大小,但仍然会发现虚拟机占用的磁盘空间会越来越大,而直观体现就是虚拟机系统文件 vmdk 不断增大。因此下面介绍一个简单的方法,使用 VMware 自带的工具对 vmdk 文件进行压缩以节省磁盘空间。拿…

frameworks/av/media/CedarX-Projects/CedarAndroidLib/LIB_KK44_/Android.mk: No such file or directory

在安卓系统编译过程中如果遇到上述或者与之类似的错误,可以采取相同的处理方法进行解决。直接进入到 CedarAndroidLib 目录下,也即此例中的 frameworks/av/media/CedarX-Projects/CedarAndroidLib。看一下当前文件: 注意第9行为包含标题中报错…

Windows与Linux下tftp服务的使用

tftp 协议是基于 udp 的,轻量小巧,用在局域网和嵌入式上很顺手。大部分帖子把在 linux 上配置的过程描述的过于复杂,其实只是个工具而已。研究协议抓下包对比协议内容也可以满足需求了,下面进入正文。分别讲下在 linux 以及 windo…

饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜 饥荒中的物品没有详细信息,基本上只有一个名字,所以很多物品的功能都不知道,比如浆果吃了也不知道恢复什么, 采集的胡萝卜也不知道什么功…

安卓BLE开发教程(一) BLE基础

我试图以一种简单的方式去把重要的事情讲清楚。目的是希望BLE协议栈和基础概念简单化,让自己及类似的安卓开发者可以在较短的时间内把握住BLE的核心及使用方法。BLE本身很复杂,但对于安卓开发而言只要抓住一些核心点,便已足够。如果你想全面了…