V4L/DVB (3835): [PATCH] update pwc driver
[linux-2.6] / drivers / media / video / stv680.h
1 /****************************************************************************
2  *
3  *  Filename: stv680.h
4  *
5  *  Description:
6  *     This is a USB driver for STV0680 based usb video cameras.
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  ****************************************************************************/
23
24 /* size of usb transfers */
25 #define STV680_PACKETSIZE       4096
26
27 /* number of queued bulk transfers to use, may have problems if > 1 */
28 #define STV680_NUMSBUF          1
29
30 /* number of frames supported by the v4l part */
31 #define STV680_NUMFRAMES        2
32
33 /* scratch buffers for passing data to the decoders: 2 or 4 are good */
34 #define STV680_NUMSCRATCH       2
35
36 /* number of nul sized packets to receive before kicking the camera */
37 #define STV680_MAX_NULLPACKETS  200
38
39 /* number of decoding errors before kicking the camera */
40 #define STV680_MAX_ERRORS       100
41
42 #define USB_PENCAM_VENDOR_ID    0x0553
43 #define USB_PENCAM_PRODUCT_ID   0x0202
44
45 #define USB_CREATIVEGOMINI_VENDOR_ID    0x041e
46 #define USB_CREATIVEGOMINI_PRODUCT_ID   0x4007
47
48 #define PENCAM_TIMEOUT          1000
49 /* fmt 4 */
50 #define STV_VIDEO_PALETTE       VIDEO_PALETTE_RGB24
51
52 static struct usb_device_id device_table[] = {
53         {USB_DEVICE (USB_PENCAM_VENDOR_ID, USB_PENCAM_PRODUCT_ID)},
54         {USB_DEVICE (USB_CREATIVEGOMINI_VENDOR_ID, USB_CREATIVEGOMINI_PRODUCT_ID)},
55         {}
56 };
57 MODULE_DEVICE_TABLE (usb, device_table);
58
59 struct stv680_sbuf {
60         unsigned char *data;
61 };
62
63 enum {
64         FRAME_UNUSED,           /* Unused (no MCAPTURE) */
65         FRAME_READY,            /* Ready to start grabbing */
66         FRAME_GRABBING,         /* In the process of being grabbed into */
67         FRAME_DONE,             /* Finished grabbing, but not been synced yet */
68         FRAME_ERROR,            /* Something bad happened while processing */
69 };
70
71 enum {
72         BUFFER_UNUSED,
73         BUFFER_READY,
74         BUFFER_BUSY,
75         BUFFER_DONE,
76 };
77
78 /* raw camera data <- sbuf (urb transfer buf) */
79 struct stv680_scratch {
80         unsigned char *data;
81         volatile int state;
82         int offset;
83         int length;
84 };
85
86 /* processed data for display ends up here, after bayer */
87 struct stv680_frame {
88         unsigned char *data;    /* Frame buffer */
89         volatile int grabstate; /* State of grabbing */
90         unsigned char *curline;
91         int curlinepix;
92         int curpix;
93 };
94
95 /* this is almost the video structure uvd_t, with extra parameters for stv */
96 struct usb_stv {
97         struct video_device *vdev;
98
99         struct usb_device *udev;
100
101         unsigned char bulk_in_endpointAddr;     /* __u8  the address of the bulk in endpoint */
102         char *camera_name;
103
104         unsigned int VideoMode; /* 0x0100 = VGA, 0x0000 = CIF, 0x0300 = QVGA */
105         int SupportedModes;
106         int CIF;
107         int VGA;
108         int QVGA;
109         int cwidth;             /* camera width */
110         int cheight;            /* camera height */
111         int maxwidth;           /* max video width */
112         int maxheight;          /* max video height */
113         int vwidth;             /* current width for video window */
114         int vheight;            /* current height for video window */
115         unsigned long int rawbufsize;
116         unsigned long int maxframesize; /* rawbufsize * 3 for RGB */
117
118         int origGain;
119         int origMode;           /* original camera mode */
120
121         struct mutex lock;      /* to lock the structure */
122         int user;               /* user count for exclusive use */
123         int removed;            /* device disconnected */
124         int streaming;          /* Are we streaming video? */
125         char *fbuf;             /* Videodev buffer area */
126         struct urb *urb[STV680_NUMSBUF];        /* # of queued bulk transfers */
127         int curframe;           /* Current receiving frame */
128         struct stv680_frame frame[STV680_NUMFRAMES];    /* # frames supported by v4l part */
129         int readcount;
130         int framecount;
131         int error;
132         int dropped;
133         int scratch_next;
134         int scratch_use;
135         int scratch_overflow;
136         struct stv680_scratch scratch[STV680_NUMSCRATCH];       /* for decoders */
137         struct stv680_sbuf sbuf[STV680_NUMSBUF];
138
139         unsigned int brightness;
140         unsigned int chgbright;
141         unsigned int whiteness;
142         unsigned int colour;
143         unsigned int contrast;
144         unsigned int hue;
145         unsigned int palette;
146         unsigned int depth;     /* rgb24 in bits */
147
148         wait_queue_head_t wq;   /* Processes waiting */
149
150         int nullpackets;
151 };
152
153
154 static const unsigned char red[256] = {
155         0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
156         18, 18, 18, 18, 18, 18, 18, 25, 30, 35, 38, 42,
157         44, 47, 50, 53, 54, 57, 59, 61, 63, 65, 67, 69,
158         71, 71, 73, 75, 77, 78, 80, 81, 82, 84, 85, 87,
159         88, 89, 90, 91, 93, 94, 95, 97, 98, 98, 99, 101,
160         102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
161         114, 115, 116, 116, 117, 118, 119, 120, 121, 122, 123, 124,
162         125, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134,
163         134, 135, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143,
164         143, 143, 144, 145, 146, 147, 147, 148, 149, 150, 150, 151,
165         152, 152, 152, 153, 154, 154, 155, 156, 157, 157, 158, 159,
166         159, 160, 161, 161, 161, 162, 163, 163, 164, 165, 165, 166,
167         167, 167, 168, 168, 169, 170, 170, 170, 171, 171, 172, 173,
168         173, 174, 174, 175, 176, 176, 177, 178, 178, 179, 179, 179,
169         180, 180, 181, 181, 182, 183, 183, 184, 184, 185, 185, 186,
170         187, 187, 188, 188, 188, 188, 189, 190, 190, 191, 191, 192,
171         192, 193, 193, 194, 195, 195, 196, 196, 197, 197, 197, 197,
172         198, 198, 199, 199, 200, 201, 201, 202, 202, 203, 203, 204,
173         204, 205, 205, 206, 206, 206, 206, 207, 207, 208, 208, 209,
174         209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215,
175         215, 215, 215, 216, 216, 217, 217, 218, 218, 218, 219, 219,
176         220, 220, 221, 221
177 };
178
179 static const unsigned char green[256] = {
180         0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
181         21, 21, 21, 21, 21, 21, 21, 28, 34, 39, 43, 47,
182         50, 53, 56, 59, 61, 64, 66, 68, 71, 73, 75, 77,
183         79, 80, 82, 84, 86, 87, 89, 91, 92, 94, 95, 97,
184         98, 100, 101, 102, 104, 105, 106, 108, 109, 110, 111, 113,
185         114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126,
186         127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
187         139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149,
188         150, 151, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159,
189         160, 160, 161, 162, 163, 164, 164, 165, 166, 167, 167, 168,
190         169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177,
191         177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 184, 185,
192         186, 186, 187, 187, 188, 189, 189, 190, 191, 191, 192, 193,
193         193, 194, 194, 195, 196, 196, 197, 198, 198, 199, 199, 200,
194         201, 201, 202, 202, 203, 204, 204, 205, 205, 206, 206, 207,
195         208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214,
196         214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 220,
197         221, 221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227,
198         227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
199         233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239,
200         239, 240, 240, 241, 241, 242, 242, 243, 243, 243, 244, 244,
201         245, 245, 246, 246
202 };
203
204 static const unsigned char blue[256] = {
205         0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
206         23, 23, 23, 23, 23, 23, 23, 30, 37, 42, 47, 51,
207         55, 58, 61, 64, 67, 70, 72, 74, 78, 80, 82, 84,
208         86, 88, 90, 92, 94, 95, 97, 100, 101, 103, 104, 106,
209         107, 110, 111, 112, 114, 115, 116, 118, 119, 121, 122, 124,
210         125, 126, 127, 128, 129, 132, 133, 134, 135, 136, 137, 138,
211         139, 140, 141, 143, 144, 145, 146, 147, 148, 149, 150, 151,
212         152, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163,
213         165, 166, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174,
214         176, 176, 177, 178, 179, 180, 180, 181, 182, 183, 183, 184,
215         185, 187, 187, 188, 189, 189, 190, 191, 192, 192, 193, 194,
216         194, 195, 196, 196, 198, 199, 200, 200, 201, 202, 202, 203,
217         204, 204, 205, 205, 206, 207, 207, 209, 210, 210, 211, 212,
218         212, 213, 213, 214, 215, 215, 216, 217, 217, 218, 218, 220,
219         221, 221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227,
220         228, 228, 229, 229, 231, 231, 232, 233, 233, 234, 234, 235,
221         235, 236, 236, 237, 238, 238, 239, 239, 240, 240, 242, 242,
222         243, 243, 244, 244, 245, 246, 246, 247, 247, 248, 248, 249,
223         249, 250, 250, 251, 251, 253, 253, 254, 254, 255, 255, 255,
224         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
225         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
226         255, 255, 255, 255
227 };