USB 虚拟总线框架是一个 有用的框架,用于将 USB 函数驱动程序连接到 USB 设备驱动程序,用于测试。
测试 USB 设备驱动程序需要以下文件。这三个 这些文件应存储在同一目录中:
{driver}.cc
:要测试的 USB 设备驱动程序。{driver}-function.cc
:用于伪造底层的 USB 函数驱动程序 USB 设备硬件。{driver}-test.cc
:该测试计划用于设置驱动程序并运行测试。
USB 虚拟总线会将 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 虚拟总线会将您的 USB 功能驱动程序连接到实际的 USB 设备 驱动程序。这样,相应设备驱动程序便可在测试中运行 模式,无需修改设备驱动程序。
USB 函数驱动程序示例:
USB 函数驱动程序需要实现 UsbFunctionInterface 班卓琴界面这些是从 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 虚拟总线测试
应使用 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 虚拟总线将函数驱动程序连接到系统中,然后
真实设备驱动程序绑定然后,您的测试可以连接到 USB 设备驱动程序
至 devfs
。绑定是异步发生的,因此您必须等待
驱动程序由 devfs
检测。监视文件的最东方方式是
fdio_watch_directory
函数。
现在,您已连接到设备,可以正常进行 FIDL 调用了。 您的驱动程序会处理这些 FIDL 调用,并调用您的 USB 函数驱动程序 就像是真实的硬件一样