libusb开发者指南(转)
译者: gashero
作者: Johannes Erdfelt
日期: 2010-04-17
地址: http://libusb.sourceforge.net/doc/
目录
1 介绍
- 1.1 概览
- 1.2 当前OS支持
- 2 API
- 2.1 设备与接口
- 2.2 超时
- 2.3 数据类型
- 2.4 同步
- 2.5 返回值
- 3 函数
- 3.1 核心函数
- 3.2 设备操作
- 3.3 控制传输
- 3.4 块传输
- 3.5 中断传输
- 3.6 不可移植
- 4 例子
- 4.1 简单例子
- 4.2 源码包的例子
- 4.3 其他应用
本文档描述libusb的API,以及如何开发USB应用。
1 介绍
1.1 概览
本文档描述libusb-0.1的API和USB相关内容。
1.2 当前OS支持
Linux 2.2或以上
FreeBSD/NetBSD/OpenBSD
Darwin/MacOSX
2 API
2.1 设备与接口
一个设备可能有多个接口,所以一个句柄可以返回多个接口实例。不要忘记调用 usb_claim_interface() 。
2.2 超时
总是以毫秒为单位。
2.3 数据类型
同时使用有抽象结构和非抽象结构来保持可移植性。
2.4 同步
所有libusb v0.1的函数都是同步的,这意味着操作完成或超时前不会返回。异步操作从libusb v1.0开始支持。
2.5 返回值
libusb v0.1有两种返回值。一种是 usb_open() 返回的句柄,另一种是整数int,返回负数表示错误。
3 函数
3.1 核心函数
void usb_init(void);
初始化libusb。
int usb_find_busses(void);
查找所有总线,返回上次调用以后改变的数量(包括新增的和移除的总线)。
int usb_find_devices(void);
寻找每个总线上的所有设备。应该在 usb_find_busses() 之后调用。返回上次调用后改变的数量(包括新增和移除的设备)。
struct usb_bus *usb_get_busses(void);
简单的返回全局变量 usb_busses 。这仅对支持C调用规范和可以使用共享库的语言,但是不支持C全局变量的(例如Delphi)。
3.2 设备操作
这组函数用于操作设备。允许你打开关闭设备,设置配置、轮换设置、干净的关闭和重置设备。它也提供OS级别的操作,如认领(claim)和释放接 口。
usb_dev_handle *usb_open(struct *usb_device dev);
打开设备以供使用,返回设备句柄。
int usb_close(usb_dev_handle *dev);
关闭设备,返回0成功,负数失败。
int usb_set_configuration(usb_dev_handle *dev, int configuration);
设置活跃配置。configuration参数是描述符bConfigurationValue字段的值。返回0成功,负数失败。
int usb_set_altinterface(usb_dev_handle *dev, int alternate);
设置当前接口的活跃轮换设置。alternate参数是描述符bAlternateSetting字段的值。返回0成功,负数失败。
int usb_resetep(usb_dev_handle *dev, unsigned int ep);
重置指定端点的所有状态。ep参数是描述符的bEndpointAddress字段的值。返回0称公,负数失败。
该接口不建议使用,你可能需要的是 usb_clear_halt() 。
int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
清理端点所有停止状态,ep是描述符bEndpointAddress字段的值。返回0成功,负数失败。
int usb_reset(usb_dev_handle *dev);
重置指定设备,通过发送RESET指令过去。返回0成功,负数失败。
在执行该函数之后,需要重新列举,找到设备。当前的句柄无法再工作了。
int usb_claim_interface(usb_dev_handle *dev, int interface);
通过OS认领一个接口。interface参数是描述符的bInterfaceNumber字段。返回0成功,负数失败。
必须在任何接口相关操作(如 usb_set_altinterface() 、 usb_bulk_write() 等)之前调用。
返回码:
1 = EBUSY :接口无效,无法被认领
2 = ENOMEM :内存不足
int usb_release_interface(usb_dev_handle *dev, int interface);
释放之前认领的接口。interface参数是描述符的bInterfaceNumber字段。返回0成功,负数失败。
3.3 控制传输
发送消息到缺省控制管道。
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char*bytes, int size, int timeout);
发送控制请求到设备的缺省控制管道。参数对应USB规范中的同名类型。返回读写字节数,负数失败。
int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, size_t buflen);
获取设备的字符串描述,通过index和langdi索引。返回Unicode字符串到buf中。返回实际写入buf的字节数,负数失败。
int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen);
包装了 usb_get_string() 函数,返回第一种语言指定index索引的字符串描述,并转换到C风格的ASCII。返回写入buf字节数,负数失败。
int usb_get_descriptor(usb_dev_handle *dev, unsigned char type, unsigned char index, void *buf, intsize);
获取设备缺省控制管道的描述符,通过type和index索引。返回实际写入buf的字节数,负数失败。
参考 usb_get_descriptor_by_endpoint() 了解允许指定控制端点的。
int usb_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned charindex, void *buf, int size);
从设备获取描述符,以type和index索引,以ep标志的控制管道。返回读取字节数,负数失败。
3.4 块传输
这部分允许应用从数据块管道发送和接收数据。
int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
写入一块数据到端点ep,返回写入成功字节数,负数失败。
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
读取一块数据,从端点ep,返回读取成功字节数,负数失败。
3.5 中断传输
这组函数允许应用发送和接收数据通过中断管道。
int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
执行对端点ep的中断写入,返回实际写入字节数,负数失败。
int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
执行对中断端点ep的读取,返回实际读取字节数,负数失败。
3.6 不可移植
这些函数是不可移植的。有些是暴露了OS USB API之类的。他们都回加上函数名后缀 _np 。
一个C预处理器宏会定义实现的函数。形式是 LIBUSB_HAS_ 加上函数名,没有 usb_ 前缀。例如,usb_get_driver_np() 实现了,就会定义 LIBUSB_HAS_GET_DRIVER_NP 。
int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, int namelen);
这个函数获取接口驱动的名字。成功返回0,失败负数。
只在Linux有实现。
int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);
这个函数从接口剥离内核驱动。使用了libusb的应用可以随即重新认领接口。返回0成功,负数失败。
只在Linux有实现。
4 例子
4.1 简单例子
与设备通信前要先找到它。需要先找到所有总线(busses),然后找到所有设备:
struct usb_bus *busses; usb_init();
usb_find_busses();
usb_find_devices(); busses=usb_get_busses(); //在这之后,应用应该手动轮询所有总线和设备,匹配其所要的:
struct usb_bus *bus;
int c,i,a; for (bus=busses; bus; bus=bus->next) {
struct usb_device *dev;
for (dev=bus->devices; dev; dev=dev->next) {
if (dev->descriptor.bDeviceClass==) {
/*打开设备,认领接口,然后操作*/
}
/*循环遍历所有配置*/
for (c=; c< dev->descriptor.bNumConfigurations; c++) {
/*循环遍历所有接口*/
for (i=; i< dev->config[c].bNumInterfaces; i++) {
/*循环遍历所有轮换设置*/
for (a=; a< dev->config[c].interface[i].num_altsetting; a++) {
/*检查接口是否是打印机*/
if (dev->config[c].interface[i].altsetting[a].bInterfaceClass==) {
/*打开设备,设置轮换配置,认领接口,然后操作*/
}
}
}
}
}
}
4.2 源码包的例子
tests目录有个程序叫 testlibusb.c 。它简单的调用libusb寻找所有设备,然后遍历并打印描述符。其结果很简单,不过用处有限。倒是可以作为很好的入门。
4.3 其他应用
其他应用就参考其他的项目吧:
- gPhoto :使用libusb与相机通信
- rio500 :使用libusb与SONICblue Rio 500播放器
libusb开发者指南(转)的更多相关文章
- libusb 开发者指南-牛胜超(转)
源:libusb 开发者指南 libusb Developers Guidelibusb 开发者指南 原作者:Johannes Erdfelt翻译者:牛胜超 Table of Contents目录 P ...
- libusb开发者指南
本文档描述libusb的API,以及如何开发USB应用.1 介绍 1.1 概览本文档描述libusb-0.1的API和USB相关内容.1.2 当前OS支持Linux 2.2或以上FreeBSD/N ...
- Cocos引擎开发者指南(1-5)
Cocos引擎开发者指南 英文原版:http://www.cocos2d-x.org/docs/programmers-guide/1/ 中午翻译:http://www.cocos.com/doc/t ...
- GOOGLE PROTOBUF开发者指南
原文地址:http://www.cppblog.com/liquidx/archive/2009/06/23/88366.html 译者: gashero 目录 1 概览 1.1 什么是pro ...
- Protocol Buffers(Protobuf)开发者指南---概览
Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...
- Android开发者指南-方位传感器-Position Sensor
Android开发者指南-方位传感器-Position Sensor 转载自:http://blog.sina.com.cn/s/blog_48d4913001010zsu.html Position ...
- [译]AngularJS 1.3.0 开发者指南(一) -- 介绍
[译]AngularJS 1.3.0 开发者指南(一) -- 介绍 Angular是什么 ? AngularJS是一款针对动态web应用的结构框架. 它可以让像使用模板语言使用HTML, 并且可以扩展 ...
- ASP.NET Core开发者指南
ASP.NET Core开发者指南 2019年ASP.NET Core开发者指南: 你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“ ...
- Spring Security OAuth 2开发者指南译
Spring Security OAuth 2开发者指南译 介绍 这是用户指南的支持OAuth 2.0.对于OAuth 1.0,一切都是不同的,所以看到它的用户指南. 本用户指南分为两部分,第一部分为 ...
随机推荐
- 随笔css的样式
div独占一行 span和div很相似但是span会随着内容的变化而改变宽度: p独占一行height:由字体撑开. a标签不支持宽和高需要加入dispaly:block: img,input,会排在 ...
- Linux中的挂载和卸载
mkdir /home/xxx 创建挂载点 mount /dev/cdrom /home/xxx 把cdrom中的内容挂载到xxx目录 umount /dev/cdrom 卸载 /dev/sr ...
- VBS脚本随笔
1.定时运行程序与关闭程序的VBS处理方法: do set ws=createobject("wscript.shell") ws.run"你要运行的程序的路径(比如说d ...
- Redis SAVE 命令 返回 ERR
今天使用redis-cli客户端中执行SAVE命令返回 (error) ERR Baidu找不到答案,去Google找一下 应该是redis-server服务没有root权限 然后sudo kill ...
- 关于MySQL中时间格式和取零点的问题
select * from order where create_time>'2016-05-21 00:00:00'; 不包含2016-05-21 00:00:00时的订单 select * ...
- FusionCharts使用问题及解决方法(三)-FusionCharts常见问题大全
前两篇文章中,我们总结了FusionCharts图表的一些常见问题(FAQ)及解决方法,本文继续讨论FusionCharts使用者常见的一些复杂的报错及解决方法. 当HTML.SWF和JavaScri ...
- dom4j解析xml实例(2)
dom4j是一个java的XML API,类似jdom,用来读写XML文件,它性能优异.功能强大和极易使用等特点 所用jar包:dom4j-1.6.1.jar.jaxen-1.1-beta-6.jar ...
- java dom4j解析xml实例(3)
代码运行前需要先导入dom4j架包. 需要解析的XML文件test.xml如下: <students> <student age="25"><!--如 ...
- POJ 3660 Cow Contest 弗洛伊德
题意难懂是POJ的标配,这都TM赖本泽马. 题意:有N头牛进行了M场比赛,比赛双方是A - B 且总是A赢(前面的那个数赢),如果说A赢B,B赢C 则可以确定A赢C.问最终多少头牛的排名可以确定. 思 ...
- automaticallyAdjustsScrollViewInsets 标签栏不正常显示
想做的效果如下: 结果那个首页.手办模型神马的就是不显示啊... 这个标签栏是用scrollView做的,解决办法: viewController.automaticallyAdjustsScroll ...