linux/drivers/media/video/cpia.h
<<
>>
Prefs
   1#ifndef cpia_h
   2#define cpia_h
   3
   4/*
   5 * CPiA Parallel Port Video4Linux driver
   6 *
   7 * Supports CPiA based parallel port Video Camera's.
   8 *
   9 * (C) Copyright 1999 Bas Huisman,
  10 *                    Peter Pregler,
  11 *                    Scott J. Bertin,
  12 *                    VLSI Vision Ltd.
  13 *
  14 * This program is free software; you can redistribute it and/or modify
  15 * it under the terms of the GNU General Public License as published by
  16 * the Free Software Foundation; either version 2 of the License, or
  17 * (at your option) any later version.
  18 *
  19 * This program is distributed in the hope that it will be useful,
  20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 * GNU General Public License for more details.
  23 *
  24 * You should have received a copy of the GNU General Public License
  25 * along with this program; if not, write to the Free Software
  26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  27 */
  28
  29#define CPIA_MAJ_VER    1
  30#define CPIA_MIN_VER   2
  31#define CPIA_PATCH_VER  3
  32
  33#define CPIA_PP_MAJ_VER       CPIA_MAJ_VER
  34#define CPIA_PP_MIN_VER       CPIA_MIN_VER
  35#define CPIA_PP_PATCH_VER     CPIA_PATCH_VER
  36
  37#define CPIA_USB_MAJ_VER      CPIA_MAJ_VER
  38#define CPIA_USB_MIN_VER      CPIA_MIN_VER
  39#define CPIA_USB_PATCH_VER    CPIA_PATCH_VER
  40
  41#define CPIA_MAX_FRAME_SIZE_UNALIGNED   (352 * 288 * 4)   /* CIF at RGB32 */
  42#define CPIA_MAX_FRAME_SIZE     ((CPIA_MAX_FRAME_SIZE_UNALIGNED + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) /* align above to PAGE_SIZE */
  43
  44#ifdef __KERNEL__
  45
  46#include <asm/uaccess.h>
  47#include <linux/videodev.h>
  48#include <media/v4l2-common.h>
  49#include <media/v4l2-ioctl.h>
  50#include <linux/list.h>
  51#include <linux/mutex.h>
  52
  53struct cpia_camera_ops
  54{
  55        /* open sets privdata to point to structure for this camera.
  56         * Returns negative value on error, otherwise 0.
  57         */
  58        int (*open)(void *privdata);
  59
  60        /* Registers callback function cb to be called with cbdata
  61         * when an image is ready.  If cb is NULL, only single image grabs
  62         * should be used.  cb should immediately call streamRead to read
  63         * the data or data may be lost. Returns negative value on error,
  64         * otherwise 0.
  65         */
  66        int (*registerCallback)(void *privdata, void (*cb)(void *cbdata),
  67                                void *cbdata);
  68
  69        /* transferCmd sends commands to the camera.  command MUST point to
  70         * an  8 byte buffer in kernel space. data can be NULL if no extra
  71         * data is needed.  The size of the data is given by the last 2
  72         * bytes of command.  data must also point to memory in kernel space.
  73         * Returns negative value on error, otherwise 0.
  74         */
  75        int (*transferCmd)(void *privdata, u8 *command, u8 *data);
  76
  77        /* streamStart initiates stream capture mode.
  78         * Returns negative value on error, otherwise 0.
  79         */
  80        int (*streamStart)(void *privdata);
  81
  82        /* streamStop terminates stream capture mode.
  83         * Returns negative value on error, otherwise 0.
  84         */
  85        int (*streamStop)(void *privdata);
  86
  87        /* streamRead reads a frame from the camera.  buffer points to a
  88         * buffer large enough to hold a complete frame in kernel space.
  89         * noblock indicates if this should be a non blocking read.
  90         * Returns the number of bytes read, or negative value on error.
  91         */
  92        int (*streamRead)(void *privdata, u8 *buffer, int noblock);
  93
  94        /* close disables the device until open() is called again.
  95         * Returns negative value on error, otherwise 0.
  96         */
  97        int (*close)(void *privdata);
  98
  99        /* If wait_for_stream_ready is non-zero, wait until the streamState
 100         * is STREAM_READY before calling streamRead.
 101         */
 102        int wait_for_stream_ready;
 103
 104        /*
 105         * Used to maintain lowlevel module usage counts
 106         */
 107        struct module *owner;
 108};
 109
 110struct cpia_frame {
 111        u8 *data;
 112        int count;
 113        int width;
 114        int height;
 115        volatile int state;
 116};
 117
 118struct cam_params {
 119        struct {
 120                u8 firmwareVersion;
 121                u8 firmwareRevision;
 122                u8 vcVersion;
 123                u8 vcRevision;
 124        } version;
 125        struct {
 126                u16 vendor;
 127                u16 product;
 128                u16 deviceRevision;
 129        } pnpID;
 130        struct {
 131                u8 vpVersion;
 132                u8 vpRevision;
 133                u16 cameraHeadID;
 134        } vpVersion;
 135        struct {
 136                u8 systemState;
 137                u8 grabState;
 138                u8 streamState;
 139                u8 fatalError;
 140                u8 cmdError;
 141                u8 debugFlags;
 142                u8 vpStatus;
 143                u8 errorCode;
 144        } status;
 145        struct {
 146                u8 brightness;
 147                u8 contrast;
 148                u8 saturation;
 149        } colourParams;
 150        struct {
 151                u8 gainMode;
 152                u8 expMode;
 153                u8 compMode;
 154                u8 centreWeight;
 155                u8 gain;
 156                u8 fineExp;
 157                u8 coarseExpLo;
 158                u8 coarseExpHi;
 159                u8 redComp;
 160                u8 green1Comp;
 161                u8 green2Comp;
 162                u8 blueComp;
 163        } exposure;
 164        struct {
 165                u8 balanceMode;
 166                u8 redGain;
 167                u8 greenGain;
 168                u8 blueGain;
 169        } colourBalance;
 170        struct {
 171                u8 divisor;
 172                u8 baserate;
 173        } sensorFps;
 174        struct {
 175                u8 gain1;
 176                u8 gain2;
 177                u8 gain4;
 178                u8 gain8;
 179        } apcor;
 180        struct {
 181                u8 disabled;
 182                u8 flickerMode;
 183                u8 coarseJump;
 184                int allowableOverExposure;
 185        } flickerControl;
 186        struct {
 187                u8 gain1;
 188                u8 gain2;
 189                u8 gain4;
 190                u8 gain8;
 191        } vlOffset;
 192        struct {
 193                u8 mode;
 194                u8 decimation;
 195        } compression;
 196        struct {
 197                u8 frTargeting;
 198                u8 targetFR;
 199                u8 targetQ;
 200        } compressionTarget;
 201        struct {
 202                u8 yThreshold;
 203                u8 uvThreshold;
 204        } yuvThreshold;
 205        struct {
 206                u8 hysteresis;
 207                u8 threshMax;
 208                u8 smallStep;
 209                u8 largeStep;
 210                u8 decimationHysteresis;
 211                u8 frDiffStepThresh;
 212                u8 qDiffStepThresh;
 213                u8 decimationThreshMod;
 214        } compressionParams;
 215        struct {
 216                u8 videoSize;           /* CIF/QCIF */
 217                u8 subSample;
 218                u8 yuvOrder;
 219        } format;
 220        struct {                        /* Intel QX3 specific data */
 221                u8 qx3_detected;        /* a QX3 is present */
 222                u8 toplight;            /* top light lit , R/W */
 223                u8 bottomlight;         /* bottom light lit, R/W */
 224                u8 button;              /* snapshot button pressed (R/O) */
 225                u8 cradled;             /* microscope is in cradle (R/O) */
 226        } qx3;
 227        struct {
 228                u8 colStart;            /* skip first 8*colStart pixels */
 229                u8 colEnd;              /* finish at 8*colEnd pixels */
 230                u8 rowStart;            /* skip first 4*rowStart lines */
 231                u8 rowEnd;              /* finish at 4*rowEnd lines */
 232        } roi;
 233        u8 ecpTiming;
 234        u8 streamStartLine;
 235};
 236
 237enum v4l_camstates {
 238        CPIA_V4L_IDLE = 0,
 239        CPIA_V4L_ERROR,
 240        CPIA_V4L_COMMAND,
 241        CPIA_V4L_GRABBING,
 242        CPIA_V4L_STREAMING,
 243        CPIA_V4L_STREAMING_PAUSED,
 244};
 245
 246#define FRAME_NUM       2       /* double buffering for now */
 247
 248struct cam_data {
 249        struct list_head cam_data_list;
 250
 251        struct mutex busy_lock;         /* guard against SMP multithreading */
 252        struct cpia_camera_ops *ops;    /* lowlevel driver operations */
 253        void *lowlevel_data;            /* private data for lowlevel driver */
 254        u8 *raw_image;                  /* buffer for raw image data */
 255        struct cpia_frame decompressed_frame;
 256                                        /* buffer to hold decompressed frame */
 257        int image_size;                 /* sizeof last decompressed image */
 258        int open_count;                 /* # of process that have camera open */
 259
 260                                /* camera status */
 261        int fps;                        /* actual fps reported by the camera */
 262        int transfer_rate;              /* transfer rate from camera in kB/s */
 263        u8 mainsFreq;                   /* for flicker control */
 264
 265                                /* proc interface */
 266        struct mutex param_lock;        /* params lock for this camera */
 267        struct cam_params params;       /* camera settings */
 268        struct proc_dir_entry *proc_entry;      /* /proc/cpia/videoX */
 269
 270                                        /* v4l */
 271        int video_size;                 /* VIDEO_SIZE_ */
 272        volatile enum v4l_camstates camstate;   /* v4l layer status */
 273        struct video_device vdev;       /* v4l videodev */
 274        struct video_picture vp;        /* v4l camera settings */
 275        struct video_window vw;         /* v4l capture area */
 276        struct video_capture vc;        /* v4l subcapture area */
 277
 278                                /* mmap interface */
 279        int curframe;                   /* the current frame to grab into */
 280        u8 *frame_buf;                  /* frame buffer data */
 281        struct cpia_frame frame[FRAME_NUM];
 282                                /* FRAME_NUM-buffering, so we need a array */
 283
 284        int first_frame;
 285        int mmap_kludge;                /* 'wrong' byte order for mmap */
 286        volatile u32 cmd_queue;         /* queued commands */
 287        int exposure_status;            /* EXPOSURE_* */
 288        int exposure_count;             /* number of frames at this status */
 289};
 290
 291/* cpia_register_camera is called by low level driver for each camera.
 292 * A unique camera number is returned, or a negative value on error */
 293struct cam_data *cpia_register_camera(struct cpia_camera_ops *ops, void *lowlevel);
 294
 295/* cpia_unregister_camera is called by low level driver when a camera
 296 * is removed.  This must not fail. */
 297void cpia_unregister_camera(struct cam_data *cam);
 298
 299/* raw CIF + 64 byte header + (2 bytes line_length + EOL) per line + 4*EOI +
 300 * one byte 16bit DMA alignment
 301 */
 302#define CPIA_MAX_IMAGE_SIZE ((352*288*2)+64+(288*3)+5)
 303
 304/* constant value's */
 305#define MAGIC_0         0x19
 306#define MAGIC_1         0x68
 307#define DATA_IN         0xC0
 308#define DATA_OUT        0x40
 309#define VIDEOSIZE_QCIF  0       /* 176x144 */
 310#define VIDEOSIZE_CIF   1       /* 352x288 */
 311#define VIDEOSIZE_SIF   2       /* 320x240 */
 312#define VIDEOSIZE_QSIF  3       /* 160x120 */
 313#define VIDEOSIZE_48_48         4 /* where no one has gone before, iconsize! */
 314#define VIDEOSIZE_64_48         5
 315#define VIDEOSIZE_128_96        6
 316#define VIDEOSIZE_160_120       VIDEOSIZE_QSIF
 317#define VIDEOSIZE_176_144       VIDEOSIZE_QCIF
 318#define VIDEOSIZE_192_144       7
 319#define VIDEOSIZE_224_168       8
 320#define VIDEOSIZE_256_192       9
 321#define VIDEOSIZE_288_216       10
 322#define VIDEOSIZE_320_240       VIDEOSIZE_SIF
 323#define VIDEOSIZE_352_288       VIDEOSIZE_CIF
 324#define VIDEOSIZE_88_72         11 /* quarter CIF */
 325#define SUBSAMPLE_420   0
 326#define SUBSAMPLE_422   1
 327#define YUVORDER_YUYV   0
 328#define YUVORDER_UYVY   1
 329#define NOT_COMPRESSED  0
 330#define COMPRESSED      1
 331#define NO_DECIMATION   0
 332#define DECIMATION_ENAB 1
 333#define EOI             0xff    /* End Of Image */
 334#define EOL             0xfd    /* End Of Line */
 335#define FRAME_HEADER_SIZE       64
 336
 337/* Image grab modes */
 338#define CPIA_GRAB_SINGLE        0
 339#define CPIA_GRAB_CONTINUOUS    1
 340
 341/* Compression parameters */
 342#define CPIA_COMPRESSION_NONE   0
 343#define CPIA_COMPRESSION_AUTO   1
 344#define CPIA_COMPRESSION_MANUAL 2
 345#define CPIA_COMPRESSION_TARGET_QUALITY         0
 346#define CPIA_COMPRESSION_TARGET_FRAMERATE       1
 347
 348/* Return offsets for GetCameraState */
 349#define SYSTEMSTATE     0
 350#define GRABSTATE       1
 351#define STREAMSTATE     2
 352#define FATALERROR      3
 353#define CMDERROR        4
 354#define DEBUGFLAGS      5
 355#define VPSTATUS        6
 356#define ERRORCODE       7
 357
 358/* SystemState */
 359#define UNINITIALISED_STATE     0
 360#define PASS_THROUGH_STATE      1
 361#define LO_POWER_STATE          2
 362#define HI_POWER_STATE          3
 363#define WARM_BOOT_STATE         4
 364
 365/* GrabState */
 366#define GRAB_IDLE               0
 367#define GRAB_ACTIVE             1
 368#define GRAB_DONE               2
 369
 370/* StreamState */
 371#define STREAM_NOT_READY        0
 372#define STREAM_READY            1
 373#define STREAM_OPEN             2
 374#define STREAM_PAUSED           3
 375#define STREAM_FINISHED         4
 376
 377/* Fatal Error, CmdError, and DebugFlags */
 378#define CPIA_FLAG         1
 379#define SYSTEM_FLAG       2
 380#define INT_CTRL_FLAG     4
 381#define PROCESS_FLAG      8
 382#define COM_FLAG         16
 383#define VP_CTRL_FLAG     32
 384#define CAPTURE_FLAG     64
 385#define DEBUG_FLAG      128
 386
 387/* VPStatus */
 388#define VP_STATE_OK                     0x00
 389
 390#define VP_STATE_FAILED_VIDEOINIT       0x01
 391#define VP_STATE_FAILED_AECACBINIT      0x02
 392#define VP_STATE_AEC_MAX                0x04
 393#define VP_STATE_ACB_BMAX               0x08
 394
 395#define VP_STATE_ACB_RMIN               0x10
 396#define VP_STATE_ACB_GMIN               0x20
 397#define VP_STATE_ACB_RMAX               0x40
 398#define VP_STATE_ACB_GMAX               0x80
 399
 400/* default (minimum) compensation values */
 401#define COMP_RED        220
 402#define COMP_GREEN1     214
 403#define COMP_GREEN2     COMP_GREEN1
 404#define COMP_BLUE       230
 405
 406/* exposure status */
 407#define EXPOSURE_VERY_LIGHT 0
 408#define EXPOSURE_LIGHT      1
 409#define EXPOSURE_NORMAL     2
 410#define EXPOSURE_DARK       3
 411#define EXPOSURE_VERY_DARK  4
 412
 413/* ErrorCode */
 414#define ERROR_FLICKER_BELOW_MIN_EXP     0x01 /*flicker exposure got below minimum exposure */
 415#define ALOG(fmt,args...) printk(fmt, ##args)
 416#define LOG(fmt,args...) ALOG(KERN_INFO __FILE__ ":%s(%d):" fmt, __func__ , __LINE__ , ##args)
 417
 418#ifdef _CPIA_DEBUG_
 419#define ADBG(fmt,args...) printk(fmt, jiffies, ##args)
 420#define DBG(fmt,args...) ADBG(KERN_DEBUG __FILE__" (%ld):%s(%d):" fmt, __func__, __LINE__ , ##args)
 421#else
 422#define DBG(fmn,args...) do {} while(0)
 423#endif
 424
 425#define DEB_BYTE(p)\
 426  DBG("%1d %1d %1d %1d %1d %1d %1d %1d \n",\
 427      (p)&0x80?1:0, (p)&0x40?1:0, (p)&0x20?1:0, (p)&0x10?1:0,\
 428        (p)&0x08?1:0, (p)&0x04?1:0, (p)&0x02?1:0, (p)&0x01?1:0);
 429
 430#endif /* __KERNEL__ */
 431
 432#endif /* cpia_h */
 433