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

📄 zoran_card.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
		.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 },		.gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 },		.gpcs = { -1, 0 },		.vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },		.gws_not_connected = 0,		.init = &dc10_init,	}, {		.type = LML33,		.name = "LML33",		.i2c_decoder = I2C_DRIVERID_BT819,		.i2c_encoder = I2C_DRIVERID_BT856,		.video_codec = CODEC_TYPE_ZR36060,		.inputs = 2,		.input = {			{ 0, "Composite" },			{ 7, "S-Video" }		},		.norms = 2,		.tvn = {			&f50ccir601_lml33,			&f60ccir601_lml33,			NULL		},		.jpeg_int = ZR36057_ISR_GIRQ1,		.vsync_int = ZR36057_ISR_GIRQ0,		.gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },		.gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },		.gpcs = { 3, 1 },		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },		.gws_not_connected = 1,		.init = &lml33_init,	}, {		.type = LML33R10,		.name = "LML33R10",		.vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,		.device_id = PCI_DEVICE_ID_LML_33R10,		.i2c_decoder = I2C_DRIVERID_SAA7114,		.i2c_encoder = I2C_DRIVERID_ADV7170,		.video_codec = CODEC_TYPE_ZR36060,		.inputs = 2,		.input = {			{ 0, "Composite" },			{ 7, "S-Video" }		},		.norms = 2,		.tvn = {			&f50ccir601_lm33r10,			&f60ccir601_lm33r10,			NULL		},		.jpeg_int = ZR36057_ISR_GIRQ1,		.vsync_int = ZR36057_ISR_GIRQ0,		.gpio = { 1, -1, 3, 5, 7, -1, -1, -1 },		.gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 },		.gpcs = { 3, 1 },		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },		.gws_not_connected = 1,		.init = &lml33_init,	}, {		.type = BUZ,		.name = "Buz",		.vendor_id = PCI_VENDOR_ID_IOMEGA,		.device_id = PCI_DEVICE_ID_IOMEGA_BUZ,		.i2c_decoder = I2C_DRIVERID_SAA7111A,		.i2c_encoder = I2C_DRIVERID_SAA7185B,		.video_codec = CODEC_TYPE_ZR36060,		.inputs = 2,		.input = {			{ 3, "Composite" },			{ 7, "S-Video" }		},		.norms = 3,		.tvn = {			&f50ccir601,			&f60ccir601,			&f50ccir601		},		.jpeg_int = ZR36057_ISR_GIRQ1,		.vsync_int = ZR36057_ISR_GIRQ0,		.gpio = { 1, -1, 3, -1, -1, -1, -1, -1 },		.gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 },		.gpcs = { 3, 1 },		.vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 },		.gws_not_connected = 1,		.init = &buz_init,	}};/* * I2C functions *//* software I2C functions */static intzoran_i2c_getsda (void *data){	struct zoran *zr = (struct zoran *) data;	return (btread(ZR36057_I2CBR) >> 1) & 1;}static intzoran_i2c_getscl (void *data){	struct zoran *zr = (struct zoran *) data;	return btread(ZR36057_I2CBR) & 1;}static voidzoran_i2c_setsda (void *data,		  int   state){	struct zoran *zr = (struct zoran *) data;	if (state)		zr->i2cbr |= 2;	else		zr->i2cbr &= ~2;	btwrite(zr->i2cbr, ZR36057_I2CBR);}static voidzoran_i2c_setscl (void *data,		  int   state){	struct zoran *zr = (struct zoran *) data;	if (state)		zr->i2cbr |= 1;	else		zr->i2cbr &= ~1;	btwrite(zr->i2cbr, ZR36057_I2CBR);}static intzoran_i2c_client_register (struct i2c_client *client){	struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);	int res = 0;	dprintk(2,		KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",		ZR_DEVNAME(zr), client->driver->id);	down(&zr->resource_lock);	if (zr->user > 0) {		/* we're already busy, so we keep a reference to		 * them... Could do a lot of stuff here, but this		 * is easiest. (Did I ever mention I'm a lazy ass?)		 */		res = -EBUSY;		goto clientreg_unlock_and_return;	}	if (client->driver->id == zr->card.i2c_decoder)		zr->decoder = client;	else if (client->driver->id == zr->card.i2c_encoder)		zr->encoder = client;	else {		res = -ENODEV;		goto clientreg_unlock_and_return;	}clientreg_unlock_and_return:	up(&zr->resource_lock);	return res;}static intzoran_i2c_client_unregister (struct i2c_client *client){	struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);	int res = 0;	dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));	down(&zr->resource_lock);	if (zr->user > 0) {		res = -EBUSY;		goto clientunreg_unlock_and_return;	}	/* try to locate it */	if (client == zr->encoder) {		zr->encoder = NULL;	} else if (client == zr->decoder) {		zr->decoder = NULL;		snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);	}clientunreg_unlock_and_return:	up(&zr->resource_lock);	return res;}static struct i2c_algo_bit_data zoran_i2c_bit_data_template = {	.setsda = zoran_i2c_setsda,	.setscl = zoran_i2c_setscl,	.getsda = zoran_i2c_getsda,	.getscl = zoran_i2c_getscl,	.udelay = 10,	.mdelay = 0,	.timeout = 100,};static struct i2c_adapter zoran_i2c_adapter_template = {	.name = "zr36057",	.id = I2C_HW_B_ZR36067,	.algo = NULL,	.client_register = zoran_i2c_client_register,	.client_unregister = zoran_i2c_client_unregister,};static intzoran_register_i2c (struct zoran *zr){	memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,	       sizeof(struct i2c_algo_bit_data));	zr->i2c_algo.data = zr;	memcpy(&zr->i2c_adapter, &zoran_i2c_adapter_template,	       sizeof(struct i2c_adapter));	strncpy(I2C_NAME(&zr->i2c_adapter), ZR_DEVNAME(zr),		sizeof(I2C_NAME(&zr->i2c_adapter)) - 1);	i2c_set_adapdata(&zr->i2c_adapter, zr);	zr->i2c_adapter.algo_data = &zr->i2c_algo;	return i2c_bit_add_bus(&zr->i2c_adapter);}static voidzoran_unregister_i2c (struct zoran *zr){	i2c_bit_del_bus((&zr->i2c_adapter));}/* Check a zoran_params struct for correctness, insert default params */intzoran_check_jpg_settings (struct zoran              *zr,			  struct zoran_jpg_settings *settings){	int err = 0, err0 = 0;	dprintk(4,		KERN_DEBUG		"%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n",		ZR_DEVNAME(zr), settings->decimation, settings->HorDcm,		settings->VerDcm, settings->TmpDcm);	dprintk(4,		KERN_DEBUG		"%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n",		ZR_DEVNAME(zr), settings->img_x, settings->img_y,		settings->img_width, settings->img_height);	/* Check decimation, set default values for decimation = 1, 2, 4 */	switch (settings->decimation) {	case 1:		settings->HorDcm = 1;		settings->VerDcm = 1;		settings->TmpDcm = 1;		settings->field_per_buff = 2;		settings->img_x = 0;		settings->img_y = 0;		settings->img_width = BUZ_MAX_WIDTH;		settings->img_height = BUZ_MAX_HEIGHT / 2;		break;	case 2:		settings->HorDcm = 2;		settings->VerDcm = 1;		settings->TmpDcm = 2;		settings->field_per_buff = 1;		settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;		settings->img_y = 0;		settings->img_width =		    (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;		settings->img_height = BUZ_MAX_HEIGHT / 2;		break;	case 4:		if (zr->card.type == DC10_new) {			dprintk(1,				KERN_DEBUG				"%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n",				ZR_DEVNAME(zr));			err0++;			break;		}		settings->HorDcm = 4;		settings->VerDcm = 2;		settings->TmpDcm = 2;		settings->field_per_buff = 1;		settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0;		settings->img_y = 0;		settings->img_width =		    (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH;		settings->img_height = BUZ_MAX_HEIGHT / 2;		break;	case 0:		/* We have to check the data the user has set */		if (settings->HorDcm != 1 && settings->HorDcm != 2 &&		    (zr->card.type == DC10_new || settings->HorDcm != 4))			err0++;		if (settings->VerDcm != 1 && settings->VerDcm != 2)			err0++;		if (settings->TmpDcm != 1 && settings->TmpDcm != 2)			err0++;		if (settings->field_per_buff != 1 &&		    settings->field_per_buff != 2)			err0++;		if (settings->img_x < 0)			err0++;		if (settings->img_y < 0)			err0++;		if (settings->img_width < 0)			err0++;		if (settings->img_height < 0)			err0++;		if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH)			err0++;		if (settings->img_y + settings->img_height >		    BUZ_MAX_HEIGHT / 2)			err0++;		if (settings->HorDcm && settings->VerDcm) {			if (settings->img_width %			    (16 * settings->HorDcm) != 0)				err0++;			if (settings->img_height %			    (8 * settings->VerDcm) != 0)				err0++;		}		if (err0) {			dprintk(1,				KERN_ERR				"%s: check_jpg_settings() - error in params for decimation = 0\n",				ZR_DEVNAME(zr));			err++;		}		break;	default:		dprintk(1,			KERN_ERR			"%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n",			ZR_DEVNAME(zr), settings->decimation);		err++;		break;	}	if (settings->jpg_comp.quality > 100)		settings->jpg_comp.quality = 100;	if (settings->jpg_comp.quality < 5)		settings->jpg_comp.quality = 5;	if (settings->jpg_comp.APPn < 0)		settings->jpg_comp.APPn = 0;	if (settings->jpg_comp.APPn > 15)		settings->jpg_comp.APPn = 15;	if (settings->jpg_comp.APP_len < 0)		settings->jpg_comp.APP_len = 0;	if (settings->jpg_comp.APP_len > 60)		settings->jpg_comp.APP_len = 60;	if (settings->jpg_comp.COM_len < 0)		settings->jpg_comp.COM_len = 0;	if (settings->jpg_comp.COM_len > 60)		settings->jpg_comp.COM_len = 60;	if (err)		return -EINVAL;	return 0;}voidzoran_open_init_params (struct zoran *zr){	int i;	/* User must explicitly set a window */	zr->overlay_settings.is_set = 0;	zr->overlay_mask = NULL;	zr->overlay_active = ZORAN_FREE;	zr->v4l_memgrab_active = 0;	zr->v4l_overlay_active = 0;	zr->v4l_grab_frame = NO_GRAB_ACTIVE;	zr->v4l_grab_seq = 0;	zr->v4l_settings.width = 192;	zr->v4l_settings.height = 144;	zr->v4l_settings.format = &zoran_formats[4];	/* YUY2 - YUV-4:2:2 packed */	zr->v4l_settings.bytesperline =	    zr->v4l_settings.width *	    ((zr->v4l_settings.format->depth + 7) / 8);	/* DMA ring stuff for V4L */	zr->v4l_pend_tail = 0;	zr->v4l_pend_head = 0;	zr->v4l_sync_tail = 0;	zr->v4l_buffers.active = ZORAN_FREE;	for (i = 0; i < VIDEO_MAX_FRAME; i++) {		zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */	}	zr->v4l_buffers.allocated = 0;	for (i = 0; i < BUZ_MAX_FRAME; i++) {		zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER;	/* nothing going on */	}	zr->jpg_buffers.active = ZORAN_FREE;	zr->jpg_buffers.allocated = 0;	/* Set necessary params and call zoran_check_jpg_settings to set the defaults */	zr->jpg_settings.decimation = 1;	zr->jpg_settings.jpg_comp.quality = 50;	/* default compression factor 8 */	if (zr->card.type != BUZ)		zr->jpg_settings.odd_even = 1;	else		zr->jpg_settings.odd_even = 0;	zr->jpg_settings.jpg_comp.APPn = 0;	zr->jpg_settings.jpg_comp.APP_len = 0;	/* No APPn marker */	memset(zr->jpg_settings.jpg_comp.APP_data, 0,	       sizeof(zr->jpg_settings.jpg_comp.APP_data));	zr->jpg_settings.jpg_comp.COM_len = 0;	/* No COM marker */	memset(zr->jpg_settings.jpg_comp.COM_data, 0,	       sizeof(zr->jpg_settings.jpg_comp.COM_data));	zr->jpg_settings.jpg_comp.jpeg_markers =	    JPEG_MARKER_DHT | JPEG_MARKER_DQT;	i = zoran_check_jpg_settings(zr, &zr->jpg_settings);	if (i)		dprintk(1,			KERN_ERR			"%s: zoran_open_init_params() internal error\n",			ZR_DEVNAME(zr));	clear_interrupt_counters(zr);	zr->testing = 0;}static void __devinittest_interrupts (struct zoran *zr){	DEFINE_WAIT(wait);	int timeout, icr;	clear_interrupt_counters(zr);	zr->testing = 1;	icr = btread(ZR36057_ICR);	btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR);	prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE);	timeout = schedule_timeout(HZ);	finish_wait(&zr->test_q, &wait);	btwrite(0, ZR36057_ICR);	btwrite(0x78000000, ZR36057_ISR);	zr->testing = 0;	dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr));	if (timeout) {		dprintk(1, ": time spent: %d\n", 1 * HZ - timeout);	}	if (*zr_debug > 1)		print_interrupts(zr);	btwrite(icr, ZR36057_ICR);}static int __devinitzr36057_init (struct zoran *zr){	unsigned long mem;	void *vdev;	unsigned mem_needed;	int j;	int two = 2;	int zero = 0;	dprintk(1,		KERN_INFO		"%s: zr36057_init() - initializing card[%d], zr=%p\n",		ZR_DEVNAME(zr), zr->id, zr);	/* default setup of all parameters which will persist between opens */	zr->user = 0;	init_waitqueue_head(&zr->v4l_capq);	init_waitqueue_head(&zr->jpg_capq);	init_waitqueue_head(&zr->test_q);	zr->jpg_buffers.allocated = 0;	zr->v4l_buffers.allocated = 0;	zr->buffer.base = (void *) vidmem;	zr->buffer.width = 0;	zr->buffer.height = 0;	zr->buffer.depth = 0;	zr->buffer.bytesperline = 0;	/* Avoid nonsense settings from user for default input/norm */	if (default_norm < VIDEO_MODE_PAL &&	    default_norm > VIDEO_MODE_SECAM)		default_norm = VIDEO_MODE_PAL;	zr->norm = default_norm;	if (!(zr->timing = zr->card.tvn[zr->norm])) {		dprintk(1,			KERN_WARNING			"%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n",			ZR_DEVNAME(zr));		zr->norm = VIDEO_MODE_PAL;		zr->timing = zr->card.tvn[zr->norm];	}	zr->input = default_input = (default_input ? 1 : 0);	/* Should the following be reset at every open ? */	zr->hue = 32768;	zr->contrast = 32768;	zr->saturation = 32768;	zr->brightness = 32768;	/* default setup (will be repeated at every open) */	zoran_open_init_params(zr);	/* allocate memory *before* doing anything to the hardware	 * in case allocation fails */	mem_needed = BUZ_NUM_STAT_COM * 4;	mem = (unsigned long) kmalloc(mem_needed, GFP_KERNEL);	vdev = (void *) kmalloc(sizeof(struct video_device), GFP_KERNEL);	if (!mem || !vdev) {		dprintk(1,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -