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-function 驱动程序的示例:
USB 功能驱动程序需要实现 UsbFunctionInterface FIDL 接口。这些函数是从 usb-virtual-bus 库调用的,因为该库会在 USB 堆栈中设置驱动程序。
usb-function 驱动程序绑定在 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-function 驱动程序会绑定。
USB 虚拟总线将功能驱动程序连接到系统,然后实际设备驱动程序进行绑定。然后,您的测试可以通过 devfs 连接到 USB 设备驱动程序。绑定是异步进行的,因此您必须等待 devfs 检测到驱动程序。最简单的文件监视方法是使用 fdio_watch_directory 函数。
现在,您已连接到设备,可以正常进行 FIDL 调用。 您的驱动程序会处理这些 FIDL 调用,并像对待真实硬件一样调用您的 USB 功能驱动程序。