虚拟USB控制器USB集线器
实现自己的USB控制器、根集线器和USB虚拟设备 - 这个工程量有点大,以USBIP现在实现了大概30%左右的代码,并且还没有调试。感觉有点难啊。
以上是自己大概1-2个月前写的计划,说是计划,倒不如说是心愿。因为本身这件事的象征意义更大一些,无所谓收益,只想弥补心中关于USB的最后一块板吧。
自己虚拟的USB设备很多,虽说做不到对USB规范很熟悉,但经过这么多的调试练习,也对USB的理解上加深了很多,特别是从Windows层面。
为了实现虚拟的USB控制器和该控制器下的USB根集线器,本人算是比较仔细在研究了USBIP的源代码。然后基于此,加上自己的想法和改造、代码设计,实现自己的虚拟USB控制器USB集线器。该工程被自己命名为VUSB.
VUSB和USBIP一样,也是从USBR控制器的PDO开始虚拟,直到USB设备这一级。其设备栈关系如下图:
其中各类型定义如下:
typedef enum _VDEVICE_TYPE
{
VDEV_FROOT, //根虚拟节点FDO
VDEV_PHCI, //USB控制器PDO
VDEV_FHCI, //USB控制器FDO
VDEV_PHUB, //USB根集线器PDO
VDEV_FHUB, //USB根集线器FDO
VDEV_PUSB //USB设备PDO
}VDEVICE_TYPE;
驱动经过编译安装后,在设备管理器中如下图所示:
可以看到,根虚拟节点是VUSB Enumerator,是我们一切的根节点。其次以下为USB主机控制器、USB根集线器。
为了后续的设备生成,这里我将该USB根集线器扩展出了16个端口(其实就是个数字),在USB Viewer下可以看到:
当然,为了搞明白USB VIEWER他们枚举USB集线器及其下的信息,自己也做了一些研究工作。
从效果上来看,这里确实已经满足了自己的需求。但实际上还因未有USB设备,所以本人打算先移值一个自定义的HID设备的USB集线器上的端口1上,先玩一玩。
存在的问题:
当前还存在一个问题,就是在USB TREE Viewer下显示虽然未连接,但和正常的USB集线器不一样,别人显示的是未连接,而自己虚拟的显示的是 UnKnow Device,估计这与node connection information相关。所以这里还得分析。
=========================== USB Port3 ===========================
Connection Status : 0x00 (No device is connected)
Port Chain : 3-3
Used Endpoints : 0
======================== USB Device ========================
DriverKeyName : ERROR_FILE_NOT_FOUND
---------------- Connection Information ---------------
Connection Index : 0x03 (Port 3)
Connection Status : 0x00 (NoDeviceConnected)
Current Config Value : 0x00 (Configuration 0)
Device Address : 0x03 (3)
Is Hub : 0x00 (no)
Device Bus Speed : 0x01 (Full-Speed)
Number Of Open Pipes : 0x00 (0 pipes to data endpoints)
Data (HexDump) : 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 01 00 03 00 00 00 00 00 00 ................
00 00 00 ...
--------------- Connection Information V2 -------------
Connection Index : 0x03 (3)
Length : 0x10 (16 bytes)
SupportedUsbProtocols : 0x03
Usb110 : 1 (yes, port supports USB 1.1)
Usb200 : 1 (yes, port supports USB 2.0)
Usb300 : 0 (no, port not supports USB 3.0)
ReservedMBZ : 0x00
Flags : 0x00
DevIsOpAtSsOrHigher : 0 (Device is not operating at SuperSpeed or higher)
DevIsSsCapOrHigher : 0 (Device is not SuperSpeed capable or higher)
DevIsOpAtSsPlusOrHigher : 0 (Device is not operating at SuperSpeedPlus or higher)
DevIsSsPlusCapOrHigher : 0 (Device is not SuperSpeedPlus capable or higher)
ReservedMBZ : 0x00
Data (HexDump) : 03 00 00 00 10 00 00 00 03 00 00 00 00 00 00 00 ................
---------------------- Device Descriptor ----------------------
bLength : 0x00 (0 bytes)
-------------------- String Descriptors -------------------
none