Lines Matching +full:1 +full:- +full:sd
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * cpia CPiA (1) gspca driver
5 * Copyright (C) 2010-2011 Hans de Goede <hdegoede@redhat.com>
9 * (C) Copyright 1999-2000 Peter Pregler
10 * (C) Copyright 1999-2000 Scott J. Bertin
11 * (C) Copyright 1999-2000 Johannes Erdfelt <johannes@erdfelt.com>
35 #define VIDEOSIZE_CIF 1 /* 352x288 */
37 #define SUBSAMPLE_422 1
39 #define YUVORDER_UYVY 1
41 #define COMPRESSED 1
43 #define DECIMATION_ENAB 1
50 #define CPIA_GRAB_CONTINEOUS 1
54 #define CPIA_COMPRESSION_AUTO 1
57 #define CPIA_COMPRESSION_TARGET_FRAMERATE 1
61 #define GRABSTATE 1
71 #define PASS_THROUGH_STATE 1
78 #define GRAB_ACTIVE 1
83 #define STREAM_READY 1
89 #define CPIA_FLAG 1
119 #define EXPOSURE_LIGHT 1
125 #define CPIA_MODULE_SYSTEM (1 << 5)
133 #define CPIA_COMMAND_GetCPIAVersion (INPUT | CPIA_MODULE_CPIA | 1)
142 #define CPIA_COMMAND_ReadVCRegs (INPUT | CPIA_MODULE_SYSTEM | 1)
156 #define CPIA_COMMAND_GetVPVersion (INPUT | CPIA_MODULE_VP_CTRL | 1)
174 #define CPIA_COMMAND_GrabFrame (OUTPUT | CPIA_MODULE_CAPTURE | 1)
190 #define CPIA_COMMAND_OutputRS232 (OUTPUT | CPIA_MODULE_DEBUG | 1)
214 #define FIRMWARE_VERSION(x, y) (sd->params.version.firmwareVersion == (x) && \
215 sd->params.version.firmwareRevision == (y))
226 /* Developer's Guide Table 5 p 3-34
353 struct sd { struct
362 u8 mainsFreq; /* 0 = 50hz, 1 = 60hz */
384 .priv = 1},
407 pipe = usb_rcvctrlpipe(gspca_dev->dev, 0); in cpia_usb_transferCmd()
410 pipe = usb_sndctrlpipe(gspca_dev->dev, 0); in cpia_usb_transferCmd()
415 return -EINVAL; in cpia_usb_transferCmd()
419 ret = usb_control_msg(gspca_dev->dev, pipe, in cpia_usb_transferCmd()
420 command[1], in cpia_usb_transferCmd()
424 gspca_dev->usb_buf, databytes, 1000); in cpia_usb_transferCmd()
427 pr_err("usb_control_msg %02x, error %d\n", command[1], ret); in cpia_usb_transferCmd()
429 if (ret == -EPIPE && retries > 0) { in cpia_usb_transferCmd()
430 retries--; in cpia_usb_transferCmd()
441 struct sd *sd = (struct sd *) gspca_dev; in do_command() local
465 cmd[1] = command & 0xff; in do_command()
479 sd->params.version.firmwareVersion = gspca_dev->usb_buf[0]; in do_command()
480 sd->params.version.firmwareRevision = gspca_dev->usb_buf[1]; in do_command()
481 sd->params.version.vcVersion = gspca_dev->usb_buf[2]; in do_command()
482 sd->params.version.vcRevision = gspca_dev->usb_buf[3]; in do_command()
485 sd->params.pnpID.vendor = in do_command()
486 gspca_dev->usb_buf[0] | (gspca_dev->usb_buf[1] << 8); in do_command()
487 sd->params.pnpID.product = in do_command()
488 gspca_dev->usb_buf[2] | (gspca_dev->usb_buf[3] << 8); in do_command()
489 sd->params.pnpID.deviceRevision = in do_command()
490 gspca_dev->usb_buf[4] | (gspca_dev->usb_buf[5] << 8); in do_command()
493 sd->params.status.systemState = gspca_dev->usb_buf[0]; in do_command()
494 sd->params.status.grabState = gspca_dev->usb_buf[1]; in do_command()
495 sd->params.status.streamState = gspca_dev->usb_buf[2]; in do_command()
496 sd->params.status.fatalError = gspca_dev->usb_buf[3]; in do_command()
497 sd->params.status.cmdError = gspca_dev->usb_buf[4]; in do_command()
498 sd->params.status.debugFlags = gspca_dev->usb_buf[5]; in do_command()
499 sd->params.status.vpStatus = gspca_dev->usb_buf[6]; in do_command()
500 sd->params.status.errorCode = gspca_dev->usb_buf[7]; in do_command()
503 sd->params.vpVersion.vpVersion = gspca_dev->usb_buf[0]; in do_command()
504 sd->params.vpVersion.vpRevision = gspca_dev->usb_buf[1]; in do_command()
505 sd->params.vpVersion.cameraHeadID = in do_command()
506 gspca_dev->usb_buf[2] | (gspca_dev->usb_buf[3] << 8); in do_command()
509 sd->params.colourParams.brightness = gspca_dev->usb_buf[0]; in do_command()
510 sd->params.colourParams.contrast = gspca_dev->usb_buf[1]; in do_command()
511 sd->params.colourParams.saturation = gspca_dev->usb_buf[2]; in do_command()
514 sd->params.colourBalance.redGain = gspca_dev->usb_buf[0]; in do_command()
515 sd->params.colourBalance.greenGain = gspca_dev->usb_buf[1]; in do_command()
516 sd->params.colourBalance.blueGain = gspca_dev->usb_buf[2]; in do_command()
519 sd->params.exposure.gain = gspca_dev->usb_buf[0]; in do_command()
520 sd->params.exposure.fineExp = gspca_dev->usb_buf[1]; in do_command()
521 sd->params.exposure.coarseExpLo = gspca_dev->usb_buf[2]; in do_command()
522 sd->params.exposure.coarseExpHi = gspca_dev->usb_buf[3]; in do_command()
523 sd->params.exposure.redComp = gspca_dev->usb_buf[4]; in do_command()
524 sd->params.exposure.green1Comp = gspca_dev->usb_buf[5]; in do_command()
525 sd->params.exposure.green2Comp = gspca_dev->usb_buf[6]; in do_command()
526 sd->params.exposure.blueComp = gspca_dev->usb_buf[7]; in do_command()
531 a = ((gspca_dev->usb_buf[1] & 0x02) == 0); in do_command()
532 if (a != sd->params.qx3.button) { in do_command()
534 input_report_key(gspca_dev->input_dev, KEY_CAMERA, a); in do_command()
535 input_sync(gspca_dev->input_dev); in do_command()
537 sd->params.qx3.button = a; in do_command()
539 if (sd->params.qx3.button) { in do_command()
540 /* button pressed - unlock the latch */ in do_command()
552 sd->params.qx3.cradled = ((gspca_dev->usb_buf[2] & 0x40) == 0); in do_command()
568 cmd[1] = command & 0xff; in do_command_extended()
575 gspca_dev->usb_buf[0] = e; in do_command_extended()
576 gspca_dev->usb_buf[1] = f; in do_command_extended()
577 gspca_dev->usb_buf[2] = g; in do_command_extended()
578 gspca_dev->usb_buf[3] = h; in do_command_extended()
579 gspca_dev->usb_buf[4] = i; in do_command_extended()
580 gspca_dev->usb_buf[5] = j; in do_command_extended()
581 gspca_dev->usb_buf[6] = k; in do_command_extended()
582 gspca_dev->usb_buf[7] = l; in do_command_extended()
592 * Parameters: Brightness - last brightness value set with SetColourParameters
603 MaxAllowableOverExposure = FLICKER_MAX_EXPOSURE - brightness - in find_over_exposure()
620 struct sd *sd = (struct sd *) gspca_dev; in reset_camera_params() local
621 struct cam_params *params = &sd->params; in reset_camera_params()
626 params->colourParams.brightness = BRIGHTNESS_DEF; in reset_camera_params()
627 params->colourParams.contrast = CONTRAST_DEF; in reset_camera_params()
628 params->colourParams.saturation = SATURATION_DEF; in reset_camera_params()
629 params->exposure.gainMode = 4; in reset_camera_params()
630 params->exposure.expMode = 2; /* AEC */ in reset_camera_params()
631 params->exposure.compMode = 1; in reset_camera_params()
632 params->exposure.centreWeight = 1; in reset_camera_params()
633 params->exposure.gain = 0; in reset_camera_params()
634 params->exposure.fineExp = 0; in reset_camera_params()
635 params->exposure.coarseExpLo = 185; in reset_camera_params()
636 params->exposure.coarseExpHi = 0; in reset_camera_params()
637 params->exposure.redComp = COMP_RED; in reset_camera_params()
638 params->exposure.green1Comp = COMP_GREEN1; in reset_camera_params()
639 params->exposure.green2Comp = COMP_GREEN2; in reset_camera_params()
640 params->exposure.blueComp = COMP_BLUE; in reset_camera_params()
641 params->colourBalance.balanceMode = 2; /* ACB */ in reset_camera_params()
642 params->colourBalance.redGain = 32; in reset_camera_params()
643 params->colourBalance.greenGain = 6; in reset_camera_params()
644 params->colourBalance.blueGain = 92; in reset_camera_params()
645 params->apcor.gain1 = 0x18; in reset_camera_params()
646 params->apcor.gain2 = 0x16; in reset_camera_params()
647 params->apcor.gain4 = 0x24; in reset_camera_params()
648 params->apcor.gain8 = 0x34; in reset_camera_params()
649 params->vlOffset.gain1 = 20; in reset_camera_params()
650 params->vlOffset.gain2 = 24; in reset_camera_params()
651 params->vlOffset.gain4 = 26; in reset_camera_params()
652 params->vlOffset.gain8 = 26; in reset_camera_params()
653 params->compressionParams.hysteresis = 3; in reset_camera_params()
654 params->compressionParams.threshMax = 11; in reset_camera_params()
655 params->compressionParams.smallStep = 1; in reset_camera_params()
656 params->compressionParams.largeStep = 3; in reset_camera_params()
657 params->compressionParams.decimationHysteresis = 2; in reset_camera_params()
658 params->compressionParams.frDiffStepThresh = 5; in reset_camera_params()
659 params->compressionParams.qDiffStepThresh = 3; in reset_camera_params()
660 params->compressionParams.decimationThreshMod = 2; in reset_camera_params()
665 params->sensorFps.divisor = 1; in reset_camera_params()
666 params->sensorFps.baserate = 1; in reset_camera_params()
668 params->flickerControl.flickerMode = 0; in reset_camera_params()
669 params->flickerControl.disabled = 1; in reset_camera_params()
670 params->flickerControl.coarseJump = in reset_camera_params()
671 flicker_jumps[sd->mainsFreq] in reset_camera_params()
672 [params->sensorFps.baserate] in reset_camera_params()
673 [params->sensorFps.divisor]; in reset_camera_params()
674 params->flickerControl.allowableOverExposure = in reset_camera_params()
675 find_over_exposure(params->colourParams.brightness); in reset_camera_params()
677 params->yuvThreshold.yThreshold = 6; /* From windows driver */ in reset_camera_params()
678 params->yuvThreshold.uvThreshold = 6; /* From windows driver */ in reset_camera_params()
680 params->format.subSample = SUBSAMPLE_420; in reset_camera_params()
681 params->format.yuvOrder = YUVORDER_YUYV; in reset_camera_params()
683 params->compression.mode = CPIA_COMPRESSION_AUTO; in reset_camera_params()
684 params->compression.decimation = NO_DECIMATION; in reset_camera_params()
686 params->compressionTarget.frTargeting = COMP_TARGET_DEF; in reset_camera_params()
687 params->compressionTarget.targetFR = 15; /* From windows driver */ in reset_camera_params()
688 params->compressionTarget.targetQ = 5; /* From windows driver */ in reset_camera_params()
690 params->qx3.qx3_detected = 0; in reset_camera_params()
691 params->qx3.toplight = 0; in reset_camera_params()
692 params->qx3.bottomlight = 0; in reset_camera_params()
693 params->qx3.button = 0; in reset_camera_params()
694 params->qx3.cradled = 0; in reset_camera_params()
700 params->status.systemState, params->status.grabState, in printstatus()
701 params->status.streamState, params->status.fatalError, in printstatus()
702 params->status.cmdError, params->status.debugFlags, in printstatus()
703 params->status.vpStatus, params->status.errorCode); in printstatus()
708 struct sd *sd = (struct sd *) gspca_dev; in goto_low_power() local
719 if (sd->params.status.systemState != LO_POWER_STATE) { in goto_low_power()
720 if (sd->params.status.systemState != WARM_BOOT_STATE) { in goto_low_power()
722 sd->params.status.systemState); in goto_low_power()
723 printstatus(gspca_dev, &sd->params); in goto_low_power()
725 return -EIO; in goto_low_power()
734 struct sd *sd = (struct sd *) gspca_dev; in goto_high_power() local
744 return -EINTR; in goto_high_power()
750 if (sd->params.status.systemState != HI_POWER_STATE) { in goto_high_power()
752 sd->params.status.systemState); in goto_high_power()
753 printstatus(gspca_dev, &sd->params); in goto_high_power()
754 return -EIO; in goto_high_power()
787 struct sd *sd = (struct sd *) gspca_dev; in command_setformat() local
791 sd->params.format.videoSize, in command_setformat()
792 sd->params.format.subSample, in command_setformat()
793 sd->params.format.yuvOrder, 0); in command_setformat()
798 sd->params.roi.colStart, sd->params.roi.colEnd, in command_setformat()
799 sd->params.roi.rowStart, sd->params.roi.rowEnd); in command_setformat()
804 struct sd *sd = (struct sd *) gspca_dev; in command_setcolourparams() local
806 sd->params.colourParams.brightness, in command_setcolourparams()
807 sd->params.colourParams.contrast, in command_setcolourparams()
808 sd->params.colourParams.saturation, 0); in command_setcolourparams()
813 struct sd *sd = (struct sd *) gspca_dev; in command_setapcor() local
815 sd->params.apcor.gain1, in command_setapcor()
816 sd->params.apcor.gain2, in command_setapcor()
817 sd->params.apcor.gain4, in command_setapcor()
818 sd->params.apcor.gain8); in command_setapcor()
823 struct sd *sd = (struct sd *) gspca_dev; in command_setvloffset() local
825 sd->params.vlOffset.gain1, in command_setvloffset()
826 sd->params.vlOffset.gain2, in command_setvloffset()
827 sd->params.vlOffset.gain4, in command_setvloffset()
828 sd->params.vlOffset.gain8); in command_setvloffset()
833 struct sd *sd = (struct sd *) gspca_dev; in command_setexposure() local
837 sd->params.exposure.gainMode, in command_setexposure()
838 1, in command_setexposure()
839 sd->params.exposure.compMode, in command_setexposure()
840 sd->params.exposure.centreWeight, in command_setexposure()
841 sd->params.exposure.gain, in command_setexposure()
842 sd->params.exposure.fineExp, in command_setexposure()
843 sd->params.exposure.coarseExpLo, in command_setexposure()
844 sd->params.exposure.coarseExpHi, in command_setexposure()
845 sd->params.exposure.redComp, in command_setexposure()
846 sd->params.exposure.green1Comp, in command_setexposure()
847 sd->params.exposure.green2Comp, in command_setexposure()
848 sd->params.exposure.blueComp); in command_setexposure()
852 if (sd->params.exposure.expMode != 1) { in command_setexposure()
855 sd->params.exposure.expMode, in command_setexposure()
857 sd->params.exposure.gain, in command_setexposure()
858 sd->params.exposure.fineExp, in command_setexposure()
859 sd->params.exposure.coarseExpLo, in command_setexposure()
860 sd->params.exposure.coarseExpHi, in command_setexposure()
869 struct sd *sd = (struct sd *) gspca_dev; in command_setcolourbalance() local
871 if (sd->params.colourBalance.balanceMode == 1) { in command_setcolourbalance()
875 1, in command_setcolourbalance()
876 sd->params.colourBalance.redGain, in command_setcolourbalance()
877 sd->params.colourBalance.greenGain, in command_setcolourbalance()
878 sd->params.colourBalance.blueGain); in command_setcolourbalance()
885 if (sd->params.colourBalance.balanceMode == 2) { in command_setcolourbalance()
889 if (sd->params.colourBalance.balanceMode == 3) { in command_setcolourbalance()
894 return -EINVAL; in command_setcolourbalance()
899 struct sd *sd = (struct sd *) gspca_dev; in command_setcompressiontarget() local
902 sd->params.compressionTarget.frTargeting, in command_setcompressiontarget()
903 sd->params.compressionTarget.targetFR, in command_setcompressiontarget()
904 sd->params.compressionTarget.targetQ, 0); in command_setcompressiontarget()
909 struct sd *sd = (struct sd *) gspca_dev; in command_setyuvtresh() local
912 sd->params.yuvThreshold.yThreshold, in command_setyuvtresh()
913 sd->params.yuvThreshold.uvThreshold, 0, 0); in command_setyuvtresh()
918 struct sd *sd = (struct sd *) gspca_dev; in command_setcompressionparams() local
923 sd->params.compressionParams.hysteresis, in command_setcompressionparams()
924 sd->params.compressionParams.threshMax, in command_setcompressionparams()
925 sd->params.compressionParams.smallStep, in command_setcompressionparams()
926 sd->params.compressionParams.largeStep, in command_setcompressionparams()
927 sd->params.compressionParams.decimationHysteresis, in command_setcompressionparams()
928 sd->params.compressionParams.frDiffStepThresh, in command_setcompressionparams()
929 sd->params.compressionParams.qDiffStepThresh, in command_setcompressionparams()
930 sd->params.compressionParams.decimationThreshMod); in command_setcompressionparams()
935 struct sd *sd = (struct sd *) gspca_dev; in command_setcompression() local
938 sd->params.compression.mode, in command_setcompression()
939 sd->params.compression.decimation, 0, 0); in command_setcompression()
944 struct sd *sd = (struct sd *) gspca_dev; in command_setsensorfps() local
947 sd->params.sensorFps.divisor, in command_setsensorfps()
948 sd->params.sensorFps.baserate, 0, 0); in command_setsensorfps()
953 struct sd *sd = (struct sd *) gspca_dev; in command_setflickerctrl() local
956 sd->params.flickerControl.flickerMode, in command_setflickerctrl()
957 sd->params.flickerControl.coarseJump, in command_setflickerctrl()
958 sd->params.flickerControl.allowableOverExposure, in command_setflickerctrl()
964 struct sd *sd = (struct sd *) gspca_dev; in command_setecptiming() local
967 sd->params.ecpTiming, 0, 0, 0); in command_setecptiming()
977 struct sd *sd = (struct sd *) gspca_dev; in command_resume() local
980 0, sd->params.streamStartLine, 0, 0); in command_resume()
985 struct sd *sd = (struct sd *) gspca_dev; in command_setlights() local
988 p1 = (sd->params.qx3.bottomlight == 0) << 1; in command_setlights()
989 p2 = (sd->params.qx3.toplight == 0) << 3; in command_setlights()
1006 (u8) ((((float) base - 128.0) * ((float) curexp / (float) newexp)) + 128.5) in set_flicker()
1009 (float)(u8)(basecomp - 128)) in set_flicker()
1013 (u8)(128 + (((u32)(2*(base-128)*curexp + newexp)) / (2 * newexp))) in set_flicker()
1015 (u16)(((u32)(curexp * (u8)(curcomp + 128)) / (u8)(basecomp - 128))) in set_flicker()
1018 struct sd *sd = (struct sd *) gspca_dev; in set_flicker() local
1019 int currentexp = sd->params.exposure.coarseExpLo + in set_flicker()
1020 sd->params.exposure.coarseExpHi * 256; in set_flicker()
1024 int cj = sd->params.flickerControl.coarseJump; in set_flicker()
1025 sd->params.flickerControl.flickerMode = 1; in set_flicker()
1026 sd->params.flickerControl.disabled = 0; in set_flicker()
1027 if (sd->params.exposure.expMode != 2) { in set_flicker()
1028 sd->params.exposure.expMode = 2; in set_flicker()
1029 sd->exposure_status = EXPOSURE_NORMAL; in set_flicker()
1031 if (sd->params.exposure.gain >= BITS_PER_TYPE(currentexp)) in set_flicker()
1032 return -EINVAL; in set_flicker()
1033 currentexp = currentexp << sd->params.exposure.gain; in set_flicker()
1034 sd->params.exposure.gain = 0; in set_flicker()
1037 if (startexp < 1) in set_flicker()
1038 startexp = 1; in set_flicker()
1039 startexp = (startexp * cj) - 1; in set_flicker()
1040 if (FIRMWARE_VERSION(1, 2)) in set_flicker()
1042 startexp -= cj; in set_flicker()
1045 startexp -= cj; in set_flicker()
1046 sd->params.exposure.coarseExpLo = startexp & 0xff; in set_flicker()
1047 sd->params.exposure.coarseExpHi = startexp >> 8; in set_flicker()
1051 sd->params.exposure.redComp = in set_flicker()
1053 sd->params.exposure.green1Comp = in set_flicker()
1055 sd->params.exposure.green2Comp = in set_flicker()
1057 sd->params.exposure.blueComp = in set_flicker()
1060 sd->params.exposure.redComp = COMP_RED; in set_flicker()
1061 sd->params.exposure.green1Comp = COMP_GREEN1; in set_flicker()
1062 sd->params.exposure.green2Comp = COMP_GREEN2; in set_flicker()
1063 sd->params.exposure.blueComp = COMP_BLUE; in set_flicker()
1065 if (FIRMWARE_VERSION(1, 2)) in set_flicker()
1066 sd->params.exposure.compMode = 0; in set_flicker()
1068 sd->params.exposure.compMode = 1; in set_flicker()
1070 sd->params.apcor.gain1 = 0x18; in set_flicker()
1071 sd->params.apcor.gain2 = 0x18; in set_flicker()
1072 sd->params.apcor.gain4 = 0x16; in set_flicker()
1073 sd->params.apcor.gain8 = 0x14; in set_flicker()
1075 sd->params.flickerControl.flickerMode = 0; in set_flicker()
1076 sd->params.flickerControl.disabled = 1; in set_flicker()
1079 sd->params.exposure.redComp, currentexp); in set_flicker()
1081 sd->params.exposure.green1Comp, currentexp); in set_flicker()
1083 sd->params.exposure.green2Comp, currentexp); in set_flicker()
1085 sd->params.exposure.blueComp, currentexp); in set_flicker()
1087 while (startexp > MAX_EXP && sd->params.exposure.gain < in set_flicker()
1088 sd->params.exposure.gainMode - 1) { in set_flicker()
1089 startexp = startexp >> 1; in set_flicker()
1090 ++sd->params.exposure.gain; in set_flicker()
1092 if (FIRMWARE_VERSION(1, 2) && startexp > MAX_EXP_102) in set_flicker()
1096 sd->params.exposure.coarseExpLo = startexp & 0xff; in set_flicker()
1097 sd->params.exposure.coarseExpHi = startexp >> 8; in set_flicker()
1098 sd->params.exposure.redComp = COMP_RED; in set_flicker()
1099 sd->params.exposure.green1Comp = COMP_GREEN1; in set_flicker()
1100 sd->params.exposure.green2Comp = COMP_GREEN2; in set_flicker()
1101 sd->params.exposure.blueComp = COMP_BLUE; in set_flicker()
1102 sd->params.exposure.compMode = 1; in set_flicker()
1103 sd->params.apcor.gain1 = 0x18; in set_flicker()
1104 sd->params.apcor.gain2 = 0x16; in set_flicker()
1105 sd->params.apcor.gain4 = 0x24; in set_flicker()
1106 sd->params.apcor.gain8 = 0x34; in set_flicker()
1108 sd->params.vlOffset.gain1 = 20; in set_flicker()
1109 sd->params.vlOffset.gain2 = 24; in set_flicker()
1110 sd->params.vlOffset.gain4 = 26; in set_flicker()
1111 sd->params.vlOffset.gain8 = 26; in set_flicker()
1139 struct sd *sd = (struct sd *) gspca_dev; in monitor_exposure() local
1148 cmd[1] = CPIA_COMMAND_ReadVPRegs & 0xff; in monitor_exposure()
1157 pr_err("ReadVPRegs(30,4,9,8) - failed: %d\n", ret); in monitor_exposure()
1160 exp_acc = gspca_dev->usb_buf[0]; in monitor_exposure()
1161 bcomp = gspca_dev->usb_buf[1]; in monitor_exposure()
1163 light_exp = sd->params.colourParams.brightness + in monitor_exposure()
1164 TC - 50 + EXP_ACC_LIGHT; in monitor_exposure()
1167 dark_exp = sd->params.colourParams.brightness + in monitor_exposure()
1168 TC - 50 - EXP_ACC_DARK; in monitor_exposure()
1173 old_exposure = sd->params.exposure.coarseExpHi * 256 + in monitor_exposure()
1174 sd->params.exposure.coarseExpLo; in monitor_exposure()
1176 if (!sd->params.flickerControl.disabled) { in monitor_exposure()
1178 int max_comp = FIRMWARE_VERSION(1, 2) ? MAX_COMP : in monitor_exposure()
1185 if (sd->exposure_status == EXPOSURE_VERY_DARK) in monitor_exposure()
1186 ++sd->exposure_count; in monitor_exposure()
1188 sd->exposure_status = in monitor_exposure()
1190 sd->exposure_count = 1; in monitor_exposure()
1194 if (sd->exposure_status == EXPOSURE_DARK) in monitor_exposure()
1195 ++sd->exposure_count; in monitor_exposure()
1197 sd->exposure_status = EXPOSURE_DARK; in monitor_exposure()
1198 sd->exposure_count = 1; in monitor_exposure()
1205 if (sd->exposure_status == EXPOSURE_VERY_LIGHT) in monitor_exposure()
1206 ++sd->exposure_count; in monitor_exposure()
1208 sd->exposure_status = in monitor_exposure()
1210 sd->exposure_count = 1; in monitor_exposure()
1214 if (sd->exposure_status == EXPOSURE_LIGHT) in monitor_exposure()
1215 ++sd->exposure_count; in monitor_exposure()
1217 sd->exposure_status = EXPOSURE_LIGHT; in monitor_exposure()
1218 sd->exposure_count = 1; in monitor_exposure()
1223 sd->exposure_status = EXPOSURE_NORMAL; in monitor_exposure()
1231 if (sd->exposure_status == EXPOSURE_VERY_DARK) in monitor_exposure()
1232 ++sd->exposure_count; in monitor_exposure()
1234 sd->exposure_status = in monitor_exposure()
1236 sd->exposure_count = 1; in monitor_exposure()
1240 if (sd->exposure_status == EXPOSURE_DARK) in monitor_exposure()
1241 ++sd->exposure_count; in monitor_exposure()
1243 sd->exposure_status = EXPOSURE_DARK; in monitor_exposure()
1244 sd->exposure_count = 1; in monitor_exposure()
1251 if (sd->exposure_status == EXPOSURE_VERY_LIGHT) in monitor_exposure()
1252 ++sd->exposure_count; in monitor_exposure()
1254 sd->exposure_status = in monitor_exposure()
1256 sd->exposure_count = 1; in monitor_exposure()
1260 if (sd->exposure_status == EXPOSURE_LIGHT) in monitor_exposure()
1261 ++sd->exposure_count; in monitor_exposure()
1263 sd->exposure_status = EXPOSURE_LIGHT; in monitor_exposure()
1264 sd->exposure_count = 1; in monitor_exposure()
1269 sd->exposure_status = EXPOSURE_NORMAL; in monitor_exposure()
1273 framerate = atomic_read(&sd->fps); in monitor_exposure()
1274 if (framerate > 30 || framerate < 1) in monitor_exposure()
1275 framerate = 1; in monitor_exposure()
1277 if (!sd->params.flickerControl.disabled) { in monitor_exposure()
1279 if ((sd->exposure_status == EXPOSURE_VERY_DARK || in monitor_exposure()
1280 sd->exposure_status == EXPOSURE_DARK) && in monitor_exposure()
1281 sd->exposure_count >= DARK_TIME * framerate && in monitor_exposure()
1282 sd->params.sensorFps.divisor < 2) { in monitor_exposure()
1285 ++sd->params.sensorFps.divisor; in monitor_exposure()
1286 setfps = 1; in monitor_exposure()
1288 sd->params.flickerControl.coarseJump = in monitor_exposure()
1289 flicker_jumps[sd->mainsFreq] in monitor_exposure()
1290 [sd->params.sensorFps.baserate] in monitor_exposure()
1291 [sd->params.sensorFps.divisor]; in monitor_exposure()
1292 setflicker = 1; in monitor_exposure()
1294 new_exposure = sd->params.flickerControl.coarseJump-1; in monitor_exposure()
1297 sd->params.flickerControl.coarseJump; in monitor_exposure()
1298 sd->params.exposure.coarseExpLo = new_exposure & 0xff; in monitor_exposure()
1299 sd->params.exposure.coarseExpHi = new_exposure >> 8; in monitor_exposure()
1300 setexp = 1; in monitor_exposure()
1301 sd->exposure_status = EXPOSURE_NORMAL; in monitor_exposure()
1304 } else if ((sd->exposure_status == EXPOSURE_VERY_LIGHT || in monitor_exposure()
1305 sd->exposure_status == EXPOSURE_LIGHT) && in monitor_exposure()
1306 sd->exposure_count >= LIGHT_TIME * framerate && in monitor_exposure()
1307 sd->params.sensorFps.divisor > 0) { in monitor_exposure()
1310 int max_exp = FIRMWARE_VERSION(1, 2) ? MAX_EXP_102 : in monitor_exposure()
1312 --sd->params.sensorFps.divisor; in monitor_exposure()
1313 setfps = 1; in monitor_exposure()
1315 sd->params.flickerControl.coarseJump = in monitor_exposure()
1316 flicker_jumps[sd->mainsFreq] in monitor_exposure()
1317 [sd->params.sensorFps.baserate] in monitor_exposure()
1318 [sd->params.sensorFps.divisor]; in monitor_exposure()
1319 setflicker = 1; in monitor_exposure()
1321 new_exposure = sd->params.flickerControl.coarseJump-1; in monitor_exposure()
1324 sd->params.flickerControl.coarseJump < max_exp) in monitor_exposure()
1326 sd->params.flickerControl.coarseJump; in monitor_exposure()
1327 sd->params.exposure.coarseExpLo = new_exposure & 0xff; in monitor_exposure()
1328 sd->params.exposure.coarseExpHi = new_exposure >> 8; in monitor_exposure()
1329 setexp = 1; in monitor_exposure()
1330 sd->exposure_status = EXPOSURE_NORMAL; in monitor_exposure()
1335 if ((sd->exposure_status == EXPOSURE_VERY_DARK || in monitor_exposure()
1336 sd->exposure_status == EXPOSURE_DARK) && in monitor_exposure()
1337 sd->exposure_count >= DARK_TIME * framerate && in monitor_exposure()
1338 sd->params.sensorFps.divisor < 2) { in monitor_exposure()
1341 ++sd->params.sensorFps.divisor; in monitor_exposure()
1342 setfps = 1; in monitor_exposure()
1344 if (sd->params.exposure.gain > 0) { in monitor_exposure()
1345 --sd->params.exposure.gain; in monitor_exposure()
1346 setexp = 1; in monitor_exposure()
1348 sd->exposure_status = EXPOSURE_NORMAL; in monitor_exposure()
1351 } else if ((sd->exposure_status == EXPOSURE_VERY_LIGHT || in monitor_exposure()
1352 sd->exposure_status == EXPOSURE_LIGHT) && in monitor_exposure()
1353 sd->exposure_count >= LIGHT_TIME * framerate && in monitor_exposure()
1354 sd->params.sensorFps.divisor > 0) { in monitor_exposure()
1357 --sd->params.sensorFps.divisor; in monitor_exposure()
1358 setfps = 1; in monitor_exposure()
1360 if (sd->params.exposure.gain < in monitor_exposure()
1361 sd->params.exposure.gainMode - 1) { in monitor_exposure()
1362 ++sd->params.exposure.gain; in monitor_exposure()
1363 setexp = 1; in monitor_exposure()
1365 sd->exposure_status = EXPOSURE_NORMAL; in monitor_exposure()
1380 /*-----------------------------------------------------------------*/
1385 It also adjust the colour balance when an exposure step is detected - as
1390 struct sd *sd = (struct sd *) gspca_dev; in restart_flicker() local
1393 if (!FIRMWARE_VERSION(1, 2)) in restart_flicker()
1396 cam_exposure = atomic_read(&sd->cam_exposure); in restart_flicker()
1398 if (sd->params.flickerControl.flickerMode == 0 || in restart_flicker()
1402 old_exp = sd->params.exposure.coarseExpLo + in restart_flicker()
1403 sd->params.exposure.coarseExpHi*256; in restart_flicker()
1408 cam_exposure %= sd->params.flickerControl.coarseJump; in restart_flicker()
1409 if (!sd->params.flickerControl.disabled && in restart_flicker()
1410 cam_exposure <= sd->params.flickerControl.coarseJump - 3) { in restart_flicker()
1411 /* Flicker control auto-disabled */ in restart_flicker()
1412 sd->params.flickerControl.disabled = 1; in restart_flicker()
1415 if (sd->params.flickerControl.disabled && in restart_flicker()
1416 old_exp > sd->params.flickerControl.coarseJump + in restart_flicker()
1420 set_flicker(gspca_dev, 1, 1); in restart_flicker()
1428 struct sd *sd = (struct sd *) gspca_dev; in sd_config() local
1431 sd->mainsFreq = FREQ_DEF == V4L2_CID_POWER_LINE_FREQUENCY_60HZ; in sd_config()
1435 id->idVendor, id->idProduct); in sd_config()
1437 cam = &gspca_dev->cam; in sd_config()
1438 cam->cam_mode = mode; in sd_config()
1439 cam->nmodes = ARRAY_SIZE(mode); in sd_config()
1443 sd->params.version.firmwareVersion = 0; in sd_config()
1445 if (sd->params.version.firmwareVersion != 1) { in sd_config()
1446 gspca_err(gspca_dev, "only firmware version 1 is supported (got: %d)\n", in sd_config()
1447 sd->params.version.firmwareVersion); in sd_config()
1448 return -ENODEV; in sd_config()
1451 /* A bug in firmware 1-02 limits gainMode to 2 */ in sd_config()
1452 if (sd->params.version.firmwareRevision <= 2 && in sd_config()
1453 sd->params.exposure.gainMode > 2) { in sd_config()
1454 sd->params.exposure.gainMode = 2; in sd_config()
1458 sd->params.qx3.qx3_detected = (sd->params.pnpID.vendor == 0x0813 && in sd_config()
1459 sd->params.pnpID.product == 0x0001); in sd_config()
1463 /* -- start the camera -- */
1466 struct sd *sd = (struct sd *) gspca_dev; in sd_start() local
1471 if (sd->params.status.systemState != WARM_BOOT_STATE) { in sd_start()
1473 sd->params.status.systemState); in sd_start()
1474 printstatus(gspca_dev, &sd->params); in sd_start()
1475 return -ENODEV; in sd_start()
1493 /* procedure described in developer's guide p3-28 */ in sd_start()
1496 sd->params.version.firmwareVersion = 0; in sd_start()
1500 * the camera powers up (developer's guide p 3-38) */ in sd_start()
1503 * in firmware 1-02 */ in sd_start()
1519 if (sd->params.status.fatalError) { in sd_start()
1521 sd->params.status.fatalError, in sd_start()
1522 sd->params.status.vpStatus); in sd_start()
1523 return -EIO; in sd_start()
1533 sd->params.streamStartLine = 120; in sd_start()
1535 priv = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; in sd_start()
1537 sd->params.roi.colStart = 2; in sd_start()
1538 sd->params.roi.rowStart = 6; in sd_start()
1540 sd->params.roi.colStart = 0; in sd_start()
1541 sd->params.roi.rowStart = 0; in sd_start()
1545 sd->params.format.videoSize = VIDEOSIZE_QCIF; in sd_start()
1546 sd->params.roi.colStart /= 2; in sd_start()
1547 sd->params.roi.rowStart /= 2; in sd_start()
1548 sd->params.streamStartLine /= 2; in sd_start()
1550 sd->params.format.videoSize = VIDEOSIZE_CIF; in sd_start()
1552 sd->params.roi.colEnd = sd->params.roi.colStart + in sd_start()
1553 (gspca_dev->pixfmt.width >> 3); in sd_start()
1554 sd->params.roi.rowEnd = sd->params.roi.rowStart + in sd_start()
1555 (gspca_dev->pixfmt.height >> 2); in sd_start()
1613 sd->first_frame = 6; in sd_start()
1614 sd->exposure_status = EXPOSURE_NORMAL; in sd_start()
1615 sd->exposure_count = 0; in sd_start()
1616 atomic_set(&sd->cam_exposure, 0); in sd_start()
1617 atomic_set(&sd->fps, 0); in sd_start()
1624 struct sd *sd __maybe_unused = (struct sd *) gspca_dev; in sd_stopN()
1639 if (sd->params.qx3.button) { in sd_stopN()
1641 the latch, so we do not reset sd->params.qx3.button now, to in sd_stopN()
1643 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0); in sd_stopN()
1644 input_sync(gspca_dev->input_dev); in sd_stopN()
1652 struct sd *sd = (struct sd *) gspca_dev; in sd_init() local
1664 if (sd->params.qx3.qx3_detected) in sd_init()
1670 sd->params.version.firmwareVersion, in sd_init()
1671 sd->params.version.firmwareRevision, in sd_init()
1672 sd->params.version.vcVersion, in sd_init()
1673 sd->params.version.vcRevision); in sd_init()
1674 gspca_dbg(gspca_dev, D_PROBE, "CPIA PnP-ID: %04x:%04x:%04x", in sd_init()
1675 sd->params.pnpID.vendor, sd->params.pnpID.product, in sd_init()
1676 sd->params.pnpID.deviceRevision); in sd_init()
1677 gspca_dbg(gspca_dev, D_PROBE, "VP-Version: %d.%d %04x", in sd_init()
1678 sd->params.vpVersion.vpVersion, in sd_init()
1679 sd->params.vpVersion.vpRevision, in sd_init()
1680 sd->params.vpVersion.cameraHeadID); in sd_init()
1689 struct sd *sd = (struct sd *) gspca_dev; in sd_pkt_scan() local
1693 data[0] == MAGIC_0 && data[1] == MAGIC_1 && in sd_pkt_scan()
1694 data[16] == sd->params.format.videoSize && in sd_pkt_scan()
1695 data[17] == sd->params.format.subSample && in sd_pkt_scan()
1696 data[18] == sd->params.format.yuvOrder && in sd_pkt_scan()
1697 data[24] == sd->params.roi.colStart && in sd_pkt_scan()
1698 data[25] == sd->params.roi.colEnd && in sd_pkt_scan()
1699 data[26] == sd->params.roi.rowStart && in sd_pkt_scan()
1700 data[27] == sd->params.roi.rowEnd) { in sd_pkt_scan()
1703 atomic_set(&sd->cam_exposure, data[39] * 2); in sd_pkt_scan()
1704 atomic_set(&sd->fps, data[41]); in sd_pkt_scan()
1707 image = gspca_dev->image; in sd_pkt_scan()
1709 gspca_dev->image_len > 4 && in sd_pkt_scan()
1710 image[gspca_dev->image_len - 4] == 0xff && in sd_pkt_scan()
1711 image[gspca_dev->image_len - 3] == 0xff && in sd_pkt_scan()
1712 image[gspca_dev->image_len - 2] == 0xff && in sd_pkt_scan()
1713 image[gspca_dev->image_len - 1] == 0xff) in sd_pkt_scan()
1726 struct sd *sd = (struct sd *) gspca_dev; in sd_dq_callback() local
1730 if (sd->first_frame) { in sd_dq_callback()
1731 sd->first_frame--; in sd_dq_callback()
1732 if (sd->first_frame == 0) in sd_dq_callback()
1741 if (sd->params.exposure.expMode == 2) in sd_dq_callback()
1752 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); in sd_s_ctrl()
1753 struct sd *sd = (struct sd *)gspca_dev; in sd_s_ctrl() local
1755 gspca_dev->usb_err = 0; in sd_s_ctrl()
1757 if (!gspca_dev->streaming && ctrl->id != V4L2_CID_POWER_LINE_FREQUENCY) in sd_s_ctrl()
1760 switch (ctrl->id) { in sd_s_ctrl()
1762 sd->params.colourParams.brightness = ctrl->val; in sd_s_ctrl()
1763 sd->params.flickerControl.allowableOverExposure = in sd_s_ctrl()
1764 find_over_exposure(sd->params.colourParams.brightness); in sd_s_ctrl()
1765 gspca_dev->usb_err = command_setcolourparams(gspca_dev); in sd_s_ctrl()
1766 if (!gspca_dev->usb_err) in sd_s_ctrl()
1767 gspca_dev->usb_err = command_setflickerctrl(gspca_dev); in sd_s_ctrl()
1770 sd->params.colourParams.contrast = ctrl->val; in sd_s_ctrl()
1771 gspca_dev->usb_err = command_setcolourparams(gspca_dev); in sd_s_ctrl()
1774 sd->params.colourParams.saturation = ctrl->val; in sd_s_ctrl()
1775 gspca_dev->usb_err = command_setcolourparams(gspca_dev); in sd_s_ctrl()
1778 sd->mainsFreq = ctrl->val == V4L2_CID_POWER_LINE_FREQUENCY_60HZ; in sd_s_ctrl()
1779 sd->params.flickerControl.coarseJump = in sd_s_ctrl()
1780 flicker_jumps[sd->mainsFreq] in sd_s_ctrl()
1781 [sd->params.sensorFps.baserate] in sd_s_ctrl()
1782 [sd->params.sensorFps.divisor]; in sd_s_ctrl()
1784 gspca_dev->usb_err = set_flicker(gspca_dev, in sd_s_ctrl()
1785 ctrl->val != V4L2_CID_POWER_LINE_FREQUENCY_DISABLED, in sd_s_ctrl()
1786 gspca_dev->streaming); in sd_s_ctrl()
1789 sd->params.qx3.bottomlight = ctrl->val; in sd_s_ctrl()
1790 gspca_dev->usb_err = command_setlights(gspca_dev); in sd_s_ctrl()
1793 sd->params.qx3.toplight = ctrl->val; in sd_s_ctrl()
1794 gspca_dev->usb_err = command_setlights(gspca_dev); in sd_s_ctrl()
1797 sd->params.compressionTarget.frTargeting = ctrl->val; in sd_s_ctrl()
1798 gspca_dev->usb_err = command_setcompressiontarget(gspca_dev); in sd_s_ctrl()
1801 return gspca_dev->usb_err; in sd_s_ctrl()
1810 struct sd *sd = (struct sd *)gspca_dev; in sd_init_controls() local
1811 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; in sd_init_controls()
1823 .max = 1, in sd_init_controls()
1827 gspca_dev->vdev.ctrl_handler = hdl; in sd_init_controls()
1830 V4L2_CID_BRIGHTNESS, 0, 100, 1, BRIGHTNESS_DEF); in sd_init_controls()
1834 V4L2_CID_SATURATION, 0, 100, 1, SATURATION_DEF); in sd_init_controls()
1835 sd->freq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops, in sd_init_controls()
1839 if (sd->params.qx3.qx3_detected) { in sd_init_controls()
1841 V4L2_CID_ILLUMINATORS_1, 0, 1, 1, in sd_init_controls()
1844 V4L2_CID_ILLUMINATORS_2, 0, 1, 1, in sd_init_controls()
1849 if (hdl->error) { in sd_init_controls()
1851 return hdl->error; in sd_init_controls()
1856 /* sub-driver description */
1867 .other_input = 1,
1871 /* -- module initialisation -- */
1879 /* -- device connect -- */
1883 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), in sd_probe()