blob: 4115938a173114125c523dd6a52074e828bd6fdf [file] [log] [blame]
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08001/*
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -08002 em2820-cards.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -08003
4 Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
5 Ludovico Cavedon <cavedon@sssup.it>
6 Mauro Carvalho Chehab <mchehab@brturbo.com.br>
7
8 Based on the em2800 driver from Sascha Sommer <saschasommer@freenet.de>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24
25#ifndef _EM2820_H
26#define _EM2820_H
27
28#include <linux/videodev.h>
29#include <linux/i2c.h>
30
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080031/* Boards supported by driver */
32
33#define EM2800_BOARD_UNKNOWN 0
34#define EM2820_BOARD_UNKNOWN 1
35#define EM2820_BOARD_TERRATEC_CINERGY_250 2
36#define EM2820_BOARD_PINNACLE_USB_2 3
37#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 4
38#define EM2820_BOARD_MSI_VOX_USB_2 5
39#define EM2800_BOARD_TERRATEC_CINERGY_200 6
40#define EM2800_BOARD_LEADTEK_WINFAST_USBII 7
41#define EM2800_BOARD_KWORLD_USB2800 8
42
43#define UNSET -1
44
45/* maximum number of em28xx boards */
46#define EM2820_MAXBOARDS 1 /*FIXME: should be bigger */
47
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -080048/* maximum number of frames that can be queued */
49#define EM2820_NUM_FRAMES 5
50/* number of frames that get used for v4l2_read() */
51#define EM2820_NUM_READ_FRAMES 2
52
53/* number of buffers for isoc transfers */
54#define EM2820_NUM_BUFS 5
55
56/* number of packets for each buffer */
57// windows requests only 40 packets .. so we better do the same
58// this is what I found out for all alternate numbers there!
59
60#define EM2820_NUM_PACKETS 40
61
62/* packet size for each packet */
63/* no longer needed: read from endpoint descriptor */
64//#define EM2820_MAX_PACKET_SIZE 3072 //7
65//#define EM2820_MAX_PACKET_SIZE 2892 //6
66//#define EM2820_MAX_PACKET_SIZE 2580 //5
67//#define EM2820_MAX_PACKET_SIZE 1448 //2
68
69/* default alternate; 0 means choose the best */
70#define EM2820_PINOUT 0
71#define EM2820_MAX_ALT 7
72
73#define EM2820_INTERLACED_DEFAULT 1
74
75/*
76#define (use usbview if you want to get the other alternate number infos)
77#define
78#define alternate number 2
79#define Endpoint Address: 82
80 Direction: in
81 Attribute: 1
82 Type: Isoc
83 Max Packet Size: 1448
84 Interval: 125us
85
86 alternate number 7
87
88 Endpoint Address: 82
89 Direction: in
90 Attribute: 1
91 Type: Isoc
92 Max Packet Size: 3072
93 Interval: 125us
94*/
95
96/* time to wait when stopping the isoc transfer */
97#define EM2820_URB_TIMEOUT msecs_to_jiffies(EM2820_NUM_BUFS * EM2820_NUM_PACKETS)
98
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -080099/* time in msecs to wait for i2c writes to finish */
100#define EM2800_I2C_WRITE_TIMEOUT 20
101
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800102/* the various frame states */
103enum em2820_frame_state {
104 F_UNUSED = 0,
105 F_QUEUED,
106 F_GRABBING,
107 F_DONE,
108 F_ERROR,
109};
110
111/* stream states */
112enum em2820_stream_state {
113 STREAM_OFF,
114 STREAM_INTERRUPT,
115 STREAM_ON,
116};
117
118/* frames */
119struct em2820_frame_t {
120 void *bufmem;
121 struct v4l2_buffer buf;
122 enum em2820_frame_state state;
123 struct list_head frame;
124 unsigned long vma_use_count;
125 int top_field;
126 int fieldbytesused;
127};
128
129/* io methods */
130enum em2820_io_method {
131 IO_NONE,
132 IO_READ,
133 IO_MMAP,
134};
135
136/* inputs */
137
138#define MAX_EM2820_INPUT 4
139enum enum2820_itype {
140 EM2820_VMUX_COMPOSITE1 = 1,
141 EM2820_VMUX_COMPOSITE2,
142 EM2820_VMUX_COMPOSITE3,
143 EM2820_VMUX_COMPOSITE4,
144 EM2820_VMUX_SVIDEO,
145 EM2820_VMUX_TELEVISION,
146 EM2820_VMUX_CABLE,
147 EM2820_VMUX_DVB,
148 EM2820_VMUX_DEBUG,
149 EM2820_RADIO,
150};
151
152struct em2820_input {
153 enum enum2820_itype type;
154 unsigned int vmux;
155 unsigned int amux;
156};
157
158#define INPUT(nr) (&em2820_boards[dev->model].input[nr])
159
160enum em2820_decoder {
161 EM2820_TVP5150,
162 EM2820_SAA7113,
163 EM2820_SAA7114
164};
165
166struct em2820_board {
167 char *name;
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800168 unsigned char chip_id;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800169 int vchannels;
170 int norm;
171 int tuner_type;
172
173 /* i2c flags */
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800174 unsigned int is_em2800;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800175 unsigned int tda9887_conf;
176
177 unsigned int has_tuner:1;
178 unsigned int has_msp34xx:1;
179
180 enum em2820_decoder decoder;
181
182 struct em2820_input input[MAX_EM2820_INPUT];
183};
184
185struct em2820_eeprom {
186 u32 id; /* 0x9567eb1a */
187 u16 vendor_ID;
188 u16 product_ID;
189
190 u16 chip_conf;
191
192 u16 board_conf;
193
194 u16 string1, string2, string3;
195
196 u8 string_idx_table;
197};
198
199/* device states */
200enum em2820_dev_state {
201 DEV_INITIALIZED = 0x01,
202 DEV_DISCONNECTED = 0x02,
203 DEV_MISCONFIGURED = 0x04,
204};
205
206/* tvnorms */
207struct em2820_tvnorm {
208 char *name;
209 v4l2_std_id id;
210 /* mode for saa7113h */
211 int mode;
212};
213
214/* main device struct */
215struct em2820 {
216 /* generic device properties */
217 char name[30]; /* name (including minor) of the device */
218 int model; /* index in the device_data struct */
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800219 unsigned int is_em2800;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800220 int video_inputs; /* number of video inputs */
221 unsigned int has_tuner:1;
222 unsigned int has_msp34xx:1;
223 unsigned int has_tda9887:1;
224
225 enum em2820_decoder decoder;
226
227 int tuner_type; /* type of the tuner */
228 int tuner_addr; /* tuner address */
229 int tda9887_conf;
230 /* i2c i/o */
231 struct i2c_adapter i2c_adap;
232 struct i2c_client i2c_client;
233 /* video for linux */
234 int users; /* user count for exclusive use */
235 struct video_device *vdev; /* video for linux device struct */
236 struct video_picture vpic; /* picture settings only used to init saa7113h */
237 struct em2820_tvnorm *tvnorm; /* selected tv norm */
238 int ctl_freq; /* selected frequency */
239 unsigned int ctl_input; /* selected input */
240 unsigned int ctl_ainput; /* slected audio input */
241 int mute;
242 int volume;
243 /* frame properties */
244 struct em2820_frame_t frame[EM2820_NUM_FRAMES]; /* list of frames */
245 int num_frames; /* number of frames currently in use */
246 unsigned int frame_count; /* total number of transfered frames */
247 struct em2820_frame_t *frame_current; /* the frame that is being filled */
248 int width; /* current frame width */
249 int height; /* current frame height */
250 int frame_size; /* current frame size */
251 int field_size; /* current field size */
252 int bytesperline;
253 int hscale; /* horizontal scale factor (see datasheet) */
254 int vscale; /* vertical scale factor (see datasheet) */
255 int interlaced; /* 1=interlace fileds, 0=just top fileds */
256 int type;
257
258 /* states */
259 enum em2820_dev_state state;
260 enum em2820_stream_state stream;
261 enum em2820_io_method io;
262 /* locks */
263 struct semaphore lock, fileop_lock;
264 spinlock_t queue_lock;
265 struct list_head inqueue, outqueue;
266 wait_queue_head_t open, wait_frame, wait_stream;
267 struct video_device *vbi_dev;
268
269 unsigned char eedata[256];
270
271 /* usb transfer */
272 struct usb_device *udev; /* the usb device */
273 int alt; /* alternate */
274 int max_pkt_size; /* max packet size of isoc transaction */
275 unsigned int alt_max_pkt_size[EM2820_MAX_ALT + 1]; /* array of wMaxPacketSize */
276 struct urb *urb[EM2820_NUM_BUFS]; /* urb for isoc transfers */
277 char *transfer_buffer[EM2820_NUM_BUFS]; /* transfer buffers for isoc transfer */
278 /* helper funcs that call usb_control_msg */
279 int (*em2820_write_regs) (struct em2820 * dev, u16 reg, char *buf,
280 int len);
281 int (*em2820_read_reg) (struct em2820 * dev, u16 reg);
282 int (*em2820_read_reg_req_len) (struct em2820 * dev, u8 req, u16 reg,
283 char *buf, int len);
284 int (*em2820_write_regs_req) (struct em2820 * dev, u8 req, u16 reg,
285 char *buf, int len);
286 int (*em2820_read_reg_req) (struct em2820 * dev, u8 req, u16 reg);
287};
288
289/* Provided by em2820-i2c.c */
290
291void em2820_i2c_call_clients(struct em2820 *dev, unsigned int cmd, void *arg);
292int em2820_i2c_register(struct em2820 *dev);
293int em2820_i2c_unregister(struct em2820 *dev);
294
295/* Provided by em2820-core.c */
296
297void em2820_print_ioctl(char *name, unsigned int cmd);
298
299u32 em2820_request_buffers(struct em2820 *dev, u32 count);
300void em2820_queue_unusedframes(struct em2820 *dev);
301void em2820_release_buffers(struct em2820 *dev);
302
303int em2820_read_reg_req_len(struct em2820 *dev, u8 req, u16 reg,
304 char *buf, int len);
305int em2820_read_reg_req(struct em2820 *dev, u8 req, u16 reg);
306int em2820_read_reg(struct em2820 *dev, u16 reg);
307int em2820_write_regs_req(struct em2820 *dev, u8 req, u16 reg, char *buf,
308 int len);
309int em2820_write_regs(struct em2820 *dev, u16 reg, char *buf, int len);
310int em2820_write_reg_bits(struct em2820 *dev, u16 reg, u8 val,
311 u8 bitmask);
312int em2820_write_ac97(struct em2820 *dev, u8 reg, u8 * val);
313int em2820_audio_analog_set(struct em2820 *dev);
314int em2820_colorlevels_set_default(struct em2820 *dev);
315int em2820_capture_start(struct em2820 *dev, int start);
316int em2820_outfmt_set_yuv422(struct em2820 *dev);
317int em2820_accumulator_set(struct em2820 *dev, u8 xmin, u8 xmax, u8 ymin,
318 u8 ymax);
319int em2820_capture_area_set(struct em2820 *dev, u8 hstart, u8 vstart,
320 u16 width, u16 height);
321int em2820_scaler_set(struct em2820 *dev, u16 h, u16 v);
322int em2820_resolution_set(struct em2820 *dev);
323void em2820_isocIrq(struct urb *urb, struct pt_regs *regs);
324int em2820_init_isoc(struct em2820 *dev);
325void em2820_uninit_isoc(struct em2820 *dev);
326int em2820_set_alternate(struct em2820 *dev);
327
328/* Provided by em2820-cards.c */
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800329extern int em2800_variant_detect(struct usb_device* udev,int model);
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800330extern void em2820_card_setup(struct em2820 *dev);
331extern struct em2820_board em2820_boards[];
332extern struct usb_device_id em2820_id_table[];
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800333extern const unsigned int em2820_bcount;
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800334
335/* em2820 registers */
Mauro Carvalho Chehab596d92d2005-11-08 21:37:24 -0800336#define CHIPID_REG 0x0a
akpm@osdl.orga6c2ba22005-11-08 21:37:07 -0800337#define USBSUSP_REG 0x0c /* */
338
339#define AUDIOSRC_REG 0x0e
340#define XCLK_REG 0x0f
341
342#define VINMODE_REG 0x10
343#define VINCTRL_REG 0x11
344#define VINENABLE_REG 0x12 /* */
345
346#define GAMMA_REG 0x14
347#define RGAIN_REG 0x15
348#define GGAIN_REG 0x16
349#define BGAIN_REG 0x17
350#define ROFFSET_REG 0x18
351#define GOFFSET_REG 0x19
352#define BOFFSET_REG 0x1a
353
354#define OFLOW_REG 0x1b
355#define HSTART_REG 0x1c
356#define VSTART_REG 0x1d
357#define CWIDTH_REG 0x1e
358#define CHEIGHT_REG 0x1f
359
360#define YGAIN_REG 0x20
361#define YOFFSET_REG 0x21
362#define UVGAIN_REG 0x22
363#define UOFFSET_REG 0x23
364#define VOFFSET_REG 0x24
365#define SHARPNESS_REG 0x25
366
367#define COMPR_REG 0x26
368#define OUTFMT_REG 0x27
369
370#define XMIN_REG 0x28
371#define XMAX_REG 0x29
372#define YMIN_REG 0x2a
373#define YMAX_REG 0x2b
374
375#define HSCALELOW_REG 0x30
376#define HSCALEHIGH_REG 0x31
377#define VSCALELOW_REG 0x32
378#define VSCALEHIGH_REG 0x33
379
380#define AC97LSB_REG 0x40
381#define AC97MSB_REG 0x41
382#define AC97ADDR_REG 0x42
383#define AC97BUSY_REG 0x43
384
385/* em202 registers */
386#define MASTER_AC97 0x02
387#define VIDEO_AC97 0x14
388
389/* register settings */
390#define EM2820_AUDIO_SRC_TUNER 0xc0
391#define EM2820_AUDIO_SRC_LINE 0x80
392
393/* printk macros */
394
395#define em2820_err(fmt, arg...) do {\
396 printk(KERN_ERR fmt , ##arg); } while (0)
397
398#define em2820_errdev(fmt, arg...) do {\
399 printk(KERN_ERR "%s: "fmt,\
400 dev->name , ##arg); } while (0)
401
402#define em2820_info(fmt, arg...) do {\
403 printk(KERN_INFO "%s: "fmt,\
404 dev->name , ##arg); } while (0)
405#define em2820_warn(fmt, arg...) do {\
406 printk(KERN_WARNING "%s: "fmt,\
407 dev->name , ##arg); } while (0)
408
409inline static int em2820_audio_source(struct em2820 *dev, int input)
410{
411 return em2820_write_reg_bits(dev, AUDIOSRC_REG, input, 0xc0);
412}
413
414inline static int em2820_audio_usb_mute(struct em2820 *dev, int mute)
415{
416 return em2820_write_reg_bits(dev, XCLK_REG, mute ? 0x00 : 0x80, 0x80);
417}
418
419inline static int em2820_audio_analog_setup(struct em2820 *dev)
420{
421 /* unmute video mixer with default volume level */
422 return em2820_write_ac97(dev, VIDEO_AC97, "\x08\x08");
423}
424
425inline static int em2820_compression_disable(struct em2820 *dev)
426{
427 /* side effect of disabling scaler and mixer */
428 return em2820_write_regs(dev, COMPR_REG, "\x00", 1);
429}
430
431inline static int em2820_contrast_get(struct em2820 *dev)
432{
433 return em2820_read_reg(dev, YGAIN_REG) & 0x1f;
434}
435
436inline static int em2820_brightness_get(struct em2820 *dev)
437{
438 return em2820_read_reg(dev, YOFFSET_REG);
439}
440
441inline static int em2820_saturation_get(struct em2820 *dev)
442{
443 return em2820_read_reg(dev, UVGAIN_REG) & 0x1f;
444}
445
446inline static int em2820_u_balance_get(struct em2820 *dev)
447{
448 return em2820_read_reg(dev, UOFFSET_REG);
449}
450
451inline static int em2820_v_balance_get(struct em2820 *dev)
452{
453 return em2820_read_reg(dev, VOFFSET_REG);
454}
455
456inline static int em2820_gamma_get(struct em2820 *dev)
457{
458 return em2820_read_reg(dev, GAMMA_REG) & 0x3f;
459}
460
461inline static int em2820_contrast_set(struct em2820 *dev, s32 val)
462{
463 u8 tmp = (u8) val;
464 return em2820_write_regs(dev, YGAIN_REG, &tmp, 1);
465}
466
467inline static int em2820_brightness_set(struct em2820 *dev, s32 val)
468{
469 u8 tmp = (u8) val;
470 return em2820_write_regs(dev, YOFFSET_REG, &tmp, 1);
471}
472
473inline static int em2820_saturation_set(struct em2820 *dev, s32 val)
474{
475 u8 tmp = (u8) val;
476 return em2820_write_regs(dev, UVGAIN_REG, &tmp, 1);
477}
478
479inline static int em2820_u_balance_set(struct em2820 *dev, s32 val)
480{
481 u8 tmp = (u8) val;
482 return em2820_write_regs(dev, UOFFSET_REG, &tmp, 1);
483}
484
485inline static int em2820_v_balance_set(struct em2820 *dev, s32 val)
486{
487 u8 tmp = (u8) val;
488 return em2820_write_regs(dev, VOFFSET_REG, &tmp, 1);
489}
490
491inline static int em2820_gamma_set(struct em2820 *dev, s32 val)
492{
493 u8 tmp = (u8) val;
494 return em2820_write_regs(dev, GAMMA_REG, &tmp, 1);
495}
496
497/*FIXME: maxw should be dependent of alt mode */
498#define norm_maxw(dev) 720
499inline static unsigned int norm_maxh(struct em2820 *dev)
500{
501 return (dev->tvnorm->id & V4L2_STD_625_50) ? 576 : 480;
502}
503
504#endif