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

📄 sonix.h

📁 Linux下很强大的万能USB摄像头驱动。解压后
💻 H
📖 第 1 页 / 共 2 页
字号:
	spca50x->brightness = 0x80 << 8;	spca50x->contrast = 0x80 << 8;	return spca50x->brightness;}static __u16sonix_getcontrast(struct usb_spca50x *spca50x){				/*FIXME hardcoded as we need to read register of the tasc */	spca50x->contrast = 0x80 << 8;	return spca50x->contrast;}static voidsonix_setbrightness(struct usb_spca50x *spca50x){	__u8 value;	__u8 i2c[] = { 0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10 };	__u8 i2c1[] = { 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14 };	__u8 i2cOV[] = { 0xa0, 0x21, 0x06, 0x36, 0xbd, 0x06, 0xf6, 0x16 };	__u8 i2cp202[] = { 0xA0, 0x40, 0x10, 0x0E, 0x31, 0x00, 0x63, 0x15 };	__u8 i2cpdoit[] = { 0xA0, 0x40, 0x11, 0x01, 0x31, 0x00, 0x63, 0x16 };	//__u8 i2cpexpo1[] = { 0xB0,0x40,0x04,0x07,0x2A,0x00,0x63,0x16 };	__u8 i2cpexpo[] = { 0xB0, 0x40, 0x0e, 0x01, 0xab, 0x00, 0x63, 0x16 };	if (spca50x->sensor == SENSOR_TAS5130CXX ||	    spca50x->sensor == SENSOR_TAS5110) {		value = (0xFF - (spca50x->brightness >> 8));		i2c[4] = value & 0xFF;		PDEBUG(4, "brightness %d :%d ", value, i2c[4]);		if (sonix_i2cwrite(spca50x->dev, i2c, 8) < 0)			PDEBUG(0, "i2c error brightness");	} else if (spca50x->sensor == SENSOR_PAS106) {		i2c1[3] = spca50x->brightness >> 11;		i2c1[2] = 0x0e;		if (sonix_i2cwrite(spca50x->dev, i2c1, 8) < 0)			PDEBUG(0, "i2c error brightness");		i2c1[3] = 0x01;		i2c1[2] = 0x13;		if (sonix_i2cwrite(spca50x->dev, i2c1, 8) < 0)			PDEBUG(0, "i2c error brightness");	} else if (spca50x->sensor == SENSOR_OV7630) {		// change reg 0x06		i2cOV[3] = spca50x->brightness >> 8;		if (sonix_i2cwrite(spca50x->dev, i2cOV, 8) < 0)			PDEBUG(0, "i2c error brightness");	} else if (spca50x->sensor == SENSOR_PAS202) {		// change reg 0x10		i2cpexpo[4] = 0xff - (spca50x->brightness >> 8);		//if(sonix_i2cwrite(spca50x->dev,i2cpexpo1,8) < 0) PDEBUG(0,"i2c error brightness");		//if(sonix_i2cwrite(spca50x->dev,i2cpdoit,8) < 0) PDEBUG(0,"i2c error brightness");		if (sonix_i2cwrite(spca50x->dev, i2cpexpo, 8) < 0)			PDEBUG(0, "i2c error brightness");		if (sonix_i2cwrite(spca50x->dev, i2cpdoit, 8) < 0)			PDEBUG(0, "i2c error brightness");		i2cp202[3] = (spca50x->brightness >> 11);		if (sonix_i2cwrite(spca50x->dev, i2cp202, 8) < 0)			PDEBUG(0, "i2c error brightness");		if (sonix_i2cwrite(spca50x->dev, i2cpdoit, 8) < 0)			PDEBUG(0, "i2c error brightness");	}}static voidsonix_setcontrast(struct usb_spca50x *spca50x){	__u8 gain = 0;	__u8 rgb_value = 0;	gain = (spca50x->contrast >> 12) & 0x0F;	/* red and blue gain */	rgb_value = gain << 4 | gain;	sonixRegWrite(spca50x->dev, 0x08, 0x10, 0x0000, &rgb_value, 1);	/* green gain */	rgb_value = gain;	sonixRegWrite(spca50x->dev, 0x08, 0x11, 0x0000, &rgb_value, 1);}static intsonix_init(struct usb_spca50x *spca50x){	__u8 ByteReceive = 0x00;	sonixRegRead(spca50x->dev, 0x00, 0x00, 0x0000, &ByteReceive, 1);	if (ByteReceive != 0x10)		return -ENODEV;	return 0;}static inttas5130_I2cinit(struct usb_spca50x *spca50x){	//__u8 i2c10[]= { 0x30,0x11,0x00,0x40,0x47,0x00,0x00,0x10 }; // shutter 0x47 short exposure?	__u8 i2c10[] = { 0x30, 0x11, 0x00, 0x40, 0x01, 0x00, 0x00, 0x10 };	// shutter 0x01 long exposure 	__u8 i2c2[] = { 0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10 };	if (sonix_i2cwrite(spca50x->dev, i2c10, 8) < 0)		PDEBUG(0, "i2c error i2c10");	if (sonix_i2cwrite(spca50x->dev, i2c2, 8) < 0)		PDEBUG(0, "i2c error i2c2");	return 0;}static intpas106_I2cinit(struct usb_spca50x *spca50x){	__u8 i2c1[] = { 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14 };	int i = 0;	while (pas106_data[i][0]) {		memcpy(&i2c1[2], &pas106_data[i++][0], 2);	//copy 2 bytes from the template		if (sonix_i2cwrite(spca50x->dev, i2c1, 8) < 0)			PDEBUG(0, "i2c error pas106");	}	return 0;}static intov7630_I2cinit(struct usb_spca50x *spca50x){	int i = 0;	while (ov7630_sensor_init[i][0]) {		if (sonix_i2cwrite(spca50x->dev, ov7630_sensor_init[i], 8) < 0)			PDEBUG(0, "i2c error ov7630");		i++;	}	return 0;}static inttas5110_I2cinit(struct usb_spca50x *spca50x){	int i = 0;	while (tas5110_sensor_init[i][0]) {		if (sonix_i2cwrite(spca50x->dev, tas5110_sensor_init[i], 8) < 0)			PDEBUG(0, "i2c error tas5110");		i++;	}	return 0;}static inthv7131_I2cinit(struct usb_spca50x *spca50x){	int i = 0;	while (hv7131_sensor_init[i][0]) {		if (sonix_i2cwrite(spca50x->dev, hv7131_sensor_init[i], 8) < 0)			PDEBUG(0, "i2c error hv7131");		i++;	}	return 0;}static intpas202_I2cinit(struct usb_spca50x *spca50x){	int i = 0;	while (pas202_sensor_init[i][0]) {		if (sonix_i2cwrite(spca50x->dev, pas202_sensor_init[i], 8) < 0)			PDEBUG(0, "i2c error pas202");		i++;	}	return 0;}static voidsonix_start(struct usb_spca50x *spca50x){	__u8 compress = 0;	__u8 MCK_SIZE = 0x33;	__u8 frmult = 0x28;	__u8 *sn9c10x = NULL;	__u8 CompressCtrl[] = { 0, 0 };	int err = 0;	switch (spca50x->sensor) {	case SENSOR_OV7630:		sn9c10x = initOv7630;		compress = spca50x->mode << 4 | COMP2;		CompressCtrl[0] = compress;		frmult = 0x68;		CompressCtrl[1] = 0x20;		MCK_SIZE = 0x20;		break;	case SENSOR_TAS5130CXX:		sn9c10x = initTas5130;		compress = spca50x->mode << 4 | COMP;		CompressCtrl[0] = compress;		frmult = 0x60;		switch (spca50x->mode) {		case 0:	/* 640x480 3fp/s */			CompressCtrl[1] = 0x43;	//0xA3 3fp/s ;// 0xF3;			MCK_SIZE = 0x43;	// 0xA3;//0xF3;			break;		case 1:	/* 320x240 0x33 10fp/s */			CompressCtrl[1] = 0x23;			MCK_SIZE = 0x23;			break;		case 2:	/* 160x120 15fp/s */			CompressCtrl[1] = 0x23;			MCK_SIZE = 0x23;			break;		default:			break;		}		break;	case SENSOR_PAS106:		sn9c10x = initPas106;;		compress = spca50x->mode << 4 | COMP1;		CompressCtrl[0] = compress;		frmult = 0x24;	//0x28		CompressCtrl[1] = 0x20;	//0xF3;		MCK_SIZE = 0x20;	//0xF3;		break;	case SENSOR_TAS5110:		sn9c10x = initTas5110;		compress = spca50x->mode << 4 | 0x86;		CompressCtrl[0] = compress;		frmult = 0x60;		CompressCtrl[1] = 0x2b;	//0xF3;		MCK_SIZE = 0x2b;	//0xF3;		break;	case SENSOR_HV7131R:		sn9c10x = initHv7131;		compress = spca50x->mode << 4 | 0x8a;		CompressCtrl[0] = compress;		frmult = 0x60;		CompressCtrl[1] = 0x20;		MCK_SIZE = 0x20;		break;	case SENSOR_PAS202:		sn9c10x = initPas202;		compress = spca50x->mode << 4 | 0x89;		CompressCtrl[0] = compress;		frmult = 0x20;	//reg17 // 7 fp/s VGA		if (spca50x->mode)			frmult = 0x24;	// 0x28->11fp/s SIF 0x24		CompressCtrl[1] = 0x20;	//reg19 30		MCK_SIZE = 0x20;		break;	}	/* reg 0x01 bit 2 video transfert on */	sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, &sn9c10x[0], 1);	/* reg 0x17 SensorClk enable inv Clk 0x60 */	sonixRegWrite(spca50x->dev, 0x08, 0x17, 0x0000, &sn9c10x[0x17 - 1], 1);	/* Set the whole registers from the template */	sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, sn9c10x, 0x1f);	switch (spca50x->sensor) {	case SENSOR_TAS5130CXX:		err = tas5130_I2cinit(spca50x);		break;	case SENSOR_PAS106:		err = pas106_I2cinit(spca50x);		break;	case SENSOR_OV7630:		err = ov7630_I2cinit(spca50x);		break;	case SENSOR_HV7131R:		err = hv7131_I2cinit(spca50x);		break;	case SENSOR_TAS5110:		err = tas5110_I2cinit(spca50x);		break;	case SENSOR_PAS202:		err = pas202_I2cinit(spca50x);		break;	default:		err = -EINVAL;		break;	}	/* H_size V_size  0x28,0x1e maybe 640x480 */	sonixRegWrite(spca50x->dev, 0x08, 0x15, 0x0000, &sn9c10x[0x15 - 1],		      0x02);	/* compression register */	sonixRegWrite(spca50x->dev, 0x08, 0x18, 0x0000, &compress, 1);	// H_start      	sonixRegWrite(spca50x->dev, 0x08, 0x12, 0x0000, &sn9c10x[0x12 - 1], 1);	// V_START      	sonixRegWrite(spca50x->dev, 0x08, 0x13, 0x0000, &sn9c10x[0x13 - 1], 1);	/* re set 0x17 SensorClk enable inv Clk 0x60 */	sonixRegWrite(spca50x->dev, 0x08, 0x17, 0x0000, &frmult, 1);	/*MCKSIZE ->3 */	sonixRegWrite(spca50x->dev, 0x08, 0x19, 0x0000, &MCK_SIZE, 1);	/* AE_STRX AE_STRY AE_ENDX AE_ENDY */	sonixRegWrite(spca50x->dev, 0x08, 0x1c, 0x0000, &sn9c10x[0x1c - 1], 4);	/* Enable video transfert */	sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, &sn9c10x[0], 1);	/* Compression */	sonixRegWrite(spca50x->dev, 0x08, 0x18, 0x0000, CompressCtrl, 2);	sonix_setcontrast(spca50x);	sonix_setbrightness(spca50x);}static intsonix_config(struct usb_spca50x *spca50x){	switch (spca50x->sensor) {	case SENSOR_OV7660:	case SENSOR_MO4000:	case SENSOR_OV7630:	case SENSOR_TAS5130CXX:	case SENSOR_HV7131R:	case SENSOR_MI0360:	case SENSOR_PAS202:		set_sonixVGA(spca50x);		break;	case SENSOR_PAS106:	case SENSOR_TAS5110:		set_sonixSIF(spca50x);		break;	default:		return -EINVAL;		break;	}	spca50x->qindex = 4;	//set the quantization table	return 0;}static voidsonix_stopN(struct usb_spca50x *spca50x){	__u8 ByteSend = 0;	ByteSend = 0x09;	// 0X00	sonixRegWrite(spca50x->dev, 0x08, 0x01, 0x0000, &ByteSend, 1);}static intsonix_sofdetect(struct usb_spca50x *spca50x, struct spca50x_frame *frame,		unsigned char *cdata, int *iPix, int seqnum, int *datalength){	int sof = 0;	int j = 0;	int p = 0;	if (*datalength < 24) {		if (*datalength > 6) {			j = *datalength - 6;		} else {			j = 0;		}		if (j > 0) {			for (p = 0; p < j; p++) {				if ((cdata[0 + p] == 0xFF)				    && (cdata[1 + p] == 0xFF)				    && (cdata[2 + p] == 0x00)				    && (cdata[3 + p] == 0xC4)				    && (cdata[4 + p] == 0xC4)				    && (cdata[5 + p] == 0x96)) {					sof = 1;					break;				}			}		}	}	if (sof) {		*iPix = p + 12;		*datalength -= *iPix;		return 0;		PDEBUG(5,		       "Sonix header packet found %d datalength %d !!",		       p, *datalength);	} else		*iPix = 0;	return seqnum + 1;}#endif				/* SONIXUSB_H */

⌨️ 快捷键说明

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