精华内容
下载资源
问答
  • by fanxiushu 2020-03-25 转载或引用请注明原始作者。 USB虚拟总线驱动的使用范围是非常广泛的,可以使用它来模拟各种通用的USB设备。...比如如下链接阐述的是在linux平台中的虚拟USB总线驱动开发原理:https://blo...

                                    by fanxiushu 2020-03-25 转载或引用请注明原始作者。

    USB虚拟总线驱动的使用范围是非常广泛的,可以使用它来模拟各种通用的USB设备。
    以前的文章阐述过基于windows平台和基于linux平台中的USB虚拟总线驱动开发,
    比如如下链接阐述的是在linux平台中的虚拟USB总线驱动开发原理:
    https://blog.csdn.net/fanxiushu/article/details/102967402
    稍微再早一点的文章阐述了windows平台中的虚拟USB总线驱动开发,但是windows中的虚拟USB总线驱动实现起来比起linux复杂得多。

    到目前为止,使用虚拟USB总线驱动模拟了虚拟摄像头,虚拟声卡和虚拟麦克风,虚拟鼠标键盘,虚拟触摸屏,。。。
    好像日常用到的都模拟遍了,不对,U盘还没模拟。
    因此这篇文章就是阐述模拟U盘的具体通讯协议过程。

    绝大部分U盘通讯协议都是基于SCSI通讯的,也就是在底层的USB通讯协议中封装了SCSI协议来实现U盘的功能。

    正如上一篇文章在阐述windows平台实现基于AVStream框架的虚拟摄像头的时候所说的一样。
    如果你的需求只是实现一个即插即用的移动硬盘,
    不应该采用这种通过虚拟USB总线驱动模拟U盘的办法,因为同样的原因:代价是高昂的,过程是冗余的。
    因此本文介绍的内容研究意义可能大于实际使用价值,不过对掌握硬件U盘实际通讯过程也有一定参考意义。
    当然这里还有一个好处就是基于USB通讯封装的SCSI协议是跨平台的。
    因此本尽量阐述协议部分,不与具体的(比如windows或linux)虚拟USB总线驱动联系起来。

    实际上,在windows这样的系统中,可以直接使用Storport 这样的磁盘驱动框架来实现虚拟磁盘。
    而且基本上几百行代码就能实现一个基于 Storport的虚拟磁盘驱动框架。
    具体原理可以查看我很早前发布的文章,如下所示,
    同时本文介绍的利用USB总线驱动模拟U盘,使用的SCSI通讯协议和下面链接中使用的SCSI基本上是一样的。
    https://blog.csdn.net/fanxiushu/article/details/9903123  (磁盘驱动与虚拟磁盘MINIPORT驱动一)
    https://blog.csdn.net/fanxiushu/article/details/11713357  (磁盘驱动与虚拟磁盘MINIPORT驱动二)
    上面的文章,尤其是第二篇介绍的SCSI命令,在本文中会同样使用到。

    要成功模拟U盘,当然第一步肯定是正确模拟出USB的设备描述符,配置描述符,接口描述符,端口描述符。
    U盘的这些描述符其实是挺简单的。我们可以直接把某个现成的U盘的描述符copy过来,直接使用。
    绝大部分U盘都是基于 Bulk-Only 方式来传输数据的,这种方式简单而且容易理解。
    也就是主机用 ”控制传输方式“ 从U盘获取各种描述符等基本信息之后,
    之后所有基于SCSI的命令,都是封装到 ”Bulk传输“ 中进行通讯的。
    BULK传输需要有两个方向:从U盘传输到主机,从主机传输到U盘,需要两个BULK端点。
    (为了下文引用的方便,这里把从U盘到主机端点定义成 Bulk-In, 把从主机到U盘的端点定义成 Bulk-Out)
    因此U盘通常是包含设备描述符,一个配置描述符,配置描述符中包含一个接口描述符,接口描述符中包含两个端点描述符。

    接着就是如何在Bulk传输中通讯SCSI协议命令。
    我们知道,USB通讯都是主机主动发起USB通讯,USB设备响应命令的主-从方式。
    因此第一个数据包数由主机首先发起,使用 Bulk-Out端点传输,是一个CBW头(Command Block Wraper),
    这个头用于指示接下来需要传输多少传输多少数据,数据传输方向,SCSI的CBD头信息等,如下定义:
    struct usb_cbw_t
    {
        __u32  sig; /// fixd  'USBC'
        __u32  tag; ///
        __u32  data_transfer_length;
        __u8   dir; ///方向 0x80 从设备到主机,  0x00 host -> device
        __u8   lun;   ///
        __u8   cb_length;
        __u8   cb_data[16];
    };
    总共31个字节。
    其中 sig固定为 0x43425355(‘USBC’),tag是主机随机生成的一个数字,用于在回复CSW的时候使用。
    data_transfer_length 就是表示接下来需要传输的数据大小,如果为0,表示就只传输CBW头,不传输数据。
    dir是接下来的数据传输方向,
    如果0x80表示从设备传输到主机,这个时候使用Bulk-IN端点传输。如果0 表示从主机传输到设备,使用Bulk-Out传输。
    lun表示 SCSI磁盘设备的逻辑位置,一般一个U盘就设置一个SCSI磁盘,因此通常都是 0,
    cb_data 就是SCSI通讯定义的CDB头,不超过16字节,具体大小由cb_length指定。
    我们可以通过CDB头,指定发起了哪个SCSI命令。

    主机通过BULK-Out发起了一个CBW包之后,接下来,如果data_transfer_length 大于0, 则开始传输实际的数据。
    然后根据CBW中的dir参数判断方向, 从而判断是采用 Bulk-In,还是Bulk-Out传输。
    如果指定的data_transfer_length长度数据传输完成,U盘会通过 Bulk-IN端点,回复主机一个CSW包。
    如果传输过程中,U盘出现故障等问题,则直接回复 STALL的USB通讯错误。
    如果data_transfer_length长度为0,则不需要传数据,但是U盘同样需要通过 Bulk-In端点回复CSW数据包。
    CSW(Command Status Wrapper)数据包定义如下:
    struct usb_csw_t
    {
        __u32  sig;  /// 'USBS'
        __u32  tag; 
        __u32  data_rest;  ///还剩下多少字节需要传输
        __u8   status;     0 success, 1 error
    };
    一共13个字节。
    其中sig固定为0x53425355(‘USBS’),tag跟主机发起的CWB包中的tag保持一致。
    data_reset表示回复的时候,还需要多少数据需要传输。
    status表示本次SCSI传输是成功,还是失败, 0 表示成功,非0表示失败。

    总结一下,通过Bulk-In和Bulk-Out两个端点,完成一个SCSI命令的传输过程:
    1,主机  发送 31个字节的 CBW 头(通过 Bulk-Out)
    2,传输数据(如果有的话),(通过Bulk-In或Bulk-Out,具体根本CBW中的参数决定。)
    3,U盘回复13个字节的CSW包,(通过Bulk-In)

    以上传输需要严格按照顺序进行,如果出现错乱,通常主机就会发起 reset device 的USB命令。

    接下来,拨开USB通讯部分,分析SCSI命令。
    SCSI命令是非常多的,好在我们实现U盘,其实只需关心其中几个比较关键的命令。
    SCSI的CDB头的第一个字节表示的就是当前命令类型,
    比如 Inquiry 是SCSIOP_INQUIRY(0x12),这个是主机获取SCSI设备的基本信息,U盘需要回复一个INQUIRYDATA结构。
    结构描述可直接查询 WDK驱动的 storport.h 头文件的描述。
    因为SCSI命令是跨平台,所以在WDK中描述的这些结构同样适合于 linux 这样的平台。
    通常实现一个U盘需要使用到的SCSI命令如下:
    SCSIOP_INQUIRY                      扫描磁盘
    SCSIOP_READ_CAPACITY       获得磁盘容量
    SCSIOP_READ                          读磁盘
    SCSIOP_WRITE                         写磁盘
    SCSIOP_MODE_SENSE             获得磁盘相关参数

    SCSIOP_TEST_UNIT_READY
    SCSIOP_SYNCHRONIZE_CACHE
    SCSIOP_START_STOP_UNIT
    SCSIOP_VERIFY           以上4个命令跟首次使用磁盘时候,检查磁盘单元有关。
    这个与在
    https://blog.csdn.net/fanxiushu/article/details/11713357  (磁盘驱动与虚拟磁盘MINIPORT驱动二)
    中描述的基本一致,因此要了解详细信息,可去查阅如上链接的文章。

    下图是利用前段时间开发的基于linux平台的虚拟USB总线驱动,模拟出来的一个U盘。
    估计是大家对windows平台都烂熟了,所以来个比较新奇的linux平台下的模拟效果图。





     

    展开全文
  • 虚拟USB GUI 该项目是用于开源虚拟USB(vUSB)GUI。 它提供了一个简单的GUI,只需单击几下即可启动Android或iOS vUSB会话。 vusb.mp4 vUSB是一个移动应用程序调试工具,可模拟使用USB电缆将Sauce Labs真实设备...
  • 行业分类-嵌入式设备-一种嵌入式虚拟USB磁盘的实现方法.zip
  • 通过应用层程序发送 CreatePDO IOCTL命令到总线驱动,让总线驱动直接创建一个虚拟USB设备的PDO,所有发送到 这个PDO的URB请求最终被转发到应用层程序,由应用层程序通过网络转发到真正的USB设备端进行数据处理, ...

    By Fanxiushu 2016-05-25 转载或引用请注明原始作者

    接上文,
    通过应用层程序发送 CreatePDO IOCTL命令到总线驱动,让总线驱动直接创建一个虚拟USB设备的PDO,所有发送到
    这个PDO的URB请求最终被转发到应用层程序,由应用层程序通过网络转发到真正的USB设备端进行数据处理,
    并且最终把处理的数据结果回传给总线驱动。
    采用这样的工作模式的虚拟USB设备,因为缺少USB控制器和根集线器的支持,某些软件尤其是工作在底层的软件,
    比如USBLyzer这样的USB抓包工具,再比如vmware虚拟机程序等是无法识别出我们的虚拟USB设备的。
    而我实现远程访问USB设备的初衷就是为了能让vmware虚拟机识别出虚拟USB设备,
    并且再次把虚拟USB设备成功转向到vmware的虚拟机系统里边去。
    因此目标尚未没达到,还需继续努力,得让USB虚拟系统是个完善的USB设备栈。

    于是通过Google全世界范围内搜索关于windows平台下USB设备栈的相关资料
    (感谢Google强大的搜寻能力,尤其是对这些比较难查询的技术资料,国内的搜索引擎就显得捉襟见肘了)
    通过查询资料,查看源代码,尤其是ReactOS的关于USB设备栈实现的源代码(也得感谢ReactOS提供的接近windows内核的源代码),
    慢慢的理解了windows平台下USB设备栈的层次结构。
    基本的层次结构其实在第一章介绍数据采集端的时候已经介绍过了。

    电脑中存在基本的PCI总线,USB控制器(也即是某个芯片)通过PCI总线接入电脑。
    电脑启动时候,PCI总线驱动会枚举到USB控制器,并且加载USB

    展开全文
  • Wincc7.4虚拟USB狗破解

    2019-04-20 15:14:55
    模拟生成wincc7.4USB
  • gadget_cdrom将您的Raspberry Pi转换为虚拟USB cdrom。 用法 您可以在HDD模式,虚拟cdrom模式和虚拟闪存驱动器模式之间切换。 HDD模式-在那种模式下,Raspberry Pi基本上是连接到计算机的USB闪存驱动器。 CD模式-...
  • stm32f030 虚拟usb

    2017-05-29 00:27:41
    考虑到stm32f030f4p6非常便宜,而且已经有人在stm8s上实现了软usb,便重写了汇编部分,将其移植到stm32f030上。可以实现鼠标等功能。
  • by fanxiushu 2020-09-18...关于虚拟USB总线驱动的讲解的内容比较多,时间跨度也比较长。 有基于linux平台下如何实现虚拟USB总线驱动的,CSDN上的如下链接:https://blog.csdn.net/fanxiushu/article/details/1029674...

                                                                                                  by fanxiushu 2020-09-18  转载或引用请注明原始作者。

    关于虚拟USB总线驱动的讲解的内容比较多,时间跨度也比较长。

    有基于linux平台下如何实现虚拟USB总线驱动的,CSDN上的如下链接:
    https://blog.csdn.net/fanxiushu/article/details/102967402

    有基于windows平台下如何实现虚拟USB总线驱动的,比如下面的CSDN链接:
    https://blog.csdn.net/fanxiushu/article/details/51420096
    https://blog.csdn.net/fanxiushu/article/details/51494169
    https://blog.csdn.net/fanxiushu/article/details/51559720

    以上介绍的是通用的windows平台,包括WIN7,WIN8,WIN10,甚至古老的WINXP都能支持的虚拟USB总线驱动。
    同时为了更逼真的模拟windows平台下的虚拟USB总线驱动,

    展开全文
  • stm32虚拟USB摄像头

    热门讨论 2011-08-09 16:12:56
    将游戏图像数据转换成摄像头数据发送上来,这样就解决了没有显示屏的问题,实际上把电脑...最后我将这块开发板虚拟成了一个USB摄像头和一个USB鼠标,不玩游戏的时候可做鼠标用。游戏的时候画面通过摄像头传到电脑上来。
  • 通过模拟键盘输入,控制另外电脑的操作,达到自动输入预定数据的目的,这个键码表是通过USB口输出,电脑与电脑连接是通过(USB【带ch341芯片】---- PS2或USB HD Keyboard)
  • STM32 cube vcp虚拟USB

    千次阅读 2017-08-15 12:07:43
    usbd_cdc_if.c为用户层文件,static int8_t CDC_Receive_FS();函数会被USB接收中断调用。在usbd_core.c文件中,USBD_LL_Resume()函数中可知USB状态是否被连接。
    生成工程文件后,需要先设置堆的大小。usbd_cdc_if.c为用户层文件,static int8_t CDC_Receive_FS();函数会被USB接收中断调用。在usbd_core.c文件中,USBD_LL_Resume()函数中可知USB状态是否被连接,USBD_LL_Suspend()函数中可知USB状态是否被拔掉。
    展开全文
  • 支持WINXP,WIN7,WIN8,WIN8.1 SERVER2003/2008/2008R2/2012 R2,中文版不稳定故上传的为英文原版,包含了32位,64位安装包
  • 键盘扫描码(转)_虚拟USB键盘

    千次阅读 2010-10-11 11:36:00
    键盘扫描码(转)_虚拟USB键盘键盘扫描码 Esc 1 F1 59F2 60F3 61F4 62 F5 63F6 64F7 65F8 66 F9 67F10 68F11 87F12 88` 411 22 33 44 55 66 77 88 99 100 11- 12= 1343← 14Tab 15Q 16W 17E 18R 19T 20Y 21U 22I...
  • " else /var/www/usb-nrf52840/c-code/serial-sqlite3/serial_ttyACM fi else echo "NOt USB-CDC-ACM DEVICE" fi 系统 crontab 定时启动上述脚本 $ crontab -e // 添加内容, 每2分钟检查一次 */2 *...
  • 基于STM32F103ZET6的USB虚拟串口实验
  • linux usb gadget mini2440虚拟usb从设备(虚拟串口)
  • USB虚拟串口

    2019-02-11 16:48:00
    在STM32F103开发板上的USB虚拟串口的demo,USB符合USB2.0规范。
  • USB虚拟软驱

    2013-09-22 13:13:48
    USB虚拟软驱软件,解决安装操作系统时需要加载scis驱动问题
  • USB虚拟化和虚拟桌面USB重定向

    千次阅读 2016-04-04 11:46:17
    随着虚拟化技术的盛行和发展,在虚拟化中引入对USB技术的支持,是必须的必然的结果,同时,由于传统桌面使用USB技术和大量的外设进行交互,因而在使用和实现虚拟桌面的时候,必须引入对USB技术的支持,以达到...
  • STM32 USB虚拟U盘

    2021-02-03 15:27:04
    STM32 USB虚拟U盘
  • 原子哥的USB虚拟串口例程已经调试完成
  • fanxiushu 2016-10-08 转载或...因此花了4,5天时间,利用自己之前开发的USB驱动,实现了一个虚拟USB摄像头的实例代码。 稍后会公布到CSDN上。 记得最早的一篇文章也是介绍虚拟摄像头驱动的开发的,只是当时采用的是wi
  • USB 虚拟串口

    千次阅读 2020-11-05 08:35:43
    USB 虚拟串口简介 USB虚拟串口简介 USB虚拟串口属于USB通信设备类。在物理层通过USB总线,采用虚拟串口的方式为主机提供一个物理串口。在系统内部,USB控制器提供了一个批量传输IN端点和一个批量传输的OUT端点,...
  • 在处理好USB数据采集端的问题之后,接下来进入核心的部分,虚拟USB设备端的开发工作。 上文简单介绍过,需要开发虚拟总线驱动来模拟USB设备。 所谓虚拟总线驱动,就是安装于System系统设备下的一个驱动,由PnP管理器...
  • USB虚拟串口使用时应注意: 用于上拉的控制位使能时,主机能检测到USB设备。 设备插入时,地址为0,后由主机分配地址。 枚举结束前(即设备被识别前),不能中断程序,否则设备不能被识别。 设备发送usb_...
  • usb虚拟串口工程

    2017-09-05 23:01:55
    自动获取插入的usb设备,并找出虚拟的COM口,并连接对应的COM口,支持对其发送能识别的指令,并显示返回其值。
  • 该项目的目标是使用Raspberry Pi创建虚拟USB HID游戏杆。 新版本的rapiberry pi zero W带有蓝牙芯片,这使得可以使用Bluetooth HID设备以及USB HID。 该项目目前正在开发过程中。 现在,我们讨论一下硬件和软件...
  • USB 虚拟串口 STM32F4ZET6 亲测可用
  • STM32 USB 虚拟串口

    2015-12-04 15:54:03
    STM32开发USB虚拟串口完整例程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,143
精华内容 22,057
关键字:

虚拟usb