多功能複合裝置¶
概述¶
多功能複合裝置(或 g_multi)是一個複合裝置,它廣泛利用複合框架來提供一個……多功能裝置。
在其標準配置中,它提供一個單一的 USB 配置,包含 RNDIS[1](即乙太網)、USB CDC[2] ACM(即序列)和 USB 大容量儲存功能。
一個 CDC ECM(乙太網)功能可以透過 Kconfig 選項開啟,RNDIS 可以關閉。如果兩者都啟用,該裝置將有兩個配置——一個使用 RNDIS,另一個使用 CDC ECM[3]。
請注意,如果您使用非標準配置(即啟用 CDC ECM),您可能需要更改供應商和/或產品 ID。
主機驅動程式¶
要使用此裝置,需要在主機端使其工作——否則,該裝置將無法實現任何功能。正如所料,不同系統所需的步驟各不相同。
Linux 主機驅動程式¶
由於該裝置使用標準複合框架,並以這種方式呈現給 Linux 主機,因此在 Linux 主機端不需要任何額外的驅動程式。所有功能都由為其開發的相應驅動程式處理。
對於以 RNDIS 配置為第一配置的兩配置設定,此情況也適用。Linux 主機將使用帶有 CDC ECM 的第二個配置,這在 Linux 下應能更好地工作。
Windows 主機驅動程式¶
為了使該裝置在 Windows 下工作,必須滿足兩個條件:
檢測為複合裝置¶
首先,Windows 需要將該裝置檢測為 USB 複合裝置,這本身有一些條件[4]。如果滿足這些條件,Windows 會讓 USB 通用父驅動程式[5]處理該裝置,然後嘗試為每個獨立的介面匹配驅動程式(某種程度上,我們不深入太多細節)。
好訊息是:您不必擔心大多數條件!
唯一需要擔心的是該裝置必須有一個單一配置,因此一個同時支援 RNDIS 和 CDC ECM 的裝置將無法工作,除非您建立一個合適的 INF 檔案——當然,如果您建立了,請務必提交!
為每個功能安裝驅動程式¶
另一個更棘手的問題是讓 Windows 為每個獨立功能安裝驅動程式。
對於大容量儲存來說,這很簡單,因為 Windows 會檢測到它是一個實現 USB 大容量儲存類的介面,並選擇相應的驅動程式。
對於 RNDIS 和 CDC ACM,情況則更復雜。
RNDIS¶
要讓 Windows 為裝置中的第一個功能選擇 RNDIS 驅動程式,需要使用本文件提供的 [[file:linux.inf]] 檔案。它將 Windows 的 RNDIS 驅動程式“附加”到裝置的第一個介面。
請注意,在測試過程中,當 RNDIS 不是第一個介面時,我們遇到了一些問題[6]。除非您正在嘗試開發自己的裝置,否則您無需擔心此問題,在這種情況下請注意此錯誤。
CDC ACM¶
同樣,為 CDC ACM 提供了 [[file:linux-cdc-acm.inf]]。
自定義裝置¶
如果您打算修改 g_multi 裝置,請注意重新排列功能顯然會改變每個功能的介面編號。因此,提供的 INF 檔案將無法工作,因為它們的介面編號是硬編碼的(儘管更改這些並不難[7])。
這也意味著,在嘗試 g_multi 並更改所提供的功能後,應該更改裝置的供應商和/或產品 ID,以免與其他自定義裝置或原始裝置發生衝突。
未能遵守可能會導致數小時的困惑,因為裝置未按預期工作,然後才意識到 Windows 快取了一些驅動程式資訊(更改 USB 埠有時可能會有幫助,您也可以嘗試使用 USBDeview[8] 來移除虛擬裝置)。
INF 測試¶
提供的 INF 檔案已在 Windows XP SP3、Windows Vista 和 Windows 7(所有 32 位版本)上進行過測試。它也應該在 64 位版本上工作。它極有可能無法在 Windows XP SP2 之前的 Windows 版本上工作。
其他系統¶
目前,尚未測試任何其他系統的驅動程式。考慮到 MacOS 基於 BSD,而 BSD 是開源的,因此認為它應該(讀作:“我不知道它是否會”)開箱即用。
對於更奇特的系統,我能說的就更少了……
歡迎任何測試和驅動程式!
腳註¶
[1] 遠端網路驅動程式介面規範,[[https://msdn.microsoft.com/en-us/library/ee484414.aspx]]。
[2] 通訊裝置類抽象控制模型,此及其他 USB 類的規範可在 [[http://www.usb.org/developers/devclass_docs/]] 找到。
[3] CDC 乙太網控制模型。
[4] [[https://msdn.microsoft.com/en-us/library/ff537109(v=VS.85).aspx]]
[5] [[https://msdn.microsoft.com/en-us/library/ff539234(v=VS.85).aspx]]
[6] 換句話說,Windows 未能響應任何使用者輸入。
[7] 您可能會發現 [[http://www.cygnal.org/ubb/Forum9/HTML/001050.html]] 有用。
[8] https://www.nirsoft.net/utils/usb_devices_view.html
[9] [[https://msdn.microsoft.com/en-us/library/ff570620.aspx]]