Libusb簡介及例子
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
Libusb簡介及例子
Libusb據說在Mac,Linux,Windows跨平臺的。目前為止我還沒有在除Linux平臺外的其它平臺測試
說的這麼繞,就是為了說明這種情況存在的必然性。對於這種新的問題,有兩種方案解決1
這種新的協議的問題一般是採用後者來實現,因為核心主線是不會採納不通用的驅動程式碼的。所以為了不一直為所有的版本核心都新增自己的驅動,可以在使用者空間直接USB通訊。這才是大家都好的結局。
這個時候大家猛然發現已經在核心中實現的基於printer協議的列印驅動程式也可以採用這個方法直接在使用者空間USB
方向明確了,如何實現,這時候大家發現了libusb,libusb可以實現使用者空間直接和usb裝置直接通訊。這樣大家都採用了基於libusb的免驅模式,如實說就是免掉核心中的驅動模式。
另外關於開源問題,以上說的和開源沒有太大關係,重點是一段程式碼可以在多個平臺執行的便利性和且不會對Linux核心的版本變化糾結。比如有名的例子主是hp公司的開源的hplip--linux平臺的印表機驅動程式,它正是我說的情況。
不過,使用者支援libusb的usbfs在核心中的配置項被加上了一個DEPRECATED標識,這說明了什麼,暫時還不行而知。(20141228更新:原因是安全見這裡Enable support for Linux systems without either usbfs or udev,不過也有相對的解決方案)
鋪墊完了,迴歸正題。
1.介紹
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 = 0; unsigned 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