pac207.c

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

C
579
字号
	pac207_write_regs(gspca_dev, 0x000a, pac207_sensor_init[1], 8);	pac207_write_regs(gspca_dev, 0x0012, pac207_sensor_init[2], 8);	pac207_write_regs(gspca_dev, 0x0040, pac207_sensor_init[3], 8);	pac207_write_regs(gspca_dev, 0x0042, pac207_sensor_init[4], 8);	pac207_write_regs(gspca_dev, 0x0048, PacReg72, 4);	/* Compression Balance */	if (gspca_dev->width == 176)		pac207_write_reg(gspca_dev, 0x4a, 0xff);	else		pac207_write_reg(gspca_dev, 0x4a, 0x88);	pac207_write_reg(gspca_dev, 0x4b, 0x00); /* Sram test value */	pac207_write_reg(gspca_dev, 0x08, sd->brightness);	/* PGA global gain (Bit 4-0) */	pac207_write_reg(gspca_dev, 0x0e, sd->gain);	pac207_write_reg(gspca_dev, 0x02, sd->exposure); /* PXCK = 12MHz /n */	mode = 0x02; /* Image Format (Bit 0), LED (1), Compr. test mode (2) */	if (gspca_dev->width == 176) {	/* 176x144 */		mode |= 0x01;		PDEBUG(D_STREAM, "pac207_start mode 176x144");	} else {				/* 352x288 */		PDEBUG(D_STREAM, "pac207_start mode 352x288");	}	pac207_write_reg(gspca_dev, 0x41, mode);	pac207_write_reg(gspca_dev, 0x13, 0x01); /* Bit 0, auto clear */	pac207_write_reg(gspca_dev, 0x1c, 0x01); /* not documented */	msleep(10);	pac207_write_reg(gspca_dev, 0x40, 0x01); /* Start ISO pipe */	sd->sof_read = 0;	sd->autogain_ignore_frames = 0;	atomic_set(&sd->avg_lum, -1);	return 0;}static void sd_stopN(struct gspca_dev *gspca_dev){	pac207_write_reg(gspca_dev, 0x40, 0x00); /* Stop ISO pipe */	pac207_write_reg(gspca_dev, 0x41, 0x00); /* Turn of LED */	pac207_write_reg(gspca_dev, 0x0f, 0x00); /* Power Control */}/* Include pac common sof detection functions */#include "pac_common.h"static void pac207_do_auto_gain(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	int avg_lum = atomic_read(&sd->avg_lum);	if (avg_lum == -1)		return;	if (sd->autogain_ignore_frames > 0)		sd->autogain_ignore_frames--;	else if (gspca_auto_gain_n_exposure(gspca_dev, avg_lum,			100 + sd->brightness / 2, PAC207_AUTOGAIN_DEADZONE,			PAC207_GAIN_KNEE, PAC207_EXPOSURE_KNEE))		sd->autogain_ignore_frames = PAC_AUTOGAIN_IGNORE_FRAMES;}static void sd_pkt_scan(struct gspca_dev *gspca_dev,			struct gspca_frame *frame,			__u8 *data,			int len){	struct sd *sd = (struct sd *) gspca_dev;	unsigned char *sof;	sof = pac_find_sof(gspca_dev, data, len);	if (sof) {		int n;		/* finish decoding current frame */		n = sof - data;		if (n > sizeof pac_sof_marker)			n -= sizeof pac_sof_marker;		else			n = 0;		frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,					data, n);		sd->header_read = 0;		gspca_frame_add(gspca_dev, FIRST_PACKET, frame, NULL, 0);		len -= sof - data;		data = sof;	}	if (sd->header_read < 11) {		int needed;		/* get average lumination from frame header (byte 5) */		if (sd->header_read < 5) {			needed = 5 - sd->header_read;			if (len >= needed)				atomic_set(&sd->avg_lum, data[needed - 1]);		}		/* skip the rest of the header */		needed = 11 - sd->header_read;		if (len <= needed) {			sd->header_read += len;			return;		}		data += needed;		len -= needed;		sd->header_read = 11;	}	gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);}static void setbrightness(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	pac207_write_reg(gspca_dev, 0x08, sd->brightness);	pac207_write_reg(gspca_dev, 0x13, 0x01);	/* Bit 0, auto clear */	pac207_write_reg(gspca_dev, 0x1c, 0x01);	/* not documented */}static void setexposure(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	pac207_write_reg(gspca_dev, 0x02, sd->exposure);	pac207_write_reg(gspca_dev, 0x13, 0x01);	/* Bit 0, auto clear */	pac207_write_reg(gspca_dev, 0x1c, 0x01);	/* not documented */}static void setgain(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	pac207_write_reg(gspca_dev, 0x0e, sd->gain);	pac207_write_reg(gspca_dev, 0x13, 0x01);	/* Bit 0, auto clear */	pac207_write_reg(gspca_dev, 0x1c, 0x01);	/* not documented */}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 0;}static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->exposure = val;	if (gspca_dev->streaming)		setexposure(gspca_dev);	return 0;}static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->exposure;	return 0;}static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->gain = val;	if (gspca_dev->streaming)		setgain(gspca_dev);	return 0;}static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val){	struct sd *sd = (struct sd *) gspca_dev;	*val = sd->gain;	return 0;}static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val){	struct sd *sd = (struct sd *) gspca_dev;	sd->autogain = val;	/* when switching to autogain set defaults to make sure	   we are on a valid point of the autogain gain /	   exposure knee graph, and give this change time to	   take effect before doing autogain. */	if (sd->autogain) {		sd->exposure = PAC207_EXPOSURE_DEFAULT;		sd->gain = PAC207_GAIN_DEFAULT;		if (gspca_dev->streaming) {			sd->autogain_ignore_frames =				PAC_AUTOGAIN_IGNORE_FRAMES;			setexposure(gspca_dev);			setgain(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 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,	.dq_callback = pac207_do_auto_gain,	.pkt_scan = sd_pkt_scan,};/* -- module initialisation -- */static const __devinitdata struct usb_device_id device_table[] = {	{USB_DEVICE(0x041e, 0x4028)},	{USB_DEVICE(0x093a, 0x2460)},	{USB_DEVICE(0x093a, 0x2463)},	{USB_DEVICE(0x093a, 0x2464)},	{USB_DEVICE(0x093a, 0x2468)},	{USB_DEVICE(0x093a, 0x2470)},	{USB_DEVICE(0x093a, 0x2471)},	{USB_DEVICE(0x093a, 0x2472)},	{USB_DEVICE(0x093a, 0x2476)},	{USB_DEVICE(0x2001, 0xf115)},	{}};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 + -
显示快捷键?