虚拟USB控制器USB集线器

2023-12-26 101 51
站长漫谈淘宝店 https://zzmt.taobao.com

实现自己的USB控制器、根集线器和USB虚拟设备 - 这个工程量有点大,以USBIP现在实现了大概30%左右的代码,并且还没有调试。感觉有点难啊。

以上是自己大概1-2个月前写的计划,说是计划,倒不如说是心愿。因为本身这件事的象征意义更大一些,无所谓收益,只想弥补心中关于USB的最后一块板吧。

自己虚拟的USB设备很多,虽说做不到对USB规范很熟悉,但经过这么多的调试练习,也对USB的理解上加深了很多,特别是从Windows层面。

为了实现虚拟的USB控制器和该控制器下的USB根集线器,本人算是比较仔细在研究了USBIP的源代码。然后基于此,加上自己的想法和改造、代码设计,实现自己的虚拟USB控制器USB集线器。该工程被自己命名为VUSB.

VUSB和USBIP一样,也是从USBR控制器的PDO开始虚拟,直到USB设备这一级。其设备栈关系如下图:
VUSB设备栈

其中各类型定义如下:

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 VIEWER他们枚举USB集线器及其下的信息,自己也做了一些研究工作。

从效果上来看,这里确实已经满足了自己的需求。但实际上还因未有USB设备,所以本人打算先移值一个自定义的HID设备的USB集线器上的端口1上,先玩一玩。

存在的问题:
当前还存在一个问题,就是在USB TREE Viewer下显示虽然未连接,但和正常的USB集线器不一样,别人显示的是未连接,而自己虚拟的显示的是 UnKnow Device,估计这与node connection information相关。所以这里还得分析。

已经解决,详见:https://www.usbzh.com/article/detail-1299.html

UnKnow Device

    =========================== 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

0 篇笔记 写笔记

USB设备和USB集线器HUB的数据传输
USB高速集线器与USB根集线器之间只通过USB使用USB高速通讯讯方式,而对于低速或全速的数据通讯的转换是由其挂接的最近的USB-HUB负责完成转换。如下图:对于USB高速设备和USB高速HUB,使用高速通讯。对于连接到高速HUB上的低速或全速USB-HUB,使用低速或全速通讯方式。对于连接到高速......
USB控制器及分类
USB是一直在变化的,从最开始的1.0发展到现在开始大规模使用的3.0,甚至到今天已经发布的USB4.0。所以USB的控制器也在不断的变化升级。所以由于历史的原因,导致USB的主机控制器,出现了多种不同的类型,即OHCI和UHCI,EHCI,和xHCI。不论是那种USB主机控制器,简称主控,都是符合......
USB 集线器HUB
通过USB集线器,可以很简单的实现主机扩展USB设备的数量。在USB协议规范中,USB集线器作为了一种特殊的设备在存在,USB规范专门为其定义了一种设备类。USB集线器的结钩集线器由6个组件组成:上行端口:用于连接上层的USB集线器或者根集线器。下行端口:用于连接下层的USB功能设备或扩展的U......
USB主机端控制器集线器与USB设备类型分类
USB根据设备功能及类型,可以分USB主机端,USB设备端。USB主机端-USB hostUSB主机端也叫USB控制器,包括两大部分,分别为与系统总线进行数据交互的USB控制器和USB总线的根集线器。一个USB主机端就是一个独立的USB总线,其按USB版本可分为OHCI,UHCI,EHCI,xHC......
USB设备与集线器最大可以级联多少层
在USB2.0规范中,定义了USB设备与集线器最大可以级联7层(包括根集线器),即根集线器之设备之间最多有5个继集线器。注意:有一个USB复合(compound)设备,其本身是一个USB集线器并接连1个或多个USB功能设备,这里需要将这个USB集线器算在内。......
USB集线器HUB的枚举过程及集线器状态
USB集线器和其他USB设备一样,都需要在上电时进行配置。在USB协议中,使用默认的端0点。进行上电初期的通信。USB集线器除了配置其自身外,还需要对下行端口连接的其他USB设备进行识别。USB集线器HUB枚举过程USB集线器的上电配置过程如下:USB集线器连接到USB主机的根集线器上。USB......
USB HUB集线器芯片选型
型号TT模式过流检测工作温度封装 CH334GSTT--40~85℃SOP16 CH334RMTT--40~85℃QSOP16 CH334U/FMTTGANG模式-40~85℃QSOP28/QFN24_4x4 CH334S/Q......
USBIP虚拟控制器和根集线器HUB的设备信息分析
USBIP是一套可以实现USB远程设备的本机映射,这样就像在本地操作目标USB设备一样。其原理是在本地端通过安装一个虚拟的USB根控制器,根集线器,同时虚拟出4个USB端口,当远程USB设备连接到远程机器时,可以把远程设备的USB信息通过网络传输到本地,在本地的虚拟USB端口虚拟一个相同的设备,这样......
USBIP虚拟控制器安装命令过程分析
USBIP虚拟控制器其自带的安装命令为:usbip.exe install -w可以看到,这是一个明显的自定义命令。这里一个比较有意思的是对命令行进行解析,使用的函数是getopt_long。在介绍这个命令之前,我们先介绍几个命令行参数的函数。命令行的长短项之分命令行分为长项和短项,我们一般使......
控制器USB的信号和协议实现
目录第1章 深入理解USB信号0011.1 USB的电气特性和信号0021.1.1 电气特性0031.1.2 驱动特性0071.1.3 USB信号特性0091.1.4 数据包编码0181.2 连接和断开的检测0201.2.1 连接状态的检测0211.2.2 断开状态的检测0241.3 速度检测028......
USBIP 设备树层次分析
通过前面知道,usbip_vhci工程实现的是pnp管理器虚拟出来的PDO的FDO,但同样也是这个FDO创建的PDO虚拟根USB控制器和其子设备HUB的驱动程序。USBIP设备硬件ID名称sys文件inf文件硬件IDusbip-win VHIC Rootusbip_vhic......
USBIP 虚拟控制器设备(VDEV_CPDO)PDO的初始化过程
IRP_MN_QUERY_ID/BusQueryDeviceIDPAGEABLE NTSTATUSpnp_query_id(pvdev_t vdev, PIRP irp, PIO_STACK_LOCATION irpstack){ NTSTATUS status = STATUS_......
USBIP 虚拟控制器设备(VDEV_VHCI)FDO的初始化过程
虚拟ROOT总线FDO创建了虚拟USB控制器PDO之后,系统通过各种IRP_MJ_PNP收集完物理设备的信息之后,开始根据其硬件ID进行设备驱动批配,批配成功后,装载驱动并调用其AddDevice之后,开始FDO的创建过程。通过前面的可知,USBIP实现的根驱动,USB控制器、HUB和设备PDO的S......
USBIP 集线器PDO(VDEV_HPDO)的初始化过程
USB集线器其实也是USB设备的一类,其设备分类分类为0x09。和USBIP虚拟的控制器(VDEV_CPDO)类似,USB控制器创建了其PDO之后,会通过IRP_MN_QUERY_DEVICE_RELATIONS返回USB集线器HUB的PDO设备列表。PNP管理器收到有新的设备之后,会开始收集这个P......
USBIP 虚拟集线器FDO子设备的管理
IRP_MN_QUERY_DEVICE_RELATIONS这得从IRP_MN_QUERY_DEVICE_RELATIONS来谈起,好像有点看的不是很明白。先把上一节的代码复制过来,看一下:static PAGEABLE NTSTATUSget_bus_relations_vhub(pvhub_d......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!