USB学习之USBIP之路
学习本身就是一门避轻就重之路。
本人从开始搞USB开始,大概已经3年了。其当时的切入点就是USB驱动的开发,其实到目前为止,也是以USB驱动开发为主要任务。但在实际的开发过程中,总会遇到很多的USB技术问题,为了解决这些问题,也不得不去涉及到USB软件层之外的问题。
例如USB硬件知识,链路层,事务及令牌,更有甚不得不看一些USB集线器、控制器相关的知识,当然这些对我为说,都是一些边边角角的东西,因为本身并非从事这些方面的东西,只是洽巧因问题需要翻这些东西。
当然,要解决上述的问题,就需要强大的综合知识,也洽好本人硬件出身,模电还是有一定的功底的,所以对这些东西来说,也不会无从下手,下有下手的动作,但效率上来说,就很低了,毕竟不从事这方面的工作。
为了更深入地了解USB底层,也为了提高本人的综合水平。也不得不去学习一些相关的东西。所以就有了以下各种诡异的操作。
研究了STM32F407,开始研究FPGA,学习音视频开发,看USBIP源代码,也在开始学习LINUX相关的知识。
- 学习STM32,也只是为了满足自己当前嵌入式的一个小的心愿。
- 学习FPGA,最终也只是为了ZYNQ到最终的LINUX。
- 学习LINUX,也是为了驱动以及内核的东西,也为是了ZYNQ服务的。
- 学习USBIP源代码,也是自己的一个小心愿。只是为了从系统层了解USB相关的知识。
搞这些东西,也只是满足心愿。当然也会有一些附带的产出。这些产出说来也奇怪,有时竟成为某些同学的需求。
USBIP之路
搞USBIP,纯属是为了提高自己的Windows内核的知识。因为看别人的代码来学习,是一件很开心的事。我们去学习中小型软件的设计架构,了解一些系统层的知识。总比漫无目的在REACTOS中乱看有效的多。所以学习USBIP是一个心愿。
当自己许了愿,就要想办法把它实现。所以就开始看USBIP的源代码,做笔记来学习。
另外,自己以前虚拟的USB各类设备,都是比较暴力的虚拟。但在本人看来,都是无源之水,无根之萍。USB设备总得从USB集线器,USB控制器开始。另外我们在搞USB的时候,经常用的一个工具是USBTreeViewer,这是在微软开源USBViewer的基础上二次开发的。这个工具有很多实用的功能,所以为了熟悉这些功能的实现以及与系统层相关的接口,无论是IOCTL还是SETUPAPI,都是很有必要的。
当然,看了别人的代码。为了将这些代码真实的变为自己的,自己就得自己重写一遍。只有自己重写一遍,才能更加深刻地理解和了解一些关键性的东西。所以本人也就有了VUSB这个工程。
2023/12/26 15:27 5,595 add_device.cpp
2023/12/15 16:04 572 add_device.h
2023/12/05 19:45 313 create_close.cpp
2023/11/27 16:22 96 create_close.h
2023/12/27 15:07 4,846 device.h
2023/12/29 16:29 661 device_fhci.cpp
2023/12/12 11:15 212 device_fhci.h
2024/01/02 11:22 6,886 device_hub.cpp
2023/12/26 16:56 374 device_hub.h
2023/12/26 11:35 4,016 device_pusb.cpp
2023/12/12 17:53 739 device_pusb.h
2023/12/29 11:30 10,824 internal_ioctrl.cpp
2023/12/15 10:59 838 internal_ioctrl.h
2023/12/26 09:59 1,126 ioctrl.cpp
2023/12/12 16:58 87 ioctrl.h
2023/12/29 16:29 3,208 ioctrl_fhci.cpp
2023/12/12 10:38 242 ioctrl_fhci.h
2024/01/02 11:12 11,090 ioctrl_fhub.cpp
2023/12/13 11:21 1,062 ioctrl_fhub.h
2023/11/29 12:17 1,548 irp.cpp
2023/11/29 12:17 387 irp.h
2023/12/15 16:42 1,882 main.cpp
2023/11/27 10:13 133 main.h
2023/12/29 11:30 13,770 pnp.cpp
2023/11/29 15:04 1,534 pnp.h
2023/12/29 11:30 4,725 pnp_device_status.cpp
2023/11/30 10:08 998 pnp_device_status.h
2023/12/29 11:30 6,501 pnp_query_cap.cpp
2023/12/05 15:58 240 pnp_query_cap.h
2023/12/29 15:40 5,254 pnp_query_id_text.cpp
2023/12/25 11:26 514 pnp_query_id_text.h
2023/12/28 14:11 5,948 pnp_query_interface.cpp
2023/11/30 15:29 256 pnp_query_interface.h
2023/12/27 15:05 5,332 pnp_query_relation.cpp
2023/12/05 17:39 409 pnp_query_relation.h
2023/12/05 16:10 811 pnp_query_resource.cpp
2023/12/05 15:53 143 pnp_query_resource.h
2023/11/28 16:36 3,080 power.cpp
2023/11/27 16:38 83 power.h
2023/12/12 10:26 475 stdafx.h
2023/11/02 23:59 7,582 usb.cpp
2023/07/25 14:34 2,556 usb.h
2023/12/26 15:28 10,229 USBZH.vcxproj
2023/11/27 15:57 168 USBZH.vcxproj.user
2023/12/25 11:00 1,376 VHUB.inf
2023/12/29 11:29 1,444 VUSB.inf
VUSB是一个简化了的USBIP,本人只做设备虚拟层了,舍弃了应用层及相关的网络通讯,因为本人并不需要USB远程映射,只需要本地电脑实现虚拟USB设备即可。
一个测试的例子,就是本人在USB控制器下虚拟了一个USB集线器,USB集线器挂了16个端口,本人为展示,也对这16个端口挂了16个HID设备,用于测试。
在设备管理器中是这样的:
在USBTREEViewer中是这样的:
当然,这是一个半拉子工程。本人还没有挂音视频或者其它USB设备来测试,HID的也是一个自定义设备。功能这里也并没有完成。
还有就是为什么获取字符串描述符它说没找到,但我确实有返回了的。
---------------------- Device Descriptor ----------------------
bLength : 0x12 (18 bytes)
bDescriptorType : 0x01 (Device Descriptor)
bcdUSB : 0x200 (USB Version 2.0)
bDeviceClass : 0x03 (HID - Human Interface Device)
bDeviceSubClass : 0x01
bDeviceProtocol : 0x02 (Mouse)
bMaxPacketSize0 : 0x40 (64 bytes)
idVendor : 0xFF00 (Unknown Vendor)
idProduct : 0x0108
bcdDevice : 0x0100
iManufacturer : 0x01 (String Descriptor 1)
*!*ERROR String descriptor not found
iProduct : 0x02 (String Descriptor 2)
*!*ERROR String descriptor not found
iSerialNumber : 0x03 (String Descriptor 3)
*!*ERROR String descriptor not found
bNumConfigurations : 0x01 (1 Configuration)
Data (HexDump) : 12 01 00 02 03 01 02 40 00 FF 08 01 00 01 01 02 .......@........
03 01 ..
另外,关于USBTreeViewer对设备,对集线器及端口的操作,本人也并没有测试。
所以这时,需要反向需要研究USBViewer的实现原理并配合本人的VUSB工程来调试了。感觉这又是一个无边的天际线大坑。
路漫漫其修远兮,吾想一逃了之~
原因也比较简单:时间成本太高,本人也是一个无利不起灶的人。