📄 ultracam.c
字号:
ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0080, 0x00c1, 1); ultracam_veio(uvd, 0x00, 0x0004, 0x00c2, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00ca, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0002, 0x00c1, 1); ultracam_veio(uvd, 0x00, 0x0020, 0x00c2, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00ca, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c3, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c4, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c5, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c6, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c7, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c8, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c3, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c4, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c5, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c6, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c7, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c8, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0040, 0x00c1, 1); ultracam_veio(uvd, 0x00, 0x0017, 0x00c2, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00ca, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c3, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c4, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c5, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c6, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c7, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c8, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c3, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c4, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c5, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c6, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c7, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c8, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c9, 1); ultracam_veio(uvd, 0x00, 0x00c0, 0x00c1, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00c2, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00ca, 1); ultracam_veio(uvd, 0x02, 0xc040, 0x0001, 1); ultracam_veio(uvd, 0x01, 0x0000, 0x0008, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x0009, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x000a, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x000b, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x000c, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x000d, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x000e, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x000f, 0); ultracam_veio(uvd, 0x01, 0x0000, 0x0010, 0); ultracam_veio(uvd, 0x01, 0x000b, 0x0008, 1); ultracam_veio(uvd, 0x01, 0x0034, 0x0009, 1); ultracam_veio(uvd, 0x01, 0x0000, 0x000a, 1); ultracam_veio(uvd, 0x01, 0x002e, 0x000b, 1); ultracam_veio(uvd, 0x01, 0x00d6, 0x000c, 1); ultracam_veio(uvd, 0x01, 0x00fc, 0x000d, 1); ultracam_veio(uvd, 0x01, 0x00f1, 0x000e, 1); ultracam_veio(uvd, 0x01, 0x00da, 0x000f, 1); ultracam_veio(uvd, 0x01, 0x0036, 0x0010, 1); ultracam_veio(uvd, 0x01, 0x0000, 0x0001, 0); ultracam_veio(uvd, 0x01, 0x0064, 0x0001, 1); ultracam_veio(uvd, 0x01, 0x0059, 0x0051, 1); ultracam_veio(uvd, 0x01, 0x003f, 0x0052, 1); ultracam_veio(uvd, 0x01, 0x0094, 0x0053, 1); ultracam_veio(uvd, 0x01, 0x00ff, 0x0011, 1); ultracam_veio(uvd, 0x01, 0x0003, 0x0012, 1); ultracam_veio(uvd, 0x01, 0x00f7, 0x0013, 1); ultracam_veio(uvd, 0x00, 0x0009, 0x0011, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x0001, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x0000, 1); ultracam_veio(uvd, 0x00, 0x0020, 0x00c1, 1); ultracam_veio(uvd, 0x00, 0x0010, 0x00c2, 1); ultracam_veio(uvd, 0x00, 0x0000, 0x00ca, 1); ultracam_alternateSetting(uvd, 0x04); ultracam_veio(uvd, 0x02, 0x0000, 0x0001, 1); ultracam_veio(uvd, 0x02, 0x0000, 0x0001, 1); ultracam_veio(uvd, 0x02, 0x0000, 0x0006, 1); ultracam_veio(uvd, 0x02, 0x9000, 0x0007, 1); ultracam_veio(uvd, 0x02, 0x0042, 0x0001, 1); ultracam_veio(uvd, 0x02, 0x0000, 0x000b, 0); ultracam_resetPipe(uvd); ULTRACAM_T(uvd)->initialized = (setup_ok != 0); } return setup_ok;}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");}/* * ultracam_probe() * * This procedure queries device descriptor and accepts the interface * if it looks like our camera. * * History: * 12-Nov-2000 Reworked to comply with new probe() signature. * 23-Jan-2001 Added compatibility with 2.2.x kernels. */static int ultracam_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; if (debug >= 1) info("ultracam_probe(%p)", intf); /* We don't handle multi-config cameras */ if (dev->descriptor.bNumConfigurations != 1) return -ENODEV; info("IBM Ultra camera found (rev. 0x%04x)", le16_to_cpu(dev->descriptor.bcdDevice)); /* Validate found interface: must have one ISO endpoint */ nas = intf->num_altsetting; if (debug > 0) info("Number of alternate settings=%d.", nas); if (nas < 8) { err("Too few alternate settings for this camera!"); 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 != 1) { err("Interface %d. has %u. endpoints!", interface->desc.bInterfaceNumber, (unsigned)(interface->desc.bNumEndpoints)); return -ENODEV; } endpoint = &interface->endpoint[0].desc; if (video_ep == 0) video_ep = endpoint->bEndpointAddress; else if (video_ep != endpoint->bEndpointAddress) { err("Alternate settings have different endpoint addresses!"); return -ENODEV; } if ((endpoint->bmAttributes & 0x03) != 0x01) { err("Interface %d. has non-ISO endpoint!", interface->desc.bInterfaceNumber); return -ENODEV; } if ((endpoint->bEndpointAddress & 0x80) == 0) { 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 (actInterface < 0) { actInterface = i; maxPS = le16_to_cpu(endpoint->wMaxPacketSize); if (debug > 0) info("Active setting=%d. maxPS=%d.", i, maxPS); } else { /* Got another active alt. setting */ if (maxPS < le16_to_cpu(endpoint->wMaxPacketSize)) { /* This one is better! */ actInterface = i; maxPS = le16_to_cpu(endpoint->wMaxPacketSize); if (debug > 0) { info("Even better ctive setting=%d. maxPS=%d.", i, maxPS); } } } } } if ((maxPS <= 0) || (actInterface < 0) || (inactInterface < 0)) { err("Failed to recognize the camera!"); return -ENODEV; } uvd = usbvideo_AllocateDevice(cams); if (uvd != NULL) { /* Here uvd is a fully allocated uvd object */ uvd->flags = flags; 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_RGB24; uvd->defaultPalette = VIDEO_PALETTE_RGB24; uvd->canvas = VIDEOSIZE(640, 480); /* FIXME */ uvd->videosize = uvd->canvas; /* ultracam_size_to_videosize(size);*/ /* Initialize ibmcam-specific data */ assert(ULTRACAM_T(uvd) != NULL); ULTRACAM_T(uvd)->camera_model = 0; /* Not used yet */ ULTRACAM_T(uvd)->initialized = 0; ultracam_configure_video(uvd); i = usbvideo_RegisterVideoDevice(uvd); if (i != 0) { err("usbvideo_RegisterVideoDevice() failed."); uvd = NULL; } } if (uvd) { usb_set_intfdata (intf, uvd); return 0; } return -EIO;}static struct usb_device_id id_table[] = { { USB_DEVICE(ULTRACAM_VENDOR_ID, ULTRACAM_PRODUCT_ID) }, { } /* Terminating entry */};/* * ultracam_init() * * This code is run to initialize the driver. */static int __init ultracam_init(void){ struct usbvideo_cb cbTbl; memset(&cbTbl, 0, sizeof(cbTbl)); cbTbl.probe = ultracam_probe; cbTbl.setupOnOpen = ultracam_setup_on_open; cbTbl.videoStart = ultracam_video_start; cbTbl.videoStop = ultracam_video_stop; cbTbl.processData = ultracam_ProcessIsocData; cbTbl.postProcess = usbvideo_DeinterlaceFrame; cbTbl.adjustPicture = ultracam_adjust_picture; cbTbl.getFPS = ultracam_calculate_fps; return usbvideo_register( &cams, MAX_CAMERAS, sizeof(ultracam_t), "ultracam", &cbTbl, THIS_MODULE, id_table);}static void __exit ultracam_cleanup(void){ usbvideo_Deregister(&cams);}MODULE_DEVICE_TABLE(usb, id_table);MODULE_LICENSE("GPL");module_init(ultracam_init);module_exit(ultracam_cleanup);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -