• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asus-wl-520gu-7.0.1.45/src/linux/linux/drivers/media/video/

Lines Matching defs:cam

176 static void reset_camera_struct(struct cam_data *cam);
247 struct cam_data *cam = data;
257 cam->params.version.firmwareVersion,
258 cam->params.version.firmwareRevision,
259 cam->params.version.vcVersion,
260 cam->params.version.vcRevision);
262 cam->params.pnpID.vendor, cam->params.pnpID.product,
263 cam->params.pnpID.deviceRevision);
265 cam->params.vpVersion.vpVersion,
266 cam->params.vpVersion.vpRevision,
267 cam->params.vpVersion.cameraHeadID);
270 cam->params.status.systemState);
272 cam->params.status.grabState);
274 cam->params.status.streamState);
276 cam->params.status.fatalError);
278 cam->params.status.cmdError);
280 cam->params.status.debugFlags);
282 cam->params.status.vpStatus);
284 cam->params.status.errorCode);
286 if (cam->params.qx3.qx3_detected) {
288 cam->params.qx3.button);
290 cam->params.qx3.cradled);
293 cam->params.format.videoSize == VIDEOSIZE_CIF ?
296 cam->params.format.subSample == SUBSAMPLE_420 ?
299 cam->params.format.yuvOrder == YUVORDER_YUYV ?
302 cam->params.roi.colStart*8,
303 cam->params.roi.rowStart*4,
304 cam->params.roi.colEnd*8,
305 cam->params.roi.rowEnd*4);
306 out += sprintf(out, "actual_fps: %3d\n", cam->fps);
308 cam->transfer_rate);
314 cam->params.colourParams.brightness, 0, 100, 50);
315 if (cam->params.version.firmwareVersion == 1 &&
316 cam->params.version.firmwareRevision == 2)
324 cam->params.colourParams.contrast, 0, tmp, 48);
326 cam->params.colourParams.saturation, 0, 100, 50);
327 tmp = (25000+5000*cam->params.sensorFps.baserate)/
328 (1<<cam->params.sensorFps.divisor);
332 2*cam->params.streamStartLine, 0,
333 cam->params.format.videoSize == VIDEOSIZE_CIF ? 288:144,
334 cam->params.format.videoSize == VIDEOSIZE_CIF ? 240:120);
336 cam->params.ecpTiming ? "slow" : "normal", "slow",
339 if (cam->params.colourBalance.balanceModeIsAuto) {
347 cam->params.colourBalance.redGain, 0, 212, 32);
349 cam->params.colourBalance.greenGain, 0, 212, 6);
351 cam->params.colourBalance.blueGain, 0, 212, 92);
353 if (cam->params.version.firmwareVersion == 1 &&
354 cam->params.version.firmwareRevision == 2)
360 if (cam->params.exposure.gainMode == 0)
366 1<<(cam->params.exposure.gainMode-1), tmpstr);
368 switch(cam->params.exposure.expMode) {
383 (2-cam->params.exposure.centreWeight) ? "on" : "off",
386 1<<cam->params.exposure.gain, 1, 1);
387 if (cam->params.version.firmwareVersion == 1 &&
388 cam->params.version.firmwareRevision == 2)
395 cam->params.exposure.fineExp*2, 0, tmp, 0);
396 if (cam->params.version.firmwareVersion == 1 &&
397 cam->params.version.firmwareRevision == 2)
404 " %8d\n", cam->params.exposure.coarseExpLo+
405 256*cam->params.exposure.coarseExpHi, 0, tmp, 185);
407 cam->params.exposure.redComp, 220, 255, 220);
409 cam->params.exposure.green1Comp, 214, 255, 214);
411 cam->params.exposure.green2Comp, 214, 255, 214);
413 cam->params.exposure.blueComp, 230, 255, 230);
416 cam->params.apcor.gain1, 0, 0xff, 0x1c);
418 cam->params.apcor.gain2, 0, 0xff, 0x1a);
420 cam->params.apcor.gain4, 0, 0xff, 0x2d);
422 cam->params.apcor.gain8, 0, 0xff, 0x2a);
424 cam->params.vlOffset.gain1, 0, 255, 24);
426 cam->params.vlOffset.gain2, 0, 255, 28);
428 cam->params.vlOffset.gain4, 0, 255, 30);
430 cam->params.vlOffset.gain8, 0, 255, 30);
432 cam->params.flickerControl.flickerMode ? "on" : "off",
436 cam->mainsFreq ? 60 : 50, 50, 60, 50);
438 cam->params.flickerControl.allowableOverExposure, 0,
441 switch(cam->params.compression.mode) {
457 cam->params.compression.decimation ==
461 cam->params.compressionTarget.frTargeting ==
466 cam->params.compressionTarget.targetFR, 0, 30, 7);
468 cam->params.compressionTarget.targetQ, 0, 255, 10);
470 cam->params.yuvThreshold.yThreshold, 0, 31, 15);
472 cam->params.yuvThreshold.uvThreshold, 0, 31, 15);
474 cam->params.compressionParams.hysteresis, 0, 255, 3);
476 cam->params.compressionParams.threshMax, 0, 255, 11);
478 cam->params.compressionParams.smallStep, 0, 255, 1);
480 cam->params.compressionParams.largeStep, 0, 255, 3);
482 cam->params.compressionParams.decimationHysteresis,
485 cam->params.compressionParams.frDiffStepThresh,
488 cam->params.compressionParams.qDiffStepThresh,
491 cam->params.compressionParams.decimationThreshMod,
494 if (cam->params.qx3.qx3_detected) {
496 cam->params.qx3.toplight ? "on" : "off",
499 cam->params.qx3.bottomlight ? "on" : "off",
518 struct cam_data *cam = data;
555 if (down_interruptible(&cam->param_lock))
566 memcpy(&new_params, &cam->params, sizeof(struct cam_params));
567 new_mains = cam->mainsFreq;
1257 /* Adjust cam->vp to reflect these changes */
1258 cam->vp.brightness =
1260 cam->vp.contrast =
1262 cam->vp.colour =
1266 memcpy(&cam->params, &new_params, sizeof(struct cam_params));
1267 cam->mainsFreq = new_mains;
1268 cam->cmd_queue |= command_flags;
1273 up(&cam->param_lock);
1280 static void create_proc_cpia_cam(struct cam_data *cam)
1285 if (!cpia_proc_root || !cam)
1288 sprintf(name, "video%d", cam->vdev.minor);
1294 ent->data = cam;
1303 cam->proc_entry = ent;
1306 static void destroy_proc_cpia_cam(struct cam_data *cam)
1310 if (!cam || !cam->proc_entry)
1313 sprintf(name, "video%d", cam->vdev.minor);
1315 cam->proc_entry = NULL;
1336 #define printstatus(cam) \
1338 cam->params.status.systemState, cam->params.status.grabState, \
1339 cam->params.status.streamState, cam->params.status.fatalError, \
1340 cam->params.status.cmdError, cam->params.status.debugFlags, \
1341 cam->params.status.vpStatus, cam->params.status.errorCode);
1402 static void set_vw_size(struct cam_data *cam)
1408 switch(cam->video_size) {
1410 cam->vw.width = 352;
1411 cam->vw.height = 288;
1412 cam->params.format.videoSize=VIDEOSIZE_CIF;
1413 cam->params.roi.colStart=0;
1414 cam->params.roi.colEnd=44;
1415 cam->params.roi.rowStart=0;
1416 cam->params.roi.rowEnd=72;
1417 cam->params.streamStartLine = 120;
1420 cam->vw.width = 320;
1421 cam->vw.height = 240;
1422 cam->params.format.videoSize=VIDEOSIZE_CIF;
1423 cam->params.roi.colStart=2;
1424 cam->params.roi.colEnd=42;
1425 cam->params.roi.rowStart=6;
1426 cam->params.roi.rowEnd=66;
1427 cam->params.streamStartLine = 120;
1430 cam->vw.width = 288;
1431 cam->vw.height = 216;
1432 cam->params.format.videoSize=VIDEOSIZE_CIF;
1433 cam->params.roi.colStart=4;
1434 cam->params.roi.colEnd=40;
1435 cam->params.roi.rowStart=9;
1436 cam->params.roi.rowEnd=63;
1437 cam->params.streamStartLine = 120;
1440 cam->vw.width = 256;
1441 cam->vw.height = 192;
1442 cam->params.format.videoSize=VIDEOSIZE_CIF;
1443 cam->params.roi.colStart=6;
1444 cam->params.roi.colEnd=38;
1445 cam->params.roi.rowStart=12;
1446 cam->params.roi.rowEnd=60;
1447 cam->params.streamStartLine = 120;
1450 cam->vw.width = 224;
1451 cam->vw.height = 168;
1452 cam->params.format.videoSize=VIDEOSIZE_CIF;
1453 cam->params.roi.colStart=8;
1454 cam->params.roi.colEnd=36;
1455 cam->params.roi.rowStart=15;
1456 cam->params.roi.rowEnd=57;
1457 cam->params.streamStartLine = 120;
1460 cam->vw.width = 192;
1461 cam->vw.height = 144;
1462 cam->params.format.videoSize=VIDEOSIZE_CIF;
1463 cam->params.roi.colStart=10;
1464 cam->params.roi.colEnd=34;
1465 cam->params.roi.rowStart=18;
1466 cam->params.roi.rowEnd=54;
1467 cam->params.streamStartLine = 120;
1470 cam->vw.width = 176;
1471 cam->vw.height = 144;
1472 cam->params.format.videoSize=VIDEOSIZE_QCIF;
1473 cam->params.roi.colStart=0;
1474 cam->params.roi.colEnd=22;
1475 cam->params.roi.rowStart=0;
1476 cam->params.roi.rowEnd=36;
1477 cam->params.streamStartLine = 60;
1480 cam->vw.width = 160;
1481 cam->vw.height = 120;
1482 cam->params.format.videoSize=VIDEOSIZE_QCIF;
1483 cam->params.roi.colStart=1;
1484 cam->params.roi.colEnd=21;
1485 cam->params.roi.rowStart=3;
1486 cam->params.roi.rowEnd=33;
1487 cam->params.streamStartLine = 60;
1490 cam->vw.width = 128;
1491 cam->vw.height = 96;
1492 cam->params.format.videoSize=VIDEOSIZE_QCIF;
1493 cam->params.roi.colStart=3;
1494 cam->params.roi.colEnd=19;
1495 cam->params.roi.rowStart=6;
1496 cam->params.roi.rowEnd=30;
1497 cam->params.streamStartLine = 60;
1500 cam->vw.width = 88;
1501 cam->vw.height = 72;
1502 cam->params.format.videoSize=VIDEOSIZE_QCIF;
1503 cam->params.roi.colStart=5;
1504 cam->params.roi.colEnd=16;
1505 cam->params.roi.rowStart=9;
1506 cam->params.roi.rowEnd=27;
1507 cam->params.streamStartLine = 60;
1510 cam->vw.width = 64;
1511 cam->vw.height = 48;
1512 cam->params.format.videoSize=VIDEOSIZE_QCIF;
1513 cam->params.roi.colStart=7;
1514 cam->params.roi.colEnd=15;
1515 cam->params.roi.rowStart=12;
1516 cam->params.roi.rowEnd=24;
1517 cam->params.streamStartLine = 60;
1520 cam->vw.width = 48;
1521 cam->vw.height = 48;
1522 cam->params.format.videoSize=VIDEOSIZE_QCIF;
1523 cam->params.roi.colStart=8;
1524 cam->params.roi.colEnd=14;
1525 cam->params.roi.rowStart=6;
1526 cam->params.roi.rowEnd=30;
1527 cam->params.streamStartLine = 60;
1530 LOG("bad videosize value: %d\n", cam->video_size);
1536 static int allocate_frame_buf(struct cam_data *cam)
1540 cam->frame_buf = rvmalloc(FRAME_NUM * CPIA_MAX_FRAME_SIZE);
1541 if (!cam->frame_buf)
1545 cam->frame[i].data = cam->frame_buf + i * CPIA_MAX_FRAME_SIZE;
1550 static int free_frame_buf(struct cam_data *cam)
1554 rvfree(cam->frame_buf, FRAME_NUM*CPIA_MAX_FRAME_SIZE);
1555 cam->frame_buf = 0;
1557 cam->frame[i].data = NULL;
1578 static int do_command(struct cam_data *cam, u16 command, u8 a, u8 b, u8 c, u8 d)
1593 down(&cam->param_lock);
1614 retval = cam->ops->transferCmd(cam->lowlevel_data, cmd, data);
1620 up(&cam->param_lock);
1624 cam->params.version.firmwareVersion = data[0];
1625 cam->params.version.firmwareRevision = data[1];
1626 cam->params.version.vcVersion = data[2];
1627 cam->params.version.vcRevision = data[3];
1630 cam->params.pnpID.vendor = data[0]+(((u16)data[1])<<8);
1631 cam->params.pnpID.product = data[2]+(((u16)data[3])<<8);
1632 cam->params.pnpID.deviceRevision =
1636 cam->params.status.systemState = data[0];
1637 cam->params.status.grabState = data[1];
1638 cam->params.status.streamState = data[2];
1639 cam->params.status.fatalError = data[3];
1640 cam->params.status.cmdError = data[4];
1641 cam->params.status.debugFlags = data[5];
1642 cam->params.status.vpStatus = data[6];
1643 cam->params.status.errorCode = data[7];
1646 cam->params.vpVersion.vpVersion = data[0];
1647 cam->params.vpVersion.vpRevision = data[1];
1648 cam->params.vpVersion.cameraHeadID =
1652 cam->params.colourParams.brightness = data[0];
1653 cam->params.colourParams.contrast = data[1];
1654 cam->params.colourParams.saturation = data[2];
1655 up(&cam->param_lock);
1658 cam->params.colourBalance.redGain = data[0];
1659 cam->params.colourBalance.greenGain = data[1];
1660 cam->params.colourBalance.blueGain = data[2];
1661 up(&cam->param_lock);
1664 cam->params.exposure.gain = data[0];
1665 cam->params.exposure.fineExp = data[1];
1666 cam->params.exposure.coarseExpLo = data[2];
1667 cam->params.exposure.coarseExpHi = data[3];
1668 cam->params.exposure.redComp = data[4];
1669 cam->params.exposure.green1Comp = data[5];
1670 cam->params.exposure.green2Comp = data[6];
1671 cam->params.exposure.blueComp = data[7];
1676 if (cam->params.exposure.redComp < 220 ||
1677 cam->params.exposure.redComp > 255 ||
1678 cam->params.exposure.green1Comp < 214 ||
1679 cam->params.exposure.green1Comp > 255 ||
1680 cam->params.exposure.green2Comp < 214 ||
1681 cam->params.exposure.green2Comp > 255 ||
1682 cam->params.exposure.blueComp < 230 ||
1683 cam->params.exposure.blueComp > 255)
1686 cam->params.exposure.redComp,
1687 cam->params.exposure.green1Comp,
1688 cam->params.exposure.green2Comp,
1689 cam->params.exposure.blueComp);
1690 cam->params.exposure.redComp = 220;
1691 cam->params.exposure.green1Comp = 214;
1692 cam->params.exposure.green2Comp = 214;
1693 cam->params.exposure.blueComp = 230;
1695 up(&cam->param_lock);
1699 if (!cam->params.qx3.qx3_detected)
1702 cam->params.qx3.button = ((data[1] & 0x02) == 0);
1703 if (cam->params.qx3.button) {
1705 do_command(cam,CPIA_COMMAND_WriteMCPort,3,0xDF,0xDF,0);
1706 do_command(cam,CPIA_COMMAND_WriteMCPort,3,0xFF,0xFF,0);
1710 cam->params.qx3.cradled = ((data[2] & 0x40) == 0);
1721 static int do_command_extended(struct cam_data *cam, u16 command,
1746 retval = cam->ops->transferCmd(cam->lowlevel_data, cmd, data);
1888 static int parse_picture(struct cam_data *cam, int size)
1894 down(&cam->param_lock);
1896 obuf = cam->decompressed_frame.data;
1898 ibuf = cam->raw_image;
1900 out_fmt = cam->vp.palette;
1904 up(&cam->param_lock);
1910 up(&cam->param_lock);
1916 up(&cam->param_lock);
1922 up(&cam->param_lock);
1930 up(&cam->param_lock);
1937 up(&cam->param_lock);
1941 cam->params.yuvThreshold.yThreshold = ibuf[30];
1942 cam->params.yuvThreshold.uvThreshold = ibuf[31];
1943 cam->params.status.systemState = ibuf[32];
1944 cam->params.status.grabState = ibuf[33];
1945 cam->params.status.streamState = ibuf[34];
1946 cam->params.status.fatalError = ibuf[35];
1947 cam->params.status.cmdError = ibuf[36];
1948 cam->params.status.debugFlags = ibuf[37];
1949 cam->params.status.vpStatus = ibuf[38];
1950 cam->params.status.errorCode = ibuf[39];
1951 cam->fps = ibuf[41];
1952 up(&cam->param_lock);
1969 in_uyvy, cam->mmap_kludge);
2010 cam->decompressed_frame.count = obuf-cam->decompressed_frame.data;
2012 return cam->decompressed_frame.count;
2016 static inline int init_stream_cap(struct cam_data *cam)
2018 return do_command(cam, CPIA_COMMAND_InitStreamCap,
2019 0, cam->params.streamStartLine, 0, 0);
2023 static void dispatch_commands(struct cam_data *cam)
2025 down(&cam->param_lock);
2026 if (cam->cmd_queue==COMMAND_NONE) {
2027 up(&cam->param_lock);
2030 DEB_BYTE(cam->cmd_queue);
2031 DEB_BYTE(cam->cmd_queue>>8);
2032 if (cam->cmd_queue & COMMAND_SETCOLOURPARAMS)
2033 do_command(cam, CPIA_COMMAND_SetColourParams,
2034 cam->params.colourParams.brightness,
2035 cam->params.colourParams.contrast,
2036 cam->params.colourParams.saturation, 0);
2038 if (cam->cmd_queue & COMMAND_SETCOMPRESSION)
2039 do_command(cam, CPIA_COMMAND_SetCompression,
2040 cam->params.compression.mode,
2041 cam->params.compression.decimation, 0, 0);
2043 if (cam->cmd_queue & COMMAND_SETFORMAT) {
2044 do_command(cam, CPIA_COMMAND_SetFormat,
2045 cam->params.format.videoSize,
2046 cam->params.format.subSample,
2047 cam->params.format.yuvOrder, 0);
2048 do_command(cam, CPIA_COMMAND_SetROI,
2049 cam->params.roi.colStart, cam->params.roi.colEnd,
2050 cam->params.roi.rowStart, cam->params.roi.rowEnd);
2051 cam->first_frame = 1;
2054 if (cam->cmd_queue & COMMAND_SETCOMPRESSIONTARGET)
2055 do_command(cam, CPIA_COMMAND_SetCompressionTarget,
2056 cam->params.compressionTarget.frTargeting,
2057 cam->params.compressionTarget.targetFR,
2058 cam->params.compressionTarget.targetQ, 0);
2060 if (cam->cmd_queue & COMMAND_SETYUVTHRESH)
2061 do_command(cam, CPIA_COMMAND_SetYUVThresh,
2062 cam->params.yuvThreshold.yThreshold,
2063 cam->params.yuvThreshold.uvThreshold, 0, 0);
2065 if (cam->cmd_queue & COMMAND_SETECPTIMING)
2066 do_command(cam, CPIA_COMMAND_SetECPTiming,
2067 cam->params.ecpTiming, 0, 0, 0);
2069 if (cam->cmd_queue & COMMAND_SETCOMPRESSIONPARAMS)
2070 do_command_extended(cam, CPIA_COMMAND_SetCompressionParams,
2072 cam->params.compressionParams.hysteresis,
2073 cam->params.compressionParams.threshMax,
2074 cam->params.compressionParams.smallStep,
2075 cam->params.compressionParams.largeStep,
2076 cam->params.compressionParams.decimationHysteresis,
2077 cam->params.compressionParams.frDiffStepThresh,
2078 cam->params.compressionParams.qDiffStepThresh,
2079 cam->params.compressionParams.decimationThreshMod);
2081 if (cam->cmd_queue & COMMAND_SETEXPOSURE)
2082 do_command_extended(cam, CPIA_COMMAND_SetExposure,
2083 cam->params.exposure.gainMode,
2084 cam->params.exposure.expMode,
2085 cam->params.exposure.compMode,
2086 cam->params.exposure.centreWeight,
2087 cam->params.exposure.gain,
2088 cam->params.exposure.fineExp,
2089 cam->params.exposure.coarseExpLo,
2090 cam->params.exposure.coarseExpHi,
2091 cam->params.exposure.redComp,
2092 cam->params.exposure.green1Comp,
2093 cam->params.exposure.green2Comp,
2094 cam->params.exposure.blueComp);
2096 if (cam->cmd_queue & COMMAND_SETCOLOURBALANCE) {
2097 if (cam->params.colourBalance.balanceModeIsAuto) {
2098 do_command(cam, CPIA_COMMAND_SetColourBalance,
2101 do_command(cam, CPIA_COMMAND_SetColourBalance,
2103 cam->params.colourBalance.redGain,
2104 cam->params.colourBalance.greenGain,
2105 cam->params.colourBalance.blueGain);
2106 do_command(cam, CPIA_COMMAND_SetColourBalance,
2111 if (cam->cmd_queue & COMMAND_SETSENSORFPS)
2112 do_command(cam, CPIA_COMMAND_SetSensorFPS,
2113 cam->params.sensorFps.divisor,
2114 cam->params.sensorFps.baserate, 0, 0);
2116 if (cam->cmd_queue & COMMAND_SETAPCOR)
2117 do_command(cam, CPIA_COMMAND_SetApcor,
2118 cam->params.apcor.gain1,
2119 cam->params.apcor.gain2,
2120 cam->params.apcor.gain4,
2121 cam->params.apcor.gain8);
2123 if (cam->cmd_queue & COMMAND_SETFLICKERCTRL)
2124 do_command(cam, CPIA_COMMAND_SetFlickerCtrl,
2125 cam->params.flickerControl.flickerMode,
2126 cam->params.flickerControl.coarseJump,
2127 cam->params.flickerControl.allowableOverExposure, 0);
2129 if (cam->cmd_queue & COMMAND_SETVLOFFSET)
2130 do_command(cam, CPIA_COMMAND_SetVLOffset,
2131 cam->params.vlOffset.gain1,
2132 cam->params.vlOffset.gain2,
2133 cam->params.vlOffset.gain4,
2134 cam->params.vlOffset.gain8);
2136 if (cam->cmd_queue & COMMAND_PAUSE)
2137 do_command(cam, CPIA_COMMAND_EndStreamCap, 0, 0, 0, 0);
2139 if (cam->cmd_queue & COMMAND_RESUME)
2140 init_stream_cap(cam);
2142 if (cam->cmd_queue & COMMAND_SETLIGHTS && cam->params.qx3.qx3_detected) {
2143 int p1 = (cam->params.qx3.bottomlight == 0) << 1;
2144 int p2 = (cam->params.qx3.toplight == 0) << 3;
2145 do_command(cam, CPIA_COMMAND_WriteVCReg, 0x90, 0x8F, 0x50, 0);
2146 do_command(cam, CPIA_COMMAND_WriteMCPort, 2, 0, (p1|p2|0xE0), 0);
2149 up(&cam->param_lock);
2150 cam->cmd_queue = COMMAND_NONE;
2158 struct cam_data *cam = (struct cam_data *)data;
2167 if (!cam->ops)
2171 if (cam->first_frame &&
2172 cam->params.compression.mode != CPIA_COMPRESSION_NONE)
2173 do_command(cam, CPIA_COMMAND_SetCompression,
2178 if (do_command(cam, CPIA_COMMAND_SetGrabMode,
2182 if (do_command(cam, CPIA_COMMAND_GrabFrame, 0,
2183 cam->params.streamStartLine, 0, 0))
2186 if (cam->ops->wait_for_stream_ready) {
2188 do_command(cam, CPIA_COMMAND_GetCameraStatus,0,0,0,0);
2189 while (cam->params.status.streamState != STREAM_READY) {
2200 do_command(cam, CPIA_COMMAND_GetCameraStatus,
2210 image_size = cam->ops->streamRead(cam->lowlevel_data,
2211 cam->raw_image, 0);
2219 cam->transfer_rate = diff==0 ? rate : rate/diff;
2223 dispatch_commands(cam);
2226 do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0);
2227 do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0);
2228 do_command(cam, CPIA_COMMAND_ReadMCPorts, 0, 0, 0, 0);
2236 cam->image_size = parse_picture(cam, image_size);
2237 if (cam->image_size <= 0)
2238 DBG("parse_picture failed %d\n", cam->image_size);
2244 if (cam->frame[cam->curframe].state == FRAME_READY) {
2245 memcpy(cam->frame[cam->curframe].data,
2246 cam->decompressed_frame.data,
2247 cam->decompressed_frame.count);
2248 cam->frame[cam->curframe].state = FRAME_DONE;
2250 cam->decompressed_frame.state = FRAME_DONE;
2252 if (cam->first_frame) {
2253 cam->first_frame = 0;
2254 cam->cmd_queue |= COMMAND_SETCOMPRESSION;
2255 cam->cmd_queue |= COMMAND_SETEXPOSURE;
2260 static int capture_frame(struct cam_data *cam, struct video_mmap *vm)
2264 if (!cam->frame_buf) {
2266 if ((retval = allocate_frame_buf(cam)))
2270 if (cam->first_frame) {
2271 cam->curframe = vm->frame;
2272 cam->frame[cam->curframe].state = FRAME_READY;
2273 fetch_frame(cam);
2274 if (cam->frame[cam->curframe].state != FRAME_DONE)
2277 cam->curframe = vm->frame;
2278 cam->frame[cam->curframe].state = FRAME_READY;
2279 fetch_frame(cam);
2280 if (cam->frame[cam->curframe].state != FRAME_DONE)
2286 static int goto_high_power(struct cam_data *cam)
2288 if (do_command(cam, CPIA_COMMAND_GotoHiPower, 0, 0, 0, 0))
2291 if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0))
2293 if (cam->params.status.systemState == HI_POWER_STATE) {
2297 printstatus(cam);
2301 static int goto_low_power(struct cam_data *cam)
2303 if (do_command(cam, CPIA_COMMAND_GotoLoPower, 0, 0, 0, 0))
2305 if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0))
2307 if (cam->params.status.systemState == LO_POWER_STATE) {
2311 printstatus(cam);
2315 static void save_camera_state(struct cam_data *cam)
2317 do_command(cam, CPIA_COMMAND_GetColourBalance, 0, 0, 0, 0);
2318 do_command(cam, CPIA_COMMAND_GetExposure, 0, 0, 0, 0);
2321 cam->params.exposure.gain,
2322 cam->params.exposure.fineExp,
2323 cam->params.exposure.coarseExpLo,
2324 cam->params.exposure.coarseExpHi,
2325 cam->params.exposure.redComp,
2326 cam->params.exposure.green1Comp,
2327 cam->params.exposure.green2Comp,
2328 cam->params.exposure.blueComp);
2330 cam->params.colourBalance.redGain,
2331 cam->params.colourBalance.greenGain,
2332 cam->params.colourBalance.blueGain);
2335 static void set_camera_state(struct cam_data *cam)
2337 if(cam->params.colourBalance.balanceModeIsAuto) {
2338 do_command(cam, CPIA_COMMAND_SetColourBalance,
2341 do_command(cam, CPIA_COMMAND_SetColourBalance,
2343 cam->params.colourBalance.redGain,
2344 cam->params.colourBalance.greenGain,
2345 cam->params.colourBalance.blueGain);
2346 do_command(cam, CPIA_COMMAND_SetColourBalance,
2351 do_command_extended(cam, CPIA_COMMAND_SetExposure,
2352 cam->params.exposure.gainMode, 1, 1,
2353 cam->params.exposure.centreWeight,
2354 cam->params.exposure.gain,
2355 cam->params.exposure.fineExp,
2356 cam->params.exposure.coarseExpLo,
2357 cam->params.exposure.coarseExpHi,
2358 cam->params.exposure.redComp,
2359 cam->params.exposure.green1Comp,
2360 cam->params.exposure.green2Comp,
2361 cam->params.exposure.blueComp);
2362 do_command_extended(cam, CPIA_COMMAND_SetExposure,
2366 if (!cam->params.exposure.gainMode)
2367 cam->params.exposure.gainMode = 2;
2368 if (!cam->params.exposure.expMode)
2369 cam->params.exposure.expMode = 2;
2370 if (!cam->params.exposure.centreWeight)
2371 cam->params.exposure.centreWeight = 1;
2373 cam->cmd_queue = COMMAND_SETCOMPRESSION |
2385 dispatch_commands(cam);
2386 save_camera_state(cam);
2391 static void get_version_information(struct cam_data *cam)
2394 do_command(cam, CPIA_COMMAND_GetCPIAVersion, 0, 0, 0, 0);
2397 do_command(cam, CPIA_COMMAND_GetPnPID, 0, 0, 0, 0);
2401 static int reset_camera(struct cam_data *cam)
2404 if (goto_low_power(cam)) {
2405 if (cam->params.status.systemState != WARM_BOOT_STATE)
2408 reset_camera_struct(cam);
2409 goto_high_power(cam);
2410 do_command(cam, CPIA_COMMAND_DiscardFrame, 0, 0, 0, 0);
2411 if (goto_low_power(cam))
2417 cam->params.version.firmwareVersion = 0;
2418 get_version_information(cam);
2419 if (cam->params.version.firmwareVersion != 1)
2423 cam->params.qx3.qx3_detected = (cam->params.pnpID.vendor == 0x0813 &&
2424 cam->params.pnpID.product == 0x0001);
2431 do_command(cam, CPIA_COMMAND_ModifyCameraStatus, STREAMSTATE, 0,
2435 if (goto_high_power(cam))
2439 if (do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0))
2442 if (cam->params.status.fatalError) {
2444 cam->params.status.fatalError);
2446 cam->params.status.vpStatus);
2447 if (cam->params.status.fatalError & ~(COM_FLAG|CPIA_FLAG)) {
2450 } else if (cam->params.status.fatalError & (COM_FLAG|CPIA_FLAG)) {
2453 do_command(cam, CPIA_COMMAND_ModifyCameraStatus,
2459 if (cam->params.status.fatalError) {
2460 if (cam->params.status.fatalError)
2466 do_command(cam, CPIA_COMMAND_GetVPVersion, 0, 0, 0, 0);
2469 set_camera_state(cam);
2478 struct cam_data *cam = dev->priv;
2480 if (!cam) {
2485 if (cam->open_count > 0) {
2490 if (!cam->raw_image) {
2491 cam->raw_image = rvmalloc(CPIA_MAX_IMAGE_SIZE);
2492 if (!cam->raw_image)
2496 if (!cam->decompressed_frame.data) {
2497 cam->decompressed_frame.data = rvmalloc(CPIA_MAX_FRAME_SIZE);
2498 if (!cam->decompressed_frame.data) {
2499 rvfree(cam->raw_image, CPIA_MAX_IMAGE_SIZE);
2500 cam->raw_image = NULL;
2506 if (cam->ops->open(cam->lowlevel_data)) {
2507 rvfree(cam->decompressed_frame.data, CPIA_MAX_FRAME_SIZE);
2508 cam->decompressed_frame.data = NULL;
2509 rvfree(cam->raw_image, CPIA_MAX_IMAGE_SIZE);
2510 cam->raw_image = NULL;
2515 if ((i = reset_camera(cam)) != 0) {
2516 cam->ops->close(cam->lowlevel_data);
2517 rvfree(cam->decompressed_frame.data, CPIA_MAX_FRAME_SIZE);
2518 cam->decompressed_frame.data = NULL;
2519 rvfree(cam->raw_image, CPIA_MAX_IMAGE_SIZE);
2520 cam->raw_image = NULL;
2525 if(cam->proc_entry)
2526 cam->proc_entry->uid = current->uid;
2529 cam->first_frame = 1;
2532 cam->mmap_kludge = 0;
2534 ++cam->open_count;
2540 struct cam_data *cam;
2542 cam = dev->priv;
2544 if (cam->ops) {
2546 if(cam->proc_entry)
2547 cam->proc_entry->uid = 0;
2550 save_camera_state(cam);
2553 goto_low_power(cam);
2556 do_command(cam, CPIA_COMMAND_GetCameraStatus, 0, 0, 0, 0);
2559 free_frames(cam->frame);
2562 cam->ops->close(cam->lowlevel_data);
2565 if (--cam->open_count == 0) {
2567 if (cam->raw_image) {
2568 rvfree(cam->raw_image, CPIA_MAX_IMAGE_SIZE);
2569 cam->raw_image = NULL;
2572 if (cam->decompressed_frame.data) {
2573 rvfree(cam->decompressed_frame.data, CPIA_MAX_FRAME_SIZE);
2574 cam->decompressed_frame.data = NULL;
2577 if (cam->frame_buf)
2578 free_frame_buf(cam);
2580 if (!cam->ops) {
2582 kfree(cam);
2593 struct cam_data *cam = dev->priv;
2596 if (down_interruptible(&cam->busy_lock))
2601 up(&cam->busy_lock);
2607 up(&cam->busy_lock);
2611 if (!cam->ops) {
2613 up(&cam->busy_lock);
2618 cam->decompressed_frame.state = FRAME_READY;
2619 cam->mmap_kludge=0;
2620 fetch_frame(cam);
2621 if (cam->decompressed_frame.state != FRAME_DONE) {
2622 DBG("upload failed %d/%d\n", cam->decompressed_frame.count,
2623 cam->decompressed_frame.state);
2624 up(&cam->busy_lock);
2627 cam->decompressed_frame.state = FRAME_UNUSED;
2630 if (cam->decompressed_frame.count > count) {
2631 DBG("count wrong: %d, %lu\n", cam->decompressed_frame.count,
2633 up(&cam->busy_lock);
2636 if (copy_to_user(buf, cam->decompressed_frame.data,
2637 cam->decompressed_frame.count)) {
2639 up(&cam->busy_lock);
2643 up(&cam->busy_lock);
2644 return cam->decompressed_frame.count;
2649 struct cam_data *cam = dev->priv;
2652 if (!cam || !cam->ops)
2656 if (down_interruptible(&cam->busy_lock))
2727 if (copy_to_user(arg, &cam->vp, sizeof(struct video_picture)))
2751 down(&cam->param_lock);
2753 memcpy( &cam->vp, &vp, sizeof(vp) );
2754 /* update cam->params.colourParams */
2755 cam->params.colourParams.brightness = vp.brightness*100/65535;
2756 cam->params.colourParams.contrast = vp.contrast*100/65535;
2757 cam->params.colourParams.saturation = vp.colour*100/65535;
2759 cam->params.colourParams.contrast =
2760 ((cam->params.colourParams.contrast + 3) / 8) * 8;
2761 if (cam->params.version.firmwareVersion == 1 &&
2762 cam->params.version.firmwareRevision == 2 &&
2763 cam->params.colourParams.contrast > 80) {
2765 cam->params.colourParams.contrast = 80;
2769 cam->cmd_queue |= COMMAND_SETCOLOURPARAMS;
2770 up(&cam->param_lock);
2781 if (copy_to_user(arg, &cam->vw, sizeof(struct video_window)))
2807 down(&cam->param_lock);
2808 if (vw.width != cam->vw.width || vw.height != cam->vw.height) {
2813 up(&cam->param_lock);
2816 cam->video_size = video_size;
2817 set_vw_size(cam);
2818 DBG("%d / %d\n", cam->vw.width, cam->vw.height);
2819 cam->cmd_queue |= COMMAND_SETFORMAT;
2822 up(&cam->param_lock);
2826 if (cam->cmd_queue & COMMAND_SETFORMAT) {
2828 dispatch_commands(cam);
2830 DBG("%d/%d:%d\n", cam->video_size,
2831 cam->vw.width, cam->vw.height);
2871 cam->vp.palette = vm.format;
2874 cam->vp.depth=8;
2881 cam->vp.depth = 16;
2884 cam->vp.depth = 24;
2887 cam->vp.depth = 32;
2902 if (video_size != cam->video_size) {
2903 cam->video_size = video_size;
2904 set_vw_size(cam);
2905 cam->cmd_queue |= COMMAND_SETFORMAT;
2906 dispatch_commands(cam);
2909 cam->mmap_kludge = 1;
2910 retval = capture_frame(cam, &vm);
2930 switch (cam->frame[frame].state) {
2939 cam->frame[frame].state = FRAME_UNUSED;
2989 up(&cam->param_lock);
2990 up(&cam->busy_lock);
2999 struct cam_data *cam = dev->priv;
3002 if (!cam || !cam->ops)
3010 if (!cam || !cam->ops)
3014 if (down_interruptible(&cam->busy_lock))
3017 if (!cam->frame_buf) { /* we do lazy allocation */
3018 if ((retval = allocate_frame_buf(cam))) {
3019 up(&cam->busy_lock);
3024 pos = (unsigned long)(cam->frame_buf);
3028 up(&cam->busy_lock);
3040 up(&cam->busy_lock);
3068 static void reset_camera_struct(struct cam_data *cam)
3073 cam->params.colourParams.brightness = 50;
3074 cam->params.colourParams.contrast = 48;
3075 cam->params.colourParams.saturation = 50;
3076 cam->params.exposure.gainMode = 2;
3077 cam->params.exposure.expMode = 2; /* AEC */
3078 cam->params.exposure.compMode = 1;
3079 cam->params.exposure.centreWeight = 1;
3080 cam->params.exposure.gain = 0;
3081 cam->params.exposure.fineExp = 0;
3082 cam->params.exposure.coarseExpLo = 185;
3083 cam->params.exposure.coarseExpHi = 0;
3084 cam->params.exposure.redComp = 220;
3085 cam->params.exposure.green1Comp = 214;
3086 cam->params.exposure.green2Comp = 214;
3087 cam->params.exposure.blueComp = 230;
3088 cam->params.colourBalance.balanceModeIsAuto = 1;
3089 cam->params.colourBalance.redGain = 32;
3090 cam->params.colourBalance.greenGain = 6;
3091 cam->params.colourBalance.blueGain = 92;
3092 cam->params.apcor.gain1 = 0x1c;
3093 cam->params.apcor.gain2 = 0x1a;
3094 cam->params.apcor.gain4 = 0x2d;
3095 cam->params.apcor.gain8 = 0x2a;
3096 cam->params.flickerControl.flickerMode = 0;
3097 cam->params.flickerControl.coarseJump =
3098 flicker_jumps[cam->mainsFreq]
3099 [cam->params.sensorFps.baserate]
3100 [cam->params.sensorFps.divisor];
3101 cam->params.vlOffset.gain1 = 24;
3102 cam->params.vlOffset.gain2 = 28;
3103 cam->params.vlOffset.gain4 = 30;
3104 cam->params.vlOffset.gain8 = 30;
3105 cam->params.compressionParams.hysteresis = 3;
3106 cam->params.compressionParams.threshMax = 11;
3107 cam->params.compressionParams.smallStep = 1;
3108 cam->params.compressionParams.largeStep = 3;
3109 cam->params.compressionParams.decimationHysteresis = 2;
3110 cam->params.compressionParams.frDiffStepThresh = 5;
3111 cam->params.compressionParams.qDiffStepThresh = 3;
3112 cam->params.compressionParams.decimationThreshMod = 2;
3115 cam->transfer_rate = 0;
3119 cam->params.sensorFps.divisor = 1;
3120 cam->params.sensorFps.baserate = 1;
3122 cam->params.yuvThreshold.yThreshold = 6; /* From windows driver */
3123 cam->params.yuvThreshold.uvThreshold = 6; /* From windows driver */
3125 cam->params.format.subSample = SUBSAMPLE_422;
3126 cam->params.format.yuvOrder = YUVORDER_YUYV;
3128 cam->params.compression.mode = CPIA_COMPRESSION_AUTO;
3129 cam->params.compressionTarget.frTargeting =
3131 cam->params.compressionTarget.targetFR = 15; /* From windows driver */
3132 cam->params.compressionTarget.targetQ = 5; /* From windows driver */
3134 cam->params.qx3.qx3_detected = 0;
3135 cam->params.qx3.toplight = 0;
3136 cam->params.qx3.bottomlight = 0;
3137 cam->params.qx3.button = 0;
3138 cam->params.qx3.cradled = 0;
3140 cam->video_size = VIDEOSIZE_CIF;
3142 cam->vp.colour = 32768; /* 50% */
3143 cam->vp.hue = 32768; /* 50% */
3144 cam->vp.brightness = 32768; /* 50% */
3145 cam->vp.contrast = 32768; /* 50% */
3146 cam->vp.whiteness = 0; /* not used -> grayscale only */
3147 cam->vp.depth = 24; /* to be set by user */
3148 cam->vp.palette = VIDEO_PALETTE_RGB24; /* to be set by user */
3150 cam->vw.x = 0;
3151 cam->vw.y = 0;
3152 set_vw_size(cam);
3153 cam->vw.chromakey = 0;
3155 cam->vw.flags = 0;
3156 cam->vw.clipcount = 0;
3157 cam->vw.clips = NULL;
3159 cam->cmd_queue = COMMAND_NONE;
3160 cam->first_frame = 0;
3166 static void init_camera_struct(struct cam_data *cam,
3172 memset(cam, 0, sizeof(struct cam_data));
3174 cam->ops = ops;
3175 init_MUTEX(&cam->param_lock);
3176 init_MUTEX(&cam->busy_lock);
3178 reset_camera_struct(cam);
3180 cam->proc_entry = NULL;
3182 memcpy(&cam->vdev, &cpia_template, sizeof(cpia_template));
3183 cam->vdev.priv = cam;
3185 cam->curframe = 0;
3187 cam->frame[i].width = 0;
3188 cam->frame[i].height = 0;
3189 cam->frame[i].state = FRAME_UNUSED;
3190 cam->frame[i].data = NULL;
3192 cam->decompressed_frame.width = 0;
3193 cam->decompressed_frame.height = 0;
3194 cam->decompressed_frame.state = FRAME_UNUSED;
3195 cam->decompressed_frame.data = NULL;
3254 void cpia_unregister_camera(struct cam_data *cam)
3256 if (!cam->open_count) {
3258 video_unregister_device(&cam->vdev);
3261 "deferring video_unregister_device\n", cam->vdev.minor);
3263 cam->ops = NULL;
3267 DBG("destroying /proc/cpia/video%d\n", cam->vdev.minor);
3268 destroy_proc_cpia_cam(cam);
3270 if (!cam->open_count) {
3272 kfree(cam);