一、libusb 簡介
libusb 是一個用戶空間訪問 USB 設備的 C 庫,特點:
- 使用 C 語言實現。
- 可移植性,目前支持的平台有 Linux,macOS,Windows,Android,OpenBSD/NetBSD,Haiku,Solaris。
- 支持全部的 USB 規范,從 1.0 到 3.1。
- 無特殊權限要求,比如在 Linux 平台訪問串口設備的時候,需要 sudo 提升權限才能操作。
二、libusb 獲取
注:GitHub 也有其倉庫,但是缺乏生成 Makefile 的系列文件。所以最好還是通過官網下載壓縮包。
三、libusb 涉及技術
針對 Linux 平台,涉及的技術有:
- sysfs:內核把一些 USB 設備的信息通過文件系統的方式呈現給了用戶空間,應用通過讀取相應文件即可獲取所需信息。如遍歷 /sys/bus/usb/devices/ 目錄下的信息就可以獲取各個設備的基本信息。
- libudev:用於 USB 設備的熱插拔。
- Netlink:用於 USB 設備的熱插拔。Netlink 是 Linux 提供的用於內核和用戶空間之間的通信方式。一旦內核監測到系統設備有變化(如ADD/DEL/REMOVE),則通知用戶進程。libudev 和 Netlink 二選一即可,可以認為 libudev 是對 Netlink 的封裝。
- 多線程。
- 進程間通信:pipe/pipe2/eventfd。
- USB 規范:這部分可參見“果殼中的USB”系列文章。
四、libusb 目錄簡介
├── android:顧名思義,用於生成 Android 版本的 libusb 庫及測試用例。
├── doc:用於生成 API 文檔。在doc/目錄下執行:doxygen doxygen.cfg 或者 make docs。
├── examples:libusb 的使用示例。后續代碼分析即以各個示例作為實例。
├── libusb:libusb 核心代碼
│ ├── os:平台相關的代碼,支持
├── msvc:微軟編譯環境相關文件。
├── tests:libusb 的測試。
└── Xcode:Apple 平台相關文件。
examples示例簡介
4.1 dpfp.c & dpfp_threaded.c
一款指紋識別器的應用程序,將采集到的指紋圖像保存為文件。
用到了control、interrupt、bulk三種傳輸方式。
4.2 ezusb.c & fxload.c
“EZ-USB的固件下載程序,可實現下載固件(image)到Cypress EZ-USB microcontrollers,ezusb系列芯片使用端點0和廠商特定命令將數據寫到片上SRAM,並且也支持寫數據到CPUCS register或者eeprom。程序使用控制傳輸方式進行指令和數據的傳輸,libusb_control_transfer()的形參bmRequestType使用LIBUSB_REQUEST_TYPE_VENDOR(廠商自定義請求)。程序支持五種下載類型(Target type): an21, fx, fx2, fx2lp, fx3,支持四種固件(image)類型:“Intel HEX”, “Cypress 8051 IIC”, “Cypress 8051 BIX”, “Cypress IMG format”。”
4.4 hotplugtest.c
hotplugtest 用於監聽系統中 USB 設備的 attached(插入)和 detached(拔出)。
實現原理及代碼分析見:libusb(3)hotplugtest 實現分析
4.5 listdevs.c
獲取並顯示系統當前的 USB 設備信息,包含:VID、PID、bus 編號、設備地址、端口號。
實現原理及代碼分析見:libusb(2)listdevs 實現分析
4.6 sam3u_benchmark.c
“Atmel SAM3U isochronous(等時傳輸)性能測試。程序不斷接收來自SAM3U iso端點的數據,當按下CTRL-C時,計算花費時間和傳輸的總數據量。”
4.7 testlibusb.c
"打印usb設備列表的詳細信息:包括設備描述符、配置、接口、端點描述符"
4.8 xusb.c
“一個綜合的USB測試程序,包括:HID設備(xbox、PS3和Joystick)、Mass Storage,涉及control、interrupt、bulk傳輸。”
“其中Mass Storage可以使用普通的U盤進行測試,只需修改VID和PID即可,可以實現的功能有:讀取描述符、查詢U盤信息、讀取U盤容量、讀取U盤數據(因為沒有使用文件系統,讀取出來的數據是原始二進制數據)。”
“關於Mass Storage中涉及的SCSI命令,參考: USB Mass Stroage - SCSI指令格式詳解。”
五、libusb 源碼編譯
5.1 系統信息
Ubuntu 14.04,Linux 4.4.0
5.2 編譯器配置
Ubuntu 14.04 默認 gcc/g++ 版本為 4.8,需要升級編譯器。方法如下:
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test $ sudo apt-get update $ sudo apt-get install gcc-5 g++-5
/usr/bin/gcc 和 /usr/bin/g++ 是軟鏈接,修改使其指向我們新安裝的編譯器:
sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc sudo ln -s /usr/bin/g++-5 /usr/bin/g++
5.3 Makefile
執行 ./configure 自動生成 Makefile。
按照上述步驟生成的 Makefile,在 make 的時候報錯“aclocal-1.16 is missing on your system.”,很明顯提示系統當前 aclocal 的版本不符合要求。
考慮到 libusb 源碼沒有多少文件,干脆自己寫 Makefile,后續自己控制編譯哪些文件。
源碼分析所用的倉庫:libusb_play.git