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

📄 etoms.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	struct sd *sd = (struct sd *) gspca_dev;	int i;	int brightness = 0;	for (i = 0; i < 4; i++) {		reg_r(gspca_dev, ET_O_RED + i, 1);		brightness += gspca_dev->usb_buf[0];	}	sd->brightness = brightness >> 3;}static void setcontrast(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	__u8 RGBG[] = { 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 };	__u8 contrast = sd->contrast;	memset(RGBG, contrast, sizeof(RGBG) - 2);	reg_w(gspca_dev, ET_G_RED, RGBG, 6);}static void getcontrast(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	int i;	int contrast = 0;	for (i = 0; i < 4; i++) {		reg_r(gspca_dev, ET_G_RED + i, 1);		contrast += gspca_dev->usb_buf[0];	}	sd->contrast = contrast >> 2;}static void setcolors(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	__u8 I2cc[] = { 0x05, 0x02, 0x02, 0x05, 0x0d };	__u8 i2cflags = 0x01;	/* __u8 green = 0; */	__u8 colors = sd->colors;	I2cc[3] = colors;	/* red */	I2cc[0] = 15 - colors;	/* blue */	/* green = 15 - ((((7*I2cc[0]) >> 2 ) + I2cc[3]) >> 1); */	/* I2cc[1] = I2cc[2] = green; */	if (sd->sensor == SENSOR_PAS106) {		i2c_w(gspca_dev, PAS106_REG13, &i2cflags, 1, 3);		i2c_w(gspca_dev, PAS106_REG9, I2cc, sizeof I2cc, 1);	}/*	PDEBUG(D_CONF , "Etoms red %d blue %d green %d",		I2cc[3], I2cc[0], green); */}static void getcolors(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	if (sd->sensor == SENSOR_PAS106) {/*		i2c_r(gspca_dev, PAS106_REG9);		 * blue */		i2c_r(gspca_dev, PAS106_REG9 + 3);	/* red */		sd->colors = gspca_dev->usb_buf[0] & 0x0f;	}}static void setautogain(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	if (sd->autogain)		sd->ag_cnt = AG_CNT_START;	else		sd->ag_cnt = -1;}static void Et_init1(struct gspca_dev *gspca_dev){	__u8 value;/*	__u8 I2c0 [] = {0x0a, 0x12, 0x05, 0x22, 0xac, 0x00, 0x01, 0x00}; */	__u8 I2c0[] = { 0x0a, 0x12, 0x05, 0x6d, 0xcd, 0x00, 0x01, 0x00 };						/* try 1/120 0x6d 0xcd 0x40 *//*	__u8 I2c0 [] = {0x0a, 0x12, 0x05, 0xfe, 0xfe, 0xc0, 0x01, 0x00};						 * 1/60000 hmm ?? */	PDEBUG(D_STREAM, "Open Init1 ET");	reg_w_val(gspca_dev, ET_GPIO_DIR_CTRL, 7);	reg_r(gspca_dev, ET_GPIO_IN, 1);	reg_w_val(gspca_dev, ET_RESET_ALL, 1);	reg_w_val(gspca_dev, ET_RESET_ALL, 0);	reg_w_val(gspca_dev, ET_ClCK, 0x10);	reg_w_val(gspca_dev, ET_CTRL, 0x19);	/*   compression et subsampling */	if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv)		value = ET_COMP_VAL1;	else		value = ET_COMP_VAL0;	PDEBUG(D_STREAM, "Open mode %d Compression %d",	       gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv,	       value);	reg_w_val(gspca_dev, ET_COMP, value);	reg_w_val(gspca_dev, ET_MAXQt, 0x1d);	reg_w_val(gspca_dev, ET_MINQt, 0x02);	/* undocumented registers */	reg_w_val(gspca_dev, ET_REG1d, 0xff);	reg_w_val(gspca_dev, ET_REG1e, 0xff);	reg_w_val(gspca_dev, ET_REG1f, 0xff);	reg_w_val(gspca_dev, ET_REG20, 0x35);	reg_w_val(gspca_dev, ET_REG21, 0x01);	reg_w_val(gspca_dev, ET_REG22, 0x00);	reg_w_val(gspca_dev, ET_REG23, 0xf7);	reg_w_val(gspca_dev, ET_REG24, 0xff);	reg_w_val(gspca_dev, ET_REG25, 0x07);	/* colors setting */	reg_w_val(gspca_dev, ET_G_RED, 0x80);	reg_w_val(gspca_dev, ET_G_GREEN1, 0x80);	reg_w_val(gspca_dev, ET_G_BLUE, 0x80);	reg_w_val(gspca_dev, ET_G_GREEN2, 0x80);	reg_w_val(gspca_dev, ET_G_GR_H, 0x00);	reg_w_val(gspca_dev, ET_G_GB_H, 0x00);	/* Window control registers */	reg_w_val(gspca_dev, ET_SYNCHRO, 0xf0);	reg_w_val(gspca_dev, ET_STARTX, 0x56);		/* 0x56 */	reg_w_val(gspca_dev, ET_STARTY, 0x05);		/* 0x04 */	reg_w_val(gspca_dev, ET_WIDTH_LOW, 0x60);	reg_w_val(gspca_dev, ET_HEIGTH_LOW, 0x20);	reg_w_val(gspca_dev, ET_W_H_HEIGTH, 0x50);	reg_w_val(gspca_dev, ET_REG6e, 0x86);	reg_w_val(gspca_dev, ET_REG6f, 0x01);	reg_w_val(gspca_dev, ET_REG70, 0x86);	reg_w_val(gspca_dev, ET_REG71, 0x14);	reg_w_val(gspca_dev, ET_REG72, 0x00);	/* Clock Pattern registers */	reg_w_val(gspca_dev, ET_REG73, 0x00);	reg_w_val(gspca_dev, ET_REG74, 0x00);	reg_w_val(gspca_dev, ET_REG75, 0x0a);	reg_w_val(gspca_dev, ET_I2C_CLK, 0x04);	reg_w_val(gspca_dev, ET_PXL_CLK, 0x01);	/* set the sensor */	if (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) {		I2c0[0] = 0x06;		i2c_w(gspca_dev, PAS106_REG2, I2c0, sizeof I2c0, 1);		i2c_w(gspca_dev, PAS106_REG9, I2c2, sizeof I2c2, 1);		value = 0x06;		i2c_w(gspca_dev, PAS106_REG2, &value, 1, 1);		i2c_w(gspca_dev, PAS106_REG3, I2c3, sizeof I2c3, 1);		/* value = 0x1f; */		value = 0x04;		i2c_w(gspca_dev, PAS106_REG0e, &value, 1, 1);	} else {		I2c0[0] = 0x0a;		i2c_w(gspca_dev, PAS106_REG2, I2c0, sizeof I2c0, 1);		i2c_w(gspca_dev, PAS106_REG9, I2c2, sizeof I2c2, 1);		value = 0x0a;		i2c_w(gspca_dev, PAS106_REG2, &value, 1, 1);		i2c_w(gspca_dev, PAS106_REG3, I2c3, sizeof I2c3, 1);		value = 0x04;		/* value = 0x10; */		i2c_w(gspca_dev, PAS106_REG0e, &value, 1, 1);		/* bit 2 enable bit 1:2 select 0 1 2 3		   value = 0x07;                                * curve 0 *		   i2c_w(gspca_dev, PAS106_REG0f, &value, 1, 1);		 */	}/*	value = 0x01; *//*	value = 0x22; *//*	i2c_w(gspca_dev, PAS106_REG5, &value, 1, 1); */	/* magnetude and sign bit for DAC */	i2c_w(gspca_dev, PAS106_REG7, I2c4, sizeof I2c4, 1);	/* now set by fifo the whole colors setting */	reg_w(gspca_dev, ET_G_RED, GainRGBG, 6);	getcolors(gspca_dev);	setcolors(gspca_dev);}/* this function is called at probe time */static int sd_config(struct gspca_dev *gspca_dev,		     const struct usb_device_id *id){	struct sd *sd = (struct sd *) gspca_dev;	struct cam *cam;	cam = &gspca_dev->cam;	cam->epaddr = 1;	sd->sensor = id->driver_info;	if (sd->sensor == SENSOR_PAS106) {		cam->cam_mode = sif_mode;		cam->nmodes = sizeof sif_mode / sizeof sif_mode[0];	} else {		cam->cam_mode = vga_mode;		cam->nmodes = sizeof vga_mode / sizeof vga_mode[0];		gspca_dev->ctrl_dis = (1 << COLOR_IDX);	}	sd->brightness = BRIGHTNESS_DEF;	sd->contrast = CONTRAST_DEF;	sd->colors = COLOR_DEF;	sd->autogain = AUTOGAIN_DEF;	sd->ag_cnt = -1;	return 0;}/* this function is called at probe and resume time */static int sd_init(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	if (sd->sensor == SENSOR_PAS106)		Et_init1(gspca_dev);	else		Et_init2(gspca_dev);	reg_w_val(gspca_dev, ET_RESET_ALL, 0x08);	et_video(gspca_dev, 0);		/* video off */	return 0;}/* -- start the camera -- */static int sd_start(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	if (sd->sensor == SENSOR_PAS106)		Et_init1(gspca_dev);	else		Et_init2(gspca_dev);	setautogain(gspca_dev);	reg_w_val(gspca_dev, ET_RESET_ALL, 0x08);	et_video(gspca_dev, 1);		/* video on */	return 0;}static void sd_stopN(struct gspca_dev *gspca_dev){	et_video(gspca_dev, 0);		/* video off */}static __u8 Et_getgainG(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	if (sd->sensor == SENSOR_PAS106) {		i2c_r(gspca_dev, PAS106_REG0e);		PDEBUG(D_CONF, "Etoms gain G %d", gspca_dev->usb_buf[0]);		return gspca_dev->usb_buf[0];	}	return 0x1f;}static void Et_setgainG(struct gspca_dev *gspca_dev, __u8 gain){	struct sd *sd = (struct sd *) gspca_dev;	if (sd->sensor == SENSOR_PAS106) {		__u8 i2cflags = 0x01;		i2c_w(gspca_dev, PAS106_REG13, &i2cflags, 1, 3);		i2c_w(gspca_dev, PAS106_REG0e, &gain, 1, 1);#if 0		i2c_w(gspca_dev, 0x09, &gain, 1, 1);		i2c_w(gspca_dev, 0x0a, &gain, 1, 1);		i2c_w(gspca_dev, 0x0b, &gain, 1, 1);		i2c_w(gspca_dev, 0x0c, &gain, 1, 1);#endif	}}#define BLIMIT(bright) \	(__u8)((bright > 0x1f)?0x1f:((bright < 4)?3:bright))#define LIMIT(color) \	(unsigned char)((color > 0xff)?0xff:((color < 0)?0:color))static void do_autogain(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	__u8 luma;	__u8 luma_mean = 128;	__u8 luma_delta = 20;	__u8 spring = 4;	int Gbright;	__u8 r, g, b;	if (sd->ag_cnt < 0)		return;	if (--sd->ag_cnt >= 0)		return;	sd->ag_cnt = AG_CNT_START;	Gbright = Et_getgainG(gspca_dev);	reg_r(gspca_dev, ET_LUMA_CENTER, 4);	g = (gspca_dev->usb_buf[0] + gspca_dev->usb_buf[3]) >> 1;	r = gspca_dev->usb_buf[1];	b = gspca_dev->usb_buf[2];	r = ((r << 8) - (r << 4) - (r << 3)) >> 10;	b = ((b << 7) >> 10);	g = ((g << 9) + (g << 7) + (g << 5)) >> 10;	luma = LIMIT(r + g + b);	PDEBUG(D_FRAM, "Etoms luma G %d", luma);	if (luma < luma_mean - luma_delta || luma > luma_mean + luma_delta) {		Gbright += (luma_mean - luma) >> spring;		Gbright = BLIMIT(Gbright);		PDEBUG(D_FRAM, "Etoms Gbright %d", Gbright);		Et_setgainG(gspca_dev, (__u8) Gbright);	}}#undef BLIMIT#undef LIMITstatic void sd_pkt_scan(struct gspca_dev *gspca_dev,			struct gspca_frame *frame,	/* target */			__u8 *data,			/* isoc packet */			int len)			/* iso packet length */{	int seqframe;	seqframe = data[0] & 0x3f;	len = (int) (((data[0] & 0xc0) << 2) | data[1]);	if (seqframe == 0x3f) {		PDEBUG(D_FRAM,		       "header packet found datalength %d !!", len);		PDEBUG(D_FRAM, "G %d R %d G %d B %d",		       data[2], data[3], data[4], data[5]);		data += 30;		/* don't change datalength as the chips provided it */		frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,					data, 0);		gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len);		return;	}	if (len) {		data += 8;		gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);	} else {			/* Drop Packet */		gspca_dev->last_packet_type = DISCARD_PACKET;	}}static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->brightness = val;	if (gspca_dev->streaming)		setbrightness(gspca_dev);	return 0;}static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	getbrightness(gspca_dev);	*val = sd->brightness;	return 0;}static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->contrast = val;	if (gspca_dev->streaming)		setcontrast(gspca_dev);	return 0;}static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	getcontrast(gspca_dev);	*val = sd->contrast;	return 0;}static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->colors = val;	if (gspca_dev->streaming)		setcolors(gspca_dev);	return 0;}static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	getcolors(gspca_dev);	*val = sd->colors;	return 0;}static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->autogain = val;	if (gspca_dev->streaming)		setautogain(gspca_dev);	return 0;}static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->autogain;	return 0;}/* sub-driver description */static struct sd_desc sd_desc = {	.name = MODULE_NAME,	.ctrls = sd_ctrls,	.nctrls = ARRAY_SIZE(sd_ctrls),	.config = sd_config,	.init = sd_init,	.start = sd_start,	.stopN = sd_stopN,	.pkt_scan = sd_pkt_scan,	.dq_callback = do_autogain,};/* -- module initialisation -- */static __devinitdata struct usb_device_id device_table[] = {	{USB_DEVICE(0x102c, 0x6151), .driver_info = SENSOR_PAS106},#if !defined CONFIG_USB_ET61X251 && !defined CONFIG_USB_ET61X251_MODULE	{USB_DEVICE(0x102c, 0x6251), .driver_info = SENSOR_TAS5130CXX},#endif	{}};MODULE_DEVICE_TABLE(usb, device_table);/* -- device connect -- */static int sd_probe(struct usb_interface *intf,		    const struct usb_device_id *id){	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),			       THIS_MODULE);}static struct usb_driver sd_driver = {	.name = MODULE_NAME,	.id_table = device_table,	.probe = sd_probe,	.disconnect = gspca_disconnect,#ifdef CONFIG_PM	.suspend = gspca_suspend,	.resume = gspca_resume,#endif};/* -- module insert / remove -- */static int __init sd_mod_init(void){	if (usb_register(&sd_driver) < 0)		return -1;	PDEBUG(D_PROBE, "registered");	return 0;}static void __exit sd_mod_exit(void){	usb_deregister(&sd_driver);	PDEBUG(D_PROBE, "deregistered");}module_init(sd_mod_init);module_exit(sd_mod_exit);

⌨️ 快捷键说明

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