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...) \ | |
36 | do {\ | |
37 | printk(KERN_ERR MODULE_NAME ": " fmt "\n", ## args); \ | |
38 | } while (0) | |
39 | #undef info | |
40 | #define info(fmt, args...) \ | |
41 | do {\ | |
42 | printk(KERN_INFO MODULE_NAME ": " fmt "\n", ## args); \ | |
43 | } while (0) | |
44 | #undef warn | |
45 | #define warn(fmt, args...) \ | |
46 | do {\ | |
47 | printk(KERN_WARNING MODULE_NAME ": " fmt "\n", ## args); \ | |
48 | } while (0) | |
49 | ||
50 | #define GSPCA_MAX_FRAMES 16 /* maximum number of video frame buffers */ | |
0be01004 JFM |
51 | /* image transfers */ |
52 | #define MAX_NURBS 4 /* max number of URBs */ | |
63eb9546 | 53 | #define ISO_MAX_PKT 32 /* max number of packets in an ISOC transfer */ |
d43fa32f | 54 | #define ISO_MAX_SIZE 0x8000 /* max size of one URB buffer (32 Kb) */ |
63eb9546 JFM |
55 | |
56 | /* device information - set at probe time */ | |
63eb9546 | 57 | struct cam { |
95d9142c | 58 | int bulk_size; /* buffer size when image transfer by bulk */ |
c2446b3e | 59 | struct v4l2_pix_format *cam_mode; /* size nmodes */ |
63eb9546 JFM |
60 | char nmodes; |
61 | __u8 epaddr; | |
62 | }; | |
63 | ||
64 | struct gspca_dev; | |
65 | struct gspca_frame; | |
66 | ||
67 | /* subdriver operations */ | |
68 | typedef int (*cam_op) (struct gspca_dev *); | |
69 | typedef void (*cam_v_op) (struct gspca_dev *); | |
70 | typedef int (*cam_cf_op) (struct gspca_dev *, const struct usb_device_id *); | |
71 | typedef int (*cam_jpg_op) (struct gspca_dev *, | |
72 | struct v4l2_jpegcompression *); | |
73 | typedef int (*cam_qmnu_op) (struct gspca_dev *, | |
74 | struct v4l2_querymenu *); | |
75 | typedef void (*cam_pkt_op) (struct gspca_dev *gspca_dev, | |
76 | struct gspca_frame *frame, | |
6a7eba24 | 77 | __u8 *data, |
63eb9546 JFM |
78 | int len); |
79 | ||
80 | struct ctrl { | |
81 | struct v4l2_queryctrl qctrl; | |
82 | int (*set)(struct gspca_dev *, __s32); | |
83 | int (*get)(struct gspca_dev *, __s32 *); | |
84 | }; | |
85 | ||
86 | /* subdriver description */ | |
87 | struct sd_desc { | |
88 | /* information */ | |
a5ae2062 | 89 | const char *name; /* sub-driver name */ |
63eb9546 | 90 | /* controls */ |
a5ae2062 | 91 | const struct ctrl *ctrls; |
63eb9546 | 92 | int nctrls; |
012d6b02 | 93 | /* mandatory operations */ |
e2997a72 | 94 | cam_cf_op config; /* called on probe */ |
012d6b02 | 95 | cam_op init; /* called on probe and resume */ |
72ab97ce | 96 | cam_op start; /* called on stream on */ |
63eb9546 | 97 | cam_pkt_op pkt_scan; |
c2446b3e | 98 | /* optional operations */ |
012d6b02 | 99 | cam_v_op stopN; /* called on stream off - main alt */ |
98522a7b | 100 | cam_v_op stop0; /* called on stream off & disconnect - alt 0 */ |
c2446b3e | 101 | cam_v_op dq_callback; /* called when a frame has been dequeued */ |
63eb9546 JFM |
102 | cam_jpg_op get_jcomp; |
103 | cam_jpg_op set_jcomp; | |
104 | cam_qmnu_op querymenu; | |
105 | }; | |
106 | ||
63eb9546 | 107 | /* packet types when moving from iso buf to frame buf */ |
e293e599 EA |
108 | enum gspca_packet_type { |
109 | DISCARD_PACKET, | |
110 | FIRST_PACKET, | |
111 | INTER_PACKET, | |
112 | LAST_PACKET | |
113 | }; | |
63eb9546 JFM |
114 | |
115 | struct gspca_frame { | |
6a7eba24 JFM |
116 | __u8 *data; /* frame buffer */ |
117 | __u8 *data_end; /* end of frame while filling */ | |
63eb9546 JFM |
118 | int vma_use_count; |
119 | struct v4l2_buffer v4l2_buf; | |
120 | }; | |
121 | ||
122 | struct gspca_dev { | |
e07a1d8a | 123 | struct video_device *vdev; |
5c4fa002 | 124 | struct module *module; /* subdriver handling the device */ |
63eb9546 | 125 | struct usb_device *dev; |
6b060ffe | 126 | struct kref kref; |
4aa0d037 | 127 | struct file *capt_file; /* file doing video capture */ |
63eb9546 JFM |
128 | |
129 | struct cam cam; /* device information */ | |
130 | const struct sd_desc *sd_desc; /* subdriver description */ | |
f50ba1be | 131 | unsigned ctrl_dis; /* disabled controls (bit map) */ |
63eb9546 | 132 | |
8295d99e JFM |
133 | #define USB_BUF_SZ 64 |
134 | __u8 *usb_buf; /* buffer for USB exchanges */ | |
d43fa32f | 135 | struct urb *urb[MAX_NURBS]; |
63eb9546 JFM |
136 | |
137 | __u8 *frbuf; /* buffer for nframes */ | |
138 | struct gspca_frame frame[GSPCA_MAX_FRAMES]; | |
6a7eba24 | 139 | __u32 frsz; /* frame size */ |
63eb9546 JFM |
140 | char nframes; /* number of frames */ |
141 | char fr_i; /* frame being filled */ | |
142 | char fr_q; /* next frame to queue */ | |
143 | char fr_o; /* next frame to dequeue */ | |
144 | signed char fr_queue[GSPCA_MAX_FRAMES]; /* frame queue */ | |
145 | char last_packet_type; | |
146 | ||
147 | __u8 iface; /* USB interface number */ | |
148 | __u8 alt; /* USB alternate setting */ | |
6a7eba24 | 149 | __u8 curr_mode; /* current camera mode */ |
63eb9546 | 150 | __u32 pixfmt; /* current mode parameters */ |
6a7eba24 JFM |
151 | __u16 width; |
152 | __u16 height; | |
63eb9546 JFM |
153 | |
154 | atomic_t nevent; /* number of frames done */ | |
155 | wait_queue_head_t wq; /* wait queue */ | |
156 | struct mutex usb_lock; /* usb exchange protection */ | |
157 | struct mutex read_lock; /* read protection */ | |
158 | struct mutex queue_lock; /* ISOC queue protection */ | |
159 | __u32 sequence; /* frame sequence number */ | |
4aa0d037 | 160 | char streaming; |
6a709749 JFM |
161 | #ifdef CONFIG_PM |
162 | char frozen; /* suspend - resume */ | |
163 | #endif | |
d43fa32f | 164 | char users; /* number of opens */ |
63eb9546 JFM |
165 | char present; /* device connected */ |
166 | char nbufread; /* number of buffers for read() */ | |
d43fa32f JFM |
167 | char nurbs; /* number of allocated URBs */ |
168 | char memory; /* memory type (V4L2_MEMORY_xxx) */ | |
d43fa32f | 169 | __u8 nbalt; /* number of USB alternate settings */ |
63eb9546 JFM |
170 | }; |
171 | ||
172 | int gspca_dev_probe(struct usb_interface *intf, | |
173 | const struct usb_device_id *id, | |
174 | const struct sd_desc *sd_desc, | |
d43fa32f JFM |
175 | int dev_size, |
176 | struct module *module); | |
63eb9546 JFM |
177 | void gspca_disconnect(struct usb_interface *intf); |
178 | struct gspca_frame *gspca_frame_add(struct gspca_dev *gspca_dev, | |
e293e599 | 179 | enum gspca_packet_type packet_type, |
63eb9546 | 180 | struct gspca_frame *frame, |
a5ae2062 | 181 | const __u8 *data, |
63eb9546 | 182 | int len); |
1b60e1ad | 183 | struct gspca_frame *gspca_get_i_frame(struct gspca_dev *gspca_dev); |
6a709749 JFM |
184 | #ifdef CONFIG_PM |
185 | int gspca_suspend(struct usb_interface *intf, pm_message_t message); | |
186 | int gspca_resume(struct usb_interface *intf); | |
187 | #endif | |
dcef3237 HG |
188 | int gspca_auto_gain_n_exposure(struct gspca_dev *gspca_dev, int avg_lum, |
189 | int desired_avg_lum, int deadzone, int gain_knee, int exposure_knee); | |
63eb9546 | 190 | #endif /* GSPCAV2_H */ |