USB设备开发---- 基于libusb的无驱设计

转载 2016年08月29日 20:12:06

Linux下的USB驱动开发,主要有内核驱动开发以及基于libusb的无驱设计。libusb是一个开源项目,Linux和Windows下都有相应的版本,本文以一个实际项目的原代码为例,来看看linux系统下怎样利用libusb来访问我们的USB设备。

首先我们简单介绍下libusb的编译和安装(本例OS为CentOS6.0 (内核版本2.6.32-71.el6.i686)。

官网下载libusb安装包(本项目中下载的版本为libusb-1.0.8.tar),解压后,进入libusb-1.0.8文件夹目录中,依次执行如下指令:

     a:执行./configure来配置安装包。

     b:执行make编译该安装包。

     c:执行make install安装。


libusb安装好之后,就可以调用它的API来访问我们的设备了,先简单介绍下几个主要的API

1:

[cpp] view plain copy
  1. API_EXPORTED int libusb_init(libusb_context **context)  

该函数进行libusb的初始化,必须最先调用。

libusb_context  *ctx :可以为NULL。


2:

[cpp] view plain copy
  1. API_EXPORTED libusb_device_handle *libusb_open_device_with_vid_pid(  
  2.     libusb_context *ctx, uint16_t vendor_id, uint16_t product_id)  
该函数可直接根据指定的USB设备的Vendor ID 和 Product ID来找到相应的设备并打开它,将设备句柄返回给调用者。

libusb_context  *ctx :可以为NULL。

uint16_t   vendor :生产商ID。

uint16_t  product_id: 设备ID。


3:

[cpp] view plain copy
  1. int libusb_control_transfer(libusb_device_handle *dev_handle,  
  2.     uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,  
  3.     unsigned char *data, uint16_t wLength, unsigned int timeout)  

控制传输操作

libusb_device_handle *dev_handle:  设备句柄。

uint8_t  bmRequestType: 对应Setup Packet包中的bmRequestType字段。

uint8_t  bRequest: 对应Setup Packet包中的bRequest字段。

uint16_t   wValue: 对应Setup Packet包中的wValue字段。

uint16_t wIndex: 对应Setup Packet包中的wIndex字段。

unsigned char  *data: 数据。

uint16_t  wLength: 数据大小。

unsigned int  timeout: 超时阀值。


4:

[cpp] view plain copy
  1. API_EXPORTED int libusb_bulk_transfer(struct libusb_device_handle *dev_handle,  
  2.     unsigned char endpoint, unsigned char *data, int length, int *transferred,  
  3.     unsigned int timeout)  
块传输操作

libusb_device_handle *dev_handle:  设备句柄。

unsigned char endpoint:  端点编号。

unsigned char  *data: 数据。

int length: 数据块长度。

int *transferred:  实际传输数据块大小。

unsigned int timeout:  超时阀值。


5:

[cpp] view plain copy
  1. API_EXPORTED int libusb_interrupt_transfer(  
  2.     struct libusb_device_handle *dev_handle, unsigned char endpoint,  
  3.     unsigned char *data, int length, int *transferred, unsigned int timeout)  

中断传输操作

libusb_device_handle *dev_handle:  设备句柄。

unsigned char endpoint:  端点编号。

unsigned char  *data: 数据。

int length: 数据块长度。

int *transferred:  实际传输数据块大小。

unsigned int timeout:  超时阀值。



下面我们看看如何打开设备:

[cpp] view plain copy
  1. int   rv = 0;  
  2.   
  3. rv = libusb_init(NULL);  
  4. if(rv < 0) {  
  5.    printf("*** initial USB lib failed! \n");      
  6.    return -1;  
  7. }  
  8.   
  9. //open the usb device  
  10. g_usb_handle = libusb_open_device_with_vid_pid(NULL, USB_VENDOR_ID, USB_PRODUCT_ID);  
  11. if(g_usb_handle == NULL) {  
  12.   printf("*** Permission denied or Can not find the USB board (Maybe the USB driver has not been installed correctly), quit!\n");  
  13.   return -1;  
  14. }  

libusb的使用非常方便,指定ID后,相应设备被打开,得到设备句柄之后,即可调用各种传输操作API对我们的USB设备进行访问了。


Libusb简介及例子

Libusb简介及例子         Libusb居说在Mac,Linux,Windows跨平台的。目前为止我还没有在除Linux平台外的其它平台测试 :(。回归重点,用通俗语言介绍一下我最近了解的...
  • kangear
  • kangear
  • 2014年06月18日 21:15
  • 27262

libusb 使用说明

Window下: 1.  下载地址:https://sourceforge.net/projects/libusb-win32/  下载libusb-win32-bin-1.2.6.0 2. 选择...
  • o1ogxfco1o
  • o1ogxfco1o
  • 2016年03月17日 11:53
  • 1497

libusb无驱设计(USB设备开发)

转自:  http://blog.csdn.net/saloon_yuan/article/details/7880768 Linux下的USB驱动开发,主要有内核驱动开发以及基于l...
  • yueguanyun
  • yueguanyun
  • 2016年04月19日 18:33
  • 1272

libusb学习-2

Libusb简介及例子 Libusb据说在Mac,Linux,Windows跨平台的。目前为止我还没有在除Linux平台外的其它平台测试 :(。回归重点,用通俗语言介绍一下我最近了解...
  • mouse1598189
  • mouse1598189
  • 2016年01月10日 11:09
  • 857

如何在Linux下利用Libusb与HID USB设备通信!

由于公司的产品,导致我在Linux下写usb通信的代码出现了许多的问题,最后发现这些设备只能通过控制传输来操作设备,所以后面的问题就迎刃而解了。现在贴上当时在QT下写的代码,以防日后再碰到此类问题的时...
  • a7082633
  • a7082633
  • 2016年03月04日 15:16
  • 3220

libusb的使用教程和例子

转自:http://www.cnblogs.com/Daniel-G/archive/2013/04/22/3036730.html libusb的使用教程和例子 驱动开发向来...
  • dotphoenix
  • dotphoenix
  • 2014年09月09日 17:04
  • 13948

libusb异步中断传输使用说明

基于libusbx-1.0.18-rc1,libusbx现已重新merage到libusb。 1. 初始化 使用libusb_init初始化libusb,如果是单设备通信,ctx参数可以传NULL...
  • coroutines
  • coroutines
  • 2014年08月08日 11:27
  • 12159

libusb API入门

synchronous I/O interface 你只要一个函数就能进行USB传输
  • luckywang1103
  • luckywang1103
  • 2014年09月17日 22:02
  • 13042

libusb_bulk_transfer函数说明

libusb_bulk_transfer函数说明 API_EXPORTED int libusb_bulk_transfer(struct libusb_device_handle *dev_han...
  • yueguanyun
  • yueguanyun
  • 2016年04月19日 18:26
  • 5186

USB设备开发---- 基于libusb的无驱设计 .

Linux下的USB驱动开发,主要有内核驱动开发以及基于libusb的无驱设计。libusb是一个开源项目,Linux和Windows下都有相应的版本,本文以一个实际项目的原代码为例,来看看linux...
  • wzsy
  • wzsy
  • 2014年05月22日 16:32
  • 945
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:USB设备开发---- 基于libusb的无驱设计
举报原因:
原因补充:

(最多只允许输入30个字)