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

📄 ov511.c

📁 基于S3CEB2410平台LINUX操作系统下 USB驱动源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
static int ov51x_set_slave_ids(struct usb_ov511 *ov511,		    unsigned char write_id,		    unsigned char read_id){	struct usb_device *dev = ov511->dev;	if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, write_id) < 0)		return -EIO;	if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, read_id) < 0)		return -EIO;	if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0)		return -EIO;	return 0;}/* This does an initial reset of an OmniVision sensor and ensures that I2C * is synchronized. Returns <0 for failure. */static int ov51x_init_ov_sensor(struct usb_ov511 *ov511){	int i, success;	/* Reset the sensor */ 	if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -EIO;	/* Wait for it to initialize */ 	schedule_timeout (1 + 150 * HZ / 1000);	for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) {		if ((ov51x_i2c_read(ov511, OV7610_REG_ID_HIGH) == 0x7F) &&		    (ov51x_i2c_read(ov511, OV7610_REG_ID_LOW) == 0xA2)) {			success = 1;			continue;		}		/* Reset the sensor */ 		if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -EIO;		/* Wait for it to initialize */ 		schedule_timeout(1 + 150 * HZ / 1000);		/* Dummy read to sync I2C */		if (ov51x_i2c_read(ov511, 0x00) < 0) return -EIO;	}	if (!success)		return -EIO;		PDEBUG(1, "I2C synced in %d attempt(s)", i);	return 0;}static int ov511_set_packet_size(struct usb_ov511 *ov511, int size){	int alt, mult;	if (ov511_stop(ov511) < 0)		return -EIO;	mult = size >> 5;	if (ov511->bridge == BRG_OV511) {		if (size == 0) alt = OV511_ALT_SIZE_0;		else if (size == 257) alt = OV511_ALT_SIZE_257;		else if (size == 513) alt = OV511_ALT_SIZE_513;		else if (size == 769) alt = OV511_ALT_SIZE_769;		else if (size == 993) alt = OV511_ALT_SIZE_993;		else {			err("Set packet size: invalid size (%d)", size);			return -EINVAL;		}	} else if (ov511->bridge == BRG_OV511PLUS) {		if (size == 0) alt = OV511PLUS_ALT_SIZE_0;		else if (size == 33) alt = OV511PLUS_ALT_SIZE_33;		else if (size == 129) alt = OV511PLUS_ALT_SIZE_129;		else if (size == 257) alt = OV511PLUS_ALT_SIZE_257;		else if (size == 385) alt = OV511PLUS_ALT_SIZE_385;		else if (size == 513) alt = OV511PLUS_ALT_SIZE_513;		else if (size == 769) alt = OV511PLUS_ALT_SIZE_769;		else if (size == 961) alt = OV511PLUS_ALT_SIZE_961;		else {			err("Set packet size: invalid size (%d)", size);			return -EINVAL;		}	} else if (ov511->bridge == BRG_OV518 ||		   ov511->bridge == BRG_OV518PLUS) {		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 (ov511->bridge != BRG_OV518 &&	    ov511->bridge != BRG_OV518PLUS) {		if (ov511_reg_write(ov511->dev, OV511_REG_FIFO_PACKET_SIZE,				    mult) < 0) {			return -EIO;		}	}		if (usb_set_interface(ov511->dev, ov511->iface, alt) < 0) {		err("Set packet size: set interface error");		return -EBUSY;	}	/* Initialize the stream */	if (ov511->bridge == BRG_OV518 ||	    ov511->bridge == BRG_OV518PLUS)		if (ov511_reg_write(ov511->dev, 0x2f, 0x80) < 0)			return -EIO;	// FIXME - Should we only reset the FIFO?	if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0)		return -EIO;	ov511->packet_size = size;	if (ov511_restart(ov511) < 0)		return -EIO;	return 0;}/* Upload compression params and quantization tables. Returns 0 for success. */static intov511_init_compression(struct usb_ov511 *ov511){	struct usb_device *dev = ov511->dev;	int rc = 0;	if (!ov511->compress_inited) {		ov511_reg_write(dev, 0x70, phy);		ov511_reg_write(dev, 0x71, phuv);		ov511_reg_write(dev, 0x72, pvy);		ov511_reg_write(dev, 0x73, pvuv);		ov511_reg_write(dev, 0x74, qhy);		ov511_reg_write(dev, 0x75, qhuv);		ov511_reg_write(dev, 0x76, qvy);		ov511_reg_write(dev, 0x77, qvuv);		if (ov511_upload_quan_tables(dev) < 0) {			err("Error uploading quantization tables");			rc = -EIO;			goto out;		}	}	ov511->compress_inited = 1;out:		return rc;}/* Upload compression params and quantization tables. Returns 0 for success. */static intov518_init_compression(struct usb_ov511 *ov511){	struct usb_device *dev = ov511->dev;	int rc = 0;	if (!ov511->compress_inited) {		if (ov518_upload_quan_tables(dev) < 0) {			err("Error uploading quantization tables");			rc = -EIO;			goto out;		}	}	ov511->compress_inited = 1;out:		return rc;}/* -------------------------------------------------------------------------- *//* Sets sensor's contrast setting to "val" */static intsensor_set_contrast(struct usb_ov511 *ov511, unsigned short val){	int rc;	PDEBUG(3, "%d", val);	if (ov511->stop_during_set)		if (ov511_stop(ov511) < 0)			return -EIO;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:	{		rc = ov51x_i2c_write(ov511, 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 = ov51x_i2c_write(ov511, 0x64, ctab[val>>12]);		if (rc < 0)			goto out;		break;	}	case SEN_SAA7111A:	{		rc = ov51x_i2c_write(ov511, 0x0b, val >> 9);		if (rc < 0)			goto out;		break;	}	default:	{		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	}	rc = 0;		/* Success */	ov511->contrast = val;out:	if (ov511_restart(ov511) < 0)		return -EIO;	return rc;}/* Gets sensor's contrast setting */static intsensor_get_contrast(struct usb_ov511 *ov511, unsigned short *val){	int rc;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:		rc = ov51x_i2c_read(ov511, 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 = ov51x_i2c_read(ov511, 0x64);		if (rc < 0)			return rc;		else			*val = (rc & 0xfe) << 8;		break;	case SEN_SAA7111A:		*val = ov511->contrast;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov511->contrast = *val;	return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's brightness setting to "val" */static intsensor_set_brightness(struct usb_ov511 *ov511, unsigned short val){	int rc;	PDEBUG(4, "%d", val);	if (ov511->stop_during_set)		if (ov511_stop(ov511) < 0)			return -EIO;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV6620:	case SEN_OV6630:		rc = ov51x_i2c_write(ov511, 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 (!ov511->auto_brt) {			rc = ov51x_i2c_write(ov511, OV7610_REG_BRT, val >> 8);			if (rc < 0)				goto out;		}		break;	case SEN_SAA7111A:		rc = ov51x_i2c_write(ov511, 0x0a, val >> 8);		if (rc < 0)			goto out;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	rc = 0;		/* Success */	ov511->brightness = val;out:	if (ov511_restart(ov511) < 0)		return -EIO;	return rc;}/* Gets sensor's brightness setting */static intsensor_get_brightness(struct usb_ov511 *ov511, unsigned short *val){	int rc;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV7620:	case SEN_OV6620:	case SEN_OV6630:		rc = ov51x_i2c_read(ov511, OV7610_REG_BRT);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_SAA7111A:		*val = ov511->brightness;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov511->brightness = *val;	return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's saturation (color intensity) setting to "val" */static intsensor_set_saturation(struct usb_ov511 *ov511, unsigned short val){	int rc;	PDEBUG(3, "%d", val);	if (ov511->stop_during_set)		if (ov511_stop(ov511) < 0)			return -EIO;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV6620:	case SEN_OV6630:		rc = ov51x_i2c_write(ov511, 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 = ov511_i2c_write(ov511->dev, 0x62, (val >> 9) & 0x7e);//		if (rc < 0)//			goto out;		rc = ov51x_i2c_write(ov511, OV7610_REG_SAT, val >> 8);		if (rc < 0)			goto out;		break;	case SEN_SAA7111A:		rc = ov51x_i2c_write(ov511, 0x0c, val >> 9);		if (rc < 0)			goto out;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		rc = -EPERM;		goto out;	}	rc = 0;		/* Success */	ov511->colour = val;out:	if (ov511_restart(ov511) < 0)		return -EIO;	return rc;}/* Gets sensor's saturation (color intensity) setting */static intsensor_get_saturation(struct usb_ov511 *ov511, unsigned short *val){	int rc;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV7620AE:	case SEN_OV6620:	case SEN_OV6630:		rc = ov51x_i2c_read(ov511, 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 = ov51x_i2c_read(ov511, 0x62);//		if (rc < 0)//			return rc;//		else//			*val = (rc & 0x7e) << 9;		rc = ov51x_i2c_read(ov511, OV7610_REG_SAT);		if (rc < 0)			return rc;		else			*val = rc << 8;		break;	case SEN_SAA7111A:		*val = ov511->colour;		break;	default:		PDEBUG(3, "Unsupported with this sensor");		return -EPERM;	}	PDEBUG(3, "%d", *val);	ov511->colour = *val;	return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's hue (red/blue balance) setting to "val" */static intsensor_set_hue(struct usb_ov511 *ov511, unsigned short val){	int rc;	PDEBUG(3, "%d", val);	if (ov511->stop_during_set)		if (ov511_stop(ov511) < 0)			return -EIO;	switch (ov511->sensor) {	case SEN_OV7610:	case SEN_OV6620:	case SEN_OV6630:		rc = ov51x_i2c_write(ov511, OV7610_REG_RED, 0xFF - (val >> 8));		if (rc < 0)			goto out;		rc = ov51x_i2c_write(ov511, 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 = ov51x_i2c_write(ov511, 0x7a,				     (unsigned char)(val >> 8) + 0xb);		if (rc < 0)			goto out;		rc = ov51x_i2c_write(ov511, 0x79, 				     (unsigned char)(val >> 8) + 0xb);		if (rc < 0)

⌨️ 快捷键说明

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