📄 ultracam.c
字号:
ultracam_veio(uvd, 0x01, 0x0080, 0x0048, 1); ultracam_veio(uvd, 0x01, 0x0090, 0x0049, 1); ultracam_veio(uvd, 0x01, 0x00a0, 0x004a, 1); ultracam_veio(uvd, 0x01, 0x00b0, 0x004b, 1); ultracam_veio(uvd, 0x01, 0x00c0, 0x004c, 1); ultracam_veio(uvd, 0x01, 0x00d0, 0x004d, 1); ultracam_veio(uvd, 0x01, 0x00e0, 0x004e, 1); ultracam_veio(uvd, 0x01, 0x00f0, 0x004f, 1); ultracam_veio(uvd, 0x01, 0x00ff, 0x0050, 1); ultracam_veio(uvd, 0x01, 0x0000, 0x0056, 1); ultracam_veio(uvd, 0x00, 0x0080, 0x00c1, 1); ultracam_veio(uvd, 0x00, 0x0000, 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, 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(uvd_t *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 void *ultracam_probe(struct usb_device *dev, unsigned int ifnum ,const struct usb_device_id *devid){ uvd_t *uvd = NULL; int i, nas; int actInterface=-1, inactInterface=-1, maxPS=0; unsigned char video_ep = 0; if (debug >= 1) info("ultracam_probe(%p,%u.)", dev, ifnum); /* We don't handle multi-config cameras */ if (dev->descriptor.bNumConfigurations != 1) return NULL; /* Is it an IBM camera? */ if ((dev->descriptor.idVendor != ULTRACAM_VENDOR_ID) || (dev->descriptor.idProduct != ULTRACAM_PRODUCT_ID)) return NULL; info("IBM Ultra camera found (rev. 0x%04x)", dev->descriptor.bcdDevice); /* Validate found interface: must have one ISO endpoint */ nas = dev->actconfig->interface[ifnum].num_altsetting; if (debug > 0) info("Number of alternate settings=%d.", nas); if (nas < 8) { err("Too few alternate settings for this camera!"); return NULL; } /* Validate all alternate settings */ for (i=0; i < nas; i++) { const struct usb_interface_descriptor *interface; const struct usb_endpoint_descriptor *endpoint; interface = &dev->actconfig->interface[ifnum].altsetting[i]; if (interface->bNumEndpoints != 1) { err("Interface %d. has %u. endpoints!", ifnum, (unsigned)(interface->bNumEndpoints)); return NULL; } endpoint = &interface->endpoint[0]; if (video_ep == 0) video_ep = endpoint->bEndpointAddress; else if (video_ep != endpoint->bEndpointAddress) { err("Alternate settings have different endpoint addresses!"); return NULL; } if ((endpoint->bmAttributes & 0x03) != 0x01) { err("Interface %d. has non-ISO endpoint!", ifnum); return NULL; } if ((endpoint->bEndpointAddress & 0x80) == 0) { err("Interface %d. has ISO OUT endpoint!", ifnum); return NULL; } if (endpoint->wMaxPacketSize == 0) { if (inactInterface < 0) inactInterface = i; else { err("More than one inactive alt. setting!"); return NULL; } } else { if (actInterface < 0) { actInterface = i; maxPS = endpoint->wMaxPacketSize; if (debug > 0) info("Active setting=%d. maxPS=%d.", i, maxPS); } else { /* Got another active alt. setting */ if (maxPS < endpoint->wMaxPacketSize) { /* This one is better! */ actInterface = i; maxPS = 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 NULL; } /* Code below may sleep, need to lock module while we are here */ MOD_INC_USE_COUNT; uvd = usbvideo_AllocateDevice(cams); if (uvd != NULL) { /* Here uvd is a fully allocated uvd_t object */ uvd->flags = flags; uvd->debug = debug; uvd->dev = dev; uvd->iface = ifnum; 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; } } MOD_DEC_USE_COUNT; return uvd;}/* * ultracam_init() * * This code is run to initialize the driver. */static int __init ultracam_init(void){ usbvideo_cb_t 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);}static void __exit ultracam_cleanup(void){ usbvideo_Deregister(&cams);}#if defined(usb_device_id_ver)static __devinitdata struct usb_device_id id_table[] = { { USB_DEVICE(ULTRACAM_VENDOR_ID, ULTRACAM_PRODUCT_ID) }, { } /* Terminating entry */};MODULE_DEVICE_TABLE(usb, id_table);#endif /* defined(usb_device_id_ver) */MODULE_LICENSE("GPL");module_init(ultracam_init);module_exit(ultracam_cleanup);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -