測試 USB 裝置

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 功能驅動程式庫會讓目前的主機看起來像週邊的 USB 裝置。例如,USB 高容量儲存 (ums) 函式裝置在插入另一台機器時,允許主機顯示為區塊裝置。如果主機適合您的裝置類別的 USB 函式驅動程式庫,則應建立實際的 usb 函式驅動程式庫。否則,如要測試 usb 驅動程式庫,最簡單的方法是編寫一種 usb 函式來假裝 USB 裝置硬體。

usb-virtual-bus 將您的 usb 功能驅動程式庫連線至您要測試的實際 USB 裝置驅動程式庫。這樣一來,裝置驅動程式庫就能在測試模式中執行,而不需對裝置驅動程式庫做任何修改。

usb 功能驅動程式範例:

usb 函式驅動程式庫必須實作 UsbFunctionInterface banjo 介面。這些函式會在 usb-virtual-bus 程式庫設定 USB 堆疊中的驅動程式庫時呼叫。

usb 函式驅動程式以 UsbFunction 通訊協定為基礎。這些呼叫可讓函式驅動程式分配端點、註冊介面回呼、將 USB 要求排入佇列等。

繫結規則

usb 函式驅動程式庫必須繫結至 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 功能驅動程式」一文。如要啟動這項測試,請將繫結規則新增至 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 函式驅動程式庫會繫結。

USB 虛擬匯流排會將函式驅動程式庫連結至系統,然後實際裝置驅動程式庫將繫結作業。接著,測試即可透過 devfs 連線至 USB 裝置驅動程式庫。繫結以非同步方式進行,因此必須等待 devfs 偵測到驅動程式庫。其中一個查看檔案的方法為 fdio_watch_directory 函式。

裝置已連線至裝置,因此即可正常進行 FIDL 通話。 驅動程式會處理這些 FIDL 呼叫並呼叫 USB 功能驅動程式庫,就像實際硬體一樣。