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

📄 cpia.c

📁 pxa270下的摄像头mtd91111的驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	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", "off",		       "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, 0, 30, 7);	out += sprintf(out, "target_quality:         %8d  %8d  %8d  %8d\n",	               cam->params.compressionTarget.targetQ, 0, 255, 10);	out += sprintf(out, "y_threshold:            %8d  %8d  %8d  %8d\n",	               cam->params.yuvThreshold.yThreshold, 0, 31, 15);	out += sprintf(out, "uv_threshold:           %8d  %8d  %8d  %8d\n",	               cam->params.yuvThreshold.uvThreshold, 0, 31, 15);	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 cpia_write_proc(struct file *file, const char *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) \	({ \		int _len = strlen(x), _ret, _colon_found; \		_ret = (_len <= count && strncmp(buffer, x, _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) \					retval = -EINVAL; \				find_colon = 0; \			} \		} \		_ret; \	})#define FIRMWARE_VERSION(x,y) (new_params.version.firmwareVersion == (x) && \                               new_params.version.firmwareRevision == (y))#define VALUE \	({ \		char *_p; \		unsigned long int _ret; \		_ret = simple_strtoul(buffer, &_p, 0); \		if (_p == buffer) \			retval = -EINVAL; \		else { \			count -= _p - buffer; \			buffer = _p; \		} \		_ret; \	})	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;		} 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;		} 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("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.balanceModeIsAuto = 0;			else if (!retval && MATCH("auto"))				new_params.colourBalance.balanceModeIsAuto = 1;			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;				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;				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;				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;				new_params.flickerControl.flickerMode = 0;				command_flags |= COMMAND_SETFLICKERCTRL;			} 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;					new_params.exposure.expMode = 1;					new_params.flickerControl.flickerMode = 0;					command_flags |= COMMAND_SETFLICKERCTRL;					break;				case 2:					new_params.exposure.gain = 1;					new_params.exposure.expMode = 1;					new_params.flickerControl.flickerMode = 0;					command_flags |= COMMAND_SETFLICKERCTRL;					break;				case 4:					new_params.exposure.gain = 2;					new_params.exposure.expMode = 1;					new_params.flickerControl.flickerMode = 0;					command_flags |= COMMAND_SETFLICKERCTRL;					break;				case 8:					new_params.exposure.gain = 3;					new_params.exposure.expMode = 1;					new_params.flickerControl.flickerMode = 0;					command_flags |= COMMAND_SETFLICKERCTRL;					break;				default:					retval = -EINVAL;					break;				}				command_flags |= COMMAND_SETEXPOSURE;				if (new_params.exposure.gain >				    new_params.exposure.gainMode-1)					retval = -EINVAL;			}		} else if (MATCH("fine_exp")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val < 256) {					/* 1-02 firmware limits fineExp to 127*/					if (FIRMWARE_VERSION(1,2) && val > 127)						val = 127;					new_params.exposure.fineExp = val;					new_params.exposure.expMode = 1;					command_flags |= COMMAND_SETEXPOSURE;					new_params.flickerControl.flickerMode = 0;					command_flags |= COMMAND_SETFLICKERCTRL;				} else					retval = -EINVAL;			}		} else if (MATCH("coarse_exp")) {			if (!retval)				val = VALUE;			if (!retval) {				if (val < 65536) {					/* 1-02 firmware limits					 * coarseExp to 255 */					if (FIRMWARE_VERSION(1,2) && val > 255)						val = 255;					new_params.exposure.coarseExpLo =						val & 0xff;					new_params.exposure.coarseExpHi =						val >> 8;					new_params.exposure.expMode = 1;					command_flags |= COMMAND_SETEXPOSURE;					new_params.flickerControl.flickerMode = 0;					command_flags |= COMMAND_SETFLICKERCTRL;				} else					retval = -EINVAL;			}		} else if (MATCH("red_comp")) {			if (!retval)				val = VALUE;

⌨️ 快捷键说明

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