Commit | Line | Data |
---|---|---|
63eb9546 JFM |
1 | #ifndef GSPCAV2_H |
2 | #define GSPCAV2_H | |
3 | ||
4 | #include <linux/module.h> | |
63eb9546 JFM |
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 | ||
335b3f88 JFM |
11 | /* compilation option */ |
12 | #define GSPCA_DEBUG 1 | |
13 | ||
14 | #ifdef GSPCA_DEBUG | |
63eb9546 JFM |
15 | /* GSPCA our debug messages */ |
16 | extern 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 | |
d43fa32f | 30 | #define D_V4L2 0x0100 |
63eb9546 JFM |
31 | #else |
32 | #define PDEBUG(level, fmt, args...) | |
33 | #endif | |
34 | #undef err | |
35 | #define err(fmt, args...) \ | |
11fb06bd | 36 | printk(KERN_ERR MODULE_NAME ": " fmt "\n", ## args) |
63eb9546 JFM |
37 | #undef info |
38 | #define info(fmt, args...) \ | |
11fb06bd | 39 | printk(KERN_INFO MODULE_NAME ": " fmt "\n", ## args) |
63eb9546 JFM |
40 | #undef warn |
41 | #define warn(fmt, args...) \ | |
11fb06bd | 42 | printk(KERN_WARNING MODULE_NAME ": " fmt "\n", ## args) |
63eb9546 JFM |
43 | |
44 | #define GSPCA_MAX_FRAMES 16 /* maximum number of video frame buffers */ | |
0be01004 JFM |
45 | /* image transfers */ |
46 | #define MAX_NURBS 4 /* max number of URBs */ | |
63eb9546 | 47 | |
28ffe77f AO |
48 | |
49 | /* used to list framerates supported by a camera mode (resolution) */ | |
50 | struct framerates { | |
29b87f04 | 51 | const u8 *rates; |
28ffe77f AO |
52 | int nrates; |
53 | }; | |
54 | ||
63eb9546 | 55 | /* device information - set at probe time */ |
63eb9546 | 56 | struct cam { |
cc611b8a | 57 | const struct v4l2_pix_format *cam_mode; /* size nmodes */ |
28ffe77f AO |
58 | const struct framerates *mode_framerates; /* must have size nmode, |
59 | * just like cam_mode */ | |
47aaca96 JFM |
60 | u32 bulk_size; /* buffer size when image transfer by bulk */ |
61 | u32 input_flags; /* value for ENUM_INPUT status flags */ | |
62 | u8 nmodes; /* size of cam_mode */ | |
63 | u8 no_urb_create; /* don't create transfer URBs */ | |
64 | u8 bulk_nurbs; /* number of URBs in bulk mode | |
dff369aa AO |
65 | * - cannot be > MAX_NURBS |
66 | * - when 0 and bulk_size != 0 means | |
67 | * 1 URB and submit done by subdriver */ | |
6929dc6b | 68 | u8 bulk; /* image transfer by 0:isoc / 1:bulk */ |
49cb6b04 JFM |
69 | u8 npkt; /* number of packets in an ISOC message |
70 | * 0 is the default value: 32 packets */ | |
47aaca96 | 71 | u8 reverse_alts; /* Alt settings are in high to low order */ |
63eb9546 JFM |
72 | }; |
73 | ||
74 | struct gspca_dev; | |
75 | struct gspca_frame; | |
76 | ||
77 | /* subdriver operations */ | |
78 | typedef int (*cam_op) (struct gspca_dev *); | |
79 | typedef void (*cam_v_op) (struct gspca_dev *); | |
80 | typedef int (*cam_cf_op) (struct gspca_dev *, const struct usb_device_id *); | |
81 | typedef int (*cam_jpg_op) (struct gspca_dev *, | |
82 | struct v4l2_jpegcompression *); | |
af1d9afa BJ |
83 | typedef int (*cam_reg_op) (struct gspca_dev *, |
84 | struct v4l2_dbg_register *); | |
85 | typedef int (*cam_ident_op) (struct gspca_dev *, | |
86 | struct v4l2_dbg_chip_ident *); | |
627a5ef7 JP |
87 | typedef int (*cam_streamparm_op) (struct gspca_dev *, |
88 | struct v4l2_streamparm *); | |
63eb9546 JFM |
89 | typedef int (*cam_qmnu_op) (struct gspca_dev *, |
90 | struct v4l2_querymenu *); | |
91 | typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev, | |
76dd272b | 92 | u8 *data, |
63eb9546 | 93 | int len); |
0274d42e MN |
94 | typedef int (*cam_int_pkt_op) (struct gspca_dev *gspca_dev, |
95 | u8 *data, | |
96 | int len); | |
63eb9546 JFM |
97 | |
98 | struct ctrl { | |
99 | struct v4l2_queryctrl qctrl; | |
100 | int (*set)(struct gspca_dev *, __s32); | |
101 | int (*get)(struct gspca_dev *, __s32 *); | |
102 | }; | |
103 | ||
104 | /* subdriver description */ | |
105 | struct sd_desc { | |
106 | /* information */ | |
a5ae2062 | 107 | const char *name; /* sub-driver name */ |
63eb9546 | 108 | /* controls */ |
a5ae2062 | 109 | const struct ctrl *ctrls; |
63eb9546 | 110 | int nctrls; |
012d6b02 | 111 | /* mandatory operations */ |
e2997a72 | 112 | cam_cf_op config; /* called on probe */ |
012d6b02 | 113 | cam_op init; /* called on probe and resume */ |
1f53b0b0 | 114 | cam_op start; /* called on stream on after URBs creation */ |
63eb9546 | 115 | cam_pkt_op pkt_scan; |
c2446b3e | 116 | /* optional operations */ |
1f53b0b0 JFM |
117 | cam_op isoc_init; /* called on stream on before getting the EP */ |
118 | cam_op isoc_nego; /* called when URB submit failed with NOSPC */ | |
012d6b02 | 119 | cam_v_op stopN; /* called on stream off - main alt */ |
98522a7b | 120 | cam_v_op stop0; /* called on stream off & disconnect - alt 0 */ |
c2446b3e | 121 | cam_v_op dq_callback; /* called when a frame has been dequeued */ |
63eb9546 JFM |
122 | cam_jpg_op get_jcomp; |
123 | cam_jpg_op set_jcomp; | |
124 | cam_qmnu_op querymenu; | |
627a5ef7 JP |
125 | cam_streamparm_op get_streamparm; |
126 | cam_streamparm_op set_streamparm; | |
af1d9afa BJ |
127 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
128 | cam_reg_op set_register; | |
129 | cam_reg_op get_register; | |
130 | #endif | |
131 | cam_ident_op get_chip_ident; | |
f7628015 | 132 | #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) |
0274d42e | 133 | cam_int_pkt_op int_pkt_scan; |
ac82f59f HG |
134 | /* other_input makes the gspca core create gspca_dev->input even when |
135 | int_pkt_scan is NULL, for cams with non interrupt driven buttons */ | |
136 | u8 other_input; | |
0274d42e | 137 | #endif |
63eb9546 JFM |
138 | }; |
139 | ||
63eb9546 | 140 | /* packet types when moving from iso buf to frame buf */ |
e293e599 EA |
141 | enum gspca_packet_type { |
142 | DISCARD_PACKET, | |
143 | FIRST_PACKET, | |
144 | INTER_PACKET, | |
145 | LAST_PACKET | |
146 | }; | |
63eb9546 JFM |
147 | |
148 | struct gspca_frame { | |
6a7eba24 | 149 | __u8 *data; /* frame buffer */ |
63eb9546 JFM |
150 | int vma_use_count; |
151 | struct v4l2_buffer v4l2_buf; | |
152 | }; | |
153 | ||
154 | struct gspca_dev { | |
a12ca6a6 | 155 | struct video_device vdev; /* !! must be the first item */ |
5c4fa002 | 156 | struct module *module; /* subdriver handling the device */ |
63eb9546 | 157 | struct usb_device *dev; |
4aa0d037 | 158 | struct file *capt_file; /* file doing video capture */ |
f7628015 | 159 | #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) |
0274d42e MN |
160 | struct input_dev *input_dev; |
161 | char phys[64]; /* physical device path */ | |
162 | #endif | |
63eb9546 JFM |
163 | |
164 | struct cam cam; /* device information */ | |
165 | const struct sd_desc *sd_desc; /* subdriver description */ | |
f50ba1be | 166 | unsigned ctrl_dis; /* disabled controls (bit map) */ |
4af85668 | 167 | unsigned ctrl_inac; /* inactive controls (bit map) */ |
63eb9546 | 168 | |
8295d99e JFM |
169 | #define USB_BUF_SZ 64 |
170 | __u8 *usb_buf; /* buffer for USB exchanges */ | |
d43fa32f | 171 | struct urb *urb[MAX_NURBS]; |
f7628015 | 172 | #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) |
0274d42e MN |
173 | struct urb *int_urb; |
174 | #endif | |
63eb9546 JFM |
175 | |
176 | __u8 *frbuf; /* buffer for nframes */ | |
177 | struct gspca_frame frame[GSPCA_MAX_FRAMES]; | |
b192ca98 | 178 | u8 *image; /* image beeing filled */ |
6a7eba24 | 179 | __u32 frsz; /* frame size */ |
b192ca98 | 180 | u32 image_len; /* current length of image */ |
63eb9546 JFM |
181 | char nframes; /* number of frames */ |
182 | char fr_i; /* frame being filled */ | |
183 | char fr_q; /* next frame to queue */ | |
184 | char fr_o; /* next frame to dequeue */ | |
185 | signed char fr_queue[GSPCA_MAX_FRAMES]; /* frame queue */ | |
ff374747 JFM |
186 | __u8 last_packet_type; |
187 | __s8 empty_packet; /* if (-1) don't check empty packets */ | |
188 | __u8 streaming; | |
63eb9546 | 189 | |
6a7eba24 | 190 | __u8 curr_mode; /* current camera mode */ |
63eb9546 | 191 | __u32 pixfmt; /* current mode parameters */ |
6a7eba24 JFM |
192 | __u16 width; |
193 | __u16 height; | |
ff374747 | 194 | __u32 sequence; /* frame sequence number */ |
63eb9546 | 195 | |
63eb9546 JFM |
196 | wait_queue_head_t wq; /* wait queue */ |
197 | struct mutex usb_lock; /* usb exchange protection */ | |
198 | struct mutex read_lock; /* read protection */ | |
199 | struct mutex queue_lock; /* ISOC queue protection */ | |
8c4ebae4 | 200 | int usb_err; /* USB error - protected by usb_lock */ |
6a709749 JFM |
201 | #ifdef CONFIG_PM |
202 | char frozen; /* suspend - resume */ | |
203 | #endif | |
d43fa32f | 204 | char users; /* number of opens */ |
63eb9546 JFM |
205 | char present; /* device connected */ |
206 | char nbufread; /* number of buffers for read() */ | |
d43fa32f | 207 | char memory; /* memory type (V4L2_MEMORY_xxx) */ |
ff374747 JFM |
208 | __u8 iface; /* USB interface number */ |
209 | __u8 alt; /* USB alternate setting */ | |
d43fa32f | 210 | __u8 nbalt; /* number of USB alternate settings */ |
1f53b0b0 | 211 | u16 pkt_size; /* ISOC packet size */ |
63eb9546 JFM |
212 | }; |
213 | ||
214 | int gspca_dev_probe(struct usb_interface *intf, | |
215 | const struct usb_device_id *id, | |
216 | const struct sd_desc *sd_desc, | |
d43fa32f JFM |
217 | int dev_size, |
218 | struct module *module); | |
4462864d JFM |
219 | int gspca_dev_probe2(struct usb_interface *intf, |
220 | const struct usb_device_id *id, | |
221 | const struct sd_desc *sd_desc, | |
222 | int dev_size, | |
223 | struct module *module); | |
63eb9546 | 224 | void gspca_disconnect(struct usb_interface *intf); |
76dd272b JFM |
225 | void gspca_frame_add(struct gspca_dev *gspca_dev, |
226 | enum gspca_packet_type packet_type, | |
227 | const u8 *data, | |
228 | int len); | |
6a709749 JFM |
229 | #ifdef CONFIG_PM |
230 | int gspca_suspend(struct usb_interface *intf, pm_message_t message); | |
231 | int gspca_resume(struct usb_interface *intf); | |
232 | #endif | |
dcef3237 HG |
233 | int gspca_auto_gain_n_exposure(struct gspca_dev *gspca_dev, int avg_lum, |
234 | int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee); | |
63eb9546 | 235 | #endif /* GSPCAV2_H */ |