1#ifndef GSPCAV2_H
2#define GSPCAV2_H
3
4#include <linux/module.h>
5#include <linux/kernel.h>
6#include <linux/usb.h>
7#include <linux/videodev2.h>
8#include <media/v4l2-common.h>
9#include <linux/mutex.h>
10
11
12#define GSPCA_DEBUG 1
13
14#ifdef GSPCA_DEBUG
15
16extern int gspca_debug;
17#define PDEBUG(level, fmt, args...) \
18 do {\
19 if (gspca_debug & (level)) \
20 printk(KERN_INFO MODULE_NAME ": " fmt "\n", ## args); \
21 } while (0)
22#define D_ERR 0x01
23#define D_PROBE 0x02
24#define D_CONF 0x04
25#define D_STREAM 0x08
26#define D_FRAM 0x10
27#define D_PACK 0x20
28#define D_USBI 0x40
29#define D_USBO 0x80
30#define D_V4L2 0x0100
31#else
32#define PDEBUG(level, fmt, args...)
33#endif
34#undef err
35#define err(fmt, args...) \
36 printk(KERN_ERR MODULE_NAME ": " fmt "\n", ## args)
37#undef info
38#define info(fmt, args...) \
39 printk(KERN_INFO MODULE_NAME ": " fmt "\n", ## args)
40#undef warn
41#define warn(fmt, args...) \
42 printk(KERN_WARNING MODULE_NAME ": " fmt "\n", ## args)
43
44#define GSPCA_MAX_FRAMES 16
45
46#define MAX_NURBS 4
47
48
49
50struct framerates {
51 int *rates;
52 int nrates;
53};
54
55
56struct cam {
57 int bulk_size;
58 const struct v4l2_pix_format *cam_mode;
59 char nmodes;
60 const struct framerates *mode_framerates;
61
62 __u8 bulk_nurbs;
63
64
65
66 u8 bulk;
67 u8 npkt;
68
69 u32 input_flags;
70 char reverse_alts;
71};
72
73struct gspca_dev;
74struct gspca_frame;
75
76
77typedef int (*cam_op) (struct gspca_dev *);
78typedef void (*cam_v_op) (struct gspca_dev *);
79typedef int (*cam_cf_op) (struct gspca_dev *, const struct usb_device_id *);
80typedef int (*cam_jpg_op) (struct gspca_dev *,
81 struct v4l2_jpegcompression *);
82typedef int (*cam_reg_op) (struct gspca_dev *,
83 struct v4l2_dbg_register *);
84typedef int (*cam_ident_op) (struct gspca_dev *,
85 struct v4l2_dbg_chip_ident *);
86typedef int (*cam_streamparm_op) (struct gspca_dev *,
87 struct v4l2_streamparm *);
88typedef int (*cam_qmnu_op) (struct gspca_dev *,
89 struct v4l2_querymenu *);
90typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev,
91 u8 *data,
92 int len);
93
94struct ctrl {
95 struct v4l2_queryctrl qctrl;
96 int (*set)(struct gspca_dev *, __s32);
97 int (*get)(struct gspca_dev *, __s32 *);
98};
99
100
101struct sd_desc {
102
103 const char *name;
104
105 const struct ctrl *ctrls;
106 int nctrls;
107
108 cam_cf_op config;
109 cam_op init;
110 cam_op start;
111 cam_pkt_op pkt_scan;
112
113 cam_op isoc_init;
114 cam_op isoc_nego;
115 cam_v_op stopN;
116 cam_v_op stop0;
117 cam_v_op dq_callback;
118 cam_jpg_op get_jcomp;
119 cam_jpg_op set_jcomp;
120 cam_qmnu_op querymenu;
121 cam_streamparm_op get_streamparm;
122 cam_streamparm_op set_streamparm;
123#ifdef CONFIG_VIDEO_ADV_DEBUG
124 cam_reg_op set_register;
125 cam_reg_op get_register;
126#endif
127 cam_ident_op get_chip_ident;
128};
129
130
131enum gspca_packet_type {
132 DISCARD_PACKET,
133 FIRST_PACKET,
134 INTER_PACKET,
135 LAST_PACKET
136};
137
138struct gspca_frame {
139 __u8 *data;
140 __u8 *data_end;
141 int vma_use_count;
142 struct v4l2_buffer v4l2_buf;
143};
144
145struct gspca_dev {
146 struct video_device vdev;
147 struct module *module;
148 struct usb_device *dev;
149 struct file *capt_file;
150
151 struct cam cam;
152 const struct sd_desc *sd_desc;
153 unsigned ctrl_dis;
154 unsigned ctrl_inac;
155
156#define USB_BUF_SZ 64
157 __u8 *usb_buf;
158 struct urb *urb[MAX_NURBS];
159
160 __u8 *frbuf;
161 struct gspca_frame frame[GSPCA_MAX_FRAMES];
162 struct gspca_frame *cur_frame;
163 __u32 frsz;
164 char nframes;
165 char fr_i;
166 char fr_q;
167 char fr_o;
168 signed char fr_queue[GSPCA_MAX_FRAMES];
169 __u8 last_packet_type;
170 __s8 empty_packet;
171 __u8 streaming;
172
173 __u8 curr_mode;
174 __u32 pixfmt;
175 __u16 width;
176 __u16 height;
177 __u32 sequence;
178
179 wait_queue_head_t wq;
180 struct mutex usb_lock;
181 struct mutex read_lock;
182 struct mutex queue_lock;
183 int usb_err;
184#ifdef CONFIG_PM
185 char frozen;
186#endif
187 char users;
188 char present;
189 char nbufread;
190 char nurbs;
191 char memory;
192 __u8 iface;
193 __u8 alt;
194 __u8 nbalt;
195 u16 pkt_size;
196};
197
198int gspca_dev_probe(struct usb_interface *intf,
199 const struct usb_device_id *id,
200 const struct sd_desc *sd_desc,
201 int dev_size,
202 struct module *module);
203void gspca_disconnect(struct usb_interface *intf);
204void gspca_frame_add(struct gspca_dev *gspca_dev,
205 enum gspca_packet_type packet_type,
206 const u8 *data,
207 int len);
208struct gspca_frame *gspca_get_i_frame(struct gspca_dev *gspca_dev);
209#ifdef CONFIG_PM
210int gspca_suspend(struct usb_interface *intf, pm_message_t message);
211int gspca_resume(struct usb_interface *intf);
212#endif
213int gspca_auto_gain_n_exposure(struct gspca_dev *gspca_dev, int avg_lum,
214 int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee);
215#endif
216