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