Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
846 | giacomo | 1 | /* (C) 1999-2003 Nemosoft Unv. (webcam@smcc.demon.nl) |
2 | |||
3 | This program is free software; you can redistribute it and/or modify |
||
4 | it under the terms of the GNU General Public License as published by |
||
5 | the Free Software Foundation; either version 2 of the License, or |
||
6 | (at your option) any later version. |
||
7 | |||
8 | This program is distributed in the hope that it will be useful, |
||
9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
11 | GNU General Public License for more details. |
||
12 | |||
13 | You should have received a copy of the GNU General Public License |
||
14 | along with this program; if not, write to the Free Software |
||
15 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
16 | */ |
||
17 | |||
18 | #ifndef PWC_H |
||
19 | #define PWC_H |
||
20 | |||
21 | #include <linux/version.h> |
||
22 | |||
23 | #include <linux/config.h> |
||
24 | #include <linux/module.h> |
||
25 | #include <linux/usb.h> |
||
26 | #include <linux/spinlock.h> |
||
27 | #include <linux/videodev.h> |
||
28 | #include <linux/wait.h> |
||
29 | #include <linux/smp_lock.h> |
||
30 | #include <asm/semaphore.h> |
||
31 | #include <asm/errno.h> |
||
32 | |||
33 | #include "pwc-ioctl.h" |
||
34 | |||
35 | /* Defines and structures for the Philips webcam */ |
||
36 | /* Used for checking memory corruption/pointer validation */ |
||
37 | #define PWC_MAGIC 0x89DC10ABUL |
||
38 | #undef PWC_MAGIC |
||
39 | |||
40 | /* Turn some debugging options on/off */ |
||
41 | #define PWC_DEBUG 0 |
||
42 | |||
43 | /* Trace certain actions in the driver */ |
||
44 | #define TRACE_MODULE 0x0001 |
||
45 | #define TRACE_PROBE 0x0002 |
||
46 | #define TRACE_OPEN 0x0004 |
||
47 | #define TRACE_READ 0x0008 |
||
48 | #define TRACE_MEMORY 0x0010 |
||
49 | #define TRACE_FLOW 0x0020 |
||
50 | #define TRACE_SIZE 0x0040 |
||
51 | #define TRACE_PWCX 0x0080 |
||
52 | #define TRACE_SEQUENCE 0x1000 |
||
53 | |||
54 | #define Trace(R, A...) if (pwc_trace & R) printk(KERN_DEBUG PWC_NAME " " A) |
||
55 | #define Debug(A...) printk(KERN_DEBUG PWC_NAME " " A) |
||
56 | #define Info(A...) printk(KERN_INFO PWC_NAME " " A) |
||
57 | #define Err(A...) printk(KERN_ERR PWC_NAME " " A) |
||
58 | |||
59 | |||
60 | /* Defines for ToUCam cameras */ |
||
61 | #define TOUCAM_HEADER_SIZE 8 |
||
62 | #define TOUCAM_TRAILER_SIZE 4 |
||
63 | |||
64 | #define FEATURE_MOTOR_PANTILT 0x0001 |
||
65 | |||
66 | /* Version block */ |
||
67 | #define PWC_MAJOR 9 |
||
68 | #define PWC_MINOR 0 |
||
69 | #define PWC_VERSION "9.0-BETA-1" |
||
70 | #define PWC_NAME "pwc" |
||
71 | |||
72 | /* Turn certain features on/off */ |
||
73 | #define PWC_INT_PIPE 0 |
||
74 | |||
75 | /* Ignore errors in the first N frames, to allow for startup delays */ |
||
76 | #define FRAME_LOWMARK 5 |
||
77 | |||
78 | /* Size and number of buffers for the ISO pipe. */ |
||
79 | #define MAX_ISO_BUFS 2 |
||
80 | #define ISO_FRAMES_PER_DESC 10 |
||
81 | #define ISO_MAX_FRAME_SIZE 960 |
||
82 | #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE) |
||
83 | |||
84 | /* Frame buffers: contains compressed or uncompressed video data. */ |
||
85 | #define MAX_FRAMES 5 |
||
86 | /* Maximum size after decompression is 640x480 YUV data, 1.5 * 640 * 480 */ |
||
87 | #define PWC_FRAME_SIZE (460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE) |
||
88 | |||
89 | /* Absolute maximum number of buffers available for mmap() */ |
||
90 | #define MAX_IMAGES 10 |
||
91 | |||
92 | /* The following structures were based on cpia.h. Why reinvent the wheel? :-) */ |
||
93 | struct pwc_iso_buf |
||
94 | { |
||
95 | void *data; |
||
96 | int length; |
||
97 | int read; |
||
98 | struct urb *urb; |
||
99 | }; |
||
100 | |||
101 | /* intermediate buffers with raw data from the USB cam */ |
||
102 | struct pwc_frame_buf |
||
103 | { |
||
104 | void *data; |
||
105 | volatile int filled; /* number of bytes filled */ |
||
106 | struct pwc_frame_buf *next; /* list */ |
||
107 | #if PWC_DEBUG |
||
108 | int sequence; /* Sequence number */ |
||
109 | #endif |
||
110 | }; |
||
111 | |||
112 | struct pwc_device |
||
113 | { |
||
114 | struct video_device vdev; |
||
115 | #ifdef PWC_MAGIC |
||
116 | int magic; |
||
117 | #endif |
||
118 | /* Pointer to our usb_device */ |
||
119 | struct usb_device *udev; |
||
120 | |||
121 | int type; /* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */ |
||
122 | int release; /* release number */ |
||
123 | int features; /* feature bits */ |
||
124 | int error_status; /* set when something goes wrong with the cam (unplugged, USB errors) */ |
||
125 | int usb_init; /* set when the cam has been initialized over USB */ |
||
126 | |||
127 | /*** Video data ***/ |
||
128 | int vopen; /* flag */ |
||
129 | int vendpoint; /* video isoc endpoint */ |
||
130 | int vcinterface; /* video control interface */ |
||
131 | int valternate; /* alternate interface needed */ |
||
132 | int vframes, vsize; /* frames-per-second & size (see PSZ_*) */ |
||
133 | int vpalette; /* palette: 420P, RAW or RGBBAYER */ |
||
134 | int vframe_count; /* received frames */ |
||
135 | int vframes_dumped; /* counter for dumped frames */ |
||
136 | int vframes_error; /* frames received in error */ |
||
137 | int vmax_packet_size; /* USB maxpacket size */ |
||
138 | int vlast_packet_size; /* for frame synchronisation */ |
||
139 | int visoc_errors; /* number of contiguous ISOC errors */ |
||
140 | int vcompression; /* desired compression factor */ |
||
141 | int vbandlength; /* compressed band length; 0 is uncompressed */ |
||
142 | char vsnapshot; /* snapshot mode */ |
||
143 | char vsync; /* used by isoc handler */ |
||
144 | char vmirror; /* for ToUCaM series */ |
||
145 | |||
146 | int cmd_len; |
||
147 | unsigned char cmd_buf[13]; |
||
148 | |||
149 | /* The image acquisition requires 3 to 4 steps: |
||
150 | 1. data is gathered in short packets from the USB controller |
||
151 | 2. data is synchronized and packed into a frame buffer |
||
152 | 3a. in case data is compressed, decompress it directly into image buffer |
||
153 | 3b. in case data is uncompressed, copy into image buffer with viewport |
||
154 | 4. data is transferred to the user process |
||
155 | |||
156 | Note that MAX_ISO_BUFS != MAX_FRAMES != MAX_IMAGES.... |
||
157 | We have in effect a back-to-back-double-buffer system. |
||
158 | */ |
||
159 | /* 1: isoc */ |
||
160 | struct pwc_iso_buf sbuf[MAX_ISO_BUFS]; |
||
161 | char iso_init; |
||
162 | |||
163 | /* 2: frame */ |
||
164 | struct pwc_frame_buf *fbuf; /* all frames */ |
||
165 | struct pwc_frame_buf *empty_frames, *empty_frames_tail; /* all empty frames */ |
||
166 | struct pwc_frame_buf *full_frames, *full_frames_tail; /* all filled frames */ |
||
167 | struct pwc_frame_buf *fill_frame; /* frame currently being filled */ |
||
168 | struct pwc_frame_buf *read_frame; /* frame currently read by user process */ |
||
169 | int frame_header_size, frame_trailer_size; |
||
170 | int frame_size; |
||
171 | int frame_total_size; /* including header & trailer */ |
||
172 | int drop_frames; |
||
173 | #if PWC_DEBUG |
||
174 | int sequence; /* Debugging aid */ |
||
175 | #endif |
||
176 | |||
177 | /* 3: decompression */ |
||
178 | struct pwc_decompressor *decompressor; /* function block with decompression routines */ |
||
179 | void *decompress_data; /* private data for decompression engine */ |
||
180 | |||
181 | /* 4: image */ |
||
182 | /* We have an 'image' and a 'view', where 'image' is the fixed-size image |
||
183 | as delivered by the camera, and 'view' is the size requested by the |
||
184 | program. The camera image is centered in this viewport, laced with |
||
185 | a gray or black border. view_min <= image <= view <= view_max; |
||
186 | */ |
||
187 | int image_mask; /* bitmask of supported sizes */ |
||
188 | struct pwc_coord view_min, view_max; /* minimum and maximum viewable sizes */ |
||
189 | struct pwc_coord abs_max; /* maximum supported size with compression */ |
||
190 | struct pwc_coord image, view; /* image and viewport size */ |
||
191 | struct pwc_coord offset; /* offset within the viewport */ |
||
192 | |||
193 | void *image_data; /* total buffer, which is subdivided into ... */ |
||
194 | void *image_ptr[MAX_IMAGES]; /* ...several images... */ |
||
195 | int fill_image; /* ...which are rotated. */ |
||
196 | int len_per_image; /* length per image */ |
||
197 | int image_read_pos; /* In case we read data in pieces, keep track of were we are in the imagebuffer */ |
||
198 | int image_used[MAX_IMAGES]; /* For MCAPTURE and SYNC */ |
||
199 | |||
200 | struct semaphore modlock; /* to prevent races in video_open(), etc */ |
||
201 | spinlock_t ptrlock; /* for manipulating the buffer pointers */ |
||
202 | |||
203 | /*** motorized pan/tilt feature */ |
||
204 | struct pwc_mpt_range angle_range; |
||
205 | int pan_angle; /* in degrees * 100 */ |
||
206 | int tilt_angle; /* absolute angle; 0,0 is home position */ |
||
207 | |||
208 | /*** Misc. data ***/ |
||
209 | wait_queue_head_t frameq; /* When waiting for a frame to finish... */ |
||
210 | #if PWC_INT_PIPE |
||
211 | void *usb_int_handler; /* for the interrupt endpoint */ |
||
212 | #endif |
||
213 | }; |
||
214 | |||
215 | |||
216 | #ifdef __cplusplus |
||
217 | extern "C" { |
||
218 | #endif |
||
219 | |||
220 | /* Global variables */ |
||
221 | extern int pwc_trace; |
||
222 | extern int pwc_preferred_compression; |
||
223 | |||
224 | /** functions in pwc-if.c */ |
||
225 | int pwc_try_video_mode(struct pwc_device *pdev, int width, int height, int new_fps, int new_compression, int new_snapshot); |
||
226 | |||
227 | /** Functions in pwc-misc.c */ |
||
228 | /* sizes in pixels */ |
||
229 | extern struct pwc_coord pwc_image_sizes[PSZ_MAX]; |
||
230 | |||
231 | int pwc_decode_size(struct pwc_device *pdev, int width, int height); |
||
232 | void pwc_construct(struct pwc_device *pdev); |
||
233 | |||
234 | /** Functions in pwc-ctrl.c */ |
||
235 | /* Request a certain video mode. Returns < 0 if not possible */ |
||
236 | extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frames, int compression, int snapshot); |
||
237 | /* Calculate the number of bytes per image (not frame) */ |
||
238 | extern void pwc_set_image_buffer_size(struct pwc_device *pdev); |
||
239 | |||
240 | /* Various controls; should be obvious. Value 0..65535, or < 0 on error */ |
||
241 | extern int pwc_get_brightness(struct pwc_device *pdev); |
||
242 | extern int pwc_set_brightness(struct pwc_device *pdev, int value); |
||
243 | extern int pwc_get_contrast(struct pwc_device *pdev); |
||
244 | extern int pwc_set_contrast(struct pwc_device *pdev, int value); |
||
245 | extern int pwc_get_gamma(struct pwc_device *pdev); |
||
246 | extern int pwc_set_gamma(struct pwc_device *pdev, int value); |
||
247 | extern int pwc_get_saturation(struct pwc_device *pdev); |
||
248 | extern int pwc_set_saturation(struct pwc_device *pdev, int value); |
||
249 | extern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value); |
||
250 | extern int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value); |
||
251 | extern int pwc_get_cmos_sensor(struct pwc_device *pdev); |
||
252 | |||
253 | /* Power down or up the camera; not supported by all models */ |
||
254 | extern int pwc_camera_power(struct pwc_device *pdev, int power); |
||
255 | |||
256 | /* Private ioctl()s; see pwc-ioctl.h */ |
||
257 | extern int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg); |
||
258 | |||
259 | |||
260 | /** pwc-uncompress.c */ |
||
261 | /* Expand frame to image, possibly including decompression. Uses read_frame and fill_image */ |
||
262 | extern int pwc_decompress(struct pwc_device *pdev); |
||
263 | |||
264 | #ifdef __cplusplus |
||
265 | } |
||
266 | #endif |
||
267 | |||
268 | |||
269 | #endif |