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