📄 cpia.c
字号:
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 + -