⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ultracam.c

📁 基于S3CEB2410平台LINUX操作系统下 USB驱动源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -