1. 程式人生 > >LibUSB-Win32 在Windows7上使用vs2010編譯過程

LibUSB-Win32 在Windows7上使用vs2010編譯過程

LibUSB-Win32是一個用於Windows作業系統(Win98SE、WinME、Win2k和WinXP、Vista、Win7等)上的通用USB裝置驅動程式。該驅動程式允許使用者在不寫任何一行核心驅動程式程式碼的情況下,可以訪問Windows系統上的任意一個USB裝置,具有以下特點:

Ø  能夠與任意一個已安裝的USB裝置進行通訊

Ø  可被用作自己開發的USB裝置的驅動程式

Ø  支援批量和中斷傳輸

Ø  支援USB規範中定義的所有標準裝置請求

Ø  支援USB裝置製造商的自定義請求

通過使用幾個函式,就可以與USB裝置進行簡單通訊了,通訊的主要流程可分為以下四步:

1) 呼叫usb_init函式,進行初始化。

2) 開啟要進行通訊的USB裝置的控制代碼。首先依次呼叫usb_find_busses、usb_find_devices和usb_get_busses這三個函式,獲得已找到的USB匯流排序列;然後通過連結串列遍歷所有的USB裝置,根據已知的要開啟USB裝置的ID(VID/PID),找到相應的USB裝置;最後呼叫usb_open函式開啟該USB裝置(在這裡假設總線上沒有相同VID和PID的USB裝置。如果總線上存在著相同VID和PID的裝置,還需要進行其他條件判斷,比如裝置名稱,以保證是開啟的是期望的USB裝置)。

3) 與USB裝置進行通訊。使用usb_control_msg函式,向USB裝置讀取資料或寫入資料。

4) 關閉USB裝置。完成所有操作後,呼叫usb_close函式關閉已經開啟的USB裝置。

編譯工具:VS2010和WINDDK,可以去官網上直接下載原始碼,地址是http://sourceforge.net/projects/libusb-win32/files/,下載的最新版本為libusb-win32-src-1.2.6.0。VS2010用來編譯libusb-win32的動態連結庫、相關工具和DEMO程式的。我們還需要WINDDK來編譯驅動,即生成libusb0.sys檔案。從官方提供的make.cfg檔案上來看,使用的是WINDDK 7600.16385.0(WINDOW XP及以上版本) WINDDK 6001.18002(WINDOWS 2000及以下版本)。此處用的是 WINDDK 7600.16385.1,開啟原始碼中的工程檔案如下圖所示:

 inf-wizard——裝置驅動安裝資訊檔案生成嚮導。此嚮導可以掃描計算機上的USB裝置,並可以獲取你選擇的裝置的VID及PID生成inf檔案。

install-filter——filter驅動安裝。

libusb-dll——動態連結庫,生成libusb0.dll。上面說的“7個函式”就封裝在這裡面。同時生成了libusb0.lib檔案,供程式連結,實現libusb0.dll的裝載。

libusb-sys——USB驅動,生成驅動檔案libusb0.sys。注意它是makefile專案。

testbulk——libusb-win32的 ”Hello,World!“。

testlibusb——實現libusb-win32驅動的裝置的遍歷並列印一部分裝置描述資訊。

testlibusb-win——WINFORM版的testlibusb。

編譯工程,沒有報錯,但libusb-sys生成目錄下也沒有libusb0.sys檔案,libusb-sys是靠WINDDK來編譯連結的。

檢視libusb-sys的專案屬性頁,在[配置屬性]的欄裡,檢視“生成命令列”。

CD"$(ProjectDir)..\ddk_make"

CMD /C make.cmd"arch=x86" "app=driver" "noclean=true""outdir=$(OutDir)" "DIR_INTERMEDIATE=$(IntDir)""debugmode=true"

檢視目錄下的make.cfg檔案。

; Default WinDDKdirectory(s) Adjust these values to match your environment

; (REQUIRED)

WINDDK_BASE=Z:\WinDDK

WINDDK_DIR=!WINDDK_BASE!\7600.16385.0\

;

; (optional)

WINDDK_W2K_DIR=!WINDDK_BASE!\6001.18002\

 

把這兩項改成你的WINDDK安裝路徑。

; Default WinDDKdirectory(s) Adjust these values to match your environment

; (REQUIRED)

WINDDK_BASE=D:\WinDDK

WINDDK_DIR=!WINDDK_BASE!\7600.16385.1\

編譯一下libusb-sys。

編譯報錯error MSB3073: ,修改ddk_make/make.cmd,Line175 W2K(末尾) 修改成WIN7,編譯成功。

然後編譯libwdi,老是報錯error MSB3073,網上查了半天資料都沒有解決辦法,最終找到問題原因,所包含的檔案沒有放置在對應位置。

從編譯的libusb-win32-src-1.2.6.0(可以從http://sourceforge.net/apps/trac/libusb-win32/wiki下載)中複製對應檔案到E:/libusb-win32,注意目錄是E:\libusb-win32\bin\x86,對應修改config.h的目錄路徑如下:

/* embed WinUSB driver files from thefollowing DDK location */

#ifndef DDK_DIR

#define DDK_DIR "D:/WinDDK/7600.16385.1"

#endif

/* embed libusb0 driver files from thefollowing location */

#ifndef LIBUSB0_DIR

#define LIBUSB0_DIR "E:/libusb-win32"

#endif

然後inf-wizard工程編譯又出現問題,error LNK2019: 無法解析的外部符號,通過新增編譯生成的libwdi .lib到工程路徑中即可解決,最終編譯完成整個專案。

編譯過程參考如下文章:

http://www.amobbs.com/archiver/tid-4096300.html

http://blog.csdn.net/hbsong75/article/details/12841301

http://m.blog.csdn.net/blog/whw8007/38895073
--------------------- 
作者:buaalei 
來源:CSDN 
原文:https://blog.csdn.net/buaalei/article/details/45722859 
版權宣告:本文為博主原創文章,轉載請附上博文連結!