• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/media/video/
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