Linux&UVC驱动
+ -

LINUX&UVC相机打开时的带宽选择

2024-03-26 30 0

UVC规范明确指出,传输UVC图像数据的端点既可以是同步传输,也可以是批量传输

批量传输

对于批量传输,其实根本不存在带宽选择的问题的。只要是批量传输,端点都是可以使能工作的,但是数据传输的效能是根据USB总线上的带宽利用率而决定的。因为USB批量占用的是周期性传输和控制传输剩余的带宽。

UVC视频流输入头描述符中bEndpointAddress字段指定了数据传输的端点,详见:https://www.usbzh.com/article/detail-98.html
所以对于批量传输的UVC相机,只需要在接口描述符下中查找端点地址为bEndpointAddress的端点描述符,然后初始化该端点即可:

    else 
    {
        /* Bulk endpoint, proceed to URB initialization. */
        ep = uvc_find_endpoint(&intf->altsetting[0],stream->header.bEndpointAddress);
        if (ep == NULL)
            return -EIO;

        ret = uvc_init_video_bulk(stream, ep, gfp_flags);
    }

LINUX&UVC驱动中打开视频数据传输端点时,使用的是uvc_video_start_transfer函数。

同步传输

同步传输涉及UVC协商时的dwMaxPayloadTransferSize。该字段的计算及含义可详见:

LINUX&UVC驱动会校验UVC视频流输入头描述符中bEndpointAddress地址的带宽是否满足dwMaxPayloadTransferSize的带宽需求。如果不满足,会提示带宽不足。

        /* Isochronous endpoint, select the alternate setting. */
        bandwidth = stream->ctrl.dwMaxPayloadTransferSize;

        for (i = 0; i < intf->num_altsetting; ++i) {
            struct usb_host_interface *alts;
            unsigned int psize;

            alts = &intf->altsetting[i];
            //查找指点的端点描述符
            ep = uvc_find_endpoint(alts,stream->header.bEndpointAddress);
            if (ep == NULL)
                continue;

            /* Check if the bandwidth is high enough. */
            //检查带宽是否满足
            psize = uvc_endpoint_max_bpi(stream->dev->udev, ep);
            if (psize >= bandwidth && psize <= best_psize) {
                altsetting = alts->desc.bAlternateSetting;
                best_psize = psize;
                best_ep = ep;
            }
        }

        //如果不满足,提示带宽不足
        if (best_ep == NULL) {
            uvc_trace(UVC_TRACE_VIDEO, "No fast enough alt setting "
                "for requested bandwidth.\n");
            return -EIO;
        }

结论

  • 同步传传存在因带宽不足而打开相机失败的原因,而批量传输就不存在打开失败。
  • 同步传输如果正确打开了,就会有数据。而批量传输不见得一定有数据传输。

0 篇笔记 写笔记

UVC等时传输中的dwMaxPayloadTransferSize
UVC的视频流接口控制请求的数据大小可为26字节,34字节和48字节,其分别对应的是UVC的1.0,1,1和UVC1.5版本。在其整个视频流控制接口参数偏移地址22处的字段为一4字节的dwMaxPayloadTransferSize,根据其字段解释为“指定设备在单个有效负载传输中可以传输或接收的最大......
UVC等时传输中的dwMaxVideoFrameSize和dwMaxPayloadTransferSize关系
在其整个视频流控制接口参数偏移地址18处的字段为一4字节的dwMaxVideoFrameSize,代表的是如果选择当前数据帧格式,其一帧图像的最大数据量大小,以字节为单位。关于dwMaxVideoFrameSize的计算可以参考 YUV2摄像头相关数据大小计算。这里我们主要说一下dwMaxVideo......
UVC批量传输中的dwMaxVideoFrameSize和dwMaxPayloadTransferSize关系
上一节看了UVC等时/同步传输的关系,这里我们介绍一相批量传输。批量传输在这里相对于同步传输要简单的多。uvc_video_start_transfer中的代码如下: else { /* Bulk endpoint, proceed to URB initialization. */ ......
USB数据传输方式及带宽占用率对比
USB定义了四种传输类型:控制传输同步传输中断传输批量传输USB传输有四种传输类型使用的事务类型各不相同。其中批量传输、同步传输每次传输需要一个或多个事务,中断传输每次传输只需要一个事务,控制传输包括三个过程(建立过程、数据过程、状态过程),建立过程和状态过程分别需要一个事务,数据过程则可能包......
再谈USB摄像头UVC视频流接口控制请求dwMaxVideoFrameSize和dwMaxPayloadTransferSize
刚开始的时候,我们做一件事是认真,一丝不苟。对于各个数据的考量力求做到精度,其实这个追求可能并不是因为我们因为项目上的要求,而是我们为了弄清一个事实,有了这个事实我们就可以随处吹牛逼,也成了我们在做新的类似的项目上的优势之资。言归正转,以前在windows下通过USB总线驱动虚拟的UVC摄像头都只......
USB 中断端点的高速高带宽
对于中断事务,如果中断端点在微帧其间NAK了事务,则表示设备端数据没有准备好或设备无数据可传,主机需要放弃本次传输,在下一个微帧再发起事务。如果设备的中断端点超时了该事务,则主机需要重试该事务。端点描述符中指定了该中断端点在一个微帧其间支持的最大事务个数。如果未达到每个微帧的最大事务数,主机控制器可......
USB 高速高带宽端点wMaxPacketSize
USB的端点可以设置为高速高带宽端点。我们知道,USB的数据传输类型有4种,分别为控制传输,中断传输,批量传输和同步传输。而端点类型与之要对应。除过控制传输外,其余三种传输使用于应用的数据传输。USB使用端点描述符的wMaxPacketSize来配置端点为高速高带宽端点,主要表现在bit11-12,......
Windows操作系统USB主机如何管理UVC视频的USB带宽?
Windows操作系统的视频宽带管理是由视频类驱动usbvideo.sys来管理的。对于USB带宽的调整,是通过同步传输的备用接口来实现的。当一个设备从一个非0备用接口切换至另一个非0备用接口时,USB主机需要对UVC视频流带宽进行重新配置,在这过程中需要停止原来的同步传输,重新开启新的同步传输实现......
USB带宽分配管理规则
USB主机负责管理总线的带宽。这是在配置同步和中断端点时的枚举时以及在总线的整个操作过程中完成的。该规范对总线进行了限制,允许为全速总线上的周期传输(中断和同步)分配不超过 90% 的任何帧。在高速总线上,这个限制减少到不超过 80% 的微帧可以分配给周期传输。因此,如果有一个具有周期性传输的高度......
UVC摄像头dwMaxPayloadTransferSize批量传输与USB端点描述符wMaxPacketSize的关系说明
这个问题是老生常谈了,其实结合以前的文章我们应该能说明白,可详见:USB数据长度为0的DATA/IN事务 https://www.usbzh.com/article/detail-624.htmlUSB2.0 事务 https://www.usbzh.com/article/detail-691......
USB2.0设备的带宽特征
USB2.0规范是可以认为是基于物理电气VBUS,D+,D-和GND信号的最后一个版本规范,其对这4根信号的性能压榨也到了极致。USB3.0规范及后续版本采用的是RX/TX的差分信号全双工信号,并且硬件的编码规则由NRZI变成了8/10B或128b/132b编码了。USB2.0规范在定义之初......
LINUX&UVC相机打开时的带宽选择
UVC规范明确指出,传输UVC图像数据的端点既可以是同步传输,也可以是批量传输。批量传输对于批量传输,其实根本不存在带宽选择的问题的。只要是批量传输,端点都是可以使能工作的,但是数据传输的效能是根据USB总线上的带宽利用率而决定的。因为USB批量占用的是周期性传输和控制传输剩余的带宽。USB带......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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