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