static void konicawc_configure_video(struct uvd *uvd) { struct konicawc *cam = (struct konicawc *)uvd->user_data; u8 buf[2]; memset(&uvd->vpic, 0, sizeof(uvd->vpic)); memset(&uvd->vpic_old, 0x55, sizeof(uvd->vpic_old)); RESTRICT_TO_RANGE(brightness, 0, MAX_BRIGHTNESS); RESTRICT_TO_RANGE(contrast, 0, MAX_CONTRAST); RESTRICT_TO_RANGE(saturation, 0, MAX_SATURATION); RESTRICT_TO_RANGE(sharpness, 0, MAX_SHARPNESS); RESTRICT_TO_RANGE(whitebal, 0, MAX_WHITEBAL); cam->brightness = brightness / 11; cam->contrast = contrast / 11; cam->saturation = saturation / 11; cam->sharpness = sharpness / 11; cam->white_bal = whitebal / 11; uvd->vpic.colour = 108; uvd->vpic.hue = 108; uvd->vpic.brightness = brightness; uvd->vpic.contrast = contrast; uvd->vpic.whiteness = whitebal; uvd->vpic.depth = 6; uvd->vpic.palette = VIDEO_PALETTE_YUV420P; memset(&uvd->vcap, 0, sizeof(uvd->vcap)); strcpy(uvd->vcap.name, "Konica Webcam"); uvd->vcap.type = VID_TYPE_CAPTURE; uvd->vcap.channels = 1; uvd->vcap.audios = 0; uvd->vcap.minwidth = camera_sizes[SIZE_160X120].width; uvd->vcap.minheight = camera_sizes[SIZE_160X120].height; uvd->vcap.maxwidth = camera_sizes[SIZE_320X240].width; uvd->vcap.maxheight = camera_sizes[SIZE_320X240].height; memset(&uvd->vchan, 0, sizeof(uvd->vchan)); uvd->vchan.flags = 0 ; uvd->vchan.tuners = 0; uvd->vchan.channel = 0; uvd->vchan.type = VIDEO_TYPE_CAMERA; strcpy(uvd->vchan.name, "Camera"); /* Talk to device */ DEBUG(1, "device init"); if(!konicawc_get_misc(uvd, 0x3, 0, 0x10, buf, 2)) DEBUG(2, "3,10 -> %2.2x %2.2x", buf[0], buf[1]); if(!konicawc_get_misc(uvd, 0x3, 0, 0x10, buf, 2)) DEBUG(2, "3,10 -> %2.2x %2.2x", buf[0], buf[1]); if(konicawc_set_misc(uvd, 0x2, 0, 0xd)) DEBUG(2, "2,0,d failed"); DEBUG(1, "setting initial values"); }
static void ultracam_configure_video(struct uvd *uvd) { if (uvd == NULL) return; RESTRICT_TO_RANGE(init_brightness, 0, 255); RESTRICT_TO_RANGE(init_contrast, 0, 255); RESTRICT_TO_RANGE(init_color, 0, 255); RESTRICT_TO_RANGE(init_hue, 0, 255); RESTRICT_TO_RANGE(hue_correction, 0, 255); memset(&uvd->vpic, 0, sizeof(uvd->vpic)); memset(&uvd->vpic_old, 0x55, sizeof(uvd->vpic_old)); uvd->vpic.colour = init_color << 8; uvd->vpic.hue = init_hue << 8; uvd->vpic.brightness = init_brightness << 8; uvd->vpic.contrast = init_contrast << 8; uvd->vpic.whiteness = 105 << 8; /* This one isn't used */ uvd->vpic.depth = 24; uvd->vpic.palette = VIDEO_PALETTE_RGB24; memset(&uvd->vcap, 0, sizeof(uvd->vcap)); strcpy(uvd->vcap.name, "IBM Ultra Camera"); uvd->vcap.type = VID_TYPE_CAPTURE; uvd->vcap.channels = 1; uvd->vcap.audios = 0; uvd->vcap.maxwidth = VIDEOSIZE_X(uvd->canvas); uvd->vcap.maxheight = VIDEOSIZE_Y(uvd->canvas); uvd->vcap.minwidth = min_canvasWidth; uvd->vcap.minheight = min_canvasHeight; memset(&uvd->vchan, 0, sizeof(uvd->vchan)); uvd->vchan.flags = 0; uvd->vchan.tuners = 0; uvd->vchan.channel = 0; uvd->vchan.type = VIDEO_TYPE_CAMERA; strcpy(uvd->vchan.name, "Camera"); }
static int konicawc_probe(struct usb_interface *intf, const struct usb_device_id *devid) { struct usb_device *dev = interface_to_usbdev(intf); struct uvd *uvd = NULL; int ix, i, nas; int actInterface=-1, inactInterface=-1, maxPS=0; unsigned char video_ep = 0; DEBUG(1, "konicawc_probe(%p)", intf); /* We don't handle multi-config cameras */ if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; dev_info(&intf->dev, "Konica Webcam (rev. 0x%04x)\n", le16_to_cpu(dev->descriptor.bcdDevice)); RESTRICT_TO_RANGE(speed, 0, MAX_SPEED); /* Validate found interface: must have one ISO endpoint */ nas = intf->num_altsetting; if (nas != 8) { err("Incorrect number of alternate settings (%d) for this camera!", nas); return -ENODEV; } /* Validate all alternate settings */ for (ix=0; ix < nas; ix++) { const struct usb_host_interface *interface; const struct usb_endpoint_descriptor *endpoint; interface = &intf->altsetting[ix]; i = interface->desc.bAlternateSetting; if (interface->desc.bNumEndpoints != 2) { err("Interface %d. has %u. endpoints!", interface->desc.bInterfaceNumber, (unsigned)(interface->desc.bNumEndpoints)); return -ENODEV; } endpoint = &interface->endpoint[1].desc; DEBUG(1, "found endpoint: addr: 0x%2.2x maxps = 0x%4.4x", endpoint->bEndpointAddress, le16_to_cpu(endpoint->wMaxPacketSize)); if (video_ep == 0) video_ep = endpoint->bEndpointAddress; else if (video_ep != endpoint->bEndpointAddress) { err("Alternate settings have different endpoint addresses!"); return -ENODEV; } if (!usb_endpoint_xfer_isoc(endpoint)) { err("Interface %d. has non-ISO endpoint!", interface->desc.bInterfaceNumber); return -ENODEV; } if (usb_endpoint_dir_out(endpoint)) { err("Interface %d. has ISO OUT endpoint!", interface->desc.bInterfaceNumber); return -ENODEV; } if (le16_to_cpu(endpoint->wMaxPacketSize) == 0) { if (inactInterface < 0) inactInterface = i; else { err("More than one inactive alt. setting!"); return -ENODEV; } } else { if (i == spd_to_iface[speed]) { /* This one is the requested one */ actInterface = i; } } if (le16_to_cpu(endpoint->wMaxPacketSize) > maxPS) maxPS = le16_to_cpu(endpoint->wMaxPacketSize); } if(actInterface == -1) { err("Cant find required endpoint"); return -ENODEV; } DEBUG(1, "Selecting requested active setting=%d. maxPS=%d.", actInterface, maxPS); uvd = usbvideo_AllocateDevice(cams); if (uvd != NULL) { struct konicawc *cam = (struct konicawc *)(uvd->user_data); /* Here uvd is a fully allocated uvd object */ for(i = 0; i < USBVIDEO_NUMSBUF; i++) { cam->sts_urb[i] = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL); if(cam->sts_urb[i] == NULL) { while(i--) { usb_free_urb(cam->sts_urb[i]); } err("can't allocate urbs"); return -ENOMEM; } } cam->speed = speed; RESTRICT_TO_RANGE(size, SIZE_160X120, SIZE_320X240); cam->width = camera_sizes[size].width; cam->height = camera_sizes[size].height; cam->size = size; uvd->flags = 0; uvd->debug = debug; uvd->dev = dev; uvd->iface = intf->altsetting->desc.bInterfaceNumber; uvd->ifaceAltInactive = inactInterface; uvd->ifaceAltActive = actInterface; uvd->video_endp = video_ep; uvd->iso_packet_len = maxPS; uvd->paletteBits = 1L << VIDEO_PALETTE_YUV420P; uvd->defaultPalette = VIDEO_PALETTE_YUV420P; uvd->canvas = VIDEOSIZE(320, 240); uvd->videosize = VIDEOSIZE(cam->width, cam->height); /* Initialize konicawc specific data */ konicawc_configure_video(uvd); i = usbvideo_RegisterVideoDevice(uvd); uvd->max_frame_size = (320 * 240 * 3)/2; if (i != 0) { err("usbvideo_RegisterVideoDevice() failed."); uvd = NULL; } konicawc_register_input(cam, dev); } if (uvd) { usb_set_intfdata (intf, uvd); return 0; } return -EIO; }