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

📄 sunplus.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
/*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA536: */		if (sd->subtype == MegapixV4 ||		    sd->subtype == LogitechClickSmart820) {			reg_w(gspca_dev, 0xf0, 0, 0, 0);			spca504B_WaitCmdStatus(gspca_dev);			reg_r(gspca_dev, 0xf0, 4, 0);			spca504B_WaitCmdStatus(gspca_dev);		} else {			reg_w(gspca_dev, 0x31, 0, 4, 0);			spca504B_WaitCmdStatus(gspca_dev);			rc = spca504B_PollingDataReady(gspca_dev);		}		break;	case BRIDGE_SPCA504:		if (sd->subtype == AiptekMiniPenCam13) {			for (i = 0; i < 6; i++)				info[i] = reg_r_1(gspca_dev, i);			PDEBUG(D_STREAM,				"Read info: %d %d %d %d %d %d."				" Should be 1,0,2,2,0,0",				info[0], info[1], info[2],				info[3], info[4], info[5]);			/* spca504a aiptek */			/* Set AE AWB Banding Type 3-> 50Hz 2-> 60Hz */			spca504A_acknowledged_command(gspca_dev, 0x24,							8, 3, 0x9e, 1);			/* Twice sequencial need status 0xff->0x9e->0x9d */			spca504A_acknowledged_command(gspca_dev, 0x24,							8, 3, 0x9e, 0);			spca504A_acknowledged_command(gspca_dev, 0x24,							0, 0, 0x9d, 1);		} else {			spca504_acknowledged_command(gspca_dev, 0x24, 8, 3);			for (i = 0; i < 6; i++)				info[i] = reg_r_1(gspca_dev, i);			PDEBUG(D_STREAM,				"Read info: %d %d %d %d %d %d."				" Should be 1,0,2,2,0,0",				info[0], info[1], info[2],				info[3], info[4], info[5]);			spca504_acknowledged_command(gspca_dev, 0x24, 8, 3);			spca504_acknowledged_command(gspca_dev, 0x24, 0, 0);		}		spca504B_SetSizeType(gspca_dev);		reg_w_riv(dev, 0x0, 0x270c, 0x05);	/* L92 sno1t.txt */		reg_w_riv(dev, 0x0, 0x2310, 0x05);		break;	case BRIDGE_SPCA504C:		if (sd->subtype == LogitechClickSmart420) {			write_vector(gspca_dev,					spca504A_clicksmart420_init_data);		} else {			write_vector(gspca_dev, spca504_pccam600_init_data);		}		enable = (sd->autogain ? 0x04 : 0x01);		reg_w_riv(dev, 0x0c, 0x0000, enable);	/* auto exposure */		reg_w_riv(dev, 0xb0, 0x0000, enable);	/* auto whiteness */		/* set default exposure compensation and whiteness balance */		reg_w_riv(dev, 0x30, 0x0001, 800);	/* ~ 20 fps */		reg_w_riv(dev, 0x30, 0x0002, 1600);		spca504B_SetSizeType(gspca_dev);		break;	}	sp5xx_initContBrigHueRegisters(gspca_dev);	return 0;}static void sd_stopN(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	struct usb_device *dev = gspca_dev->dev;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA536: *//*	case BRIDGE_SPCA504B: */		reg_w(gspca_dev, 0x31, 0, 0, 0);		spca504B_WaitCmdStatus(gspca_dev);		spca504B_PollingDataReady(gspca_dev);		break;	case BRIDGE_SPCA504:	case BRIDGE_SPCA504C:		reg_w_riv(dev, 0x00, 0x2000, 0x0000);		if (sd->subtype == AiptekMiniPenCam13) {			/* spca504a aiptek *//*			spca504A_acknowledged_command(gspca_dev, 0x08,							 6, 0, 0x86, 1); */			spca504A_acknowledged_command(gspca_dev, 0x24,							0x00, 0x00, 0x9d, 1);			spca504A_acknowledged_command(gspca_dev, 0x01,							0x0f, 0x00, 0xff, 1);		} else {			spca504_acknowledged_command(gspca_dev, 0x24, 0, 0);			reg_w_riv(dev, 0x01, 0x000f, 0x00);		}		break;	}}static void sd_pkt_scan(struct gspca_dev *gspca_dev,			struct gspca_frame *frame,	/* target */			__u8 *data,			/* isoc packet */			int len)			/* iso packet length */{	struct sd *sd = (struct sd *) gspca_dev;	int i, sof = 0;	unsigned char *s, *d;	static unsigned char ffd9[] = {0xff, 0xd9};/* frames are jpeg 4.1.1 without 0xff escape */	switch (sd->bridge) {	case BRIDGE_SPCA533:		if (data[0] == 0xff) {			if (data[1] != 0x01) {	/* drop packet *//*				gspca_dev->last_packet_type = DISCARD_PACKET; */				return;			}			sof = 1;			data += SPCA533_OFFSET_DATA;			len -= SPCA533_OFFSET_DATA;		} else {			data += 1;			len -= 1;		}		break;	case BRIDGE_SPCA536:		if (data[0] == 0xff) {			sof = 1;			data += SPCA536_OFFSET_DATA;			len -= SPCA536_OFFSET_DATA;		} else {			data += 2;			len -= 2;		}		break;	default:/*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504B: */		switch (data[0]) {		case 0xfe:			/* start of frame */			sof = 1;			data += SPCA50X_OFFSET_DATA;			len -= SPCA50X_OFFSET_DATA;			break;		case 0xff:			/* drop packet *//*			gspca_dev->last_packet_type = DISCARD_PACKET; */			return;		default:			data += 1;			len -= 1;			break;		}		break;	case BRIDGE_SPCA504C:		switch (data[0]) {		case 0xfe:			/* start of frame */			sof = 1;			data += SPCA504_PCCAM600_OFFSET_DATA;			len -= SPCA504_PCCAM600_OFFSET_DATA;			break;		case 0xff:			/* drop packet *//*			gspca_dev->last_packet_type = DISCARD_PACKET; */			return;		default:			data += 1;			len -= 1;			break;		}		break;	}	if (sof) {		/* start of frame */		frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,					ffd9, 2);		/* put the JPEG header in the new frame */		jpeg_put_header(gspca_dev, frame,				((struct sd *) gspca_dev)->qindex,				0x22);	}	/* add 0x00 after 0xff */	for (i = len; --i >= 0; )		if (data[i] == 0xff)			break;	if (i < 0) {			/* no 0xff */		gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);		return;	}	s = data;	d = sd->packet;	for (i = 0; i < len; i++) {		*d++ = *s++;		if (s[-1] == 0xff)			*d++ = 0x00;	}	gspca_frame_add(gspca_dev, INTER_PACKET, frame,			sd->packet, d - sd->packet);}static void setbrightness(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	struct usb_device *dev = gspca_dev->dev;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504C: */		reg_w_riv(dev, 0x0, 0x21a7, sd->brightness);		break;	case BRIDGE_SPCA536:		reg_w_riv(dev, 0x0, 0x20f0, sd->brightness);		break;	}}static void getbrightness(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	__u16 brightness = 0;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504C: */		brightness = reg_r_12(gspca_dev, 0x00, 0x21a7, 2);		break;	case BRIDGE_SPCA536:		brightness = reg_r_12(gspca_dev, 0x00, 0x20f0, 2);		break;	}	sd->brightness = ((brightness & 0xff) - 128) % 255;}static void setcontrast(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	struct usb_device *dev = gspca_dev->dev;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504C: */		reg_w_riv(dev, 0x0, 0x21a8, sd->contrast);		break;	case BRIDGE_SPCA536:		reg_w_riv(dev, 0x0, 0x20f1, sd->contrast);		break;	}}static void getcontrast(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504C: */		sd->contrast = reg_r_12(gspca_dev, 0x00, 0x21a8, 2);		break;	case BRIDGE_SPCA536:		sd->contrast = reg_r_12(gspca_dev, 0x00, 0x20f1, 2);		break;	}}static void setcolors(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	struct usb_device *dev = gspca_dev->dev;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504C: */		reg_w_riv(dev, 0x0, 0x21ae, sd->colors);		break;	case BRIDGE_SPCA536:		reg_w_riv(dev, 0x0, 0x20f6, sd->colors);		break;	}}static void getcolors(struct gspca_dev *gspca_dev){	struct sd *sd = (struct sd *) gspca_dev;	switch (sd->bridge) {	default:/*	case BRIDGE_SPCA533: *//*	case BRIDGE_SPCA504B: *//*	case BRIDGE_SPCA504: *//*	case BRIDGE_SPCA504C: */		sd->colors = reg_r_12(gspca_dev, 0x00, 0x21ae, 2) >> 1;		break;	case BRIDGE_SPCA536:		sd->colors = reg_r_12(gspca_dev, 0x00, 0x20f6, 2) >> 1;		break;	}}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;	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,	.pkt_scan = sd_pkt_scan,};/* -- module initialisation -- */#define BS(bridge, subtype) \	.driver_info = (BRIDGE_ ## bridge << 8) \			| (subtype)static const __devinitdata struct usb_device_id device_table[] = {	{USB_DEVICE(0x041e, 0x400b), BS(SPCA504C, 0)},	{USB_DEVICE(0x041e, 0x4012), BS(SPCA504C, 0)},	{USB_DEVICE(0x041e, 0x4013), BS(SPCA504C, 0)},	{USB_DEVICE(0x0458, 0x7006), BS(SPCA504B, 0)},	{USB_DEVICE(0x0461, 0x0821), BS(SPCA533, 0)},	{USB_DEVICE(0x046d, 0x0905), BS(SPCA533, LogitechClickSmart820)},	{USB_DEVICE(0x046d, 0x0960), BS(SPCA504C, LogitechClickSmart420)},	{USB_DEVICE(0x0471, 0x0322), BS(SPCA504B, 0)},	{USB_DEVICE(0x04a5, 0x3003), BS(SPCA504B, 0)},	{USB_DEVICE(0x04a5, 0x3008), BS(SPCA533, 0)},	{USB_DEVICE(0x04a5, 0x300a), BS(SPCA533, 0)},	{USB_DEVICE(0x04f1, 0x1001), BS(SPCA504B, 0)},	{USB_DEVICE(0x04fc, 0x500c), BS(SPCA504B, 0)},	{USB_DEVICE(0x04fc, 0x504a), BS(SPCA504, AiptekMiniPenCam13)},	{USB_DEVICE(0x04fc, 0x504b), BS(SPCA504B, 0)},	{USB_DEVICE(0x04fc, 0x5330), BS(SPCA533, 0)},	{USB_DEVICE(0x04fc, 0x5360), BS(SPCA536, 0)},	{USB_DEVICE(0x04fc, 0xffff), BS(SPCA504B, 0)},	{USB_DEVICE(0x052b, 0x1513), BS(SPCA533, MegapixV4)},	{USB_DEVICE(0x0546, 0x3155), BS(SPCA533, 0)},	{USB_DEVICE(0x0546, 0x3191), BS(SPCA504B, 0)},	{USB_DEVICE(0x0546, 0x3273), BS(SPCA504B, 0)},	{USB_DEVICE(0x055f, 0xc211), BS(SPCA536, 0)},	{USB_DEVICE(0x055f, 0xc230), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc232), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc360), BS(SPCA536, 0)},	{USB_DEVICE(0x055f, 0xc420), BS(SPCA504, 0)},	{USB_DEVICE(0x055f, 0xc430), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc440), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc520), BS(SPCA504, 0)},	{USB_DEVICE(0x055f, 0xc530), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc540), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc630), BS(SPCA533, 0)},	{USB_DEVICE(0x055f, 0xc650), BS(SPCA533, 0)},	{USB_DEVICE(0x05da, 0x1018), BS(SPCA504B, 0)},	{USB_DEVICE(0x06d6, 0x0031), BS(SPCA533, 0)},	{USB_DEVICE(0x0733, 0x1311), BS(SPCA533, 0)},	{USB_DEVICE(0x0733, 0x1314), BS(SPCA533, 0)},	{USB_DEVICE(0x0733, 0x2211), BS(SPCA533, 0)},	{USB_DEVICE(0x0733, 0x2221), BS(SPCA533, 0)},	{USB_DEVICE(0x0733, 0x3261), BS(SPCA536, 0)},	{USB_DEVICE(0x0733, 0x3281), BS(SPCA536, 0)},	{USB_DEVICE(0x08ca, 0x0104), BS(SPCA533, 0)},	{USB_DEVICE(0x08ca, 0x0106), BS(SPCA533, 0)},	{USB_DEVICE(0x08ca, 0x2008), BS(SPCA504B, 0)},	{USB_DEVICE(0x08ca, 0x2010), BS(SPCA533, 0)},	{USB_DEVICE(0x08ca, 0x2016), BS(SPCA504B, 0)},	{USB_DEVICE(0x08ca, 0x2018), BS(SPCA504B, 0)},	{USB_DEVICE(0x08ca, 0x2020), BS(SPCA533, 0)},	{USB_DEVICE(0x08ca, 0x2022), BS(SPCA533, 0)},	{USB_DEVICE(0x08ca, 0x2024), BS(SPCA536, 0)},	{USB_DEVICE(0x08ca, 0x2028), BS(SPCA533, 0)},	{USB_DEVICE(0x08ca, 0x2040), BS(SPCA536, 0)},	{USB_DEVICE(0x08ca, 0x2042), BS(SPCA536, 0)},	{USB_DEVICE(0x08ca, 0x2050), BS(SPCA536, 0)},	{USB_DEVICE(0x08ca, 0x2060), BS(SPCA536, 0)},	{USB_DEVICE(0x0d64, 0x0303), BS(SPCA536, 0)},	{}};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 + -