1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef PWC_H
26#define PWC_H
27
28#include <linux/module.h>
29#include <linux/usb.h>
30#include <linux/spinlock.h>
31#include <linux/wait.h>
32#include <linux/version.h>
33#include <linux/mutex.h>
34#include <linux/mm.h>
35#include <asm/errno.h>
36#include <linux/videodev.h>
37#include <media/v4l2-common.h>
38#include <media/v4l2-ioctl.h>
39#ifdef CONFIG_USB_PWC_INPUT_EVDEV
40#include <linux/input.h>
41#endif
42
43#include "pwc-uncompress.h"
44#include <media/pwc-ioctl.h>
45
46
47#define PWC_MAJOR 10
48#define PWC_MINOR 0
49#define PWC_EXTRAMINOR 12
50#define PWC_VERSION_CODE KERNEL_VERSION(PWC_MAJOR,PWC_MINOR,PWC_EXTRAMINOR)
51#define PWC_VERSION "10.0.13"
52#define PWC_NAME "pwc"
53#define PFX PWC_NAME ": "
54
55
56
57#define PWC_DEBUG_LEVEL_MODULE (1<<0)
58#define PWC_DEBUG_LEVEL_PROBE (1<<1)
59#define PWC_DEBUG_LEVEL_OPEN (1<<2)
60#define PWC_DEBUG_LEVEL_READ (1<<3)
61#define PWC_DEBUG_LEVEL_MEMORY (1<<4)
62#define PWC_DEBUG_LEVEL_FLOW (1<<5)
63#define PWC_DEBUG_LEVEL_SIZE (1<<6)
64#define PWC_DEBUG_LEVEL_IOCTL (1<<7)
65#define PWC_DEBUG_LEVEL_TRACE (1<<8)
66
67#define PWC_DEBUG_MODULE(fmt, args...) PWC_DEBUG(MODULE, fmt, ##args)
68#define PWC_DEBUG_PROBE(fmt, args...) PWC_DEBUG(PROBE, fmt, ##args)
69#define PWC_DEBUG_OPEN(fmt, args...) PWC_DEBUG(OPEN, fmt, ##args)
70#define PWC_DEBUG_READ(fmt, args...) PWC_DEBUG(READ, fmt, ##args)
71#define PWC_DEBUG_MEMORY(fmt, args...) PWC_DEBUG(MEMORY, fmt, ##args)
72#define PWC_DEBUG_FLOW(fmt, args...) PWC_DEBUG(FLOW, fmt, ##args)
73#define PWC_DEBUG_SIZE(fmt, args...) PWC_DEBUG(SIZE, fmt, ##args)
74#define PWC_DEBUG_IOCTL(fmt, args...) PWC_DEBUG(IOCTL, fmt, ##args)
75#define PWC_DEBUG_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args)
76
77
78#ifdef CONFIG_USB_PWC_DEBUG
79
80#define PWC_DEBUG_LEVEL (PWC_DEBUG_LEVEL_MODULE)
81
82#define PWC_DEBUG(level, fmt, args...) do {\
83 if ((PWC_DEBUG_LEVEL_ ##level) & pwc_trace) \
84 printk(KERN_DEBUG PFX fmt, ##args); \
85 } while(0)
86
87#define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args)
88#define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args)
89#define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args)
90#define PWC_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args)
91
92#else
93
94#define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args)
95#define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args)
96#define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args)
97#define PWC_TRACE(fmt, args...) do { } while(0)
98#define PWC_DEBUG(level, fmt, args...) do { } while(0)
99
100#define pwc_trace 0
101
102#endif
103
104
105#define TOUCAM_HEADER_SIZE 8
106#define TOUCAM_TRAILER_SIZE 4
107
108#define FEATURE_MOTOR_PANTILT 0x0001
109#define FEATURE_CODEC1 0x0002
110#define FEATURE_CODEC2 0x0004
111
112
113#define PWC_INT_PIPE 0
114
115
116#define FRAME_LOWMARK 5
117
118
119#define MAX_ISO_BUFS 2
120#define ISO_FRAMES_PER_DESC 10
121#define ISO_MAX_FRAME_SIZE 960
122#define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
123
124
125#define MAX_FRAMES 5
126
127#define PWC_FRAME_SIZE (460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE)
128
129
130#define MAX_IMAGES 10
131
132
133#define DEVICE_USE_CODEC1(x) ((x)<675)
134#define DEVICE_USE_CODEC2(x) ((x)>=675 && (x)<700)
135#define DEVICE_USE_CODEC3(x) ((x)>=700)
136#define DEVICE_USE_CODEC23(x) ((x)>=675)
137
138
139struct pwc_iso_buf
140{
141 void *data;
142 int length;
143 int read;
144 struct urb *urb;
145};
146
147
148struct pwc_frame_buf
149{
150 void *data;
151 volatile int filled;
152 struct pwc_frame_buf *next;
153};
154
155
156struct pwc_imgbuf
157{
158 unsigned long offset;
159 int vma_use_count;
160};
161
162struct pwc_device
163{
164 struct video_device *vdev;
165
166
167 struct usb_device *udev;
168
169 int type;
170 int release;
171 int features;
172 char serial[30];
173 int error_status;
174 int usb_init;
175
176
177 int vopen;
178 int vendpoint;
179 int vcinterface;
180 int valternate;
181 int vframes, vsize;
182 int vpalette;
183 int vframe_count;
184 int vframes_dumped;
185 int vframes_error;
186 int vmax_packet_size;
187 int vlast_packet_size;
188 int visoc_errors;
189 int vcompression;
190 int vbandlength;
191 char vsnapshot;
192 char vsync;
193 char vmirror;
194 char unplugged;
195
196 int cmd_len;
197 unsigned char cmd_buf[13];
198
199
200
201
202
203
204
205
206
207
208
209
210 struct pwc_iso_buf sbuf[MAX_ISO_BUFS];
211 char iso_init;
212
213
214 struct pwc_frame_buf *fbuf;
215 struct pwc_frame_buf *empty_frames, *empty_frames_tail;
216 struct pwc_frame_buf *full_frames, *full_frames_tail;
217 struct pwc_frame_buf *fill_frame;
218 struct pwc_frame_buf *read_frame;
219 int frame_header_size, frame_trailer_size;
220 int frame_size;
221 int frame_total_size;
222 int drop_frames;
223
224
225 void *decompress_data;
226
227
228
229
230
231
232
233 int image_mask;
234 struct pwc_coord view_min, view_max;
235 struct pwc_coord abs_max;
236 struct pwc_coord image, view;
237 struct pwc_coord offset;
238
239 void *image_data;
240 struct pwc_imgbuf images[MAX_IMAGES];
241 int fill_image;
242 int len_per_image;
243 int image_read_pos;
244 int image_used[MAX_IMAGES];
245
246 struct mutex modlock;
247 spinlock_t ptrlock;
248
249
250 struct pwc_mpt_range angle_range;
251 int pan_angle;
252 int tilt_angle;
253 int snapshot_button_status;
254#ifdef CONFIG_USB_PWC_INPUT_EVDEV
255 struct input_dev *button_dev;
256 char button_phys[64];
257#endif
258
259
260 wait_queue_head_t frameq;
261#if PWC_INT_PIPE
262 void *usb_int_handler;
263#endif
264};
265
266#ifdef __cplusplus
267extern "C" {
268#endif
269
270
271#ifdef CONFIG_USB_PWC_DEBUG
272extern int pwc_trace;
273#endif
274extern int pwc_mbufs;
275
276
277int pwc_try_video_mode(struct pwc_device *pdev, int width, int height, int new_fps, int new_compression, int new_snapshot);
278int pwc_handle_frame(struct pwc_device *pdev);
279void pwc_next_image(struct pwc_device *pdev);
280int pwc_isoc_init(struct pwc_device *pdev);
281void pwc_isoc_cleanup(struct pwc_device *pdev);
282
283
284
285extern const struct pwc_coord pwc_image_sizes[PSZ_MAX];
286
287int pwc_decode_size(struct pwc_device *pdev, int width, int height);
288void pwc_construct(struct pwc_device *pdev);
289
290
291
292extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, int frames, int compression, int snapshot);
293extern unsigned int pwc_get_fps(struct pwc_device *pdev, unsigned int index, unsigned int size);
294
295extern int pwc_mpt_reset(struct pwc_device *pdev, int flags);
296extern int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt);
297
298
299extern int pwc_get_brightness(struct pwc_device *pdev);
300extern int pwc_set_brightness(struct pwc_device *pdev, int value);
301extern int pwc_get_contrast(struct pwc_device *pdev);
302extern int pwc_set_contrast(struct pwc_device *pdev, int value);
303extern int pwc_get_gamma(struct pwc_device *pdev);
304extern int pwc_set_gamma(struct pwc_device *pdev, int value);
305extern int pwc_get_saturation(struct pwc_device *pdev, int *value);
306extern int pwc_set_saturation(struct pwc_device *pdev, int value);
307extern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value);
308extern int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor);
309extern int pwc_restore_user(struct pwc_device *pdev);
310extern int pwc_save_user(struct pwc_device *pdev);
311extern int pwc_restore_factory(struct pwc_device *pdev);
312
313
314extern int pwc_get_red_gain(struct pwc_device *pdev, int *value);
315extern int pwc_set_red_gain(struct pwc_device *pdev, int value);
316extern int pwc_get_blue_gain(struct pwc_device *pdev, int *value);
317extern int pwc_set_blue_gain(struct pwc_device *pdev, int value);
318extern int pwc_get_awb(struct pwc_device *pdev);
319extern int pwc_set_awb(struct pwc_device *pdev, int mode);
320extern int pwc_set_agc(struct pwc_device *pdev, int mode, int value);
321extern int pwc_get_agc(struct pwc_device *pdev, int *value);
322extern int pwc_set_shutter_speed(struct pwc_device *pdev, int mode, int value);
323extern int pwc_get_shutter_speed(struct pwc_device *pdev, int *value);
324
325extern int pwc_set_colour_mode(struct pwc_device *pdev, int colour);
326extern int pwc_get_colour_mode(struct pwc_device *pdev, int *colour);
327extern int pwc_set_contour(struct pwc_device *pdev, int contour);
328extern int pwc_get_contour(struct pwc_device *pdev, int *contour);
329extern int pwc_set_backlight(struct pwc_device *pdev, int backlight);
330extern int pwc_get_backlight(struct pwc_device *pdev, int *backlight);
331extern int pwc_set_flicker(struct pwc_device *pdev, int flicker);
332extern int pwc_get_flicker(struct pwc_device *pdev, int *flicker);
333extern int pwc_set_dynamic_noise(struct pwc_device *pdev, int noise);
334extern int pwc_get_dynamic_noise(struct pwc_device *pdev, int *noise);
335
336
337extern int pwc_camera_power(struct pwc_device *pdev, int power);
338
339
340extern long pwc_ioctl(struct pwc_device *pdev, unsigned int cmd, void *arg);
341
342
343extern long pwc_video_do_ioctl(struct file *file, unsigned int cmd, void *arg);
344
345
346
347extern int pwc_decompress(struct pwc_device *pdev);
348
349#ifdef __cplusplus
350}
351#endif
352
353
354#endif
355
356