UVC摄像头技术笔记
+ -

UVC批量传输中的dwMaxVideoFrameSize和dwMaxPayloadTransferSize关系

2021-03-31 1755 0

上一节看了UVC等时/同步传输的关系,这里我们介绍一相批量传输
批量传输在这里相对于同步传输要简单的多。

uvc_video_start_transfer中的代码如下:

 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);
    }

可以看到,由于是批量传输,不存在选择转换接口操作,直接按批量传输的地址查找对应的端点描述符即可。
找到了对应的端点描述符后,使用函数uvc_init_video_bulk函数初始化批量传输内存。

uvc_init_video_bulk的源代码如下:

static int uvc_init_video_bulk(struct uvc_streaming *stream,
    struct usb_host_endpoint *ep, gfp_t gfp_flags)
{
    struct urb *urb;
    struct uvc_urb *uvc_urb;
    unsigned int npackets, pipe;
    u16 psize;
    u32 size;

    psize = usb_endpoint_maxp(&ep->desc);
    size = stream->ctrl.dwMaxPayloadTransferSize;
    stream->bulk.max_payload_size = size;

    npackets = uvc_alloc_urb_buffers(stream, size, psize, gfp_flags);
    if (npackets == 0)
        return -ENOMEM;

    size = npackets * psize;

    if (usb_endpoint_dir_in(&ep->desc))
        pipe = usb_rcvbulkpipe(stream->dev->udev,
                       ep->desc.bEndpointAddress);
    else
        pipe = usb_sndbulkpipe(stream->dev->udev,
                       ep->desc.bEndpointAddress);

    if (stream->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
        size = 0;

    for_each_uvc_urb(uvc_urb, stream) {
        urb = usb_alloc_urb(0, gfp_flags);
        if (urb == NULL) {
            uvc_video_stop_transfer(stream, 1);
            return -ENOMEM;
        }

        usb_fill_bulk_urb(urb, stream->dev->udev, pipe,    uvc_urb->buffer,
                  size, uvc_video_complete, uvc_urb);
#ifndef CONFIG_DMA_NONCOHERENT
        urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
        urb->transfer_dma = uvc_urb->dma;
#endif

        uvc_urb->urb = urb;
    }

    return 0;
}

从代码来看,这里的dwMaxPayloadTransferSize代表一次批量传输传输的最大数据量,这次批量传输的数据大小是端点支持的数据量大小的dwMaxPayloadTransferSize/端点大小。

在USB2.0的高速端点描述符中,端点大小最大为512字节,在超高速USB3.0由于支持了突发传输,且端点的最大包大小为1024字节。

static inline void usb_fill_bulk_urb(struct urb *urb,
                     struct usb_device *dev,
                     unsigned int pipe,
                     void *transfer_buffer,
                     int buffer_length,
                     usb_complete_t complete_fn,
                     void *context)
{
    urb->dev = dev;
    urb->pipe = pipe;
    urb->transfer_buffer = transfer_buffer;
    urb->transfer_buffer_length = buffer_length;
    urb->complete = complete_fn;
    urb->context = context;
}

所以说,批量传输中,这里的npackets的代表的是一个URB可以支持多少次批量传输。


dwMaxVideoFrameSize和dwMaxPayloadTransferSize关系的总结

从这两节可知,同步传输和批量传输都有npackets的概念,只是这个npackets有概念稍有点不同。
在批量传输中,这里的npackets仅代表URB可以支持多少次批量传输,而在同步传输中,这个npackets代表的是一个urb中有多少个同步传输iso_packet.
但两者都有一个共同点,那就是在USB传输过程中,为了提高效率,一个URB可以支持多次端点的传输,这个次数使用npackets来表示。当然这个npackets不光与usb的描述符和UVC视频流接口配置的参数有关系,也与当前系统的内使使用情况有关。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

UVC摄像头批量传输的StreamOn和StreamOff
在UVC规范中,UVC摄像头视频数据的传输方式支持两种,分别为批量传输和同步传输。UVC摄像头数据传输的格式按负载数据头的方式按帧进行打包传输。根据USB规范可知,同步传输方式是只要带中带有同步端点的接口,系统会定时从设备中读取数据,无论设备中是否有数据。而如要要停止数据的传输,只需要选中不带有同步......
UVC批量传输中的dwMaxVideoFrameSize和dwMaxPayloadTransferSize关系
上一节看了UVC等时/同步传输的关系,这里我们介绍一相批量传输批量传输在这里相对于同步传输要简单的多。uvc_video_start_transfer中的代码如下: else { /* Bulk endpoint, proceed to URB initialization. */ ......
USB超高速批量传输
批量传输类型是用来支持想要跟相当大的海量数据通信设备,传输能使用任何可用的超速带宽。超速批量传输功能端点提供以下:对基于有限带宽的超速总线访问保证数据的发送,但是不保证带宽和发送时间超速维持下面的批量传输管道特征:对批量传输管道通信流没有强制固定的数据结构批量传输管道是一个流式管道,因此总是有通信流......
USB 批量/块传输方式
USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。批量传输一般用于批量的和非实时的数据传输,通俗的来说就是用于数据量大但对时间要求又不高的场合的一种传输方式,类似用于USB打印机和USB扫描仪等等。批量传输使用批量传输事务,一次批量传输事务分为三个阶段:令牌包阶段、数据包......
基于UVC规范的USB摄像头数据传输模式的总结
根据UVC(USB VIDEO CLASS)规范,UVC视频数据传输方式支持:同步传输即ISO传输批量传输即BULK传输但是不同的操作系统对UVC规范的支持不一定是全量支持的:Windows操作系统对于windows操作系统,对UVC版本的支持情况如下:UVC 版本Windows ......
使用BUSHOUND手动分析USB批量传输的URB
使用BUSHOUND抓取U盘的批量传输的URB数据,我们对其其进行数据分析:13 IN 55 53 42 53 40 0b ac 57 00 00 00 00 00 URB80 00 09 00 00 00 00 00 d8 f2 75 a0 77 7f 00 00 ......
USB2.0 中断传输和批量传输数据包的PID序列
其实在Windows下开发USB驱动时,USB的数据传输模式只有三种模式:多种控制传输方式同步传输方式批量或中断传输方式这一点在URB的结构体上表现的很清楚. struct _URB_CONTROL_TRANSFER UrbControlTransfer; struct _UR......
USB2.0低速、全速、高速模式四种传输模式速宽对比
USB 数据传输通过事务来实现。事务在帧的主机控制时间间隔内进行。事务的长度和频率取决于端点使用的传输类型。可以在一个帧中发送的传输类型和帧长度由 USB 的指定速度定义。低速模式下控制传输、中断传输、批量传输、同步传输对比低速帧速率为1ms传输类型最大传输长度每帧的传输次数最大理......
USB传输模式选择及各传输特性对比
通用串行总线 (USB) 传输类型是指主机和设备端点之间使用的通信模式。传输类型决定了用于与端点通信的事务的频率和长度。传输类型还可以分配一个循环冗余校验和 (CRC),以对每个传输的数据包进行验证。传输类型由设备设置,并在枚举过程中与主机通信。USB分为四种传输模式,分别为中断传输模式,控制传输......
批量传输:自定义接口实现
[TOC]在进行 usb 传输的过程中,往往需要大容量传输。无外乎批量传输。典型的批量传输协议如下:cdc-acm :usb 转串口。win10 以下需要 pc 驱动。massstroage:U 盘设备。通常仅仅只需要批量传输,而不想引入复杂的协议,这个时候自定义接口进行批量传输就比较合适了,需......
UVC摄像头USB批量传输BULK数据传输方式的打开与关闭StreamOn StreamOff
USB的批量传输和中断传输是一样的简单,但经常发现有人在问批量传输的UVC摄像头的打开与半闭问题的边界问题,特别是摄像头关闭的判断。BULK摄像头的打开我们通过BUSHOUND抓包的内容如下:Device Length Phase Data ......
UVC摄像头dwMaxPayloadTransferSize批量传输与USB端点描述符wMaxPacketSize的关系说明
这个问题是老生常谈了,其实结合以前的文章我们应该能说明白,可详见:USB数据长度为0的DATA/IN事务 https://www.usbzh.com/article/detail-624.htmlUSB2.0 事务 https://www.usbzh.com/article/detail-691......
UVC批量传输与同步传输各自的优缺点和适用领域
UVC规范中视频数据可以使用批量传输,也可以使用同步传输。但是有一些不同之处。以下是UVC视频领域批量传输和等时传输的特点:批量传输批量传输是基本的视频数据传输方式,因为它提供了高速数据传输的能力,而对于实时性的要求则相对较低。批量传输的带宽分配不是固定的,而是动态变化的,因此在多个批量传输设......
USBIP 中断传输批量传输
对于USB批量传输或中断传输。static NTSTATUSstore_urb_bulk(PIRP irp, PURB urb, struct urb_req *urbr){ struct _URB_BULK_OR_INTERRUPT_TRANSFER *urb_bi = &a......
UVC相机配置描述符-BULK批量传输-NV12-H265
格式概述格式分辨率NV12640X360x30H2653840X2160X30传输方式批量传输,BULK模式功能支持处理单元D0:亮度D1:对比度D2:色调D3:饱和D4:锐度扩展单元选择子9-11D0的选择子为1视频流端点地址0x81其它附......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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