uvc摄像头代码解析3(二)

2014-11-23 22:19:33 ? 作者: ? 浏览: 14
rn -EINVAL;
}
streaming = kzalloc(sizeof *streaming, GFP_KERNEL); //分配uvc数据流内存
if (streaming == NULL) {
usb_driver_release_interface(&uvc_driver.driver, intf);
return -EINVAL;
}
mutex_init(&streaming->mutex);
streaming->dev = dev; //uvc数据流和uvc设备捆绑
streaming->intf = usb_get_intf(intf); //uvc数据流和usb接口捆绑,并增加引用计数
streaming->intfnum = intf->cur_altsetting->desc.bInterfaceNumber; //设置接口号
/* The Pico iMage webcam has its class-specific interface descriptors after the endpoint descriptors. */
if (buflen == 0) { //Pico iMage webcam 特殊处理
for (i = 0; i < alts->desc.bNumEndpoints; ++i) {
struct usb_host_endpoint *ep = &alts->endpoint[i];
if (ep->extralen == 0)
continue;
if (ep->extralen > 2 && ep->extra[1] == USB_DT_CS_INTERFACE) {
uvc_trace(UVC_TRACE_DESCR, "trying extra data from endpoint %u.\n", i);
buffer = alts->endpoint[i].extra;
buflen = alts->endpoint[i].extralen;
break;
}
}
}
/* Skip the standard interface descriptors. 跳过标准的接口描述符*/
while (buflen > 2 && buffer[1] != USB_DT_CS_INTERFACE) {
buflen -= buffer[0];
buffer += buffer[0];
}
if (buflen <= 2) {
uvc_trace(UVC_TRACE_DESCR, "no class-specific streaming interface descriptors found.\n");
goto error;
}
/* Parse the header descriptor. 解析header描述符*/ //Class-specific VS Interface Input Header Descriptor
switch (buffer[2]) { //bDescriptorSubtype
case UVC_VS_OUTPUT_HEADER: //输出类型的视频流
streaming->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; //设置为V4L2视频buf输出
size = 9;
break;
case UVC_VS_INPUT_HEADER: //输入类型的视频流
streaming->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //设置为V4L2视频buf输入
size = 13;
break;
default:
uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface %d HEADER descriptor not found.\n", dev->udev->devnum,alts->desc.bInterfaceNumber);
goto error;
}
p = buflen >= 4 buffer[3] : 0; //bNumFormats uvc格式format个数
n = buflen >= size buffer[size-1] : 0; //bControlSize 控制位域大小
if (buflen < size + p*n) { //检测buflen长度是否合适
uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming interface %d HEADER descriptor is invalid.\n",dev->udev->devnum, alts->desc.bInterfaceNumber);
goto error;
}
//初始化uvc视频流头部
streaming->header.bNumFormats = p; //uvc格式format格式个数
streaming->header.bEndpointAddress = buffer[6]; //端点地址
if (buffer[2] == UVC_VS_INPUT_HEADER) { //输入的视频流
streaming->header.bmInfo = buffer[7]; //信息位图(兼容性)
streaming->header.bTerminalLink = buffer[8]; //连接到的输出Terminal ID号
streaming->header.bStillCaptureMethod = buffer[9]; //静态图像捕捉方法(Method 1、Method 2、Method 3)
streaming->header.bTriggerSupport = buffer[10]; //硬件触发支持
streaming->header.bTriggerUsage = buffer[11]; //触发用例
}
else {
streaming->header.bTerminalLink = buffer[7]; //连接到的输入Terminal ID号
}
streaming->header.bControlSize = n; //控制位域大小
streaming->header.bmaControls = kmemdup(&buffer[size], p * n,GFP_KERNEL); //初始化bmaControls(x)位图(大小=帧数*位域大小)
if (streaming->header.bmaControls == NUL
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: