USB 虛擬匯流排架構可將 USB 函式驅動程式庫連結至 USB 裝置驅動程式庫,以利測試。
測試 USB 裝置驅動程式庫時,會用到下列檔案。這三個檔案都應儲存在同一個目錄中:
{driver}.cc:要測試的 USB 裝置驅動程式庫。{driver}-function.cc:USB 函式驅動程式庫,可模擬基礎 USB 裝置硬體。{driver}-test.cc:測試程式,用於設定驅動程式庫及執行測試。
usb-virtual-bus 會將 USB 周邊裝置匯流排連接至 USB 匯流排,如下圖所示:
usb-peripheral-bus -> {Your usb-function driver}
^
|
usb-virtual-bus
|
v
usb-bus -> {Your usb-driver}
編寫 USB 函式驅動程式庫
usb-function 驅動程式庫會讓目前的主機顯示為周邊 USB 裝置。舉例來說,USB 大量儲存 (ums) 功能裝置插入另一部電腦時,主機可顯示為區塊裝置。如果主機需要裝置類別的 USB 函式驅動程式庫,就應建立真正的 usb-function 驅動程式庫。否則,撰寫可模擬 USB 裝置硬體的 USB 函式,是測試 USB 驅動程式庫最簡單的方法。
usb-virtual-bus 會將 usb-function 驅動程式庫連線至您要測試的實際 USB 裝置驅動程式庫。這樣一來,裝置驅動程式庫就能在測試模式中執行,不必修改裝置驅動程式庫。
USB 函式驅動程式範例:
usb-function 驅動程式庫必須實作 UsbFunctionInterface FIDL 介面。這些函式會從 usb-virtual-bus 程式庫呼叫,因為程式庫會在 USB 堆疊中設定驅動程式庫。
usb-function 驅動程式庫會繫結在 UsbFunction 通訊協定上方。函式驅動程式庫程式可透過這些呼叫分配端點、註冊介面回呼、將 USB 要求加入佇列等。
繫結規則
usb-function 驅動程式庫必須繫結至 ZX_PROTOCOL_USB_FUNCTION 通訊協定。USB 類別、USB 子類別和 USB 通訊協定可能會有額外的繫結規則。
以下範例顯示繫結規則,其中 {} 代表應替換為您資訊的區域:
using fuchsia.usb;
fuchsia.BIND_PROTOCOL == fuchsia.usb.BIND_PROTOCOL.FUNCTION;
fuchsia.BIND_USB_CLASS == {usb_class}
fuchsia.BIND_USB_SUBCLASS == {usb_subclass}
fuchsia.BIND_USB_PROTOCOL == {usb_protocol}
撰寫 usb-virtual-bus 測試
測試應使用 usb 虛擬匯流排啟動器程式庫編寫。
測試啟動的第一個項目是 撰寫 USB 函式驅動程式一文所述的 usb-function 驅動程式庫。如要啟動這項測試,請將繫結規則新增至 usb_peripheral::FunctionDescriptor,然後使用 SetupPeripheralDevice() 函式。例如:
// Set up your USB Device Descriptor.
usb_peripheral::DeviceDescriptor device_desc = {};
/ Set up your USB Function descriptors.
std::vector<usb_peripheral::FunctionDescriptor> function_descs;
usb_peripheral::FunctionDescriptor function_desc = {
.interface_class = {usb_class},
.interface_subclass = {usb_subclass},
.interface_protocol = {usb_protocol},
};
function_descs.push_back(function_desc);
ASSERT_NO_FATAL_FAILURE(SetupPeripheralDevice(device_desc, std::move(function_descs)));
SetupPeripheralDevice 函式成功後,usb-function 驅動程式庫就會繫結。
USB 虛擬匯流排會將函式驅動程式庫連線至系統,然後繫結實際裝置驅動程式庫。測試即可透過 devfs 連線至 USB 裝置驅動程式庫。繫結作業是非同步進行,因此您必須等待 devfs 偵測到驅動程式庫。監看檔案最簡單的方法是使用 fdio_watch_directory 函式。
連線至裝置後,即可正常發出 FIDL 呼叫。 您的驅動程式庫會處理這些 FIDL 呼叫,並呼叫 USB 函式驅動程式庫,就像是實際硬體一樣。