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

📄 cpia.c

📁 优龙2410linux2.6.8内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	               cam->params.apcor.gain8, 0, 0xff, 0x2a);	out += sprintf(out, "vl_offset_gain1:        %8d  %8d  %8d  %8d\n",	               cam->params.vlOffset.gain1, 0, 255, 24);	out += sprintf(out, "vl_offset_gain2:        %8d  %8d  %8d  %8d\n",	               cam->params.vlOffset.gain2, 0, 255, 28);	out += sprintf(out, "vl_offset_gain4:        %8d  %8d  %8d  %8d\n",	               cam->params.vlOffset.gain4, 0, 255, 30);	out += sprintf(out, "vl_offset_gain8:        %8d  %8d  %8d  %8d\n",	               cam->params.vlOffset.gain8, 0, 255, 30);	out += sprintf(out, "flicker_control:        %8s  %8s  %8s  %8s\n",	               cam->params.flickerControl.flickerMode ? "on" : "off",		       "off", "on", "off");	out += sprintf(out, "mains_frequency:        %8d  %8d  %8d  %8d"	               " only 50/60\n",	               cam->mainsFreq ? 60 : 50, 50, 60, 50);	if(cam->params.flickerControl.allowableOverExposure < 0)		out += sprintf(out, "allowable_overexposure: %4dauto      auto  %8d      auto\n",		               -cam->params.flickerControl.allowableOverExposure,		               255);	else		out += sprintf(out, "allowable_overexposure: %8d      auto  %8d      auto\n",		               cam->params.flickerControl.allowableOverExposure,		               255);	out += sprintf(out, "compression_mode:       ");	switch(cam->params.compression.mode) {	case CPIA_COMPRESSION_NONE:		out += sprintf(out, "%8s", "none");		break;	case CPIA_COMPRESSION_AUTO:		out += sprintf(out, "%8s", "auto");		break;	case CPIA_COMPRESSION_MANUAL:		out += sprintf(out, "%8s", "manual");		break;	default:		out += sprintf(out, "%8s", "unknown");		break;	}	out += sprintf(out, "    none,auto,manual      auto\n");	out += sprintf(out, "decimation_enable:      %8s  %8s  %8s  %8s\n",        	       cam->params.compression.decimation ==		       DECIMATION_ENAB ? "on":"off", "off", "on", 		       "off");	out += sprintf(out, "compression_target:    %9s %9s %9s %9s\n",	               cam->params.compressionTarget.frTargeting  == 		       CPIA_COMPRESSION_TARGET_FRAMERATE ?		       "framerate":"quality",		       "framerate", "quality", "quality");	out += sprintf(out, "target_framerate:       %8d  %8d  %8d  %8d\n",	               cam->params.compressionTarget.targetFR, 1, 30, 15);	out += sprintf(out, "target_quality:         %8d  %8d  %8d  %8d\n",	               cam->params.compressionTarget.targetQ, 1, 64, 5);	out += sprintf(out, "y_threshold:            %8d  %8d  %8d  %8d\n",	               cam->params.yuvThreshold.yThreshold, 0, 31, 6);	out += sprintf(out, "uv_threshold:           %8d  %8d  %8d  %8d\n",	               cam->params.yuvThreshold.uvThreshold, 0, 31, 6);	out += sprintf(out, "hysteresis:             %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.hysteresis, 0, 255, 3);	out += sprintf(out, "threshold_max:          %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.threshMax, 0, 255, 11);	out += sprintf(out, "small_step:             %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.smallStep, 0, 255, 1);	out += sprintf(out, "large_step:             %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.largeStep, 0, 255, 3);	out += sprintf(out, "decimation_hysteresis:  %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.decimationHysteresis,		       0, 255, 2);	out += sprintf(out, "fr_diff_step_thresh:    %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.frDiffStepThresh,		       0, 255, 5);	out += sprintf(out, "q_diff_step_thresh:     %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.qDiffStepThresh,		       0, 255, 3);	out += sprintf(out, "decimation_thresh_mod:  %8d  %8d  %8d  %8d\n",	               cam->params.compressionParams.decimationThreshMod,		       0, 255, 2);	/* QX3 specific entries */	if (cam->params.qx3.qx3_detected) {		out += sprintf(out, "toplight:               %8s  %8s  %8s  %8s\n", 		               cam->params.qx3.toplight ? "on" : "off",			       "off", "on", "off");		out += sprintf(out, "bottomlight:            %8s  %8s  %8s  %8s\n", 		               cam->params.qx3.bottomlight ? "on" : "off",			       "off", "on", "off");	}		len = out - page;	len -= off;	if (len < count) {		*eof = 1;		if (len <= 0) return 0;	} else		len = count;	*start = page + off;	return len;}static int match(char *checkstr, char **buffer, unsigned long *count,                 int *find_colon, int *err){	int ret, colon_found = 1;	int len = strlen(checkstr);	ret = (len <= *count && strncmp(*buffer, checkstr, len) == 0);	if (ret) {		*buffer += len;		*count -= len;		if (*find_colon) {			colon_found = 0;			while (*count && (**buffer == ' ' || **buffer == '\t' ||					  (!colon_found && **buffer == ':'))) {				if (**buffer == ':')					colon_found = 1;				--*count;				++*buffer;			}			if (!*count || !colon_found)				*err = -EINVAL;			*find_colon = 0;		}	}	return ret;}static unsigned long int value(char **buffer, unsigned long *count, int *err){	char *p;	unsigned long int ret;	ret = simple_strtoul(*buffer, &p, 0);	if (p == *buffer)		*err = -EINVAL;	else {		*count -= p - *buffer;		*buffer = p;	}	return ret;}static int cpia_write_proc(struct file *file, const char __user *buf,                           unsigned long count, void *data){	struct cam_data *cam = data;	struct cam_params new_params;	char *page, *buffer;	int retval, find_colon;	int size = count;	unsigned long val = 0;	u32 command_flags = 0;	u8 new_mains;	/*	 * This code to copy from buf to page is shamelessly copied	 * from the comx driver	 */	if (count > PAGE_SIZE) {		printk(KERN_ERR "count is %lu > %d!!!\n", count, (int)PAGE_SIZE);		return -ENOSPC;	}	if (!(page = (char *)__get_free_page(GFP_KERNEL))) return -ENOMEM;	if(copy_from_user(page, buf, count))	{		retval = -EFAULT;		goto out;	}	if (page[count-1] == '\n')		page[count-1] = '\0';	else if (count < PAGE_SIZE)		page[count] = '\0';	else if (page[count]) {		retval = -EINVAL;		goto out;	}		buffer = page;		if (down_interruptible(&cam->param_lock))		return -ERESTARTSYS;		/*	 * Skip over leading whitespace	 */	while (count && isspace(*buffer)) {		--count;		++buffer;	}		memcpy(&new_params, &cam->params, sizeof(struct cam_params));	new_mains = cam->mainsFreq;	#define MATCH(x) (match(x, &buffer, &count, &find_colon, &retval))#define VALUE (value(&buffer,&count, &retval))#define FIRMWARE_VERSION(x,y) (new_params.version.firmwareVersion == (x) && \                               new_params.version.firmwareRevision == (y))		retval = 0;	while (count && !retval) {		find_colon = 1;		if (MATCH("brightness")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val <= 100)					new_params.colourParams.brightness = val;				else					retval = -EINVAL;			}			command_flags |= COMMAND_SETCOLOURPARAMS;			if(new_params.flickerControl.allowableOverExposure < 0)				new_params.flickerControl.allowableOverExposure = 					-find_over_exposure(new_params.colourParams.brightness);			if(new_params.flickerControl.flickerMode != 0)				command_flags |= COMMAND_SETFLICKERCTRL;		} else if (MATCH("contrast")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val <= 100) {					/* contrast is in steps of 8, so round*/					val = ((val + 3) / 8) * 8;					/* 1-02 firmware limits contrast to 80*/					if (FIRMWARE_VERSION(1,2) && val > 80)						val = 80;					new_params.colourParams.contrast = val;				} else					retval = -EINVAL;			}			command_flags |= COMMAND_SETCOLOURPARAMS;		} else if (MATCH("saturation")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val <= 100)					new_params.colourParams.saturation = val;				else					retval = -EINVAL;			}			command_flags |= COMMAND_SETCOLOURPARAMS;		} else if (MATCH("sensor_fps")) {			if (!retval)				val = VALUE;			if (!retval) {				/* find values so that sensorFPS is minimized,				 * but >= val */				if (val > 30)					retval = -EINVAL;				else if (val > 25) {					new_params.sensorFps.divisor = 0;					new_params.sensorFps.baserate = 1;				} else if (val > 15) {					new_params.sensorFps.divisor = 0;					new_params.sensorFps.baserate = 0;				} else if (val > 12) {					new_params.sensorFps.divisor = 1;					new_params.sensorFps.baserate = 1;				} else if (val > 7) {					new_params.sensorFps.divisor = 1;					new_params.sensorFps.baserate = 0;				} else if (val > 6) {					new_params.sensorFps.divisor = 2;					new_params.sensorFps.baserate = 1;				} else if (val > 3) {					new_params.sensorFps.divisor = 2;					new_params.sensorFps.baserate = 0;				} else {					new_params.sensorFps.divisor = 3;					/* Either base rate would work here */					new_params.sensorFps.baserate = 1;				}				new_params.flickerControl.coarseJump = 					flicker_jumps[new_mains]					[new_params.sensorFps.baserate]					[new_params.sensorFps.divisor];				if (new_params.flickerControl.flickerMode)					command_flags |= COMMAND_SETFLICKERCTRL;			}			command_flags |= COMMAND_SETSENSORFPS;			cam->exposure_status = EXPOSURE_NORMAL;		} else if (MATCH("stream_start_line")) {			if (!retval)				val = VALUE;			if (!retval) {				int max_line = 288;				if (new_params.format.videoSize == VIDEOSIZE_QCIF)					max_line = 144;				if (val <= max_line)					new_params.streamStartLine = val/2;				else					retval = -EINVAL;			}		} else if (MATCH("sub_sample")) {			if (!retval && MATCH("420"))				new_params.format.subSample = SUBSAMPLE_420;			else if (!retval && MATCH("422"))				new_params.format.subSample = SUBSAMPLE_422;			else				retval = -EINVAL;			command_flags |= COMMAND_SETFORMAT;		} else if (MATCH("yuv_order")) {			if (!retval && MATCH("YUYV"))				new_params.format.yuvOrder = YUVORDER_YUYV;			else if (!retval && MATCH("UYVY"))				new_params.format.yuvOrder = YUVORDER_UYVY;			else				retval = -EINVAL;			command_flags |= COMMAND_SETFORMAT;		} else if (MATCH("ecp_timing")) {			if (!retval && MATCH("normal"))				new_params.ecpTiming = 0;			else if (!retval && MATCH("slow"))				new_params.ecpTiming = 1;			else				retval = -EINVAL;			command_flags |= COMMAND_SETECPTIMING;		} else if (MATCH("color_balance_mode")) {			if (!retval && MATCH("manual"))				new_params.colourBalance.balanceMode = 3;			else if (!retval && MATCH("auto"))				new_params.colourBalance.balanceMode = 2;			else				retval = -EINVAL;			command_flags |= COMMAND_SETCOLOURBALANCE;		} else if (MATCH("red_gain")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val <= 212) {					new_params.colourBalance.redGain = val;					new_params.colourBalance.balanceMode = 1;				} else					retval = -EINVAL;			}			command_flags |= COMMAND_SETCOLOURBALANCE;		} else if (MATCH("green_gain")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val <= 212) {					new_params.colourBalance.greenGain = val;					new_params.colourBalance.balanceMode = 1;				} else					retval = -EINVAL;			}			command_flags |= COMMAND_SETCOLOURBALANCE;		} else if (MATCH("blue_gain")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val <= 212) {					new_params.colourBalance.blueGain = val;					new_params.colourBalance.balanceMode = 1;				} else					retval = -EINVAL;			}			command_flags |= COMMAND_SETCOLOURBALANCE;		} else if (MATCH("max_gain")) {			if (!retval)				val = VALUE;			if (!retval) {				/* 1-02 firmware limits gain to 2 */				if (FIRMWARE_VERSION(1,2) && val > 2)					val = 2;				switch(val) {				case 1:					new_params.exposure.gainMode = 1;					break;				case 2:					new_params.exposure.gainMode = 2;					break;				case 4:					new_params.exposure.gainMode = 3;					break;				case 8:					new_params.exposure.gainMode = 4;					break;				default:					retval = -EINVAL;					break;				}			}			command_flags |= COMMAND_SETEXPOSURE;		} else if (MATCH("exposure_mode")) {			if (!retval && MATCH("auto"))				new_params.exposure.expMode = 2;			else if (!retval && MATCH("manual")) {				if (new_params.exposure.expMode == 2)					new_params.exposure.expMode = 3;				if(new_params.flickerControl.flickerMode != 0)					command_flags |= COMMAND_SETFLICKERCTRL;				new_params.flickerControl.flickerMode = 0;			} else				retval = -EINVAL;			command_flags |= COMMAND_SETEXPOSURE;		} else if (MATCH("centre_weight")) {			if (!retval && MATCH("on"))				new_params.exposure.centreWeight = 1;			else if (!retval && MATCH("off"))				new_params.exposure.centreWeight = 2;			else				retval = -EINVAL;			command_flags |= COMMAND_SETEXPOSURE;		} else if (MATCH("gain")) {			if (!retval)				val = VALUE;			if (!retval) {				switch(val) {				case 1:					new_params.exposure.gain = 0;					break;				case 2:					new_params.exposure.gain = 1;					break;				case 4:					new_params.exposure.gain = 2;					break;				case 8:					new_params.exposure.gain = 3;					break;				default:					retval = -EINVAL;					break;				}				new_params.exposure.expMode = 1;				if(new_params.flickerControl.flickerMode != 0)					command_flags |= COMMAND_SETFLICKERCTRL;				new_params.flickerControl.flickerMode = 0;

⌨️ 快捷键说明

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