1. 程式人生 > >Libusb簡介及例子

Libusb簡介及例子

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

Libusb簡介及例子

        Libusb據說在Mac,Linux,Windows跨平臺的。目前為止我還沒有在除Linux平臺外的其它平臺測試 

:(。迴歸重點,用通俗語言介紹一下我最近了解的,一般的usb裝置驅動是在按照通常的在核心中基於usb通訊,為使用者空間展示一個裝置節點的方式實現。這個確實是遵守了unix世界的一切皆為檔案的理論。這個看起來是皆大歡喜的事情,其實則不然,在有USB子系統行業標準(說人話就是usb協議中已經統一的通訊方式)的時候一切都好辦,這種情況如printer etc。但是正如你所瞭解的一樣,標準協議一般要比一個新自定義協議出現要晚好幾年,甚至有可能永久都出現不了。所以如果要實現這種協議一般會在USB裝置的已經介面0額外的介面1(注:此處的介面並非物理上的介面)用於實現自己的協議。

        說的這麼繞,就是為了說明這種情況存在的必然性。對於這種新的問題,有兩種方案解決1

是寫核心驅動為使用者空間提供一個裝置節點;2就是在使用者空間直接進行usb通訊,拋開裝置節點。當然這兩種情況不能同時存在,使用2方法的時候,裝置節點會自然消失。

        這種新的協議的問題一般是採用後者來實現,因為核心主線是不會採納不通用的驅動程式碼的。所以為了不一直為所有的版本核心都新增自己的驅動,可以在使用者空間直接USB通訊。這才是大家都好的結局。

        這個時候大家猛然發現已經在核心中實現的基於printer協議的列印驅動程式也可以採用這個方法直接在使用者空間USB

通訊實現,這樣就可以完全和系統無關了,核心只要有usb通訊協議就好了。上半場已經捋順了,下面說說下半場。

        方向明確了,如何實現,這時候大家發現了libusblibusb可以實現使用者空間直接和usb裝置直接通訊。這樣大家都採用了基於libusb的免驅模式,如實說就是免掉核心中的驅動模式。

        另外關於開源問題,以上說的和開源沒有太大關係,重點是一段程式碼可以在多個平臺執行的便利性和且不會對Linux核心的版本變化糾結。比如有名的例子主是hp公司的開源的hplip--linux平臺的印表機驅動程式,它正是我說的情況。

        不過,使用者支援libusbusbfs在核心中的配置項被加上了一個DEPRECATED標識,這說明了什麼,暫時還不行而知。(20141228更新:原因是安全見這裡Enable support for Linux systems without either usbfs or udev,不過也有相對的解決方案)

        鋪墊完了,迴歸正題。

 

1.介紹

   官網http://www.libusb.org/

   Lisbusbx之前是lisbusb一個分支,現在已經合併到Libusb上了。

 

2.使用方法

   Ubuntu上安裝方法:sudo apt-get install libusb-1.0-0-dev

   標頭檔案 <libusb-1.0/libusb.h>

   連結庫 -lusb-1.0

   關於api,由於網上的例子魚龍混雜,這裡說明一下1.0版本的api都是以libusb_開頭的.

 

3.例子

如果如下例子可以編譯過,說明環境沒有問題了

#include <unistd.h>#include <stdio.h>#include <libusb-1.0/libusb.h>// First, use "lsusb" see vid and pid.// there is my printer(hp deskjet 1010) vid and pid.#define VID 0x03f0#define PID 0xb511static int device_satus(libusb_device_handle *hd)int interface = 0unsigned char byte; libusb_control_transfer(hd, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,   LIBUSB_REQUEST_CLEAR_FEATURE,   0,   interface,   &byte, 1, 5000); printf("status:0x%x\n", byte);/** * byte * normal:0x18 * other :0x10 */ return 0;}int main() { libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices libusb_device_handle *dev_handle; //a device handle libusb_context *ctx = NULL; //a libusb session int r; //for return values ssize_t cnt; //holding number of devices in list r = libusb_init(&ctx); //initialize the library for the session we just declared if(r < 0) {  perror("Init Error\n"); //there was an error  return 1; } libusb_set_debug(ctx, LIBUSB_LOG_LEVEL_INFO); //set verbosity level to 3, as suggested in the documentation cnt = libusb_get_device_list(ctx, &devs); //get the list of devices if(cnt < 0) {  perror("Get Device Error\n"); //there was an error  return 1; } printf("%d Devices in list.\n", cnt); dev_handle = libusb_open_device_with_vid_pid(ctx, VID, PID); //these are vendorID and productID I found for my usb device if(dev_handle == NULL)  perror("Cannot open device\n"); else  printf("Device Opened\n"); libusb_free_device_list(devs, 1); //free the list, unref the devices in it if(libusb_kernel_driver_active(dev_handle, 0) == 1) { //find out if kernel driver is attached  printf("Kernel Driver Active\n");  if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it   printf("Kernel Driver Detached!\n"); } r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device (mine had jsut 1) if(r < 0) {  perror("Cannot Claim Interface\n");  return 1; } printf("Claimed Interface\n"); device_satus(dev_handle); libusb_close(dev_handle); //close the device we opened libusb_exit(ctx); //needs to be called to end the return 0;}

以上是一個簡單的程式。獲取印表機部分狀態。

另外,PC上的lsusb命令也是基於libusb-1.0的一個應用程式:

$ ldd /usr/bin/lsusb linux-gate.so.1 =>  (0xb76fc000) libusb-1.0.so.0 => /lib/i386-linux-gnu/libusb-1.0.so.0 (0xb76ca000)                  ......$

原始碼:http://dist.momonga-linux.org/pub/momonga/2/SOURCES/libusb-0.1.10.tar.gz

http://sourceforge.net/projects/libusb/files/libusb-1.0/

關於libusb for Android見:https://github.com/libusb/libusb/blob/master/android/README



           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述