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

📄 cpia.c

📁 cpia usb摄像头的驱动程序源码。需要video4linux和i2c-core支持
💻 C
📖 第 1 页 / 共 5 页
字号:
		               cam->params.qx3.cradled);	}	out += sprintf(out, "video_size:               %s\n",	               cam->params.format.videoSize == VIDEOSIZE_CIF ?		       "CIF " : "QCIF");	out += sprintf(out, "roi:                      (%3d, %3d) to (%3d, %3d)\n",	               cam->params.roi.colStart*8,	               cam->params.roi.rowStart*4,	               cam->params.roi.colEnd*8,	               cam->params.roi.rowEnd*4);	out += sprintf(out, "actual_fps:               %3d\n", cam->fps);	out += sprintf(out, "transfer_rate:            %4dkB/s\n",	               cam->transfer_rate);		out += sprintf(out, "\nread-write\n");	out += sprintf(out, "-----------------------  current       min"	               "       max   default  comment\n");	if (cam->params.camType == CAM_TYPE_PP  && cam->parport_mode > 1) {		out += sprintf(out, "ecp_timing:             %8s  %8s  %8s  %8s\n",			       cam->params.ecpTiming ? "slow" : "normal", "slow",			       "normal", "normal");	} else if (cam->params.camType == CAM_TYPE_USB) {		out += sprintf(out, "usb_alt_setting:        %8d  %8d  %8d  %8d\n",			       cam->params.usbAlt,1,MAX_USB_ALT_SETTING,			       MAX_USB_ALT_SETTING);	} else if (cam->params.camType == CAM_TYPE_UNKNOWN) {	  out += sprintf(out, "Error: camera has not been initialized\n");		goto finish;	}			out += sprintf(out, "brightness:             %8d  %8d  %8d  %8d\n",	               cam->params.colourParams.brightness, 0, 100, 50);	if (cam->params.version.firmwareVersion == 1 &&	   cam->params.version.firmwareRevision == 2)		/* 1-02 firmware limits contrast to 80 */		tmp = 80;	else		tmp = 96;	out += sprintf(out, "contrast:               %8d  %8d  %8d  %8d"	               "  steps of 8\n",	               cam->params.colourParams.contrast, 0, tmp, 48);	out += sprintf(out, "saturation:             %8d  %8d  %8d  %8d\n",	               cam->params.colourParams.saturation, 0, 100, 50);	tmp = (25000+5000*cam->params.sensorFps.baserate)/	      (1<<cam->params.sensorFps.divisor);	out += sprintf(out, "sensor_fps:             %4d.%03d  %8d  %8d  %8d\n",	               tmp/1000, tmp%1000, 3, 30, 15);	out += sprintf(out, "stream_start_line:      %8d  %8d  %8d  %8d\n",	               2*cam->params.streamStartLine, 0,		       cam->params.format.videoSize == VIDEOSIZE_CIF ? 288:144,		       cam->params.format.videoSize == VIDEOSIZE_CIF ? 240:120);	out += sprintf(out, "sub_sample:             %8s  %8s  %8s  %8s\n",	               cam->params.format.subSample == SUBSAMPLE_420 ?		       "420" : "422", "420", "422", "422");	out += sprintf(out, "yuv_order:              %8s  %8s  %8s  %8s\n",	               cam->params.format.yuvOrder == YUVORDER_YUYV ?		       "YUYV" : "UYVY", "YUYV" , "UYVY", "YUYV");	if (cam->params.colourBalance.balanceMode == 2) {		sprintf(tmpstr, "auto");	} else {		sprintf(tmpstr, "manual");	}	out += sprintf(out, "color_balance_mode:     %8s  %8s  %8s"		       "  %8s\n",  tmpstr, "manual", "auto", "auto");	out += sprintf(out, "red_gain:               %8d  %8d  %8d  %8d\n",	               cam->params.colourBalance.redGain, 0, 212, 32);	out += sprintf(out, "green_gain:             %8d  %8d  %8d  %8d\n",	               cam->params.colourBalance.greenGain, 0, 212, 6);	out += sprintf(out, "blue_gain:              %8d  %8d  %8d  %8d\n",	               cam->params.colourBalance.blueGain, 0, 212, 92);	if (cam->params.version.firmwareVersion == 1 &&	   cam->params.version.firmwareRevision == 2)		/* 1-02 firmware limits gain to 2 */		sprintf(tmpstr, "%8d  %8d  %8d", 1, 2, 2);	else		sprintf(tmpstr, "%8d  %8d  %8d", 1, 8, 2);	if (cam->params.exposure.gainMode == 0)		out += sprintf(out, "max_gain:                unknown  %28s"		               "  powers of 2\n", tmpstr); 	else		out += sprintf(out, "max_gain:               %8d  %28s"			       "  1,2,4 or 8 \n",		               1<<(cam->params.exposure.gainMode-1), tmpstr);	switch(cam->params.exposure.expMode) {	case 1:	case 3:		sprintf(tmpstr, "manual");		break;	case 2:		sprintf(tmpstr, "auto");		break;	default:		sprintf(tmpstr, "unknown");		break;	}	out += sprintf(out, "exposure_mode:          %8s  %8s  %8s"		       "  %8s\n",  tmpstr, "manual", "auto", "auto");	out += sprintf(out, "centre_weight:          %8s  %8s  %8s  %8s\n",	               (2-cam->params.exposure.centreWeight) ? "on" : "off",	               "off", "on", "on");	out += sprintf(out, "gain:                   %8d  %8d  max_gain  %8d  1,2,4,8 possible\n",	               1<<cam->params.exposure.gain, 1, 1);	if (cam->params.version.firmwareVersion == 1 &&	   cam->params.version.firmwareRevision == 2)		/* 1-02 firmware limits fineExp/2 to 127 */		tmp = 254;	else		tmp = 510;	out += sprintf(out, "fine_exp:               %8d  %8d  %8d  %8d\n",	               cam->params.exposure.fineExp*2, 0, tmp, 0);	if (cam->params.version.firmwareVersion == 1 &&	   cam->params.version.firmwareRevision == 2)		/* 1-02 firmware limits coarseExpHi to 0 */		tmp = MAX_EXP_102;	else		tmp = MAX_EXP;	out += sprintf(out, "coarse_exp:             %8d  %8d  %8d"		       "  %8d\n", cam->params.exposure.coarseExpLo+		       256*cam->params.exposure.coarseExpHi, 0, tmp, 185);	out += sprintf(out, "red_comp:               %8d  %8d  %8d  %8d\n",	               cam->params.exposure.redComp, COMP_RED, 255, COMP_RED);	out += sprintf(out, "green1_comp:            %8d  %8d  %8d  %8d\n",	               cam->params.exposure.green1Comp, COMP_GREEN1, 255,		       COMP_GREEN1);	out += sprintf(out, "green2_comp:            %8d  %8d  %8d  %8d\n",	               cam->params.exposure.green2Comp, COMP_GREEN2, 255,		       COMP_GREEN2);	out += sprintf(out, "blue_comp:              %8d  %8d  %8d  %8d\n",	               cam->params.exposure.blueComp, COMP_BLUE, 255, COMP_BLUE);		out += sprintf(out, "apcor_gain1:            %#8x  %#8x  %#8x  %#8x\n",	               cam->params.apcor.gain1, 0, 0xff, 0x1c);	out += sprintf(out, "apcor_gain2:            %#8x  %#8x  %#8x  %#8x\n",	               cam->params.apcor.gain2, 0, 0xff, 0x1a);	out += sprintf(out, "apcor_gain4:            %#8x  %#8x  %#8x  %#8x\n",	               cam->params.apcor.gain4, 0, 0xff, 0x2d);	out += sprintf(out, "apcor_gain8:            %#8x  %#8x  %#8x  %#8x\n",	               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");	} finish:	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 *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

⌨️ 快捷键说明

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