亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ov511.c

?? 本源代碼為USB攝像頭的驅動程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
	struct video_picture p;	unsigned char exp;	if (!ov511 || !ov511->dev)		return -ENODEV;	sensor_get_picture(ov511, &p);	sensor_get_exposure(ov511, &exp);	/* IMPORTANT: This output MUST be kept under PAGE_SIZE	 *            or we need to get more sophisticated. */	out += sprintf(out, "driver_version  : %s\n", DRIVER_VERSION);	out += sprintf(out, "custom_id       : %d\n", ov511->customid);	out += sprintf(out, "model           : %s\n", ov511->desc ?		       clist[ov511->desc].description : "unknown");	out += sprintf(out, "streaming       : %s\n", YES_NO(ov511->streaming));	out += sprintf(out, "grabbing        : %s\n", YES_NO(ov511->grabbing));	out += sprintf(out, "compress        : %s\n", YES_NO(ov511->compress));	out += sprintf(out, "subcapture      : %s\n", YES_NO(ov511->sub_flag));	out += sprintf(out, "sub_size        : %d %d %d %d\n",		       ov511->subx, ov511->suby, ov511->subw, ov511->subh);	out += sprintf(out, "data_format     : %s\n",		       force_rgb ? "RGB" : "BGR");	out += sprintf(out, "brightness      : %d\n", p.brightness >> 8);	out += sprintf(out, "colour          : %d\n", p.colour >> 8);	out += sprintf(out, "contrast        : %d\n", p.contrast >> 8);	out += sprintf(out, "hue             : %d\n", p.hue >> 8);	out += sprintf(out, "exposure        : %d\n", exp);	out += sprintf(out, "num_frames      : %d\n", OV511_NUMFRAMES);	for (i = 0; i < OV511_NUMFRAMES; i++) {		out += sprintf(out, "frame           : %d\n", i);		out += sprintf(out, "  depth         : %d\n",			       ov511->frame[i].depth);		out += sprintf(out, "  size          : %d %d\n",			       ov511->frame[i].width, ov511->frame[i].height);		out += sprintf(out, "  format        : ");		for (j = 0; plist[j].num >= 0; j++) {			if (plist[j].num == ov511->frame[i].format) {				out += sprintf(out, "%s\n", plist[j].name);				break;			}		}		if (plist[j].num < 0)			out += sprintf(out, "unknown\n");		out += sprintf(out, "  data_buffer   : 0x%p\n",			       ov511->frame[i].data);	}	out += sprintf(out, "snap_enabled    : %s\n",		       YES_NO(ov511->snap_enabled));	out += sprintf(out, "bridge          : %s\n",		       ov511->bridge == BRG_OV511 ? "OV511" :			ov511->bridge == BRG_OV511PLUS ? "OV511+" :			ov511->bridge == BRG_OV518 ? "OV518" :			ov511->bridge == BRG_OV518PLUS ? "OV518+" :			"unknown");	out += sprintf(out, "sensor          : %s\n",		       ov511->sensor == SEN_OV6620 ? "OV6620" :			ov511->sensor == SEN_OV6630 ? "OV6630" :			ov511->sensor == SEN_OV7610 ? "OV7610" :			ov511->sensor == SEN_OV7620 ? "OV7620" :			ov511->sensor == SEN_OV7620AE ? "OV7620AE" :			ov511->sensor == SEN_OV8600 ? "OV8600" :			ov511->sensor == SEN_KS0127 ? "KS0127" :			ov511->sensor == SEN_KS0127B ? "KS0127B" :			ov511->sensor == SEN_SAA7111A ? "SAA7111A" :			"unknown");	out += sprintf(out, "packet_size     : %d\n", ov511->packet_size);	out += sprintf(out, "framebuffer     : 0x%p\n", ov511->fbuf);	len = out - page;	len -= off;	if (len < count) {		*eof = 1;		if (len <= 0)			return 0;	} else		len = count;	*start = page + off;	return len;}/* /proc/video/ov511/<minor#>/button * * When the camera's button is pressed, the output of this will change from a * 0 to a 1 (ASCII). It will retain this value until it is read, after which * it will reset to zero. *  * SECURITY NOTE: Since reading this file can change the state of the snapshot * status, it is important for applications that open it to keep it locked * against access by other processes, using flock() or a similar mechanism. No * locking is provided by this driver. */static int ov511_read_proc_button(char *page, char **start, off_t off, int count, int *eof,		       void *data){	char *out = page;	int len, status;	struct usb_ov511 *ov511 = data;	if (!ov511 || !ov511->dev)		return -ENODEV;	status = ov51x_check_snapshot(ov511);	out += sprintf(out, "%d", status);	if (status)		ov51x_clear_snapshot(ov511);	len = out - page;	len -= off;	if (len < count) {		*eof = 1;		if (len <= 0)			return 0;	} else {		len = count;	}	*start = page + off;	return len;}static void create_proc_ov511_cam(struct usb_ov511 *ov511){	char dirname[4];	if (!ov511_proc_entry || !ov511)		return;	/* Create per-device directory */	sprintf(dirname, "%d", ov511->vdev.minor);	PDEBUG(4, "creating /proc/video/ov511/%s/", dirname);	ov511->proc_devdir = create_proc_entry(dirname, S_IFDIR,		ov511_proc_entry);	if (!ov511->proc_devdir)		return;	/* Create "info" entry (human readable device information) */	PDEBUG(4, "creating /proc/video/ov511/%s/info", dirname);	ov511->proc_info = create_proc_read_entry("info",		S_IFREG|S_IRUGO|S_IWUSR, ov511->proc_devdir,		ov511_read_proc_info, ov511);	if (!ov511->proc_info)		return;	/* Don't create it if old snapshot mode on (would cause race cond.) */	if (!snapshot) {		/* Create "button" entry (snapshot button status) */		PDEBUG(4, "creating /proc/video/ov511/%s/button", dirname);		ov511->proc_button = create_proc_read_entry("button",			S_IFREG|S_IRUGO|S_IWUSR, ov511->proc_devdir,			ov511_read_proc_button, ov511);		if (!ov511->proc_button)			return;	}	/* Create "control" entry (ioctl() interface) */	PDEBUG(4, "creating /proc/video/ov511/%s/control", dirname);	lock_kernel();	ov511->proc_control = create_proc_entry("control",		S_IFREG|S_IRUGO|S_IWUSR, ov511->proc_devdir);	if (!ov511->proc_control) {		unlock_kernel();		return;	}	ov511->proc_control->data = ov511;	ov511->proc_control->proc_fops = &ov511_control_fops;	unlock_kernel();}static void destroy_proc_ov511_cam(struct usb_ov511 *ov511){	char dirname[4];		if (!ov511 || !ov511->proc_devdir)		return;	sprintf(dirname, "%d", ov511->vdev.minor);	/* Destroy "control" entry */	if (ov511->proc_control) {		PDEBUG(4, "destroying /proc/video/ov511/%s/control", dirname);		remove_proc_entry("control", ov511->proc_devdir);		ov511->proc_control = NULL;	}	/* Destroy "button" entry */	if (ov511->proc_button) {		PDEBUG(4, "destroying /proc/video/ov511/%s/button", dirname);		remove_proc_entry("button", ov511->proc_devdir);		ov511->proc_button = NULL;	}	/* Destroy "info" entry */	if (ov511->proc_info) {		PDEBUG(4, "destroying /proc/video/ov511/%s/info", dirname);		remove_proc_entry("info", ov511->proc_devdir);		ov511->proc_info = NULL;	}	/* Destroy per-device directory */	PDEBUG(4, "destroying /proc/video/ov511/%s/", dirname);	remove_proc_entry(dirname, ov511_proc_entry);	ov511->proc_devdir = NULL;}static void proc_ov511_create(void){	/* No current standard here. Alan prefers /proc/video/ as it keeps	 * /proc "less cluttered than /proc/randomcardifoundintheshed/"	 * -claudio	 */	if (video_proc_entry == NULL) {		err("Error: /proc/video/ does not exist");		return;	}	ov511_proc_entry = create_proc_entry("ov511", S_IFDIR,					     video_proc_entry);	if (ov511_proc_entry)		ov511_proc_entry->owner = THIS_MODULE;	else		err("Unable to create /proc/video/ov511");}static void proc_ov511_destroy(void){	PDEBUG(3, "removing /proc/video/ov511");	if (ov511_proc_entry == NULL)		return;	remove_proc_entry("ov511", video_proc_entry);}#endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS *//********************************************************************** * * Register I/O * **********************************************************************/static int ov511_reg_write(struct usb_device *dev, unsigned char reg, unsigned char value){	int rc;	PDEBUG(5, "0x%02X:0x%02X", reg, value);	rc = usb_control_msg(dev,			     usb_sndctrlpipe(dev, 0),			     2 /* REG_IO */,			     USB_TYPE_CLASS | USB_RECIP_DEVICE,			     0, (__u16)reg, &value, 1, HZ);		if (rc < 0)		err("reg write: error %d", rc);	return rc;}/* returns: negative is error, pos or zero is data */static int ov511_reg_read(struct usb_device *dev, unsigned char reg){	int rc;	unsigned char buffer[1];	rc = usb_control_msg(dev,			     usb_rcvctrlpipe(dev, 0),			     2 /* REG_IO */,			     USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_DEVICE,			     0, (__u16)reg, buffer, 1, HZ);                               	PDEBUG(5, "0x%02X:0x%02X", reg, buffer[0]);		if (rc < 0) {		err("reg read: error %d", rc);		return rc;	} else {		return buffer[0];		}}/* * Writes bits at positions specified by mask to a reg. Bits that are in * the same position as 1's in "mask" are cleared and set to "value". Bits * that are in the same position as 0's in "mask" are preserved, regardless  * of their respective state in "value". */static int ov511_reg_write_mask(struct usb_device *dev,		     unsigned char reg,		     unsigned char value,		     unsigned char mask){	int ret;	unsigned char oldval, newval;	ret = ov511_reg_read(dev, reg);	if (ret < 0)		return ret;	oldval = (unsigned char) ret;	oldval &= (~mask);		/* Clear the masked bits */	value &= mask;			/* Enforce mask on value */	newval = oldval | value;	/* Set the desired bits */	return (ov511_reg_write(dev, reg, newval));}/* Writes multiple (n) values to a single register. Only valid with certain * registers (0x30 and 0xc4 - 0xce). Used for writing 16 and 24-bit values. */static int ov518_reg_write_multi(struct usb_device *dev,		      unsigned char reg,		      unsigned char *values,		      int n){	int rc;	PDEBUG(5, "0x%02X:[multiple], n=%d", reg, n);  // FIXME	if (values == NULL) {		err("reg write multiple: NULL buffer");		return -EINVAL;	}	rc = usb_control_msg(dev,			     usb_sndctrlpipe(dev, 0),			     2 /* REG_IO */,			     USB_TYPE_CLASS | USB_RECIP_DEVICE,			     0, (__u16)reg, values, n, HZ);		if (rc < 0)		err("reg write multiple: error %d", rc);	return rc;}static int ov511_upload_quan_tables(struct usb_device *dev){	unsigned char *pYTable = yQuanTable511;	unsigned char *pUVTable = uvQuanTable511;	unsigned char val0, val1;	int i, rc, reg = OV511_OMNICE_Y_LUT_BEGIN;	PDEBUG(4, "Uploading quantization tables");	for (i = 0; i < OV511_QUANTABLESIZE / 2; i++)	{		if (ENABLE_Y_QUANTABLE)		{			val0 = *pYTable++;			val1 = *pYTable++;			val0 &= 0x0f;			val1 &= 0x0f;			val0 |= val1 << 4;			rc = ov511_reg_write(dev, reg, val0);			if (rc < 0)				return rc;		}		if (ENABLE_UV_QUANTABLE)		{			val0 = *pUVTable++;			val1 = *pUVTable++;			val0 &= 0x0f;			val1 &= 0x0f;			val0 |= val1 << 4;			rc = ov511_reg_write(dev, reg + OV511_QUANTABLESIZE / 2,				val0);			if (rc < 0)				return rc;		}		reg++;	}	return 0;}/* OV518 quantization tables are 8x4 (instead of 8x8) */static int ov518_upload_quan_tables(struct usb_device *dev){	unsigned char *pYTable = yQuanTable518;	unsigned char *pUVTable = uvQuanTable518;	unsigned char val0, val1;	int i, rc, reg = OV511_OMNICE_Y_LUT_BEGIN;	PDEBUG(4, "Uploading quantization tables");	for (i = 0; i < OV518_QUANTABLESIZE / 2; i++)	{		if (ENABLE_Y_QUANTABLE)		{			val0 = *pYTable++;			val1 = *pYTable++;			val0 &= 0x0f;			val1 &= 0x0f;			val0 |= val1 << 4;			rc = ov511_reg_write(dev, reg, val0);			if (rc < 0)				return rc;		}		if (ENABLE_UV_QUANTABLE)		{			val0 = *pUVTable++;			val1 = *pUVTable++;			val0 &= 0x0f;			val1 &= 0x0f;			val0 |= val1 << 4;			rc = ov511_reg_write(dev, reg + OV518_QUANTABLESIZE / 2,				val0);			if (rc < 0)				return rc;		}		reg++;	}	return 0;}/* NOTE: Do not call this function directly! * The OV518 I2C I/O procedure is different, hence, this function. * This is normally only called from ov51x_i2c_write(). Note that this function * always succeeds regardless of whether the sensor is present and working. */static int ov518_i2c_write_internal(struct usb_device *dev,			 unsigned char reg,			 unsigned char value){	int rc;	PDEBUG(5, "0x%02X:0x%02X", reg, value);	/* Select camera register */	rc = ov511_reg_write(dev, OV511_REG_I2C_SUB_ADDRESS_3_BYTE, reg);	if (rc < 0) goto error;	/* Write "value" to I2C data port of OV511 */	rc = ov511_reg_write(dev, OV511_REG_I2C_DATA_PORT, value);	if (rc < 0) goto error;	/* Initiate 3-byte write cycle */	rc = ov511_reg_write(dev, OV518_REG_I2C_CONTROL, 0x01);	if (rc < 0) goto error;	return 0;error:	err("ov518 i2c write: error %d", rc);	return rc;}/* NOTE: Do not call this function directly! */static int ov511_i2c_write_internal(struct usb_device *dev,			 unsigned char reg,			 unsigned char value){	int rc, retries;	PDEBUG(5, "0x%02X:0x%02X", reg, value);	/* Three byte write cycle */	for (retries = OV511_I2C_RETRIES; ; ) {		/* Select camera register */		rc = ov511_reg_write(dev, OV511_REG_I2C_SUB_ADDRESS_3_BYTE,				     reg);		if (rc < 0) goto error;		/* Write "value" to I2C data port of OV511 */		rc = ov511_reg_write(dev, OV511_REG_I2C_DATA_PORT, value);			if (rc < 0) goto error;		/* Initiate 3-byte write cycle */		rc = ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x01);		if (rc < 0) goto error;		do rc = ov511_reg_read(dev, OV511_REG_I2C_CONTROL);		while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */		if (rc < 0) goto error;		if ((rc&2) == 0) /* Ack? */			break;#if 0		/* I2C abort */			ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x10);#endif		if (--retries < 0) {			err("i2c write retries exhausted");			rc = -1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产宾馆实践打屁股91| 欧美视频一区二区| 在线影院国内精品| 91精品国产aⅴ一区二区| 亚洲国产精品传媒在线观看| 亚洲高清免费观看高清完整版在线观看 | 欧美成人a在线| 亚洲人亚洲人成电影网站色| 精一区二区三区| 欧美体内she精高潮| 国产精品三级久久久久三级| 秋霞电影网一区二区| 色一情一伦一子一伦一区| 精品第一国产综合精品aⅴ| 亚洲日本韩国一区| 成人在线综合网站| 久久这里都是精品| 男女男精品网站| 欧美精品亚洲一区二区在线播放| 亚洲色图另类专区| 成人高清免费观看| 欧美国产精品一区二区三区| 精品一区二区av| 精品免费国产一区二区三区四区| 视频一区在线播放| 欧美美女一区二区| 日韩不卡手机在线v区| 欧美精品久久一区| 五月婷婷久久综合| 91精品国产综合久久久久| 午夜久久久久久久久久一区二区| 欧美性做爰猛烈叫床潮| 亚洲人成电影网站色mp4| 国产a精品视频| 久久精品亚洲乱码伦伦中文| 免费一级欧美片在线观看| 99久久综合色| 亚洲精品高清在线| 丁香桃色午夜亚洲一区二区三区| 欧美一区二区精美| 亚洲国产裸拍裸体视频在线观看乱了 | 国产麻豆视频一区二区| 久久色在线视频| 久久99精品久久久久久久久久久久| 欧美视频中文字幕| 日韩理论片一区二区| 成人av网站免费观看| 国产亚洲精品资源在线26u| 青椒成人免费视频| 91色九色蝌蚪| 亚洲国产综合人成综合网站| 在线免费一区三区| 亚洲激情网站免费观看| 在线免费亚洲电影| 亚洲一区日韩精品中文字幕| 色香色香欲天天天影视综合网| 国产亚洲成aⅴ人片在线观看| av激情综合网| 亚洲男人的天堂av| 色综合天天狠狠| 一区二区三区中文字幕精品精品 | 亚洲色图制服诱惑| 日本精品视频一区二区三区| 国产精品久99| 欧美日韩精品一区二区三区四区| 亚洲综合免费观看高清完整版在线 | 亚洲国产成人自拍| 99久久久国产精品| 亚洲欧美日韩系列| 欧美亚洲国产一区在线观看网站| 亚洲国产你懂的| 91麻豆精品久久久久蜜臀| 日韩av成人高清| 欧美老人xxxx18| 久久激情五月激情| 中文字幕欧美日韩一区| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲一区二区免费视频| 欧美电视剧在线观看完整版| 国产精品一区二区久激情瑜伽| 国产女人18水真多18精品一级做| 一本色道久久加勒比精品| 天天操天天色综合| 国产蜜臀av在线一区二区三区| 91看片淫黄大片一级在线观看| 亚洲一区二区三区中文字幕| 日韩欧美在线综合网| 成人深夜福利app| 亚洲电影视频在线| 久久久91精品国产一区二区精品| 精品一区二区在线观看| 亚洲电影第三页| 国产精品免费免费| 91麻豆精品国产| caoporm超碰国产精品| 蜜臀精品久久久久久蜜臀 | 伊人婷婷欧美激情| 日韩欧美一级在线播放| 91网站在线观看视频| 美女网站色91| 一区二区三区中文在线| 亚洲欧洲精品一区二区三区| 日韩欧美一区二区免费| 色婷婷综合久久久中文一区二区 | 欧美酷刑日本凌虐凌虐| 高清在线观看日韩| 三级亚洲高清视频| 亚洲精品乱码久久久久久黑人 | 免费高清在线一区| 亚洲精品国产一区二区精华液| 91精品国产aⅴ一区二区| 岛国精品一区二区| 久久精品999| 日韩国产欧美在线观看| 一区二区三区中文免费| 综合久久综合久久| 欧美国产一区在线| 国产日韩欧美精品综合| 日韩欧美亚洲国产另类| 91精品国产综合久久久久久久久久 | 91亚洲精品乱码久久久久久蜜桃 | 成人美女视频在线看| 久久国产乱子精品免费女| 亚洲午夜日本在线观看| 亚洲欧洲日产国产综合网| 国产精品福利一区| 中文字幕电影一区| 欧美精品一区二区在线观看| 欧美中文一区二区三区| 91在线免费看| 不卡免费追剧大全电视剧网站| 国产成人综合在线| 国产伦精品一区二区三区免费迷 | 亚洲成人在线观看视频| 一区二区三区欧美| 亚洲欧美在线视频| 欧美成人乱码一区二区三区| 久久久精品tv| 久久九九99视频| 欧美激情一区二区三区在线| 久久综合九色综合欧美98| 精品国产免费人成在线观看| 欧美一区二区三区人| 91久久精品国产91性色tv| 69p69国产精品| 日韩精品一区二区三区中文不卡| 日韩欧美一区二区不卡| 欧美精品一区二区三区一线天视频| 欧美成人a在线| 欧美韩国日本不卡| 成人欧美一区二区三区视频网页 | 精品国产伦一区二区三区观看体验| 8v天堂国产在线一区二区| 日韩欧美国产wwwww| 久久看人人爽人人| 亚洲欧洲精品成人久久奇米网| 亚洲精品成人精品456| 亚洲小少妇裸体bbw| 偷窥国产亚洲免费视频| 精品亚洲porn| 99视频国产精品| 欧美高清精品3d| 精品国产sm最大网站| 精品成人一区二区三区四区| 亚洲黄一区二区三区| 日本特黄久久久高潮| 久久99精品国产91久久来源| 国产精品一区二区x88av| 成人免费观看视频| 欧美日韩精品一区二区| 国产无一区二区| 亚洲视频综合在线| 久久精品国产久精国产| 91视频在线观看| 91.com在线观看| 国产精品乱人伦| 午夜精品久久久久影视| a在线播放不卡| 日韩欧美久久久| 亚洲欧美区自拍先锋| 亚洲不卡一区二区三区| 国产在线精品一区在线观看麻豆| 91网站视频在线观看| 日韩一区二区在线观看| 天天综合色天天| av午夜一区麻豆| 精品国产一区a| 午夜精品一区在线观看| 91影院在线观看| 国产午夜精品福利| 蜜臀av一区二区| 日本精品一级二级| 欧美经典一区二区三区| 丝袜亚洲精品中文字幕一区| 韩日欧美一区二区三区| 精品国产百合女同互慰| 日本不卡视频在线| 日本精品视频一区二区| 国产精品妹子av| 韩国午夜理伦三级不卡影院|