日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

USB设备仿真框架设计指南——10.用USB设备模拟器测试USB驱动程序

發布時間:2024/8/1 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USB设备仿真框架设计指南——10.用USB设备模拟器测试USB驱动程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節討論使用DSF設備模擬器測試USB驅動程序的技術。

本節包括:

創建一個模擬USB 2.0?EHCI控制器

在模擬USB 2.0控制器中插入設備

模擬設備PNP枚舉

用設備模擬器協調I/O

在計算機上重啟模擬設備

使用設備仿真的測試策略


創建一個模擬USB 2.0?EHCI控制器

在將模擬設備插入模擬USB 2.0控制器之前,必須在目標系統上創建和枚舉控制器。若要創建并枚舉控制器,請運行DSF運行時在目標程序系統中安裝的Softehcicfg.exe應用程序,該程序文件在\Program Files\dsf\softehci?文件夾中。

若要安裝控制器,請打開命令窗口并運行?softehcicfg /install。這個命令將向DSF根枚舉器驅動程序(Dsfroot.sys)發送一條消息,并告訴它枚舉模擬EHCI控制器。您必須等待控制器枚舉,然后才能將模擬設備插入其中。您可以查看是否通過檢查設備管理器和查找“Microsoft USB 2.0 Host Controller Simulator”條目來枚舉控制器,或者使用諸如微軟?Windows Device Testing Framework (WDTF)之類的工具以編程方式枚舉控制器。

注意,控制器的設備ID是"PCI\VEN_1414&DEV_0004&SUBSYS_00041414&REV_00"。這個ID是微軟的一個被正式分配的PCI設備ID,它不應該與任何其他現有的PCI設備沖突。

您還可以通過使用Softehcicfg.exe意外地從目標系統中移除模擬的EHCI控制器。若要移除模擬的EHCI控制器,請打開命令提示符窗口并運行softehcicfg /remove

您還可以枚舉多個同時模擬的EHCI控制器,將實例參數添加到?softehcicfg /install。例如,您可以運行softehcicfg /install 0,然后運行softehcicfg /install 1

控制器將由即插即用(PnP)管理器分配唯一的設備實例ID,這些ID以實例號結束,實例號表示為最多三個前導零。使用上面的示例,控制器可以被分配以下設備實例ID:

Instance 0: PCI\VEN_1414&DEV_0004&SUBSYS_00041414&REV_00\1&1222FD94&9&0000Instance 1: PCI\VEN_1414&DEV_0004&SUBSYS_00041414&REV_00\1&1222FD94&9&0001

若要刪除多個實例,請將實例參數追加到softehcicfg /remove。若要移除在較早示例中添加的兩個控制器,請運行softehcicfg /remove 0,然后運行softehcicfg /remove 1。?

原文鏈接:https://docs.microsoft.com/zh-cn/previous-versions/windows/hardware/dsf/ff538281%28v%3dvs.85%29


在模擬USB 2.0控制器中插入設備

有兩種方法將設備直接插入模擬USB 2.0控制器:

調用IDSF::HotPlug,傳遞設備的DSFDevice對象(IDSFDevice)。

調用SoftEHCIRootHubPort::HotPlug, 傳遞設備的SoftUSBDevice?對象(ISoftUSBDevice)。

通常,測試應用程序將把設備模擬器插入控制器,但是模擬器可以選擇性地設計成將自己插入控制器。如果測試應用程序插入設備,則測試應用程序將需要訪問其SoftUSBDevice?對象或其DSFDevice對象。每個對象都可以從另一個對象訪問。考慮下面的VBScript代碼示例。

Set DSFDevice = SoftUSBDevice.DSFDeviceconst IID_ISoftUSBDevice = "{9AC61697-81AE-459A-8629-BF5D5A838519}" Set SoftUSBDevice = DSFDevice.Object(IID_ISoftUSBDevice)

如果模擬設備被實現為COM對象,那么DSFDevice?對象或SoftUSBDevice?對象可以作為屬性公開。例如,?DSF USB Loopback Device Simulation通過LoopbackDevice::DSFDevice?屬性公開DSF設備對象。?

IDSF::HotPlug方法采用兩個參數:總線的名稱和模擬設備的DSFDevice對象。EHCI控制器模擬器的總線名稱是“USB2.0”。HotPlug返回一個DSFBus?對象(IDSFBus),您可以稍后使用它來拔出設備。(例如,從\Program Files\dsf\USBLoopback文件夾中與DSF運行時一起安裝的RunLoopbackSample.wsf?loopback示例腳本中),考慮以下代碼示例:

Dim LoopbackDev : Set LoopbackDev = WScript.CreateObject("SoftUSBLoopback.LoopbackDevice", "LoopbackEvent_") Dim LoopbackDSFDev : Set LoopbackDSFDev = LoopbackDev.DSFDevice Dim DSF : Set DSF = CreateObject("DSF.DSF") Dim Bus : Set Bus = DSF.HotPlug(LoopbackDSFDev, "USB2.0")... use the loopback device ... Bus.UnPlug LoopbackDSFDev

為了使用SoftEHCIRootHubPort::HotPlug,你必須訪問EHCI控制器模擬器。可以通過為控制器搜索IDSF::Devices?屬性來訪問此模擬器,如EnumSimulatedDevices例程中的以下示例腳本所示。?

'/ ' Function EnumSimulatedDevices ' ' This function searches the collection of simulated devices ' referenced by DSF.Devices for a device that exposes an ancillary ' object from DSFDevice.Object with the specified GUID. If found it returns the ' DSFDevice object otherwise it returns Nothing. '/ const IID_IDSFBus = "{E927C266-5364-449E-AE52-D6A782AFDA9C}" Dim CtrlrDev : Set CtrlrDev = EnumSimulatedDevices(IID_IDSFBus) ... Private Function EnumSimulatedDevices(SearchObjectGUID)Dim DevSought : Set DevSought = NothingDim Dev : Set Dev = NothingDim DSF : Set DSF = CreateObject("DSF.DSF")Dim ObjSought : Set ObjSought = NothingFor Each Dev in DSF.DevicesIf Dev.HasObject(SearchObjectGUID) ThenSet ObjSought = Dev.Object(SearchObjectGUID)If Not ObjSought Is Nothing ThenSet DevSought = DevExit ForEnd IfEnd IfNextSet EnumSimulatedDevices = DevSoughtEnd Function

如果使用多個模擬EHCI控制器并且需要根據設備實例ID查找特定控制器,則可以修改前面的EnumSimulatedDevices示例函數,以通過檢查循環中每個設備的InstanceID?屬性來檢查設備實例ID,如下面是代碼示例。

For Each Dev in DSF.DevicesIf Dev.HasObject(SearchObjectGUID) And (Dev.InstanceID = SearchID) ThenSet ObjSought = Dev.Object(SearchObjectGUID)If Not ObjSought Is Nothing ThenSet DevSought = DevExit ForEnd IfEnd IfNext

根集線器端口對象可從EHCI控制器的端口集合獲得。下面的代碼示例演示如何獲取根集線器端口1的對象。

Dim CtrlrObj : Set CtrlrObj = CtrlrDev.Object(IID_EHCICtrlrObj) Dim RootHubPorts : Set RootHubPorts = CtrlrObj.Ports Dim RootHubPort1 : Set RootHubPort1 = RootHubPorts(1)

?第一行從控制器的DSFDevice?對象中提取SoftEHCICtrlr?對象。第二行獲取根集線器端口集合,第三行獲取端口1的SoftEHCIRootHubPort?對象。

最后一步是使用設備模擬器的SoftUSBDevice?對象將設備模擬器插入根集線器端口。例如,考慮?loopback設備的以下代碼示例。

const IID_ISoftUSBDevice = "{9AC61697-81AE-459A-8629-BF5D5A838519}" RootHubPort1.HotPlug LoopbackDevice.DSFDevice.Object(IID_ISoftUSBDevice)

?要刪除設備,運行RootHubPort1.Unplug。

如果調用SoftEHCIRootHubPort::Unplug?或者?IDSFBus::UnPlug,目標系統將該調用視為意外移除,并且在功能上等同于從根集線器端口移除USB電纜而不首先在軟件中啟動移除(例如,通過使用安全移除硬件圖標)。

原文鏈接:https://docs.microsoft.com/zh-cn/previous-versions/windows/hardware/dsf/ff542263(v%3dvs.85)


模擬設備PNP枚舉

從目標系統的角度來看,模擬USB設備的枚舉與真實USB設備的枚舉實際上沒有什么不同。您可以在設備管理器中看到設備,還可以通過使用工具(如微軟 Windows Device Testing Framework (WDTF)或?SetupDiXxx?API)以編程方式發現設備。

在Windows Vista的Windows Driver Kit(WDK)中包含的DSF版本(版本6000)中,在插入第二設備之前,必須等待枚舉一個設備。類似地,當您拔出模擬設備時,在移除或插入附加設備之前,必須完成設備移除。

從WDK for Windows Server 2008(版本6001)中包含的DSF版本開始,可以使用外部集線器模擬器同時枚舉多個設備。類似地,可以通過拔出父外部集線器模擬器來拔除多個設備。

原文鏈接:https://docs.microsoft.com/zh-cn/previous-versions/windows/hardware/dsf/ff542301(v%3dvs.85)


用設備模擬器協調I/O

使用設備模擬器測試驅動程序通常需要使用設備啟動I/O,同時在模擬器中運行操作以滿足那些I/O請求。測試用例可以是肯定的(期望I/O成功完成)或否定的(期望I/O以特定錯誤完成)。

如果測試包括設備的多個實例,則必須將設備模擬器的實例與即插即用(PnP)設備實例匹配。目前,DSF中沒有能夠將模擬的USB設備與給定設備實例ID積極匹配的工具。

枚舉設備的實例(例如,通過使用微軟Windows Device Testing Framework [WDTF]),插入模擬設備,然后重新枚舉以找到設備的其他實例。

通過使用RegisterDeviceNotification?來接收設備到達通知,并在插入模擬設備之后等待通知,從而處理WM_DEVICECHANGE消息或注冊設備通知。有關WM_DEVICECHANGE?RegisterDeviceNotification的更多信息,請參見MSDN Library?網站。

在您已經明確地標識了設備并且可以對其發起I/O之后,您必須確保設備模擬器相應地響應I/O請求。例如,考慮DSF USB Loopback Device Simulation,它具有一個具有一個批量IN端點和一個批量OUT端點的單個接口。Rwbulk.exe(您可以在\src\usb\bulkusb\exe文件夾中的WDK安裝中找到)調用Microsoft Win32 API函數CreateFile?以打開bulkusb?驅動程序(在\src\usb\bulkusb\sys文件夾中)公開的設備接口,然后調用Win32 API函數ReadFile?和?WriteFile發送I/O請求。WriteFile?調用使控制器向大容量端點發送數據傳輸。loopback?設備通過將接收到的數據排隊到批量IN端點,在CLoopbackDevice::OnWriteTransfer函數(在\src\Test\DSF\USB\SoftUSBLoopback文件夾中)中處理這個I/O事件。來自Rwbulk.exe的后續ReadFile調用導致控制器請求來自大容量IN端點的數據傳輸,然后大容量IN端點使用排隊的數據。

您可以設計一個確定的肯定測試用例,以便loopback?設備向測試應用程序中觸發一個事件,以指示收到批量OUT傳輸。測試應用程序可以調用WriteFile,等待確認收到批量OUT傳輸的事件,然后等待WriteFile調用完成。這個過程需要兩個線程或使用異步重疊I/O,因為WriteFile調用將被阻塞,直到I/O完成。

您可以設計一個否定的測試用例,以便對loopback設備進行編程,以在下一個事務上從批量OUT端點返回事務錯誤。您可以通過向回送設備添加屬性來完成這種情況(例如,LoopbackDevice.ErrOnNextBulkOUT = True)。

loopback設備可以在每次調用CLoopbackDevice::OnWriteTransfer開始時檢查該屬性,如果屬性為真,則返回USB_ERR作為事務狀態,并將屬性重置為false。在設置此屬性之后,測試應用程序可以調用WriteFile?,然后檢查它是否返回相應的錯誤。

原文鏈接:https://docs.microsoft.com/zh-cn/previous-versions/windows/hardware/dsf/ff538279(v%3dvs.85)


在計算機上重啟模擬設備

模擬USB 2.0控制器在重啟、關機、休眠和掛起操作之間被持久化,直到通過運行softehcicfg?/remove被移除。

模擬的外部集線器和模擬的USB設備不會在DSF的當前版本中重新啟動。

外部集線器和設備在關機、休眠、暫停時不會被刪除,但是,在計算機重新啟動時也不會出現。這種情況類似于在系統關閉或暫停USB電纜時物理刪除連接到控制器的裝置。

原文鏈接:https://docs.microsoft.com/zh-cn/previous-versions/windows/hardware/dsf/ff542262(v%3dvs.85)


使用設備仿真的測試策略

設備模擬提供了新的機會,以提高您的驅動程序測試策略,是不可用的真實硬件。最明顯的好處是您必須手動完成測試的自動化。總有一些測試用例必須手動運行,例如必須知道能夠100%工作的通用用戶集成場景和涉及無法模擬的潛在電氣和時序問題的場景。

仿真提供了機會來達到代碼路徑和生成數據值,這在真實硬件不可能做到的。您應該徹底檢查您的驅動程序和設備應用程序代碼,以確定如何使用仿真覆蓋這些情況。

仿真還允許在驅動程序開發過程中修改,這在真實硬件不可能做到的。在開發過程中,應考慮以下事項以加強過程:

  • 創建一個自動化的構建驗證測試(BVT)。
  • 創建一個可以在虛擬機上運行的自動化BVT。使用微軟虛擬服務器實現對虛擬機的自動化控制。
  • 創建一個自動回歸套件,可以在不到一天的時間內運行。
  • 創建一個較小的自動化回歸套件,開發人員可以在他們的計算機或筆記本電腦上運行。
  • 創建一個自動化的壓力套件,包括即插即用(PNP)和I/O測試。
  • 使用仿真作為新的驅動程序開發人員的學習工具。
  • 在將硬件提交到硬件原型之前,使用模擬來測試潛在的硬件更改。

原文鏈接:https://docs.microsoft.com/zh-cn/previous-versions/windows/hardware/dsf/ff542527(v%3dvs.85)

?

總結

以上是生活随笔為你收集整理的USB设备仿真框架设计指南——10.用USB设备模拟器测试USB驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。