1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef PWC_H
19#define PWC_H
20
21#include <linux/config.h>
22#include <linux/module.h>
23#include <linux/usb.h>
24#include <linux/spinlock.h>
25#include <linux/videodev.h>
26#include <linux/wait.h>
27#include <linux/smp_lock.h>
28
29#include <asm/semaphore.h>
30#include <asm/errno.h>
31
32
33
34#define PWC_MAGIC 0x89DC10ABUL
35#undef PWC_MAGIC
36
37
38#define PWC_DEBUG 0
39
40
41#define TRACE_MODULE 0x0001
42#define TRACE_PROBE 0x0002
43#define TRACE_OPEN 0x0004
44#define TRACE_READ 0x0008
45#define TRACE_MEMORY 0x0010
46#define TRACE_FLOW 0x0020
47#define TRACE_SIZE 0x0040
48#define TRACE_PWCX 0x0080
49#define TRACE_SEQUENCE 0x1000
50
51#define Trace(R, A...) if (pwc_trace & R) printk(KERN_DEBUG PWC_NAME " " A)
52#define Debug(A...) printk(KERN_DEBUG PWC_NAME " " A)
53#define Info(A...) printk(KERN_INFO PWC_NAME " " A)
54#define Err(A...) printk(KERN_ERR PWC_NAME " " A)
55
56
57
58#define TOUCAM_HEADER_SIZE 8
59#define TOUCAM_TRAILER_SIZE 4
60
61
62#define PWC_MAJOR 8
63#define PWC_MINOR 11
64#define PWC_VERSION "8.11"
65#define PWC_NAME "pwc"
66
67
68#define PWC_INT_PIPE 0
69
70
71#define FRAME_LOWMARK 5
72
73
74#define MAX_ISO_BUFS 2
75#define ISO_FRAMES_PER_DESC 10
76#define ISO_MAX_FRAME_SIZE 960
77#define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
78
79
80#define MAX_FRAMES 5
81
82#define PWC_FRAME_SIZE (460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE)
83
84
85#define MAX_IMAGES 10
86
87struct pwc_coord
88{
89 int x, y;
90 int size;
91};
92
93
94struct pwc_iso_buf
95{
96 void *data;
97 int length;
98 int read;
99 struct urb *urb;
100};
101
102
103struct pwc_frame_buf
104{
105 void *data;
106 volatile int filled;
107 struct pwc_frame_buf *next;
108#if PWC_DEBUG
109 int sequence;
110#endif
111};
112
113struct pwc_device
114{
115 struct video_device vdev;
116#ifdef PWC_MAGIC
117 int magic;
118#endif
119
120 struct usb_device *udev;
121
122 int type;
123 int release;
124 int error_status;
125 int usb_init;
126
127
128 int vopen;
129 int vendpoint;
130 int vcinterface;
131 int valternate;
132 int vframes, vsize;
133 int vframe_count;
134 int vframes_dumped;
135 int vframes_error;
136 int vmax_packet_size;
137 int vlast_packet_size;
138 int visoc_errors;
139 int vcompression;
140 int vbandlength;
141 char vsnapshot;
142 char vsync;
143 char vmirror;
144
145
146
147
148
149
150
151
152
153
154
155
156 struct pwc_iso_buf sbuf[MAX_ISO_BUFS];
157 char iso_init;
158
159
160 struct pwc_frame_buf *fbuf;
161 struct pwc_frame_buf *empty_frames, *empty_frames_tail;
162 struct pwc_frame_buf *full_frames, *full_frames_tail;
163 struct pwc_frame_buf *fill_frame;
164 struct pwc_frame_buf *read_frame;
165 int frame_size;
166 int frame_header_size, frame_trailer_size;
167 int drop_frames;
168#if PWC_DEBUG
169 int sequence;
170#endif
171
172
173 struct pwc_decompressor *decompressor;
174 void *decompress_data;
175
176
177
178
179
180
181
182 int image_mask;
183 struct pwc_coord view_min, view_max;
184 struct pwc_coord image, view;
185 struct pwc_coord offset;
186
187 void *image_data;
188 void *image_ptr[MAX_IMAGES];
189 int fill_image;
190 int len_per_image;
191 int image_read_pos;
192 int image_used[MAX_IMAGES];
193
194 struct semaphore modlock;
195 spinlock_t ptrlock;
196
197
198 wait_queue_head_t frameq;
199#if PWC_INT_PIPE
200 void *usb_int_handler;
201#endif
202};
203
204
205#define PSZ_SQCIF 0x00
206#define PSZ_QSIF 0x01
207#define PSZ_QCIF 0x02
208#define PSZ_SIF 0x03
209#define PSZ_CIF 0x04
210#define PSZ_VGA 0x05
211#define PSZ_MAX 6
212
213
214
215#ifdef __cplusplus
216extern "C" {
217#endif
218
219
220extern int pwc_trace;
221extern int pwc_preferred_compression;
222
223
224int pwc_try_video_mode(struct pwc_device *pdev, int width, int height, int new_fps, int new_compression, int new_snapshot);
225
226
227
228extern struct pwc_coord pwc_image_sizes[PSZ_MAX];
229
230int pwc_decode_size(struct pwc_device *pdev, int width, int height);
231void pwc_construct(struct pwc_device *pdev);
232
233
234
235extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frames, int compression, int snapshot);
236
237extern void pwc_set_image_buffer_size(struct pwc_device *pdev);
238
239
240extern int pwc_get_brightness(struct pwc_device *pdev);
241extern int pwc_set_brightness(struct pwc_device *pdev, int value);
242extern int pwc_get_contrast(struct pwc_device *pdev);
243extern int pwc_set_contrast(struct pwc_device *pdev, int value);
244extern int pwc_get_gamma(struct pwc_device *pdev);
245extern int pwc_set_gamma(struct pwc_device *pdev, int value);
246extern int pwc_get_saturation(struct pwc_device *pdev);
247extern int pwc_set_saturation(struct pwc_device *pdev, int value);
248extern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value);
249extern int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value);
250extern int pwc_get_cmos_sensor(struct pwc_device *pdev);
251
252
253extern int pwc_camera_power(struct pwc_device *pdev, int power);
254
255
256extern int pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg);
257
258
259
260
261extern int pwc_decompress(struct pwc_device *pdev);
262
263#ifdef __cplusplus
264}
265#endif
266
267
268#endif
269