精华内容
下载资源
问答
  • by fanxiushu 2020-03-25 转载或引用请注明原始作者。...以前的文章阐述过基于windows平台和基于linux平台中的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平台下的模拟效果图。





     

    展开全文
  • 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总线驱动,

    展开全文
  • fanxiushu 2016-10-08 转载或...因此花了4,5天时间,利用自己之前开发USB驱动,实现了一个虚拟USB摄像头的实例代码。 稍后会公布到CSDN上。 记得最早的一篇文章也是介绍虚拟摄像头驱动的开发的,只是当时采用的是wi

                                             fanxiushu 2016-10-08 转载或引用,请注明原始作者

    做这个事情写这篇文章之前,压根没朝模拟USB摄像头这方面去想过。

    直到CSDN上一位朋友提出问题,才想到还有这么一个玩意。
    因此花了4,5天时间,利用自己之前开发的USB驱动,实现了一个虚拟USB摄像头的实例代码。
    稍后会公布到CSDN上。

    记得最早的一篇文章也是介绍虚拟摄像头驱动的开发的,只是当时采用的是windows的流内核实现的,
    windows实现视频驱动(包括摄像头,声卡等等多媒体相关的)本身就是采用流内核作为微端口框架来实现的。
    因此很容易想到使用AVStream流内核框架来实现虚拟摄像头,
    事实上,USB接口的摄像头,在经过底层的USB总线层,上升到驱动的功能层,
    依然需要利用AVStream微端口实现摄像头的功能。

    而USB接口的摄像头,如果它的USB接口传输的协议是符合UVC(USB Video Class)标准的,
    则windows会自动加载自己的usbvideo驱动,而无需再额外开发驱动,这就是大家所说的是免驱的。
    不光是USB摄像头,因为USB的通用性和普遍性,很多很多的USB接口设备,包括USB键盘,U盘, USB鼠标,USB声卡等等,
    这些USB设备,他们的USB通讯协议都符合某些通用的标准的,因此当把这些设备插入电脑,系统都会加载通用的驱动,
    而无需再额外开发自己的驱动程序。
    这就是所谓的免驱,其实并不是不要驱动

    展开全文
  • 本RAR压缩包包含了usb cdc标准协议1.1和1.2两个版本,捆绑下载。是usb驱动之虚拟串口协议开发必备文档,下载方便,请您食用。
  • 之前的文章阐述过在windows平台下,如何实现USB虚拟总线驱动,以及如何在windows平台采集真实USB设备的数据, 然后通过网络传输,达到 ”延长“ USB线缆的效果。 相关链接如下:https://blog.csdn.net/fanxi...

                                         by fanxiushu 2019-11-07 转载或引用请注明原始作者。

    之前的文章阐述过在windows平台下,如何实现USB虚拟总线驱动, 以及如何在windows平台采集真实USB设备的数据,
    然后通过网络传输,达到 ”延长“ USB线缆的效果。
     相关链接如下:
    https://blog.csdn.net/fanxiushu/article/details/51420096  USB设备驱动开发之远程访问USB设备(一USB设备数据采集端)
    https://blog.csdn.net/fanxiushu/article/details/51494169  USB设备驱动开发之远程访问USB设备(二 USB设备虚拟端)
    https://blog.csdn.net/fanxiushu/article/details/51559720  USB设备驱动开发之远程访问USB设备( 三 虚拟USB控制器和根集线器)

    以上都是windows平台下的,其中第一个链接是关于如何实现采集端的,后面两个链接阐述USB虚拟端。
    当初想要实现USB虚拟驱动的目的比较另类,也在上面的文章中说明了。
    因为偶尔会在macOS系统中做些iOS手机数据备份开发什么的,而我的macOS系统是装到vmware虚拟机中的,
    结果每次都需要把手机USB数据线插到笔记本电脑上,总感觉这跟线多余,于是总想着有没有办法去掉,于是才有了上面的开发的文章。
    实现的效果如下图这样的:


    简单解释一下,图中A部分”Fanxiushu Virtual USB Host Controller“ 和 ”Fanxiushu Virtual USB Root HUB“ 是我实现的USB虚拟总线驱动,
    这个总线驱动需要虚拟控制器和根集线器的,否则vmware这样的软件无法识别的,
    而这个 驱动下“的Port1端口插入了” iPhone手机的,其实真实iPhone手机插到我的另一台windows台式机器上,
    这里通过网络传输,然后模拟成”插入“ ”Fanxiushu Virtual USB Host Controller“ 的效果。
    但是 Port1端口显示的是 ”Vmware USB Device“ , 说明这个USB设备已经被vmware接管了。
    紧接着看图中的B部分。显示”Apple Fanxiushu-USB-Device1“设备已经连接进去vmware虚拟机中,
    再看图中的 C部分, 在虚拟机中macOS系统中,已经识别到了我的iPhone手机。
    这就是当初实现USB虚拟驱动,想要达到的目的。

    本文即将描述的就是linux平台下的USB虚拟总线驱动的实现,也可以叫虚拟USB控制器驱动。
    同时,也在以前的文章中,阐述过如何在linux平台中采集真实USB设备的数据,
    链接如下:
    https://blog.csdn.net/fanxiushu/article/details/73478924   USB驱动开发之远程访问USB设备扩展(linux平台USB设备数据采集端)

    配合本文的虚拟USB总线驱动,可以实现在linux平台之间任意的共享USB设备,
    如果再配合windows平台下的实现,则可实现windows,linux平台之间任意共享USB设备。
    同时也可以把虚拟总线驱动单独拿出来,用于模拟各类通用的USB设备。
    比如模拟USB摄像头,如下链接描述的就是利用USB总线驱动模拟 USB摄像头:
    https://blog.csdn.net/fanxiushu/article/details/52761644  USB设备驱动开发之扩展(利用USB虚拟总线驱动模拟USB摄像头)
    也可以模拟USB声卡,U盘,USB键盘鼠标,游戏手柄等,只有想不到的没有办不到的,因为USB接口太通用了。
    也可以模拟某些私有协议的USB设备,当然前提是必须知道这类设备的USB通讯协议格式。

    linux下实现USB虚拟总驱动并没有windows平台那么有用,因为使用linux的人太少了。
    不过考虑在linux服务器下,尤其是作为桌面云服务器的linux宿主机,这个USB虚拟总线驱动用处却是比较大。
    远程桌面,需要解决的一个问题就是USB设备的远程共享。
    一般是终端的设备采集到USB设备数据,发送到云桌面服务器的宿主机端,linux宿主机使用虚线USB总线驱动模拟出USB设备,
    然后就像上图vmware虚拟机把iPhone设备接管到vmware虚拟机那样,把这个模拟的设备转嫁到对应的虚拟机中。
    当然这是其中一个办法,还有就是直接从终端设备采集到的USB数据,传输到虚拟机内部,
    然后虚拟机内部的操作系统开发出的USB虚拟总线驱动模拟出对应的USB设备。
    至于哪个方法比较好,取决于具体的情况。

    回到正题.
    linux下的USB虚拟总线驱动框架比起windows来说太简单了。
    只需调用几个函数,注册几个回调函数,就能实现一个虚拟USB总线驱动框架。

    linux内核从2.6版本开始,就实现了一种叫 platform总线的虚拟总线,这是一种通用的虚拟总线框架结构。
    为什么会有这么一种架构,
    因为在硬件的世界中,有些外设与CPU通讯是使用标准的总线的,比如 USB总线,I2C总线,PCI总线等等,
    但是有些外设是与CPU连在一起,这些外设直接扩展到CPU的地址空间,比如SoC。
    如果两类设备按照两套逻辑来处理,显然会给系统内核造成不必要的罗嗦和混乱,所以规定所有的设备都具有总线,
    只不过Soc使用的虚拟总线,这就是platofrm总线的由来。
    我们在开发虚拟USB总线驱动的时候,就是需要使用platfrom总线。使用它的方式也是很简单。

    我们在代码中定义  platform_driver 和 platform_device 数据结构, 如下代码:

    /// 驱动入口 

    static struct platform_driver host_driver = {

    .probe = host_add_device,

    .remove = host_remove_device,

    .suspend = host_suspend,

    .resume = host_resume,

    .driver = {

       .name = "usb_host", /// 和下面的device一样

       .owner = THIS_MODULE,

        },

    };

     

    static void platform_device_release(struct device *dev)

    {

    // do  nothing, is virtual host

    printk("-- usb_host: platform_device_release\n");

    }

    static struct platform_device host_device = {

    .name = "usb_host",

    .id = -1,

    .dev = {

        .release = platform_device_release,

         },

    };
     

    其中host_add_device,host_remove_device,host_suspend,host_resume是回调函数,
    如果熟悉windows驱动,也比较好理解 host_add_device和host_remove_device含义,
    host_add_deivce相当于windows中的AddDevice回调函数,是虚拟总线驱动加载的时候被调用,
    host_remove_deivce是在驱动卸载时候被调用。

    定义如上两个结构之后,在驱动初始化入口函数中调用 platform_driver_register注册总线驱动,
    调用 platform_device_register 注册总线设备,如下伪代码:

    static int __init host_driver_init(void)

    {

    int ret;

    。。。

    ret = platform_driver_register(&host_driver);

    。。。。

    //注册一个平台总线设备

    ret = platform_device_register(&host_device);

    。。。。

    printk("-- usb_host: drive init ok.\n");

    return 0;

    }
    在退出函数注销,如下伪代码:

    static void __exit host_driver_exit(void)

    {

    platform_device_unregister(&host_device);

    platform_driver_unregister(&host_driver);

    printk("--- usb_host : driver exit.\n");

    }
    初始化模块:

    module_init(host_driver_init);

    module_exit(host_driver_exit);

    这样,platform 总线驱动就建立起来了。是不是比起windows实现虚拟总线驱动简单得多了。
    接着我们在host_add_device回调函数中初始化USB总线驱动,创建HCD,也就是 USB主机控制器。

    开始之前,先大致来了解linux平台下,USB  Host端,也就是主机端驱动的总体框架流程。
    主要分为三层:
     1, USB 设备驱动, 这里就是具体的USB设备,负责主机与USB设备通信。
                |
    2,  USB Core , 负责连接和管理上下两层,并且对上面的USB设备驱动提供API接口,对下面对的USB主机驱动提供API接口。
                |
    3, USB 主机控制器驱动,负责控制管理插入的USB设备。
           比如最常见的EHCI(USB2),XCHI(USB3),OCHI(USB1)主机控制器驱动


    我们这里需要实现的就是第3个部分,USB主机控制器,同时管理我维护着我们的“虚拟USB设备”。 
    在host_add_device回调函数中,调用usbcore提供的 usb_create_hcd 创建主机控制器,
    然后调用 usb_add_hcd 函数把主机控制器加入到普拉头发柔美总线设备中,这样一个USB主机控制器就建立起来了。
    当然还需要在usb_add_device回调函数做一些其他相关的工作。
    其中 usb_add_hcd函数内部的实现很复杂,有兴趣可以去阅读linux内核源代码。
    其中一个重要的就是在usb_add_hcd内部会创建一个root  hub 虚拟根集线器设备,用于管理插到主机上的USB设备或USBHUB,
    usb_create_hcd函数会要求传递一个hc_driver数据结构变量。
    这里边定义了所有关于USB数据交换,状态查询,USB控制等回调函数。用于查询和管理USB设备状态,URB数据传输。
     把hc_driver里边相关的回调函数实现了,就等于是完整的实现了一个USB控制器驱动。
    因此,我们的主要任务就是实现hc_driver结构里边的回调函数。

    hc_driver结构比较复杂,这里只实现我们在虚拟控制器驱动需要实现的内容,如下:

    ///host主机相关结构和回调函数

    static struct hc_driver _hc_driver = {

    .description = "usb_host",

    .product_desc = "Fanxiushu Virtual USB Host Controller",

    .hcd_priv_size = sizeof(struct usb_host_t),   //

     

    .flags = HCD_USB2, //

     

    .start = usb_host_start,   //主机控制器启动

    .stop =  usb_host_stop,  //主机控制器停止

     

    .urb_enqueue = usb_host_urb_enqueue, //上层的USB设备驱动发起了URB请求,递交到主机控制器中了

    .urb_dequeue = usb_host_urb_dequeue,  //上层URB请求取消,或者主机检测到USB设备被拔出了

     

    .get_frame_number = usb_host_get_frame_number,

     

            .hub_status_data = usb_host_hub_status,  //查询主机控制器的端口状态,
            .hub_control = usb_host_hub_control,            //设置,清除,查询端口状态。

     

    .bus_suspend = usb_host_bus_suspend, //

            .bus_resume = usb_host_bus_resume, //

    };


    其中hub_status_data和hub_control回调函数的实现,可以查阅usbip的代码,或者借鉴linux内核中其他类似代码。
     无非就是对USB控制器的每个端口状态查询,设置等操作。

    重点是urb_enqueue回调函数的实现,这个是USB的通讯核心数据包传递函数。
    具体的说,就是上层的USB设备驱动调用usbcore提供的usb_submit_urb 函数的时候,
    usb_submit_urb做些其他处理,然后调用usb_hcd_submit_urb函数,
    usb_hcd_submit_urb最终进入到我们的主机驱动,调用 urb_enqueue 回调函数, 
    如果是真正的USB主机控制器,则在urb_enqueue回调函数中把URB请求递交给USB硬件,
    而这里是虚拟主机控制器,因此可以在urb_enqueue中以任何方式传递urb请求数据,
    比如在usbip代码中,直接把urb数据通过socket网络传输给对方。
    而在我们的代码实现中,为了方便和灵活使用,统一把URB请求数据包传递到应用层,然后在应用层再做其他方面的处理。
    当我们的主机驱动处理完这个URB请的时候,调用usbcore提供的usb_hcd_giveback_urb 函数,
    通知上层的usb设备驱动,URB请求已经完成。
    这时候,上层sub驱动设置的urb回调函数就会被调用,从而上层的usb设备驱动就获取到已经完成的urb数据。

    一个完整的urb通讯流程就这样完成了。
    现在还有一个问题,如何模拟”插入“和”拔出“USB设备。
    在hub_control控制回调函数中,usbcore会查询roothub的设备描述信息,在里边填写我们主机驱动提供的端口数,比如16个。
    也就是我们的主机可以提供16个端口同时给16个USB设备。然后每个端口对应一个相应的状态,一开始都是未连接状态。
    当我要在某个端口“插入”一个USB设备的时候,改变这个端口状态,然后调用 usb_hcd_poll_rh_status 函数通知usbcore。
    usbcore会接着调用 hub_control 回调函数查询端口状态,发现某个端口已经插入了USB设备,
    于是调用usb_submit_urb函数获取这个USB设备的设备描述符等相关信息,于是我们的urb_enqueue被调用。
    获取描述符,然后根据设备描述符等信息,试图加载对应的USB设备驱动。
    USB设备驱动加载之后,接着会调用usb_submit_urb建立起正常的USB设备通信。
    在这里,usbcore的行为与windows平台PNP即插即用管理器的行为十分相似。

    至此,一个完整的linux平台的USB虚拟控制器驱动内核部分就算实现了,
    因为我们的驱动是把URB数据传递到应用层再来处理的。
    接着需要处理的就是如何处理URB数据包
    1, 如果是模拟一些USB设备,则直接填写相关数据,然后返回给驱动。
    2,如果是实现类似usbip功能,则把数据整理打包,再通过网络传递给对方。
    这里也就不再赘述。
    下图是在 CentOS8系统中(linux内核版本是4.18), 模拟一个USB摄像头的效果图:
    USB摄像头的模拟数据是根据以前所写的windows平台的模拟数据,
    USB总线驱动不单可以模拟USB摄像头,还能模拟其他通用USB设备,这里为了方便,只模拟了USB摄像头。



    未完待续,
    下一章主要阐述如何把驱动移植到Android系统中,并且模拟出一个USB摄像头的效果。
     

    展开全文
  • 基于STM32的USB复合设备开发(1/3-USB2.0协议)全文概述USB的电气连接与基本识别USB的通信格式(1)0/1定义(Signaling Levels):(2)0/1定义(Signaling Levels):新的改变功能快捷键合理的创建标题,有助于目录的...
  •  STM32F103系列芯片都自带USB接口,不过STM32F103的USB都只能用来做设备,而不能用作主机。 目录:   53.1 USB简介      USBF103自带的USB符合USB2.0规范。 在USB主机上,D-和d +都接了15K下拉电阻到地...
  • USB协议基础篇

    千次阅读 2020-12-29 08:39:18
    1.2 USB协议版本 1.3 USB接口分类 1.4 PIPE 1.5 endpoint 1.6 管道通信方式 1.7 传输方式 1.7 逻辑设备 1.8 interface 1.9 class协议 1.10 host/device 二,USB框架/拓扑结构
  • STM32 之 USB 虚拟串口

    千次阅读 2020-10-26 16:48:28
    USB虚拟串口提供了绕过这个问题的一个简单的解决方案。         为了让USB被视为一个COM端口,USB设备必须根据通信设备类(CDC)规范来实现两个接口: 1.抽象控制模型通信,在端点中有1个中断...
  • USB虚拟串口

    万次阅读 2015-09-10 17:02:43
    现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中。...相反,现在的个人计算机普遍拥有4个以上的USB接口,能不能使用USB接口代替串口,完成PC机和嵌入式系统的通信呢?
  • 一.USB描述符修改 USB描述符包括设备描述符(DeviceDescriptor)、配置描述符(ConfigDescriptor)、HID报告描述符(CustomHID_ReportDescriptor)、字符串描述符。 1.设备描述符--基本固定,不需要怎么修改。一般复合...
  • USB虚拟串口实验_STM32F1开发指南_第五十三章——USB学习笔记
  • 本文基于github上的stm32 Rndis实例结合协议讲解stm32中USB虚拟网卡驱动的实现。达到外部主机(手机)通过USB接口访问物联网设备网页的功能。
  • 基于STM32CubeMX的USB虚拟串口实例详解,通过修改收发函数,实现在1024字节以内任意字节数目的收发功能
  • 5.5 USB虚拟

    千次阅读 2015-09-12 17:29:21
    本节分析qemu中usb虚拟化原理
  • 通过STM32虚拟串口实现Flash Loader协议的具体流程
  • 在处理好USB数据采集端的问题之后,接下来进入核心的部分,虚拟USB设备端的开发工作。 上文简单介绍过,需要开发虚拟总线驱动来模拟USB设备。 所谓虚拟总线驱动,就是安装于System系统设备下的一个驱动,由PnP管理器...
  • usb hound抓包完整数据流分析
  • USB虚拟串口很具有实用价值,由于USB内核协议的限制,串口一次性最多接收64字节数据,本文通过对正点原子接收函数的改写实现了任意字节数据的接收,亲测好用,供大家参考,谢谢!
  • Linux 蓝牙协议栈的USB+设备驱动

    热门讨论 2010-12-28 15:16:53
    给出实现蓝牙设备驱动的重要数据结构和流程,并总结Linux 下开发蓝牙USB 设备驱动的一般方法和关键技术。 关键词:Linux 系统;蓝牙协议栈;设备驱动 USB Device Driver for Linux Bluetooth Stack LIANG Jun-xue...
  • 基于MFC的USB上位机开发(1)概述 基于MFC的USB上位机开发(2)速度测试模块 基于MFC的USB上位机开发(3)数据传输模块 基于MFC的USB上位机开发(4)环路模块 基于MFC的USB上位机开发(5)下环路模块 目录 1. ...
  • STM32 USB 系列之 虚拟串口(VPC)

    千次阅读 多人点赞 2020-05-14 00:20:22
    STM32 USB系列之虚拟串口 这段时间缓慢更新一下stm32 usb系列的博客,前段时间在多个地方零零散散的学习和使用USB协议,在网上查找的资料也是零零散散的,整理一下写成博客。 1. 开发环境 使用stm32f103c8t6,HAL库...
  • 本次主要讲解,如何在Mac电脑上开发,如今流行的电脑桌面程序,因为我们在做互联网/智能化设备的时候,无疑或许会用到MAC来进行调试; 重点如下: 如何在MAC电脑上创建桌面程序; 在项目中添加usb协议库。如:HID,...
  • 为了实现usb虚拟串口的功能,本人足足弄了半个多月,接下来本人介绍一下自己在这过程中踩的坑—— 首先,按照博文:***https://blog.csdn.net/newbie_Blogger/article/details/92617242***里面的步骤来进行第一步...
  • 52840 USB虚拟串口移植

    千次阅读 2019-06-02 15:00:54
    一.测试的平台 本篇文章主要介绍将52840作为接收器,使用的工程为nRF5_SDK_15.2.0_9412b96\examples...环境:win10,64位,MDK集成开发环境.SDK:nRF5_SDK_15.2协议栈:s132_nrf52_6.1_softdevice.hex.USB参考工程: ...
  • 在进行USB CDC类开发时,无法发送64整数倍的数据

    万次阅读 热门讨论 2016-11-17 21:27:42
    前言本文将基于STM32F4DISCOVERY板,介绍如何使用USB的CDC类进行开发,以及在开发过程中碰到发送64整数倍数据时会失败的问题分析及解决方案。
  • USB协议

    2018-10-30 09:03:07
    USB协议起因简介标准历史USBUSB On-The-Go Supplement技术细节概述技术指标机械和电气标准编码方式软件架构端点HCDUSB 封包格式设备分类USB接头电源同类标准比较Storage人机接口设备(HID)扩展关注 通用串行总线...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,058
精华内容 4,423
关键字:

usb虚拟协议开发