USB裝置開發 基於libusb的無驅設計

2021-07-22 05:30:16 字數 3077 閱讀 6739

linux下的usb驅動開發,主要有核心驅動開發以及基於libusb的無驅設計。libusb是乙個開源專案,linux和windows下都有相應的版本,本文以乙個實際專案的原**為例,來看看linux系統下怎樣利用libusb來訪問我們的usb裝置。

首先我們簡單介紹下libusb的編譯和安裝(本例os為centos6.0 (核心版本2.6.32-71.el6.i686)。

a:執行./configure來配置安裝包。

b:執行make編譯該安裝包。

c:執行make install安裝。

libusb安裝好之後,就可以呼叫它的api來訪問我們的裝置了,先簡單介紹下幾個主要的api

1:[cpp]view plain

copy

api_exported 

intlibusb_init(libusb_context **context)  

該函式進行libusb的初始化,必須最先呼叫。

libusb_context  *ctx :可以為null。

2:[cpp]view plain

copy

api_exported libusb_device_handle *libusb_open_device_with_vid_pid(  

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

intlibusb_control_transfer(libusb_device_handle *dev_handle,  

uint8_t bmrequesttype, uint8_t brequest, uint16_t wvalue, uint16_t windex,  

unsigned char

*data, uint16_t wlength, unsigned 

inttimeout)  

控制傳輸操作

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

api_exported 

intlibusb_bulk_transfer(

struct

libusb_device_handle *dev_handle,  

unsigned char

endpoint, unsigned 

char

*data, 

intlength, 

int*transferred,  

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

api_exported 

intlibusb_interrupt_transfer(  

struct

libusb_device_handle *dev_handle, unsigned 

char

endpoint,  

unsigned char

*data, 

intlength, 

int*transferred, unsigned 

inttimeout)  

中斷傳輸操作

libusb_device_handle *dev_handle:  裝置控制代碼。

unsigned char endpoint:  端點編號。

unsigned char  *data: 資料。

int length: 資料塊長度。

int *transferred:  實際傳輸資料塊大小。

unsigned int timeout:  超時閥值。

下面我們看看如何開啟裝置:

[cpp]view plain

copy

intrv = 0;  

rv = libusb_init(null);  

if(rv 

//open the usb device

g_usb_handle = libusb_open_device_with_vid_pid(null, usb_vendor_id, usb_product_id);  

if(g_usb_handle == null)   

libusb的使用非常方便,指定id後,相應裝置被開啟,得到裝置控制代碼之後,即可呼叫各種傳輸操作api對我們的usb裝置進行訪問了。

基於OHCI的USB主機 USB裝置列舉

usb裝置接入以後,必須進行裝置列舉,得到裝置引數,設定裝置執行配置等引數,下面的 就是對u盤裝置進行列舉的過程。因為沒有使用作業系統,所以函式使用狀態遷移的方式完成列舉,該函式在主迴圈中被呼叫。usb裝置列舉處理 return 當前列舉處理的狀態 short usbenumdev void old...

USB裝置開發 usb描述符概述

說到usb裝置,不得不提到各種描述符 descriptors 一般來說,描述符有如下幾種 1 裝置描述符 device descriptors 2 配置描述符 configuration descriptors 2 介面描述符 inte ce descriptors 3 端點描述符 endpoint...

USB裝置開發 usb描述符概述

說到usb裝置,不得不提到各種描述符 descriptors 一般來說,描述符有如下幾種 1 裝置描述符 device descriptors 2 配置描述符 configuration descriptors 2 介面描述符 inte ce descriptors 3 端點描述符 endpoint...