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 终端概述与分类

该博文已经迁移到其他博客,参见: Linux 终端IO概念与背景介绍

Linux tty驱动程序一 架构

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

Linux 串口编程二 深入了解 termios

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

Libusb开发教程三 USB设备程序开发

首先,需要指出本篇博客的基础仍然是基于 libusb V1.0 以下。主要考虑到保持与之前博客的连贯性,在上一篇博客中介绍了老版本中可以被调用的 API 以及功能介绍,对于库中 API 接口函数的使用相信读者会一目了然,不需要刻意记忆&…

Linux 串口编程三 使用termios与API进行串口程序开发

在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解。事实上,快速掌握一项技术的核心点也是一种学习能力。对于使用,熟悉并掌握操作框架十分…

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 主机。配件实例可能包含机器人控制器、扩展坞、诊断和音乐设备、售货亭、…

安卓USB开发教程 二 USB Host

USB Host(主机模式) 当 Android 设备处于 USB 主机模式时,它充当 USB 主机,为总线供电,并枚举连接的 USB 设备。Android 3.1 及更高版本支持 USB 主机模式。 API 概述 在开始之前,理解需要使用的类是很重…

安卓USB开发教程 三 USB Accessory

USB Accessory(配件模式) USB 配件模式允许用户连接专为 Android 设备设计的 USB 主机硬件。配件必须遵守 Android Accessory Development Kit 文档中列出的 Android 配件协议。 这使得 Android 设备无法充当 USB 主机时仍然可以与 USB 硬件交互。 当 A…

Android ADB

Android 调试桥 本文内容 adb 的工作方式在您的设备上启用 adb 调试通过 WLAN 连接到设备查询设备将命令发送至特定设备安装应用设置端口转发将文件复制到设备/从设备复制文件停止 adb 服务器adb 命令参考发出 shell 命令 调用 Activity Manager (am)调用软件包管理器 (pm)进行…

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

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

安卓系统源代码下载(官方教程)

下载源代码 Android 源代码树位于由 Google 托管的 Git 代码库中。Git 代码库中包含 Android 源代码的元数据,其中包括与对源代码进行的更改以及更改日期相关的元数据。本文档介绍了如何下载特定 Android 代码流水线的源代码树。 要从特定设备的出厂映像开始&#x…

Cygwin 下载极速源推荐

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