t613.c

来自「trident tm5600的linux驱动」· C语言 代码 · 共 1,192 行 · 第 1/3 页

C
1,192
字号
		 0x74, 0x32, 0x75, 0x92, 0x76, 0x00, 0x09, 0x01,		 0x60, 0x14};	static const __u8 poll2[] =		{0x67, 0x02, 0x68, 0x71, 0x69, 0x72, 0x72, 0xa9,		 0x73, 0x02, 0x73, 0x02, 0x60, 0x14};	static const __u8 poll3[] =		{0x87, 0x3f, 0x88, 0x20, 0x89, 0x2d};	static const __u8 poll4[] =		{0xa6, 0x0a, 0xea, 0xcf, 0xbe, 0x26, 0xb1, 0x5f,		 0xa1, 0xb1, 0xda, 0x6b, 0xdb, 0x98, 0xdf, 0x0c,		 0xc2, 0x80, 0xc3, 0x10};	if (sd->sensor != SENSOR_TAS5130A) {		PDEBUG(D_STREAM, "[Sensor requires polling]");		reg_w_buf(gspca_dev, poll1, sizeof poll1);		reg_w_buf(gspca_dev, poll2, sizeof poll2);		reg_w_buf(gspca_dev, poll3, sizeof poll3);		reg_w_buf(gspca_dev, poll4, sizeof poll4);	}}static int sd_start(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	int i, mode;	__u8 t2[] = { 0x07, 0x00, 0x0d, 0x60, 0x0e, 0x80 };	static const __u8 t3[] =		{ 0xb3, 0x07, 0xb4, 0x00, 0xb5, 0x88, 0xb6, 0x02, 0xb7, 0x06,		  0xb8, 0x00, 0xb9, 0xe7, 0xba, 0x01 };	mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode]. priv;	switch (mode) {	case 1:		/* 352x288 */		t2[1] = 0x40;		break;	case 2:		/* 320x240 */		t2[1] = 0x10;		break;	case 3:		/* 176x144 */		t2[1] = 0x50;		break;	case 4:		/* 160x120 */		t2[1] = 0x20;		break;	default:	/* 640x480 (0x00) */		break;	}	if (sd->sensor == SENSOR_TAS5130A) {		i = 0;		while (tas5130a_sensor_init[i][0] != 0) {			reg_w_buf(gspca_dev, tas5130a_sensor_init[i],					 sizeof tas5130a_sensor_init[0]);			i++;		}		reg_w(gspca_dev, 0x3c80);		/* just in case and to keep sync with logs (for mine) */		reg_w_buf(gspca_dev, tas5130a_sensor_init[3],				 sizeof tas5130a_sensor_init[0]);		reg_w(gspca_dev, 0x3c80);	} else {		om6802_sensor_init(gspca_dev);	}	reg_w_buf(gspca_dev, sensor_data[sd->sensor].data4,			sizeof sensor_data[sd->sensor].data4);	reg_r(gspca_dev, 0x0012);	reg_w_buf(gspca_dev, t2, sizeof t2);	reg_w_buf(gspca_dev, t3, sizeof t3);	reg_w(gspca_dev, 0x0013);	msleep(15);	reg_w_buf(gspca_dev, sensor_data[sd->sensor].stream,			sizeof sensor_data[sd->sensor].stream);	poll_sensor(gspca_dev);	/* restart on each start, just in case, sometimes regs goes wrong	 * when using controls from app */	setbrightness(gspca_dev);	setcontrast(gspca_dev);	setcolors(gspca_dev);#if 0	seteffect(gspca_dev);	setflip(gspca_dev);#endif	return 0;}static void sd_stopN(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	reg_w_buf(gspca_dev, sensor_data[sd->sensor].stream,			sizeof sensor_data[sd->sensor].stream);	msleep(20);	reg_w_buf(gspca_dev, sensor_data[sd->sensor].stream,			sizeof sensor_data[sd->sensor].stream);	msleep(20);	reg_w(gspca_dev, 0x0309);}static void sd_pkt_scan(struct gspca_dev *gspca_dev,			struct gspca_frame *frame,	/* target */			__u8 *data,			/* isoc packet */			int len)			/* iso packet length */{	static __u8 ffd9[] = { 0xff, 0xd9 };	if (data[0] == 0x5a) {		/* Control Packet, after this came the header again,		 * but extra bytes came in the packet before this,		 * sometimes an EOF arrives, sometimes not... */		return;	}	data += 2;	len -= 2;	if (data[0] == 0xff && data[1] == 0xd8) {		/* extra bytes....., could be processed too but would be		 * a waste of time, right now leave the application and		 * libjpeg do it for ourserlves.. */		frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,					ffd9, 2);		gspca_frame_add(gspca_dev, FIRST_PACKET, frame, data, len);		return;	}	if (data[len - 2] == 0xff && data[len - 1] == 0xd9) {		/* Just in case, i have seen packets with the marker,		 * other's do not include it... */		len -= 2;	}	gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);}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;	*val = sd->brightness;	return *val;}static int sd_setwhitebalance(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->whitebalance = val;	if (gspca_dev->streaming)		setwhitebalance(gspca_dev);	return 0;}static int sd_getwhitebalance(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->whitebalance;	return *val;}static int sd_setflip(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->mirror = val;	if (gspca_dev->streaming)		setflip(gspca_dev);	return 0;}static int sd_getflip(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->mirror;	return *val;}static int sd_seteffect(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->effect = val;	if (gspca_dev->streaming)		seteffect(gspca_dev);	return 0;}static int sd_geteffect(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->effect;	return *val;}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;	*val = sd->contrast;	return *val;}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;	*val = sd->colors;	return 0;}static int sd_setgamma(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->gamma = val;	if (gspca_dev->streaming)		setgamma(gspca_dev);	return 0;}static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->gamma;	return 0;}static int sd_setfreq(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->freq = val;	if (gspca_dev->streaming)		setlightfreq(gspca_dev);	return 0;}static int sd_getfreq(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->freq;	return 0;}static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->sharpness = val;	if (gspca_dev->streaming)		setsharpness(gspca_dev);	return 0;}static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->sharpness;	return 0;}/* Low Light set  here......*/static int sd_setlowlight(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->autogain = val;	if (val != 0)		reg_w(gspca_dev, 0xf48e);	else		reg_w(gspca_dev, 0xb48e);	return 0;}static int sd_getlowlight(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->autogain;	return 0;}static int sd_querymenu(struct gspca_dev *gspca_dev,			struct v4l2_querymenu *menu){	switch (menu->id) {	case V4L2_CID_POWER_LINE_FREQUENCY:		switch (menu->index) {		case 1:		/* V4L2_CID_POWER_LINE_FREQUENCY_50HZ */			strcpy((char *) menu->name, "50 Hz");			return 0;		case 2:		/* V4L2_CID_POWER_LINE_FREQUENCY_60HZ */			strcpy((char *) menu->name, "60 Hz");			return 0;		}		break;	case V4L2_CID_EFFECTS:		if ((unsigned) menu->index < ARRAY_SIZE(effects_control)) {			strncpy((char *) menu->name,				effects_control[menu->index], 32);			return 0;		}		break;	}	return -EINVAL;}/* sub-driver description */static const 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,	.querymenu = sd_querymenu,};/* -- module initialisation -- */static const __devinitdata struct usb_device_id device_table[] = {	{USB_DEVICE(0x17a1, 0x0128)},	{}};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 + =
减小字号Ctrl + -
显示快捷键?