]>
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> | |
5e87efa3 | 48 | #include <media/v4l2-common.h> |
35ea11ff | 49 | #include <media/v4l2-ioctl.h> |
1da177e4 | 50 | #include <linux/list.h> |
3593cab5 | 51 | #include <linux/mutex.h> |
1da177e4 LT |
52 | |
53 | struct cpia_camera_ops | |
54 | { | |
55 | /* open sets privdata to point to structure for this camera. | |
d56410e0 | 56 | * Returns negative value on error, otherwise 0. |
1da177e4 LT |
57 | */ |
58 | int (*open)(void *privdata); | |
d56410e0 | 59 | |
1da177e4 LT |
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), | |
d56410e0 MCC |
67 | void *cbdata); |
68 | ||
1da177e4 LT |
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); | |
d56410e0 | 81 | |
1da177e4 LT |
82 | /* streamStop terminates stream capture mode. |
83 | * Returns negative value on error, otherwise 0. | |
84 | */ | |
85 | int (*streamStop)(void *privdata); | |
d56410e0 | 86 | |
1da177e4 | 87 | /* streamRead reads a frame from the camera. buffer points to a |
d56410e0 MCC |
88 | * buffer large enough to hold a complete frame in kernel space. |
89 | * noblock indicates if this should be a non blocking read. | |
1da177e4 | 90 | * Returns the number of bytes read, or negative value on error. |
d56410e0 | 91 | */ |
1da177e4 | 92 | int (*streamRead)(void *privdata, u8 *buffer, int noblock); |
d56410e0 | 93 | |
1da177e4 LT |
94 | /* close disables the device until open() is called again. |
95 | * Returns negative value on error, otherwise 0. | |
96 | */ | |
97 | int (*close)(void *privdata); | |
d56410e0 | 98 | |
1da177e4 LT |
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 | ||
d56410e0 | 104 | /* |
1da177e4 LT |
105 | * Used to maintain lowlevel module usage counts |
106 | */ | |
107 | struct module *owner; | |
108 | }; | |
109 | ||
110 | struct cpia_frame { | |
111 | u8 *data; | |
112 | int count; | |
113 | int width; | |
114 | int height; | |
115 | volatile int state; | |
116 | }; | |
117 | ||
118 | struct 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; | |
d56410e0 MCC |
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; | |
1da177e4 LT |
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 | ||
237 | enum 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 | ||
248 | struct cam_data { | |
249 | struct list_head cam_data_list; | |
250 | ||
7d0dc269 | 251 | struct mutex busy_lock; /* guard against SMP multithreading */ |
1da177e4 LT |
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; | |
d56410e0 MCC |
256 | /* buffer to hold decompressed frame */ |
257 | int image_size; /* sizeof last decompressed image */ | |
1da177e4 LT |
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 */ | |
3593cab5 | 266 | struct mutex param_lock; /* params lock for this camera */ |
1da177e4 LT |
267 | struct cam_params params; /* camera settings */ |
268 | struct proc_dir_entry *proc_entry; /* /proc/cpia/videoX */ | |
d56410e0 | 269 | |
1da177e4 LT |
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 */ | |
d56410e0 | 281 | struct cpia_frame frame[FRAME_NUM]; |
1da177e4 LT |
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 */ | |
293 | struct 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. */ | |
297 | void 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) | |
7e28adb2 | 416 | #define LOG(fmt,args...) ALOG(KERN_INFO __FILE__ ":%s(%d):" fmt, __func__ , __LINE__ , ##args) |
1da177e4 LT |
417 | |
418 | #ifdef _CPIA_DEBUG_ | |
419 | #define ADBG(fmt,args...) printk(fmt, jiffies, ##args) | |
7e28adb2 | 420 | #define DBG(fmt,args...) ADBG(KERN_DEBUG __FILE__" (%ld):%s(%d):" fmt, __func__, __LINE__ , ##args) |
1da177e4 LT |
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,\ | |
d56410e0 | 428 | (p)&0x08?1:0, (p)&0x04?1:0, (p)&0x02?1:0, (p)&0x01?1:0); |
1da177e4 LT |
429 | |
430 | #endif /* __KERNEL__ */ | |
431 | ||
432 | #endif /* cpia_h */ |