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

📄 ov511.c

📁 linux下的usb接口驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
			return -EINVAL;		}	} else if (ov->bclass == BCL_OV518) {		if (size == 0) alt = OV518_ALT_SIZE_0;		else if (size == 128) alt = OV518_ALT_SIZE_128;		else if (size == 256) alt = OV518_ALT_SIZE_256;		else if (size == 384) alt = OV518_ALT_SIZE_384;		else if (size == 512) alt = OV518_ALT_SIZE_512;		else if (size == 640) alt = OV518_ALT_SIZE_640;		else if (size == 768) alt = OV518_ALT_SIZE_768;		else if (size == 896) alt = OV518_ALT_SIZE_896;		else {			err("Set packet size: invalid size (%d)", size);			return -EINVAL;		}	} else {		err("Set packet size: Invalid bridge type");		return -EINVAL;	}	PDEBUG(3, "set packet size: %d, mult=%d, alt=%d", size, mult, alt);	// FIXME: Don't know how to do this on OV518 yet	if (ov->bclass == BCL_OV511) {		if (reg_w(ov, R51x_FIFO_PSIZE,				    mult) < 0) {			return -EIO;		}	}		if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {		err("Set packet size: set interface error");		return -EBUSY;	}	/* Initialize the stream */	if (ov->bclass == BCL_OV518)		if (reg_w(ov, 0x2f, 0x80) < 0)			return -EIO;	// FIXME - Should we only reset the FIFO?	if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)		return -EIO;	ov->packet_size = size;	if (ov51x_restart(ov) < 0)		return -EIO;	return 0;}/* Upload compression params and quantization tables. Returns 0 for success. */static intov511_init_compression(struct usb_ov511 *ov){	int rc = 0;	if (!ov->compress_inited) {		reg_w(ov, 0x70, phy);		reg_w(ov, 0x71, phuv);		reg_w(ov, 0x72, pvy);		reg_w(ov, 0x73, pvuv);		reg_w(ov, 0x74, qhy);		reg_w(ov, 0x75, qhuv);		reg_w(ov, 0x76, qvy);		reg_w(ov, 0x77, qvuv);		if (ov511_upload_quan_tables(ov) < 0) {			err("Error uploading quantization tables");			rc = -EIO;			goto out;		}	}	ov->compress_inited = 1;out:		return rc;}/* Upload compression params and quantization tables. Returns 0 for success. */static intov518_init_compression(struct usb_ov511 *ov){	int rc = 0;	if (!ov->compress_inited) {		if (ov518_upload_quan_tables(ov) < 0) {			err("Error uploading quantization tables");			rc = -EIO;			goto out;		}	}	ov->compress_inited = 1;out:		return rc;}/* -------------------------------------------------------------------------- *//* Sets sensor's contrast setting to "val" */static intsensor_set_contrast(struct usb_ov511 *ov, unsigned short val){	int rc;	PDEBUG(3, "%d", val);	if (ov->stop_during_set)		if (ov51x_stop(ov) < 0)			return -EIO;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:	{		rc = i2c_w(ov, OV7610_REG_CNT, val >> 8);		if (rc < 0)			goto out;		break;	}	case SEN_OV7620:	{		unsigned char ctab[] = {			0x01, 0x05, 0x09, 0x11, 0x15, 0x35, 0x37, 0x57,			0x5b, 0xa5, 0xa7, 0xc7, 0xc9, 0xcf, 0xef, 0xff		};		/* Use Y gamma control instead. Bit 0 enables it. */		rc = i2c_w(ov, 0x64, ctab[val>>12]);		if (rc < 0)			goto out;		break;	}	case SEN_SAA7111A:	{		rc = i2c_w(ov, 0x0b, val >> 9);		if (rc < 0)			goto out;		break;	}	default:	{		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	}	rc = 0;		/* Success */	ov->contrast = val;out:	if (ov51x_restart(ov) < 0)		return -EIO;	return rc;}/* Gets sensor's contrast setting */static intsensor_get_contrast(struct usb_ov511 *ov, unsigned short *val){	int rc;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_r(ov, OV7610_REG_CNT);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_OV7620:		/* Use Y gamma reg instead. Bit 0 is the enable bit. */		rc = i2c_r(ov, 0x64);		if (rc < 0)			return rc;		else			*val = (rc & 0xfe) << 8;		break;	case SEN_SAA7111A:		*val = ov->contrast;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov->contrast = *val;	return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's brightness setting to "val" */static intsensor_set_brightness(struct usb_ov511 *ov, unsigned short val){	int rc;	PDEBUG(4, "%d", val);	if (ov->stop_during_set)		if (ov51x_stop(ov) < 0)			return -EIO;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);		if (rc < 0)			goto out;		break;	case SEN_OV7620:		/* 7620 doesn't like manual changes when in auto mode */		if (!ov->auto_brt) {			rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);			if (rc < 0)				goto out;		}		break;	case SEN_SAA7111A:		rc = i2c_w(ov, 0x0a, val >> 8);		if (rc < 0)			goto out;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	rc = 0;		/* Success */	ov->brightness = val;out:	if (ov51x_restart(ov) < 0)		return -EIO;	return rc;}/* Gets sensor's brightness setting */static intsensor_get_brightness(struct usb_ov511 *ov, unsigned short *val){	int rc;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV7620:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_r(ov, OV7610_REG_BRT);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_SAA7111A:		*val = ov->brightness;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov->brightness = *val;	return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's saturation (color intensity) setting to "val" */static intsensor_set_saturation(struct usb_ov511 *ov, unsigned short val){	int rc;	PDEBUG(3, "%d", val);	if (ov->stop_during_set)		if (ov51x_stop(ov) < 0)			return -EIO;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);		if (rc < 0)			goto out;		break;	case SEN_OV7620://		/* Use UV gamma control instead. Bits 0 & 7 are reserved. *///		rc = ov_i2c_write(ov->dev, 0x62, (val >> 9) & 0x7e);//		if (rc < 0)//			goto out;		rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);		if (rc < 0)			goto out;		break;	case SEN_SAA7111A:		rc = i2c_w(ov, 0x0c, val >> 9);		if (rc < 0)			goto out;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	rc = 0;		/* Success */	ov->colour = val;out:	if (ov51x_restart(ov) < 0)		return -EIO;	return rc;}/* Gets sensor's saturation (color intensity) setting */static intsensor_get_saturation(struct usb_ov511 *ov, unsigned short *val){	int rc;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_r(ov, OV7610_REG_SAT);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_OV7620://		/* Use UV gamma reg instead. Bits 0 & 7 are reserved. *///		rc = i2c_r(ov, 0x62);//		if (rc < 0)//			return rc;//		else//			*val = (rc & 0x7e) << 9;		rc = i2c_r(ov, OV7610_REG_SAT);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_SAA7111A:		*val = ov->colour;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov->colour = *val;	return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's hue (red/blue balance) setting to "val" */static intsensor_set_hue(struct usb_ov511 *ov, unsigned short val){	int rc;	PDEBUG(3, "%d", val);	if (ov->stop_during_set)		if (ov51x_stop(ov) < 0)			return -EIO;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_w(ov, OV7610_REG_RED, 0xFF - (val >> 8));		if (rc < 0)			goto out;		rc = i2c_w(ov, OV7610_REG_BLUE, val >> 8);		if (rc < 0)			goto out;		break;	case SEN_OV7620:// Hue control is causing problems. I will enable it once it's fixed.#if 0		rc = i2c_w(ov, 0x7a, (unsigned char)(val >> 8) + 0xb);		if (rc < 0)			goto out;		rc = i2c_w(ov, 0x79, (unsigned char)(val >> 8) + 0xb);		if (rc < 0)			goto out;#endif		break;	case SEN_SAA7111A:		rc = i2c_w(ov, 0x0d, (val + 32768) >> 8);		if (rc < 0)			goto out;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	rc = 0;		/* Success */	ov->hue = val;out:	if (ov51x_restart(ov) < 0)		return -EIO;	return rc;}/* Gets sensor's hue (red/blue balance) setting */static intsensor_get_hue(struct usb_ov511 *ov, unsigned short *val){	int rc;	switch (ov->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:		rc = i2c_r(ov, OV7610_REG_BLUE);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_OV7620:		rc = i2c_r(ov, 0x7a);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_SAA7111A:		*val = ov->hue;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov->hue = *val;	return 0;}/* -------------------------------------------------------------------------- */static inline intsensor_set_picture(struct usb_ov511 *ov, struct video_picture *p){	int rc;	PDEBUG(4, "sensor_set_picture");	ov->whiteness = p->whiteness;	/* Don't return error if a setting is unsupported, or rest of settings         * will not be performed */	rc = sensor_set_contrast(ov, p->contrast);	if (FATAL_ERROR(rc))		return rc;	rc = sensor_set_brightness(ov, p->brightness);	if (FATAL_ERROR(rc))		return rc;	rc = sensor_set_saturation(ov, p->colour);	if (FATAL_ERROR(rc))		return rc;	rc = sensor_set_hue(ov, p->hue);	if (FATAL_ERROR(rc))		return rc;	return 0;}static inline intsensor_get_picture(struct usb_ov511 *ov, struct video_picture *p){	int rc;	PDEBUG(4, "sensor_get_picture");	/* Don't return error if a setting is unsupported, or rest of settings         * will not be performed */	rc = sensor_get_contrast(ov, &(p->contrast));	if (FATAL_ERROR(rc))		return rc;	rc = sensor_get_brightness(ov, &(p->brightness));	if (FATAL_ERROR(rc))		return rc;	rc = sensor_get_saturation(ov, &(p->colour));	if (FATAL_ERROR(rc))		return rc;	rc = sensor_get_hue(ov, &(p->hue));	if (FATAL_ERROR(rc))		return rc;	p->whiteness = 105 << 8;

⌨️ 快捷键说明

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