: : 撰寫驅動 : :
Q : 請問WinDriver是否有提供NDIS的開發範例?

A : WinDriver沒有支持NDIS設備\驅動,原因如下
1.NDIS用於通信/ netwrok設備,它不是客製化的驅動程序,此驅動程序是kernel mode的驅動,與另一種Microsoft為底的驅動進行通信,它負責內核的通信協議和功能。WinDriver無法實現內核到內核通信,只能從使用者界面到內核模式。
2.NDIS是一個微軟專有的驅動程序,您無法開發一個代替的驅動而沒有支付微軟任何費用。
請參考手冊http://www.jungo.com/st/support/documentation/windriver/11.8.0/wdpci_manual.mhtml/drivers_func_classification.html#miniport_drivers
 
USB.org已經為網路設備開發一個開放的協議,叫做CDC-ECM (或 CDC-NCM),如果您需要執行該設備去替代NDIS,WinDriver的二進制驅動程序基於CDC設備可以提供一個很好的解決方案。
Q : 請問WinDriver是否同時支持兩塊PCIe卡採集數據?

A : 可以的,此實現與WinDriver API或驅動無關,此取決於開發人員在應用程序邏輯中驗證硬件與其他卡的運作,此與WinDriver無關且WinDriver API不會影響此行為。

Q1 : 請問下載WinDriver後,會提供cat檔案嗎

A1 : 會,當安裝gui wizard即代表正在使用Jungo預先提供含有.cat檔案的驅動,當您生成一個新的項目與INF檔案,這些項目沒有簽屬數字簽名,因此需要新的.cat檔案,Jungo.cat只適用於gui wizard

Q : 我們正使用WinDriver訪問相同的兩塊視頻採集設備,若同個時間收到兩個設備數據(DMA transfer),數據會不如預期,請問WinDriver是否可以訪問兩個相同設備呢?
A : 沒有簡單的方法可以在兩台設備中做同步,API中也沒有建立此方法,此實現是完成在主機端應用程序,由開發人員處理,因此同步兩個設備沒有在WinDriver的支持範圍內。
Q : 我已經在Windows為DMA鎖定內存緩衝區,現在當我直接訪問該存儲器時,使用用戶模式的指示,分配withmalloc()似乎比訪問“regular”內存緩衝區,慢5倍的時間,請問是為什麼呢?
A : Regular”存儲器(例如stack, heap)是由作業系統緩衝,當使用WD_DMALock()時,為使它的DMA是安全的,所以該數據非緩衝。因此,存儲器存取速度較慢,請注意,這是用於DMA正確的方式。當執行連續的緩衝區DMA(Contiguous Buffer DMA),您可以在WDC_DMAContigBufLock的參數中,設置DMA_ALLOW_CACHE 標誌,或直接在WD_DMA結構的dwOptions 標誌,傳遞給WD_DMALock() (使用低級別的WinDriver API),為了分配緩存的DMA緩衝區。在Windows x86和x86_64平台上運作時,建議始終設置該標誌。
(請注意:從WinDriver 5.2.1版本開始,DMA_ALLOW_CACHE標誌是有效的。)
如果您在用戶模式分配存儲器,然後通過其地址到WDC_DMASGBufLock()或低級別的WD_DMALock(),以便鎖定一個分散/集中DMA緩衝區,然後調用WD_DMAUnlock()將解鎖內存緩衝區和它像其他現在“正規”的內存存取速度。
Q : 我無法使用WD_DMALock()鎖定一個大的memory block(超過1MB以上),Debug Monitor顯示分散/集中鎖定失敗。
A : 需要為分散/集中(S/G) DMA,鎖定一個大的DMA緩衝區(超過1MB以上),也就是當KERNEL_BUFFER_ALLOC DMA選項標誌沒有被設置時,使用WD_DMALock(),請執行下列步驟。
請注意當使用高層次的WDC_DMASGBufLock()時(從WinDriver v7.0.0版本開始),您不需要進行類似的配置,鎖定大型DMA緩衝區; 此功能已經為您處理。當使用低級別的WD_DMALock()功能,僅需下列步驟。
WD_DMA 結構中的dwOptions領域,設置 DMA_LARGE_BUFFER標誌,作為傳遞WD_DMALock()的pDmaparameter(“the WD_DMAstructure”)。(請注意:當執行分散/集中DMA時,會需要此標誌,而不是執行連續的緩衝區DMA)。
您需要鎖定的計算頁面,以下面的方法並將其分配給t WD_DMA結構的dwPages領域:dwPagesNeeded = transferCount / 4096 + 2;
其中,transferCount是要鎖定的字節數。
請注意:在默認情況下,WD_DMA結構可以容納高達256頁的訊息(= WD_DMA_PAGES, defined inWinDriver/include/windrvr.h)。如果您想鎖定超過256頁的訊息,需要有足夠的內存來保存所有頁面的資訊,以分配內存取得其他的資訊,您可以執行以下操作:
WD_DMA *pDma;
pDma = (WD_DMA *)malloc(sizeof(WD_DMA) + sizeof(WD_DMA_PAGE)*(dwPagesNeeded – WD_DMA_PAGES));

如果內存分配仍然失敗(以上述概括的方式,無論是使用WDC_DMASGBufLock(),或WD_DMALock()),確認是否有足夠的系統資源嘗試內存分配(在kernel和在存儲器映圖的用戶模式地址空間)。在Windows,您可能需要增加共同分頁的大小(從該存儲器分配),更多資訊請參考Technical Document 58。如果仍無法鎖定整個緩衝區,請嘗試鎖定一個較小的緩衝區,更多WinDriver DMA表現的資訊,請參考WinDriver pci User’s ManualWinDriver Implementations Issues章節,其中的Performing DMA,以及手冊中Function Reference 章節的WinDriver DMA APIs說明。

Q : 我嘗試用DriverWizard取得PCI板卡的中斷,但得到以下信息:
WARNING!! You did not choose an Access Register for this interrupt. If you do not want to specify a register you will have to manually change the code generated by DriverWizard.

A : PCI使用電平敏感中斷,在內核被接收時必須立即清除。因此,WinDriver需要您定義一個中斷狀態寄存器,它應該為了清除中斷而被讀/寫,這是一個預防性的功能,因為這是無法確認一個電平敏感中斷是否可以掛上您的電腦。關於如何使用WinDriver的DriverWizard聽取PCI中斷,請參考Technical Document 105。另外,亦請參考 Technical Document 75,以及WinDriver PCI User’s Manual以便了解關於PCI中斷的處理。
請注意,如同WinDriver手冊中的詳細說明,為了在即插即用(PNP)的Windows作業系統,正確處理PCI斷,您必須先為設備安裝INF文件,此設備可以使用WinDriver’s PnP driver為它註冊而運作(windrvr6.sys在最新版本WinDriver中的名稱;在以前的版本中-windrvr.sys/wdpnp.sys/wdusb.sys,根據不同版本而有不同名稱)。
Q : 我使用DriverWizard生成代碼來處理我的電平敏感中斷,之後WD_IntWait()返回時,我讀取中斷狀態寄存器,它並沒有告訴我有個中斷發生,如果我有多個卡共用一個中斷程序,將會出現問題。
A : 當一個PCI中斷發生時,WinDriver會讀寫中斷狀態寄存器,以便清除(確認)電平敏感中斷。這是在kernel直接執行,根據在代碼中設置的資訊,事先授予權力的中斷。中斷被清除之前,讀取和保存中斷寄存器的值,因此您之後在中斷處理程序中,可以參考此值,在中斷傳送命令中您需要設置一個相關的讀取命令,在WD_INTERRUPT結構中的dwCmd領域做設置,此被傳遞到在(/InterruptThreadEnable()早期版本中的InterruptEnable(),並在WD_INTERRUPT結構中的dwOptions領域,設置INTERRUPT_CMD_COPY標誌(int.dwOptions |= INTERRUPT_CMD_COPY)。更多資訊請參考WinDriver PCI手冊中的Interrupt Handling章節,以及技術手冊104與 75
Q : 請問該如何提交技術問題
A : 首先,在WinDriver Support頁面查看可用的WinDriver資源。如果您的問題無法找到答案,可以使用Support Center描述您的問題或其他類型的問題也可以得到支援。
為了確保可以快速和有效的回覆,請詳細說明所有相關信息,在Support Center中,如同以下方式描述。
您也可以通過電話與我們聯繫,如果您在我們工作以外的時間撥打,或所有支持人員忙線,請留下您的詳細聯繫方式(例如姓名、公司名稱、電子郵箱和電話號碼),我們會盡快與您聯繫。
當您描述問題時,請包括所有您執行的步驟,以及說明哪一步驟失敗(包括完整的錯誤消息)。
提交技術問題前,請明確檢查已經包含以下訊息:
1.     在一般情況下,請註明
·        您的作業系統。例如:Windows 8 64-bit; Windows XP SP3; Windows Embedded Compact 7, Windows CE v7.0; RedHat Linux 7.2, Linux kernel version 2.6.32-5-686.
·        您的WinDriver版本。例如: WinDriver version 11.8.0.
·        Debug Monitor 所有訊息輸出:運行Debug Monitor,設置debug的級別為“Trace”,再重現您的問題,並提供從Debug Monitor視窗輸出的訊息(包括上面的版本訊息)。
2.     License問題:除了Debug Monitor log,請務必提供您的完整License string(在購買WinDriver時會收到此License string),還有開發電腦中的registration code。您可以在DriverWizard’s Licensing Information中,查看License string與電腦中registration code (File –> Registration Options)
3.     PCI相關的問題:除了Debug Monitor log,請提供pci_dump的完整輸出訊息(可以在WinDriver/util 目錄中找到),同時也提供您設備的供應商ID(vendor ID)和設備ID(device ID)
4.     安裝相關的問題 : 除了Debug Monitor輸出,請明確描述您執行的安裝步驟(哪些文件複製到哪個目錄;使用wdreg安裝工具;INF文件的安裝等等)與每一步驟的結果,並提供您收到(如果有的話)的錯誤消息。
Windows所有即插即用的平台(Windows 98與以上的版本,不包括Windows NT 4.0),請提供安裝設備INF文件(如果有的話),以及在有問題的電腦中%WINDIR%\setupapi.log 
文件。
Q :請問是否需要微軟的驅動程序開發工具包,去建立Kernel PlugIn 的項目?
A :如果您使用Kernel PlugIn來開發Windows SYS driver,需要安裝微軟的Windows Driver Kit (WDK),或早期的Driver Development Kit (DDK) – 此取決於您的目標作業系統和WinDriver的版本,以便成功建立您的Kernel PlugIn driver
有關WDK的更多訊息,請參考http://www.microsoft.com/whdc/devtools/WDK/WDKpkg.mspx


(請注意,當您使用WDK/DDK來建立Kernel PlugIn driver,您需要設置BASEDIR或為您的DDK函數庫設置DDKROOT 環境變量,更多資訊請參考WinDriver User’s Manual。)
VxD Kernel PlugIn的驅動開發,在早期版本WinDriver (v6.0x-)的版本中,有支持Windows 98 / Me中,WinDriver不會為了要成功建立驅動而要求您安裝微軟的WDK / DDK,除非您選擇添加您自己的DDK函數調用到您的Kernel PlugIn應用程序。 (請注意,使用特定作業系統的DDK功能會損壞驅動器的可攜帶性)。

Q : 安裝正式版的WinDriver,範例程序是由Jungo提供(PCI Bus Diagnostics, Parallel Port Sample, etc.),現在無法運行,請問該如何解決?
A : 在試用版本的範例程序(沒有License時可以發行和使用),您可以修改您的源代碼,以便註冊您的License,其他更詳細的資訊,請參考FAQREG1
Q : 我使用WinDriver與並行端口進行外圍的通訊,在ECP模式,有些電腦可以運作,但在一台電腦上卻無法運作。
A : 這可能是硬體問題,由於並行端口模式的BIOS特定實現會在不同電腦上,WinDriver無法控制此行為,因為它已被編程到BIOS中,建議您遵循電腦的品牌或已觀察到正確運作的BIOS。

Q : 我的設備功能正常,也可以在Linux以及Windows (WinDriver V6.0.2)中正確識別,但是在Windows中,無法經由WinDriverPCI應用程序,識別此設備,請問原因為何。
A : 在WinDriver driver的INF文件夾中,設置PciCfgRwCompat 註冊標誌(v10.3.1或v10.3.1以上的版本),以1當作能夠使PCI配置空間讀/寫的方法,請參考Technical Document 2


Q : 當我在Windows XP中安裝WinDriver的基礎驅動程序時,Windows顯示此錯誤:
您為此硬體安裝的軟件沒有通過Windows Logo測試,可能損害或破壞系統的正常運行,請問如何避免此訊息?
A : 此訊息非真的錯誤消息,在安裝過程中或是驅動是沒有任何問題的,微軟Windows XP發出此訊息,表示Driver沒有測試也沒有通過微軟的Windows Certification Program(以前的Windows Hardware Quality Labs (WHQL稱為Windows Logo Program (WLP)) Certification)。為了避免此訊息,也為了使您的驅動得到數字簽名,請聯繫Microsoft,欲了解更多訊息請點擊這裡



Q : 請問什麼是 WDM設備驅動程序? WinDriver 有支持 WDM嗎?
A : 撰寫設備驅動程序時,開發人員必須為Win 9x和Win NTx Kernels分別撰寫設備驅動程序,為了提供代碼插入設備,微軟已經開發一個跨平台的作業系統去支持輸入設備,並在Windows中可以即插即用(Windows 98和以上的版本,不包括Windows NT 4.0),此種新的支持即為Windows Driver Model或簡稱“WDM”。 WDM是基於原始的Windows NT驅動程序模型,修改為支持即插即用和電源管理,並用於多媒體設備類型以及其他許多新的設備類型,例如:USB和1394設備。
從WinDriver V5.2.0開始,WinDriver的 Kernel Module —(Windrvr6.Sys / Windrvr.Sys In V5.2.2-) —可以實現WinDriver的API,是個完整的WDM驅動。



Q  : 我需要為ISA卡定義20多個“硬體項目” (I/O, Memory, And Interrupts),因此我在Windrvr.H頭文件中增加WD_CARD_ITEMS(由於WD_CARD的結構項目構件定義如同WD_CARD_ITEMS WD_ITEMS結構的陣列)。但現在WD_CardRegister()無法正常運作,請問是為何呢?



A : 如果您需要為您的卡定義多個WD_CARD_ITEMS項目(目前有20個項目,根據在Windrvr.H中的WD_CARD_ITEMS的定義),在代碼中請不要修改任何WD_CARD_ITEMS的值,而是從您的代碼中,每次用不同的項目,多次簡單地呼叫WD_CardRegister()(特定的卡使用單一WD_CardRegister() Call,不會強制的鎖定所有資源。)或者,考慮將多個Memory/IO地址的所有範圍編組到單個BAR定義,使整體資源項目數量不超過默認的20個項目限制。
在Windrvr.H中請不要變更任何東西,以造成非期望的變更。
Q : 如果在SYS Kernel PlugIn驅動中撰寫一個新功能,請問是否需要與__cdecl一同宣布?

A : 不需要,只有使用WinDrivercallback時,才需要如同__cdecl宣布

Q : 我的應用程序被安裝在電腦中,所以當電腦當機時不能看到Debug Monitor log的調試信息,請問是否有方法可以保存它以免電腦當機?

A : 有的。您可以選擇從Debug Monitor發送debug訊息到kernel debugger,請詳見Technical Document 44,另外,從WinDriver 11.7.0版本開始,您可以選擇自動保存Debug Monitor log
Windows中,為了發送debug訊息到kernel debugger,你需要在另一台電腦安裝kernel debugger,以及在這台電腦與開發的電腦建立debug session,若Windows當機,請參考Technical Document 21在Linux,您可以在/var/log/messages此目錄中找到kernel debugger log.


Q : 請問何謂Debug Monitor? 該如何使用?

A : Debug Monitor(在舊的WinDriver版本中,又稱Monitor Debug Messages),是記錄來自WinDriver kernel driver詳細的調試信息的應用程序。此應用程序有兩個版本:wddebug_gui – 一個完全圖形化版本;以及wddebug – 控制模式版本,同時也支持基於Windows CE平台的GUI執行(從WinDriverv10.0.1開始)。
可以在WinDriver/util;,找到兩種Debug Monitor版本,(在Mac OS X中,在WinDriver版本可以支持它,也可以在OS’s /Applications folder找到 GUI版本)。
有關此更詳細的信息,以及如何使用,請參考WinDriver User’s ManualsTechnicalDocuments12 (wddebug_gui for Windows, Mac OS X, Linux, and Solaris), 13(wddebug for Windows, Windows CE (包括Windows Mobile,Mac OS X, Linux, and Solaris)以及 14 (wddebug for VxWorks — 僅支持WinDriverv5.2.2)。
有關更多從Debug Monitor重新定向debug資訊到kernel debugger,請參考Technical Document 44
請注意:Debug Monitor只可以在目標平台運行WinDriver驅動程序,而不是已安裝的WinDriver工具包。此工具是很有幫助的,可以讓您在客戶的平台上調試問題,更多資訊請參考FAQ #lfc6009


Q : 請問在設備驅動程序或內核編程中需要有經驗才可以撰寫嗎?

A : 若您沒有經驗也沒有關係,您可以在user mode使用WinDriver去撰寫設備驅動程序,WinDriver已經提供較低級別實現WinDriver APIkernel mode驅動程序(請參考WinDriver User’s ManualsWinDriver架構概述)。因此,您可以在user mode,使用喜歡的開發環境編程和調試驅動程序,因此可以降低您開發設備驅動程序的時間。

建議開發步驟:

1. 開啟DriverWizard – WinDriver/wizard/wdwizard  (或/Applications/wdwizard.appMac OS X – 有支持此作業系統的WinDriver版本)。在Windows中,您也可以用桌面上的快捷圖案去運行DriverWizard,或從Windows的開始按鈕  Start –> Programs –> WinDriver –> DriverWizard.

2. 使用圖形化的DriverWizard可以輕鬆測試您的硬件,而無需編寫一行代碼,對於PCI / ISA – 可以讀/寫硬件資源(memory/IO/registers),並聽取中斷。

對於USB – 在管道中傳輸數據,重置設備等等。

3. 從工具欄中選擇“Generate Code”選項,或按Next 按鈕,選擇您的目標編譯程式/開發環境,並讓DriverWizard為您的設備創建驅動程序的骨架。生成的代碼包括方便的結構和功能,它採用WinDriver基本的API來訪問您的硬件,去檢測以及由你定義資源。

您可以使用DriverWizard在C, C#, or Visual Basic .NET (VB.NET)來生成代碼(僅USB;早期的版本(直到v11.2.0)也支持在Delphi (Pascal)Visual Basic (VB 6.0)生成代碼。DriverWizard也會建立makefile及相關構建環境的32位元和64位元編譯器 – 例如MS Visual Studio, GCC, or Windows GCC MinGW/Cygwin.
您也可以使用WinDriver的基礎範例進行開發,特殊的硬件範例可以在相對應的目錄中看到,例如PLXAltera,欲瞭解更多,請參考WinDriver User’s Manuals
您亦可以在WinDriver/samples目錄中看到生程範例,可以在WinDriver/csharp.net (C#)WinDriver/vb.net (VB.NET)目錄中看到.NET samples(從WinDriverV7.0.0開始)。

4. 使用手冊和幫助文件修改生成的代碼,並添加您需要的任何特定功能,以符合您的硬件規格。
WinDriver的用戶手冊和幫助文件,可以在WinDriver/docs目錄中看到,也可以透過Windows的開始選單(對於Windows用戶),從WinDriver Support的頁面,也可在網上看到所有的文件。



5. 在任何32位元或64位元編譯器中,從用戶模式編譯並生成代碼。
Q : 我在電腦上開發驅動程式皆順利,之後將此驅動安裝在目標電腦上卻出現問題,問在目標電腦上是否可以運行Debug Monitor? 還是只能在原有的開發電腦上運行?

A : WinDriverDebug Monitor可以在任何電腦上運行(不同於WinDriver DriverWizard會鎖定在開發的電腦)。因此,您可以從開發的電腦中,簡單地複製wddebug_guiwddebug程序文件到有安裝WinDriver的目標電腦上,並在目標電腦運行Debug Monitor( WinDriver/util   Applications on — WinDriver的版本有支持作業系統),,有關Debug Monitor更詳細資訊,請參考WinDriver User’s ManualsDebug Monitor FAQ.
Q
:
為什麼建議使用WinDriver,而不是自己開發設備驅動程序呢?


A
:
使用WinDriver,您將獲得以下好處:

成本節省90%的開發時間

可靠性
: WinDriver已經在市場上有數千種應用測試(請見客戶成功案例,了解更多)。它已經在市場上的幾乎所有平台上調試過,因此,它不僅加速開發時間,也減少調試時間。

上市時間: WinDriver已經為您準備好,使用WinDriver可以大幅縮短您開發時間。

靈活性: WinDriver支持多種作業系統,例如Windows 8.1/Server 2012 R2/8/Server 2012/7/Server
2008 R2/Vista/Server 2008/Server 2003/XP, Embedded Windows 8.1/8/7,
Windows CE/Mobile, and Linux
(取決於您所使用的版本)
  所以即使您只需要驅動程序在一個平台上,使用WinDriver可以靈活地讓您在任何平台上運行(請參考Technical Document 4)。

穩定性 – WinDriver讓您遠離較困難的OS
kernel,當我們預先寫好的kernel module執行於您的硬體時,您寫的代碼會在受保護的application mode,您會得到kernel mode驅動(由我們經驗豐富的開發人員),在任何OS/platform/BIOS做測試。
Q
:
 
使用WinDriver時,若沒有在內核模式下進行編程,是否代表我還沒有建立驅動?



A
:
設備驅動程序是控制硬體的軟件模組,在現今的作業系統中,軟體模組通常存在於kernel mode (ring 0),然而在用戶模式下,WinDriver可以幫助您編寫此代碼,利用低級別的核心驅動程序,使您無需具備驅動程序開發的知識。為更了解WinDriver的基本架構,請參考WinDriver的用戶手冊



WinDriver還包括Kernel
PlugIn
的功能,它允許降低您部分的user mode代碼至kernel
mode
,以獲得更好的性能和更大的靈活性(for PCI/CardBus/PCMCIA/PCI
Express/ISA)
無論您在user modekernel mode開發的代碼,它仍然是操控於硬體,因此它是驅動程序。

Q : 請問驅動程序碼是否都會鎖住物理內存?


A :
是的 
Q : 我試著在Linux上分配Kernel buffer,我可以分配100KBbuffer,但沒有辦法分配150KB,請問該如何調整?


A : Linux一般可以分配至128KB,您也可以試著重新編譯然獲得更大的空間,請參考技術手冊Technical Document 64
Q : 我可以簡單調試微軟的Visual StudioVisual
C++
)嗎?

A : 可以的!您撰寫的設備驅動程序代碼,可以正常的在Win32用戶模式運行。因此,您可以使用微軟的Visual Studio/Visual C++去編譯和調試您的代碼。請參閱技術文件19

Q : 請問可以提供微軟Side Winder USB端口的驅動程序嗎


A : WinDriver是提供工程師驅動程式開發工具,無法提供現成的驅動程式。

Q : 我在WinDriver的DMA章節中,看到Xilinx的範例是為ML605設計的? 如何找到相對應的fpga代碼? 另外我使用WinDriver時,出現「Unable to initalize WDC」畫面,請問原因為何?

A : 檢查您的錯誤訊息,”TRUST_E_NOSIGNATURE”代表您的Windows OS root沒有更新,請參考下方網址
http://www.microsoft.com/en-us/search/DownloadResults.aspx?q=windows+xp+root+certificates&sortby=-availabledate
DMA的實現是取決於特定的硬件與客戶的硬件設計,Jungo僅基於BMD的設計,提供Xilinx的範例,此BMD的範例與您Xilinx fpga並無相關,它可以上傳許多xilinx晶片,包括ML605,ML505等等。
建議您使用我們的範例做參考,並更改您特定的邏輯操作

Q : 在使用Altera的開發板,以中斷方式來讀取一些按鍵值,按照sample code 做,沒有產生反應, 但是用開發板附的測試軟體和WinDriver IDE則可以產生中斷

A : 請檢查是否有安裝INF、device、using the wizard,並檢查在GUI wizard中,是否可以看到bar與offset registers,如果仍中斷失敗,
     請附上debug monitor

Q : 在Linux上使用 DMA,僅可以配置4M的記憶體,無法配置 16M 的連續記憶體,請問原因為何?

A : 對於大型傳輸,您可以使用分散聚集DMA,請參閱WinDriver的手冊DMA章節

Q : 在winform中,我使用C#去撰寫開發,但在C# lib中,找不到WD_Open() .func.tion.,請問在那裡可以找到呢?

A : WD_OPEN call是IOCTL巨大的指令,包括windrvr.h.都可直接使用。如果您正計畫使用C#去開發WinDriver,建議您可以使用我們提供的csharp.net\pci_範例,
     或csharp.net\usb_範例,這是使用高等級API 和 wdapiXXX.dll

Q : 我們使用WinDriver去開發Xilinx v5 PCIe DMA,利用WinDriver提供的範例去撰寫DMA,後來發現在鎖定分配中,時間的花費變長,從100ms到15000ms,
     而且未能在最後鎖定記憶體。請問是否可以撰寫兩個DMA可變因素,並連接PCIE,一個DMA用於讀,另一個用於寫? 之後對這兩個DMA分配記憶體,
     請問是否可以使用很多次?

A : 請您提供Debug Monitor與重定向Debug消息内核,使用kernel debugger (例如 Dbgview.exe)紀錄kernel log,請確保每個打印都有時間標誌,
     可以看到時間變慢的原因。
     可能是視窗較難找到所要求的連續緩衝區,有個好的解決方案是使用預分配的緩衝區,每次重複使用,請參考以下
     http://www.jungo.com/st/support/tech_docs/td3.html
     當使用緩衝區分配前置時,您會看到debug print。

Q : 我需要使用Timer去撰寫程式,Jungo提供的tools Generate雖可以使用,但是性能與原來差距太大,是否有其他的解決方式呢?

A : 在WinDriver的kernel plug in中,沒有特定的API可以實現timer的功能,您可以自行開發。Kernel plug in的範例與生成的代碼,不包括特定的實現,
     您可以更改為適合您邏輯的方式。

Q : 請問WinDriver是否有提供 Kernel sample code?

A : 請參考以下的網址,
     Techdoc#17 http://www.jungo.com/st/support/tech_docs/td17.html
     Kernel plug in – http://goo.gl/wEPhp0
     若仍無法解決您的問題,請您聯繫大中華代理商 網護科技,並詳細說明您的情況,我們會請原廠提供您更精確的協助

Q : WinDriver Debug Monitor顯示出以下訊息,請問該如何處理呢?
     “transform_32_to_64: unknown ioctl 0x953826e7 (0x9b9)”
     “Rebuild your application with -DKERNEL_64BIT flag. Contact support@jungo.com for more details“

A : 請您在編譯中添加64 bit的編譯標誌,請見以下的說明章節
     http://www.jungo.com/st/support/documentation/windriver/11.7.0/wdpci_manual.mhtml/32bit_app_on_64bit_arch_win_unix.html

Q : 我們是on board的板子,想要在不同電腦使用WinDriver試用版開發驅動,是否可再將開發出來的source code轉到目標電腦,利用WinDriver正式序號去做編         譯?

A : 如果目標電腦和開發電腦是相同的OS,例如Windows,那您可以使用一台電腦來編譯source code,然後再將binary application移到on board的電腦。
     如果您必須繼續開發驅動在您on board的電腦,可以使用DLL的方式去編譯WinDriver,再使用WinDriver去開發您的專案。
     另外,您無法生成也無法移動visual studio,到另一台電腦重新編譯。

Q : 請參考以下圖片,在Ubuntu 12.04 LTS with kernel 3.4.7,使用Driver Wizard,當我創建一個新的項目,並選擇欲使用的USB設備,但出現錯誤(如下圖)

若選擇PCI設備,則會出現(如下圖)
請問使用USB需要做其他的設定方可使用嗎?
A : 請您先卸載它,然後再試一次,可以參考 https://help.ubuntu.com/community/Mount/USB#Unmounting_Explained
     由於安裝WinDriver,在Linux與Windows有很大的不同,請參考在Linux 安裝時的WinDriver手冊     
     http://www.jungo.com/st/support/documentation/windriver/11.6.0/wdusb_manual.mhtml/wd_install_process.html#wd_linux_installation

Q : 在試用WinDriver 11.6版本時,Windows7和Windows XP都能對PCIE的BAR記憶體進行正常的操作,但在Windows8.1,卻無法正常操作,請問是什麼原因呢?

A : 請您先在 Windows 7 與 windows 8.1,使用相同的PCI_diag/wizard,再提供此兩平台的debug monitor。另外也請您檢查兩平台是否皆有安裝INF以及當設備出      現在device managers時是否沒有問題

Q : 請問WinDriver是否支援多個應用程式同時使用某個硬體,例如:一塊PCI時間卡,其他應用也可以獲取到精確的時間。

A : 由於此需求會超出WinDriver的支持範圍,因此不建議同一個硬件同時使用多個應用程式,可能會因為資源辨別錯誤,而導致同步出現問題與當機。
     您可以在DLL中,使用WinDriver的API,或使用一個單一的主要應用程序,去調用自身內部的其他應用程式,正如上述所提,此已超出WinDriver的支持範圍,
     不推薦使用此方式。

Q : 在Win8 64位元安裝WinDriver生成的INF,卻出現錯誤訊息 : 第三方INF不包含數字簽名信息,請問是什麼原因呢?

A : 自從Vista開始,Windows 64位元需要digital signature,此與微軟政策有關,而非WinDriver需求,微軟必須要有第三方公司認證digital signature,詳情請見
      http://msdn.microsoft.com/en-us/library/windows/hardware/ff548231(v=vs.85).aspx

Q : 在driver wizard中能正確寫入和讀取PCIE memory的寄存器,但是用code wizard生成MS Develop studio 2005 for x86後,使用控制台進行寫入和
      讀取PCIE memory內容時,寫入和讀取的資料不對。請問是什麼原因呢?

A : 由於設置一個寄存器並生成一個項目,不會超過5分鐘的時間,請您自行驗證,在GUI 和生成的代碼中,PCI設備值是相同的。

Q : linux版本的測試軟體在Ubuntu12.04版本進行配置編譯,發現有錯誤如下,請問是什麼原因呢?
root@ubuntu:/home/bocom/WinDriver/redist# ./configure –disable-usb-support 
USE_KBUILD = yes 
checking for cpu architecture… x86_64 
checking for WinDriver root directory… /home/bocom/WinDriver 
checking for linux kernel source… found at /lib/modules/3.2.0-23-generic/build 
not found 
configure.wd: error: please install the kernel source or specify alternate location

A : 請先確認您的內核源代碼的位置。
     要指定一個”備用位置”,您可以使用配置選項 -with-kernel-source=path to build with kernel source directory <path>.
     (“./configure –with-kernel-source=/<custom path>/usr/src/linux –disable-usb-support”)
     如果沒有usr directory,可以從<custom directory name>去創建usr。

Q : 想使用Windriver開發WindowsXP的驅動,我在主機上插入四塊PCIe的設備卡,請問Windriver能適用這種情況嗎?如果適用,應該寫幾個驅動呢?

A : 您不需要各自開發四個應用程序,您可以從單一應用程序訪問四個設備,關於如何訪問多個設備,您可以參考PCI_diag。

Q : 在Windows 7 64bit的作業系統下安裝驅動,已確認有管理員許可權,但仍顯示cannot open service control manager, make sure you are running with     
      Administratorprivileges,請問應該如何處理?

A : 
     1. 請檢查您的電腦是否有管理員權限
     2. 請確認安裝WinDriver時,是以管理員身分
     3. 請檢查使用wdreg的64bit時,是在WinDriver 64bit的版本

Q : 我已按照WinDriver手冊產生INF並已安裝完成,但還是無法使用熱插拔,請問應該如何處理?

A : 由於有些硬體是不支持熱插拔的,因此請先檢查電腦主機板品牌以及確認PCI-E是否有包括熱插拔功能。

Q : WinDriver是否有提供在Windows 7的PCIe熱插拔案例?

A : PCI-E熱插拔是由Windows 7支持,只有當電腦或硬件有支持時才可以。
     請按順序執行下列步驟:
     1. 確認主機上的PCI-E 插槽是否支持PCI-E hotplug,並非所有的PCI-E  uses都有支持(通常沒有),可查詢PC主機板或規格是否有支持。
     2. 插入設備並安裝WinDriver之後重新開機,執行GUI wizard與安裝INF。
     3. 插入/移除PCI-E並檢查設備是否被正確列舉,該PCI-E會出現在Windows device manager。

Q : 在Windows環境下, Windriver針對某個可讀寫的Register會對1048的位置會自動加1,當超過FFFF會自動變零,但將device manager的windriver停掉則不會發        生此狀況,請問原因為何?

A : 由於WinDriver不會添加任何值到device registers,因此自動加1的方式是由設備本身產生。

Q : 我在運行WinDriver自動生成的代碼時,找到pci設備後提示: “failed opening a handle to the device:failed opening a WDC device handle. 
     error0x200000e – resource overlap”請問是什麼原因呢? 

A : 請確認在您運行生成應用程式之前,已關閉DriverWizard。因為WinDriver不允許兩個應用程式,連接到單一的設備,
     而DriverWizard會被認為是一個額外的應用程式。

Q : 請問在Windriver圖形界面中,該如何allocate一塊連續memory測試DMA的讀寫?

A : 請檢查您硬體中是否包含DMA的控制器,也請閱讀手冊中DMA章節,或觀看DMA的視頻http://youtu.be/RPwLzdnbi88
     關於DMA測試,由於每個硬體有其獨特的實現在內存範圍,因此沒有具體的sample可提供。

Q : 我們有一個ISA device的 Driver 從Windows XP 升級到Windows 7 (32 bits),
     所以我們migrate WinDriver from v9.20 to v11.20,但發現enable interrupt時失敗, WDC_IntEnable(), 回ERROR CODE 0x2000000c – Failed enabling interrupt
     我們的PCI device 的driver migration 是沒此問題, 原來的ISA XP版本也OK,請問是否需要額外再做一些修改?

A : 在Windows 7之前,使用者應用程式可以嘗試註冊任何IRQ和系統(通常會允許)。但Windows 7系統,將只允許WinDriver的連接註冊到一些設備的IRQ。
     具體地來說,如果所請求的IRQ不知道此系統的功能,NT_HalGetInterruptVector會失敗。

     如果IRQ是免費開放的裝置管理員,要測試時請選擇“View→Resources by type” ,將會看到IRQ在列表中

     透過WinDriver,分配一個可用的IRQ (如IRQ 10)
     Make a copy of the files in WinDriver\redist
     Edit windrvr6.inf to have:

    [ DriverInstall.NT ]
    COPYFILES = DriverCopyFiles
    LogConfig = config_irq

    [ config_irq ]
    IRQConfig = 10
    重新安裝WinDriver 兩個檔 : wdreg -INF windrvr6.inf使用裝置管理員打開WinDriver編寫的性質,並確保資源選項卡中出現與所選擇的IRQ 。
    由於IRQ資源在windriver被註冊為虛擬裝置,建議重新命名此driver,避免與WinDriver其它例子造成衝突。

Q : 在Windows 7作業系統,想使用PCIe的熱插拔功能,請問應該如何執行?

A : Windows7支持熱插拔,請參考以下方式
1. 由於並非所有的PCI-E匯流排是hot plugable,請先確保您的PCI-E插槽支持PCI-E熱插拔。 
2. 重啟PC,插入設備並安裝WinDriver。 
3. 插入/移除PCI-E設備和檢查設備是否被正確列舉。

Q:WinDriver的安裝路徑下有xilinx的V5的pcie的例程,在該例程中有用到DMA數據傳輸方式,但在WinDriver中該如何添加DMA資源?

Q : 我欲在NI的編譯環境(National Instrutments CVI)底下使用Jungo的API,若想參考範例bmd_diag中的interrupt DMA方式時,在執行WDC_IntEnable時,WinDriver會檢查是否有安裝 .inf 檔; 若沒安裝,WDC_IntEnable會回傳Driver not installed的error,但在實際使用上,我們的板卡需要安裝由NI wizard所產生出來的INF,因此,執行WDC_IntEnable時,就會產生error,因此想請教是否有辦法解決此問題,例如:可整合由windriver wizard所產生的INF以及 NI 的INF ?

A:可以的,兩個INF文件可以合併,但Jungo並不完全鼓勵,因為有兩個不同的INF文件時,若有bug將會很難確認問題所在。

Q:當程式執行到 WDC_PciScanDevices 時,回傳的結果卻為WD_NO_LICENSE ,請問原因為何?

A:您使用的是已到期的試用版,請購買WinDriver正式序號即可使用,您可以重新編輯該項目,插入GUI和代碼即可。

Q:請問使用WinDriver生成驅動時,該設備的Device CLASS該如何修改?

A:當您使用DriverWizard生成INF檔案時,便可以修改該設備的Class。

Q:我已經利用WinDriver試用版成功開發驅動程式,請問若取得正式序號是否仍需要做調整?

A:只要在程式中,調用到Licenses的參數,直接改為您購買的WinDriver正式序號,重新編譯過即可正常運作。

Q:在PLX9030的範例中,該如何添加Kernel Plugin的程式。

A:您需要重新建立一個Kernel Plagin的專案,並且把生成的專案放入PLX的範例中,接著若要開啟一個Kernel Plagin 的處理序時需要調用WDC_KernelPlugInOpen() (http://www.jungo.com/st/support/documentation/windriver/11.3.0/wdpci_manual.mhtml/WDC_LIB_API.html#WDC_KernelPlugInOpen).

Q:物理位置映射是在哪一個API中完成?

A:在WDC_PciDeviceOpen() API中完成映射

Q:在WinDriver API中對EEPROM做讀寫,是否有實際寫入?

A:是的

Q:請問傳統中斷的中斷訊號發出後,應該如何確認並清除該中斷訊號呢?

Q:在Linux下執行WinDriver時,一定需要root權限嗎? 是否可以在一般權限下使用WinDriver?

A:您可以在/dev/windrvr6.修改權限,指令是sudo chmod 666 /dev/windrvr6

Q:我已經利用WinDriver成功開發Linux驅動,欲將此驅動移植至Windows平台,在Linux有提供類似udelay ()的暫停函數,請問在WinDriver上有提供類似的函數嗎?

A:WinDriver提供WDC_Sleep函數,可以支援在所有WinDriver支援的平台上,請參閱
http://www.jungo.com/st/support/documentation/windriver/11.3.0/wdpci_manual.mhtml/WDC_LIB_API.html#WDC_Sleep

Q:我需要同時發行32位元和64位元的驅動程式,請問WinDriver是否有提供單一的.sys檔案可以供雙平台同時發布呢?

A:請須針對不同的作業系統位元,準備不同的.sys檔案與分發包,sys檔案必須要跟對應的CPU 種類一同編譯。
請參閱技術手冊 http://www.jungo.com/st/support/documentation/windriver/11.2.0/wdpci_manual.mhtml/driver_distribution.html

Q:我需要使用DMA功能,但是我的設備卡是PCI的不是PCI-e,請問適合使用ALTERA的Qsys設計範例嗎?

A:若您的ALTERA設備卡符合該範例的話,便可以使用。
若DMA的傳輸失敗,建議您使用該範例並且依據您的硬體設備上的DMA設置,修改DMA的功能參數。

【重要通知】WinDriver 技術支援流程

親愛的客戶,當您在試用WinDriver遇到技術問題時,我們很樂意提供免費技術服務,請提供您的連絡方式與以下資訊,發送至windriver@netguard.com.tw,以便加速技術支援的回覆時間

1. WinDriver序號
2. WinDriver的使用環境 ( PCI/ USBWindows/ Linux/ CE32bit /64bit)
3. 您的設備的功能應用為何使用哪些API?
4. 描述您的技術問題
5. Debug Monitor紀錄

Q:請問WinDriver生成的驅動是否可以在MSC模式執行?

A:當您使用WinDriver來開發USB驅動或應用程式時,是沒有MSC或MTP模式的。WinDriver是應用在與客製化的USB設備溝通;而音效裝置是屬於作業系統中音效驅動類別的裝置,並不需要安裝或開發任何驅動程式。WinDriver是用來開發電腦識別為”Custom”的韌體設備。

Q:請問WinDriver是否可以支援接收多個中斷訊號?

A:WinDriver調用中斷處理序來個別處裡每個中斷,在此處理程序中,您可以調用pIntResult->dwLastMessage,來觀察各個中斷訊號,並且根據您的設定分析該訊號。
您可以參閱pci_diag範例程式中的”DiagIntHandler()”,可以在%WinDriver%\samples\pci_diag\pci_diag.c資料夾中找到
> /* Diagnostics interrupt handler routine */
> static void DiagIntHandler(WDC_DEVICE_HANDLE hDev, PCI_INT_RESULT *pIntResult)
> {
>     /* TODO: You can modify this function in order to implement your own
>              diagnostics interrupt handler routine. */
>     printf(“Got interrupt number %ld\n”, pIntResult->dwCounter);
>     printf(“Interrupt Type: %s\n”,
>         WDC_DIAG_IntTypeDescriptionGet(pIntResult->dwEnabledIntType));
>     if (WDC_INT_IS_MSI(pIntResult->dwEnabledIntType))
>         printf(“Message Data: 0x%lx\n”, pIntResult->dwLastMessage);
> }

Q:當我在使用WDC_DMAContigBufLock時出現問題,

Debeg Monitor 紀錄如下
————————————————————————————-
dma_contig_lock: MmAllocateContiguousMemory failed
dma_contig_lock: try increasing the value of NonPagedPoolSize under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management in the registry (a zero value allocates a default buffer of 110k)
dma_lock: failed (0x20000005)
Table_remove_general (dma): removed handle 1
WDC_DMAContigBufLock: Error 0x20000005 – Insufficient resources
Table_remove (dma): handle 108658884 out of range
WDC_DMABufUnlock: Failed unlocking DMA buffer.
Error 0x20000001 – Invalid handle
Do_card_unlock: entered, hCard 1, last 1
Card_close_handle: hCard 1
Card_close_handle: un-registering item 2 interrupt 9
Irq_close_handle: entered, hInterrupt 1
Irq_disable: received 0 interrupts called 0 dpc Lost count 0
Table_remove_general (irq): removed handle 1
Card_close_handle: un-registering item 1 memory 0xf4000000-0xf5ffffff
Unmap_physical_mem_user: entered, base addr 0D900000, mem section 8A60A5F8
Unmap_physical_mem_krnl: entered, linear addr 0xb2a00000, length 0x2000000, context 00000000
Unmap_physical_mem_krnl – leaving
Card_close_handle: success
Table_remove_general (card): removed handle 1
————————————————————————————-
A:您好,從Debug Monitor可以看到
“WDC_DMAContigBufLock: Error 0x20000005 – Insufficient resources”
此代表該OS在嘗試分配DMA緩衝區時失敗,請重新分配較小的緩衝區,並移除不必要的PCI設備,以便從機器上更多的RAM。

Q:WinDriver視窗中有提到Block transfer可以設定8bit或32bit,以及「Do you wish to increment the address after each read block」,請問是什麼意思?

A:此問題是關於WDC_ReadAddrBlock()/WDC_WriteAddrBlock()的相關參數設置,請查閱WDC_ReadAddrBlock()在使用手冊中的解說,http://www.jungo.com/st/support/documentation/windriver/11.1.0/wdpci_manual.mhtml/WDC_LIB_API.html#WDC_ReadAddrBloc

請參閱「Mode」參數,該參數是用來定義在做I/O或記憶體或I/O位址,在R/W時,一次存取8, 16, 32 or 64 bits也就是1, 2, 4 or 8 bytes的資料尺寸;以及參閱「Options」參數,若您選擇不改變該位址,則該設備位址會保持不變,而是會R/W一個塊狀的記憶體或I/O位址。

Q:請問WinDriver是否可以支援在CPCI上的熱插拔功能嗎?

A:WinDriver以前有支援此功能,但是由於近期市場需求不高,因此已經停止支援此功能。

Q:請問是否可以使用WinDriver撰寫底層的驅動,然後使用 DirectShow 作為其上層API嗎?

A:不行的。

Q:請問WinDriver是否提供自動偵測DMA的通行線程?

A:DMA的功能是由硬體制定的,舉例來說,PCI/PCI-E的功能都不一樣,因此該通行線程是沒有辦法自動偵測,並且每個驅動程式都需要針對硬體設備做設定。
請參閱技術手冊第9.1章節,內含完整的Direct Memory Access解說。

Q:若欲將使用Altera的程式開發PLX dotnet的驅動程式,請問應該如何修改?

A:您可以將Altera的程式碼編譯成為DLL檔,並使用此DLL檔來開發PLX的dotnet程式,或者將Altera的C code插入至PLX dotnet的程式中,並針對dornet進行適當的修改。

Q:在C:\WinDriver\altera中,有提供Altera的Scatter/Gather DMA代碼,請問是否有其他的範例或文件解說Altera的API嗎?

A:沒有,WinDriver只針對特定的硬體,提供特定的範例程式

Q:當我直接使用Altera的範例代碼時,WinDriver會要求必須開啟DriverWizard才可執行此範例。請問是否可以在不開啟DriverWizard情況下,使用該範例程式?

A:請修改編輯altera_lib.c並將ALTERA_DEFAULT_LICENSE_STRING修改為一個有效的許可證,再重新建置該範例即可。

Q:請問是否可以提供針對Altera與PLX設備的DMA範例.Net程式嗎?

A:請參考WinDriver\ PLX\ dotnet\ LIB \ dma.cs的範例程式,此範例已經包括DMA,您可以容易地改變參數,以及選擇欲支援的晶片廠商。
您可以使用DriverWizard來撰寫.NET驅動程序,或者挑選使用最符合您需求的WinDriver .NET範例,然後按照您的設備修改WinDriver範例代碼。

Q:若使用WinDriver DMA的C++/C檔案,請問是否使用其.dll檔案便可以存取我的設備?

A:C# 的範例是將原有的C++ DMA範例重新編譯為C#.net框架,並依據您的硬體規格改變API的參數。
請參閱WinDriver DMA相關說明
請參閱Wiki DMA相關說明

Q:請問是否可以提供DMA範例程式?

A:請於 WinDriver\pLX\ DOTNET\ LIB \ dma.c 取得DMA的.net範例代碼

Q:若欲在同一時間插入多款USB設備,每款設備的供應商ID與設備ID皆相同,必須重新安裝驅動程序,因此會造成驅動加載變慢,請問應該如何解決?

A :WinDriver可以處理多款具有相同的供應商ID與設備ID的設備,請參閱USB_diag範例驅動程式了解相關資訊。
同時,亦建議您申請WHQL認證,因為擁有WHQL認證的驅動程序,可以設定為靜默安裝或預先安裝而縮短配置時間。若該驅動程序是由WinDriver進行開發,Jungo可以協助您申請WHQL認證,若有需要請與網護科技聯繫。

Q:在Linux的環境下執行make xconfig命令時出現錯誤,請問應該如何解決?

A:“xconfig”是屬於Linux系統的操作,與WinDriver並無直接關係。您的情況應該是缺乏相關的QT資料庫。請使用Terminal Mode來執行Linux內核GUI版本的“make xconfig“指令、”make menuconfig“指令或是” GTK版本的”make gconfig”指令。

Q : 當我在使用傳輸功能以實現WDC_ReadAddr32時,卻出現以下代碼,請問應如何處理? 

BZERO (cardReg);
cardReg.Card.dwItems = 1;
cardReg.Card.Item [0]. item = ITEM_MEMORY;
cardReg.Card.Item [0]. fNotSharable = TRUE;
cardReg.Card.Item [0]. I.Mem.dwPhysicalAddr = 0x0; / / Mem registered Bar0 space
cardReg.Card.Item [0]. I.Mem.dwBytes = 1024;
cardReg.Card.Item [0]. I.Mem.dwBar = 0;
WD_CardRegister (hWD, & cardReg);
WD_TRANSFER Trans;
BZERO (Trans);
Trans.cmdTrans = WM_DWORD;
Trans.dwPort = cardReg.Card.Item [0]. I.Mem.dwTransAddr +0;
data0 = Trans.Data.Dword
A : 您可以依據以下步驟進行設置 :
1. 將WD_PCI_CARD_和WD_CARD_REGISTER參數結構設為0。
2. 呼叫WD_PciGetCardInfo來對應你所需的插槽。
3. 複製設備卡數值到WD_CARD_REGISTER結構(類型WD_CARD)。
4. 掃描在Card.Item的資源,並修改fNotSharable和dwOptions(若需要改)。
5. 呼叫WD_CardRegister
請正確輸入傳輸命令,以確保使用正確的[N]數值對應正確的BAR,例如:
cardReg.Card.Item[N] I.Mem.dwTransAddr+Offset

Q : 當我使用WD_CARDREGISTER註冊中斷時,總是顯示註冊失敗,請問應如何處理? 

代碼如下:
BZERO (cardReg_int);
cardReg_int.Card.dwItems = 1;
cardReg_int.Card.Item [0]. item = ITEM_INTERRUPT;
cardReg_int.Card.Item [0]. fNotSharable = TRUE;
cardReg_int.Card.Item [0]. I.Int.dwInterrupt = 3; / / distribution system, can be seen in the DriverWizard Configuration space in the register INTLN = 3
cardReg_int.Card.Item [0]. I.Int.dwOptions = INTERRUPT_LEVEL_SENSITIVE;
cardReg_int.fCheckLockOnly = FALSE;
WD_CardRegister (hWD, & cardReg_int);
A : 您可以依據以下步驟設置中斷:
1. 註冊設備卡。
2. 使用從WD_CardRegister返回的數據,來建設dwTransAddr傳輸命令。
3. 使用WD_IntEnable來啟用中斷和傳輸命令。

Q : 我的FPGA設備需要添加多個功能,WinDriver是否可以逐一測試,或需將所有的功能添加完全才可測試?

A : WinDriver與硬體的發展是不相關的。只要設備符合PCI規格,WinDriver皆可以訪問其設備資源。

Q : WinDriver是否有提供相關的API以讀寫DMA?

A : 若您的設備有DMA控制器,您使用DMA傳輸,請參閱手冊
您亦可以使用WDC_WriteAddrBlock()和WDC_ReadAddrBlock()API以讀取和寫入內存(非DMA),請參閱手冊

Q : WinDriver是否可以改變數據包傳輸的尺寸?

A : 您可以使用WDC_WriteAddrBlock()和WDC_ReadAddrBlock()API函數來改變及讀寫不同大小的緩衝區。

Q : 請問應如何對自己修改定義的巨集進行追蹤?

A : 請見以下步驟:
1.  請使用WinDriver的DriverWiZard生成一個新的驅動程序,並將此專案另存名稱為您欲指定的名稱 (例如:netguard)
2. 在生成的專案資料夾底下,您會找到”netguard_installation”資料夾。此資料夾包括修改驅動程序的文件和安裝腳本netguard_install.bat。請執行此腳本,以加載修改後的驅動。
3. 請確保您的應用程序是使用您欲設定的名稱。
4. 運行您的應用程序。
5. 從命令提示字元底下,使用您的驅動程式名稱作為參數來執行Dubug monitor,
例如,WinDriver/ UTIL / wddebug_gui.exe netguard

Q : 我欲利用WinDriver開發ISA的驅動程式,在裝置管理員底下找到該設備時會出現問號符號,請問應如何識別 ?

A : 請忽略裝置管理員下的問號,並繼續使用DriverWizard,直到此專案完成。
請注意,由於ISA卡是不支援即插即用的設備,因此您需要自行設定此設備卡的資源。

Q : 請問如何使用DriverWizard進行大量數據的讀寫測試?

A : 請使用WDC_ReadAddrBlock()和WDC_WriteAddrBlock()以便達到理想的效能。

Q : 在Linux環境上,使用WinDriver掃描PCIe設備,可以順利地找到該設備,但是卻無法取得該設備的主控權,請問如何解決?

A : 請使用WinDriver的PCI_diag範例程式來取得該設備的主控權。
執行此程式時,請先關閉所有其它應用程序,並確認晶片的電路板已經正確連接電腦。若無法執行,請附上Debug monitor的紀錄。
有可能您的內核空間過於擁擠,而導致錯誤。大部分驅動只需要BAR區域映射到user space,並不需要映射到內核空間,所以請務必在您開啟設備前將WD_ITEMS中的參數dwOptions設置為WD_ITEM_DO_NOT_MAP_KERNEL。

Q : WinDriver是否可對任何Device Classes建立Driver? (不限0xFF的Device class) 例如:我的HID滑鼠Device,是否也可以透過WinDriver對此滑鼠設備建立新的Driver去蓋過原本的Driver?

A : 在使用WinDriver時,您需要加入您自己的邏輯程式,若您想要仿造類似HID的功能,您可以自行嘗試,但根據我們的經驗,大部分的HID裝置還是會選用Windows已經提供的驅動程式。

Q : WinDriver是否可以支援開發USB Audio、HID之設備?

A :  WinDriver可以協助您在PC端開發客製化設備之驅動程式的工具,若是例如:影音,儲存…等在作業系統中已經包含的驅動程式,則無法使用。若是您的硬體設備,包含兩個以上的介面,其中之一個介面是所謂客製化的介面,您便可以使用WinDriver來幫助您的開發。

Q : 若此開發設備需要同時使用兩個應用程式,並調用WinDriver API WDC_xxx,但會出現錯誤,請問如何解決嗎?

A : WinDriver API 可以同時供給兩個應用程式使用,但是會產生相關的同步性問題,您可以改變fNotShared的設定值。關於fNotShared函數設定,
      請參閱fNotShared 

Q : 我在Linux作業系統欲使用WinDriver開發設備驅動程式,但WinDriver for Linux並未有設備ID與廠商ID的資訊,請問如何辨識該設備?

A : WinDriver是根據設備ID和廠商ID辨識該設備,您可以參閱關於WinDriver的範例 (例如:pci_diag)。一般來說,你可以調用WDC_PciScanDevices 與設備ID和
     廠商ID,您便可以辨別此設備是連接到您系統的哪一個插槽,欲瞭解更多請參閱範例應用程式。

Q : 我欲開發一個類似攝影機的設備,並採用攝影機的通訊協定,該攝影機上有個按鈕,我們希望透過此按鈕時電腦可以抓下該擷圖,
     但是目前此動作只能透過鍵盤執行,無法使用此設備上的按鈕,因為在驅動裡面抓圖功能似乎是Windows內建的,
     所以使用WinDriver無法順利截取圖片,請問我們有辦法使用WinDriver的功能來抓設備上按鈕發出的中斷訊號,但利用Windows內建的功能來擷取圖片嗎?

A : 這是可能的,只要該攝影機具有多個USB的interface,便可以利用Windows來控制其中一個interface,而另一個則使用WinDriver來控制。

Q : 我該如何使用WinDriver生成的檔案?

A :  通常您不需要直接使用DLL,DLL會被安置在您的API內,您只需使用API,在API內的程式碼將會自動調用該DLL。

Q : WinDriver生成的程式碼可以用DDK來建置嗎?

A :  不行的,生成的代碼是純粹的ANSI C,某些高階功能會要求您安裝DDK,因為它們有時會利用一些DDK的API。

Q : 我該如何針對不同系統環境來使用WinDriver API?

A :  WinDriver的API 可以針對所有作業系統與平臺,當你在產生程式碼時,你可以自行選擇你想使用的API。

Q :  WinDriver生成的.sys檔案是否可以修改呢?

Q:當我使用WinDriver開發驅動程式,此工具會自動建立許多檔案並且包含DLL檔案。若我不想看到此DLL檔案,請問如何解決?

A:若您欲使用靜態連結的方式,則需要存取原始程式碼,請把src資料夾下的DLL檔案從新編譯成*lib即可完成。

Q:WinDriver生成的驅動程式是否會包含原始程式碼?

A: 由於WinDriver所生成的驅動骨架程式碼就是原始程式碼,該程式碼可以被整合在用戶端的應用當中,而WinDriver產品本身的原始程式碼則無法提供。

Q:目前我計畫寫一個應用程式調用WinDriver生成的DLL檔案,請問若WinDriver三十天試用期結束後,該DLL檔案是否可以正常使用?

A:在WinDriver試用期三十天內,WinDriver生成的DLL檔案是可以正常使用;但若是試用期結束後,則該DLL檔案將無法執行,
      若您欲繼續使用請購買WinDriver正式序號。

Q:請問欲PDA設備的驅動程式,是否亦可使用WinDriver驅動程式開發工具進行開發?

A:WinDriver驅動程式開發工具可以完全支援WinCE作業系統,因此可以利用此套工具來開發PDA驅動程式。

1. 當PDA為Device端:
將WinDriver安裝在電腦上,運行VS IDE,連結您的客制化USB設備,執行測試、溝通、生成程式架構等動作,並且選擇WinCE,確認您已經設定正確的CPU(例如:x86、ARM等),並且按照下列網址的指示執行開發與發行步驟。

開發步驟:
http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/register_wince.html

發行步驟:
http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/dist_wince.html#dist_wince_new_ce_platform

2. 當PDA為Host端:
    若您欲使用WinDriver開發PDA的驅動程式,來連結一個既定的設備,例如:攝影機、USB modem,
    此時Jungo提供的另一種解決方案DriverCore則可以滿足您的需求,更多資訊請參考http://www.jungo.com/st/drivercore/drivercore_class_drivers.html

Q : 若欲在同時間使用兩個以上相同的設備,而該設備的廠商ID與設備ID皆相同,WinDriver 驅動程式開發工具是否亦可支援?

A : 是的,WinDriver可以同時支援兩個以上相同的設備。由於每個設備在呼叫WDU_Init()時皆會收到獨特的處理宣告(Handle),因此所有設備皆會有不同對應的驅         動應用程式進行處理。

Q: 目前我有個設備已經內附現有的驅動程式,但我又再度利用WinDriver開發此設備的驅動程式並且生成INF檔案,請問我該如何移除此INF檔案讓此設備正常運行?

A:請按照下列步驟操作即可。
     1. 請在裝置管理員裡找尋該裝置 → 點擊右鍵 → 選取裝置進階選項 → 選擇卸載驅動程式,移除「windrvr6.sys」驅動程式。
     2. 執行C:\WinDriver\uninstall.exe,以移除WinDriver資料夾
     3. 安裝原有的現有驅動程式,即可正常使用該裝置。  

Q:若利用WinDriver來生成USB2.0介面的攝影機驅動程式,仍是無法順利截取該攝影機的畫面,而當我想要重新設定攝影機的相關驅動設定時,
     發現WinDriver奪取主控權,應如何解決?

A:由於WinDriver是一個開發客制化驅動程式的產品,此工具包並不適用於開發作業系統既有的驅動程式,例如:現成的攝影機、滑鼠、大容量儲存裝置。
     在作業系統開發時,已經包含了很多種的標準化驅動程式,因此在此案例中,WinDriver產生的驅動程式是無法正常使用的。

Q:我欲使用WinDriver開發一個PCI卡的驅動程式來傳輸圖像,但是當我利用WinDriver進行Virtex5 FPGA進行讀取和寫入動作時,電腦會當機,請問如何解決?

A : 請提供電腦當機時的螢幕顯示資訊(Minidump),並參閱http://support.microsoft.com/kb/307973
     請同時提供CPU類型、作業系統類型,應用程式等資料。若是因為應用程式當機而非作業系統當機,請提供WinDriver的Debug monitorLog資料,請參閱       
     http://www.jungo.com/st/support/tech_docs/td12.html

Q:當我將USB設備連結至電腦時,WinDriver會自動顯示出USB的ID,但當我在執行熱插拔時,該USB的ID會變更,因此我無法確認該ID是指何者設備。
      請問WinDriver是否可以定義該設備的ID內容在執行熱插拔前後皆是相同的?

A:由於此為Windows的程式,因此無法利用驅動程式或應用程式進行修改。

1 2