多功能複合裝置

概述

多功能複合裝置(或 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 是開源的,因此認為它應該(讀作:“我不知道它是否會”)開箱即用。

對於更奇特的系統,我能說的就更少了……

歡迎任何測試和驅動程式!

作者

本文件由 Michal Nazarewicz ([[mailto:mina86@mina86.com]]) 編寫。INF 檔案是在 Marek Szyprowski ([[mailto:m.szyprowski@samsung.com]]) 和 Xiaofan Chen ([[mailto:xiaofanc@gmail.com]]) 的支援下修改的,基於 MS RNDIS 模板[9]、Microchip 的 CDC ACM INF 檔案和 David Brownell ([[mailto:dbrownell@users.sourceforge.net]]) 的原始 INF 檔案。

腳註

[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]]