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...