• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/media/video/em28xx/
1/*
2   em28xx.h - driver for Empia EM2800/EM2820/2840 USB video capture devices
3
4   Copyright (C) 2005 Markus Rechberger <mrechberger@gmail.com>
5		      Ludovico Cavedon <cavedon@sssup.it>
6		      Mauro Carvalho Chehab <mchehab@infradead.org>
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 _EM28XX_H
26#define _EM28XX_H
27
28#include <linux/videodev.h>
29#include <linux/i2c.h>
30#include <linux/mutex.h>
31#include <media/ir-kbd-i2c.h>
32
33/* Boards supported by driver */
34
35#define EM2800_BOARD_UNKNOWN			0
36#define EM2820_BOARD_UNKNOWN			1
37#define EM2820_BOARD_TERRATEC_CINERGY_250	2
38#define EM2820_BOARD_PINNACLE_USB_2		3
39#define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
40#define EM2820_BOARD_MSI_VOX_USB_2              5
41#define EM2800_BOARD_TERRATEC_CINERGY_200       6
42#define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
43#define EM2800_BOARD_KWORLD_USB2800             8
44#define EM2820_BOARD_PINNACLE_DVC_90		9
45#define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900	10
46#define EM2880_BOARD_TERRATEC_HYBRID_XS		11
47#define EM2820_BOARD_KWORLD_PVRTV2800RF		12
48#define EM2880_BOARD_TERRATEC_PRODIGY_XS	13
49
50#define UNSET -1
51
52/* maximum number of em28xx boards */
53#define EM28XX_MAXBOARDS 1
54
55/* maximum number of frames that can be queued */
56#define EM28XX_NUM_FRAMES 5
57/* number of frames that get used for v4l2_read() */
58#define EM28XX_NUM_READ_FRAMES 2
59
60/* number of buffers for isoc transfers */
61#define EM28XX_NUM_BUFS 5
62
63/* number of packets for each buffer
64   windows requests only 40 packets .. so we better do the same
65   this is what I found out for all alternate numbers there!
66 */
67#define EM28XX_NUM_PACKETS 40
68
69/* default alternate; 0 means choose the best */
70#define EM28XX_PINOUT 0
71
72#define EM28XX_INTERLACED_DEFAULT 1
73
74/*
75#define (use usbview if you want to get the other alternate number infos)
76#define
77#define alternate number 2
78#define 			Endpoint Address: 82
79			Direction: in
80			Attribute: 1
81			Type: Isoc
82			Max Packet Size: 1448
83			Interval: 125us
84
85  alternate number 7
86
87			Endpoint Address: 82
88			Direction: in
89			Attribute: 1
90			Type: Isoc
91			Max Packet Size: 3072
92			Interval: 125us
93*/
94
95/* time to wait when stopping the isoc transfer */
96#define EM28XX_URB_TIMEOUT       msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
97
98/* time in msecs to wait for i2c writes to finish */
99#define EM2800_I2C_WRITE_TIMEOUT 20
100
101/* the various frame states */
102enum em28xx_frame_state {
103	F_UNUSED = 0,
104	F_QUEUED,
105	F_GRABBING,
106	F_DONE,
107	F_ERROR,
108};
109
110/* stream states */
111enum em28xx_stream_state {
112	STREAM_OFF,
113	STREAM_INTERRUPT,
114	STREAM_ON,
115};
116
117/* frames */
118struct em28xx_frame_t {
119	void *bufmem;
120	struct v4l2_buffer buf;
121	enum em28xx_frame_state state;
122	struct list_head frame;
123	unsigned long vma_use_count;
124	int top_field;
125	int fieldbytesused;
126};
127
128/* io methods */
129enum em28xx_io_method {
130	IO_NONE,
131	IO_READ,
132	IO_MMAP,
133};
134
135/* inputs */
136
137#define MAX_EM28XX_INPUT 4
138enum enum28xx_itype {
139	EM28XX_VMUX_COMPOSITE1 = 1,
140	EM28XX_VMUX_COMPOSITE2,
141	EM28XX_VMUX_COMPOSITE3,
142	EM28XX_VMUX_COMPOSITE4,
143	EM28XX_VMUX_SVIDEO,
144	EM28XX_VMUX_TELEVISION,
145	EM28XX_VMUX_CABLE,
146	EM28XX_VMUX_DVB,
147	EM28XX_VMUX_DEBUG,
148	EM28XX_RADIO,
149};
150
151struct em28xx_input {
152	enum enum28xx_itype type;
153	unsigned int vmux;
154	unsigned int amux;
155};
156
157#define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
158
159enum em28xx_decoder {
160	EM28XX_TVP5150,
161	EM28XX_SAA7113,
162	EM28XX_SAA7114
163};
164
165struct em28xx_board {
166	char *name;
167	int vchannels;
168	int norm;
169	int tuner_type;
170
171	/* i2c flags */
172	unsigned int is_em2800;
173	unsigned int tda9887_conf;
174
175	unsigned int has_tuner:1;
176	unsigned int has_msp34xx:1;
177
178	enum em28xx_decoder decoder;
179
180	struct em28xx_input       input[MAX_EM28XX_INPUT];
181};
182
183struct em28xx_eeprom {
184	u32 id;			/* 0x9567eb1a */
185	u16 vendor_ID;
186	u16 product_ID;
187
188	u16 chip_conf;
189
190	u16 board_conf;
191
192	u16 string1, string2, string3;
193
194	u8 string_idx_table;
195};
196
197/* device states */
198enum em28xx_dev_state {
199	DEV_INITIALIZED = 0x01,
200	DEV_DISCONNECTED = 0x02,
201	DEV_MISCONFIGURED = 0x04,
202};
203
204/* tvnorms */
205struct em28xx_tvnorm {
206	char *name;
207	v4l2_std_id id;
208	/* mode for saa7113h */
209	int mode;
210};
211
212/* main device struct */
213struct em28xx {
214	/* generic device properties */
215	char name[30];		/* name (including minor) of the device */
216	int model;		/* index in the device_data struct */
217	int devno;		/* marks the number of this device */
218	unsigned int is_em2800;
219	int video_inputs;	/* number of video inputs */
220	struct list_head	devlist;
221	unsigned int has_tuner:1;
222	unsigned int has_msp34xx:1;
223	unsigned int has_tda9887:1;
224
225	u32 i2s_speed;		/* I2S speed for audio digital stream */
226
227	enum em28xx_decoder decoder;
228
229	int tuner_type;		/* type of the tuner */
230	int tuner_addr;		/* tuner address */
231	int tda9887_conf;
232	/* i2c i/o */
233	struct i2c_adapter i2c_adap;
234	struct i2c_client i2c_client;
235	/* video for linux */
236	int users;		/* user count for exclusive use */
237	struct video_device *vdev;	/* video for linux device struct */
238	struct video_picture vpic;	/* picture settings only used to init saa7113h */
239	struct em28xx_tvnorm *tvnorm;	/* selected tv norm */
240	int ctl_freq;		/* selected frequency */
241	unsigned int ctl_input;	/* selected input */
242	unsigned int ctl_ainput;	/* slected audio input */
243	int mute;
244	int volume;
245	/* frame properties */
246	struct em28xx_frame_t frame[EM28XX_NUM_FRAMES];	/* list of frames */
247	int num_frames;		/* number of frames currently in use */
248	unsigned int frame_count;	/* total number of transfered frames */
249	struct em28xx_frame_t *frame_current;	/* the frame that is being filled */
250	int width;		/* current frame width */
251	int height;		/* current frame height */
252	int frame_size;		/* current frame size */
253	int field_size;		/* current field size */
254	int bytesperline;
255	int hscale;		/* horizontal scale factor (see datasheet) */
256	int vscale;		/* vertical scale factor (see datasheet) */
257	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
258	int type;
259
260	/* states */
261	enum em28xx_dev_state state;
262	enum em28xx_stream_state stream;
263	enum em28xx_io_method io;
264	/* locks */
265	struct mutex lock, fileop_lock;
266	spinlock_t queue_lock;
267	struct list_head inqueue, outqueue;
268	wait_queue_head_t open, wait_frame, wait_stream;
269	struct video_device *vbi_dev;
270
271	unsigned char eedata[256];
272
273	/* usb transfer */
274	struct usb_device *udev;	/* the usb device */
275	int alt;		/* alternate */
276	int max_pkt_size;	/* max packet size of isoc transaction */
277	int num_alt;		/* Number of alternative settings */
278	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
279	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
280	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
281	/* helper funcs that call usb_control_msg */
282	int (*em28xx_write_regs) (struct em28xx * dev, u16 reg, char *buf,
283				  int len);
284	int (*em28xx_read_reg) (struct em28xx * dev, u16 reg);
285	int (*em28xx_read_reg_req_len) (struct em28xx * dev, u8 req, u16 reg,
286					char *buf, int len);
287	int (*em28xx_write_regs_req) (struct em28xx * dev, u8 req, u16 reg,
288				      char *buf, int len);
289	int (*em28xx_read_reg_req) (struct em28xx * dev, u8 req, u16 reg);
290};
291
292/* Provided by em28xx-i2c.c */
293
294void em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
295int em28xx_i2c_register(struct em28xx *dev);
296int em28xx_i2c_unregister(struct em28xx *dev);
297
298/* Provided by em28xx-input.c */
299
300void em28xx_set_ir(struct em28xx * dev,struct IR_i2c *ir);
301
302/* Provided by em28xx-core.c */
303
304u32 em28xx_request_buffers(struct em28xx *dev, u32 count);
305void em28xx_queue_unusedframes(struct em28xx *dev);
306void em28xx_release_buffers(struct em28xx *dev);
307
308int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
309			    char *buf, int len);
310int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
311int em28xx_read_reg(struct em28xx *dev, u16 reg);
312int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
313			  int len);
314int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
315int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
316			  u8 bitmask);
317int em28xx_write_ac97(struct em28xx *dev, u8 reg, u8 * val);
318int em28xx_audio_analog_set(struct em28xx *dev);
319int em28xx_colorlevels_set_default(struct em28xx *dev);
320int em28xx_capture_start(struct em28xx *dev, int start);
321int em28xx_outfmt_set_yuv422(struct em28xx *dev);
322int em28xx_resolution_set(struct em28xx *dev);
323int em28xx_init_isoc(struct em28xx *dev);
324void em28xx_uninit_isoc(struct em28xx *dev);
325int em28xx_set_alternate(struct em28xx *dev);
326
327/* Provided by em28xx-cards.c */
328extern int em2800_variant_detect(struct usb_device* udev,int model);
329extern void em28xx_pre_card_setup(struct em28xx *dev);
330extern void em28xx_card_setup(struct em28xx *dev);
331extern struct em28xx_board em28xx_boards[];
332extern struct usb_device_id em28xx_id_table[];
333extern const unsigned int em28xx_bcount;
334
335/* em28xx registers */
336#define CHIPID_REG	0x0a
337#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 EM28XX_AUDIO_SRC_TUNER	0xc0
391#define EM28XX_AUDIO_SRC_LINE	0x80
392
393/* printk macros */
394
395#define em28xx_err(fmt, arg...) do {\
396	printk(KERN_ERR fmt , ##arg); } while (0)
397
398#define em28xx_errdev(fmt, arg...) do {\
399	printk(KERN_ERR "%s: "fmt,\
400			dev->name , ##arg); } while (0)
401
402#define em28xx_info(fmt, arg...) do {\
403	printk(KERN_INFO "%s: "fmt,\
404			dev->name , ##arg); } while (0)
405#define em28xx_warn(fmt, arg...) do {\
406	printk(KERN_WARNING "%s: "fmt,\
407			dev->name , ##arg); } while (0)
408
409inline static int em28xx_audio_source(struct em28xx *dev, int input)
410{
411	return em28xx_write_reg_bits(dev, AUDIOSRC_REG, input, 0xc0);
412}
413
414inline static int em28xx_audio_usb_mute(struct em28xx *dev, int mute)
415{
416	return em28xx_write_reg_bits(dev, XCLK_REG, mute ? 0x00 : 0x80, 0x80);
417}
418
419inline static int em28xx_audio_analog_setup(struct em28xx *dev)
420{
421	/* unmute video mixer with default volume level */
422	return em28xx_write_ac97(dev, VIDEO_AC97, "\x08\x08");
423}
424
425inline static int em28xx_compression_disable(struct em28xx *dev)
426{
427	/* side effect of disabling scaler and mixer */
428	return em28xx_write_regs(dev, COMPR_REG, "\x00", 1);
429}
430
431inline static int em28xx_contrast_get(struct em28xx *dev)
432{
433	return em28xx_read_reg(dev, YGAIN_REG) & 0x1f;
434}
435
436inline static int em28xx_brightness_get(struct em28xx *dev)
437{
438	return em28xx_read_reg(dev, YOFFSET_REG);
439}
440
441inline static int em28xx_saturation_get(struct em28xx *dev)
442{
443	return em28xx_read_reg(dev, UVGAIN_REG) & 0x1f;
444}
445
446inline static int em28xx_u_balance_get(struct em28xx *dev)
447{
448	return em28xx_read_reg(dev, UOFFSET_REG);
449}
450
451inline static int em28xx_v_balance_get(struct em28xx *dev)
452{
453	return em28xx_read_reg(dev, VOFFSET_REG);
454}
455
456inline static int em28xx_gamma_get(struct em28xx *dev)
457{
458	return em28xx_read_reg(dev, GAMMA_REG) & 0x3f;
459}
460
461inline static int em28xx_contrast_set(struct em28xx *dev, s32 val)
462{
463	u8 tmp = (u8) val;
464	return em28xx_write_regs(dev, YGAIN_REG, &tmp, 1);
465}
466
467inline static int em28xx_brightness_set(struct em28xx *dev, s32 val)
468{
469	u8 tmp = (u8) val;
470	return em28xx_write_regs(dev, YOFFSET_REG, &tmp, 1);
471}
472
473inline static int em28xx_saturation_set(struct em28xx *dev, s32 val)
474{
475	u8 tmp = (u8) val;
476	return em28xx_write_regs(dev, UVGAIN_REG, &tmp, 1);
477}
478
479inline static int em28xx_u_balance_set(struct em28xx *dev, s32 val)
480{
481	u8 tmp = (u8) val;
482	return em28xx_write_regs(dev, UOFFSET_REG, &tmp, 1);
483}
484
485inline static int em28xx_v_balance_set(struct em28xx *dev, s32 val)
486{
487	u8 tmp = (u8) val;
488	return em28xx_write_regs(dev, VOFFSET_REG, &tmp, 1);
489}
490
491inline static int em28xx_gamma_set(struct em28xx *dev, s32 val)
492{
493	u8 tmp = (u8) val;
494	return em28xx_write_regs(dev, GAMMA_REG, &tmp, 1);
495}
496
497inline static unsigned int norm_maxw(struct em28xx *dev)
498{
499	switch(dev->model){
500		case (EM2820_BOARD_MSI_VOX_USB_2): return(640);
501		default: return(720);
502	}
503}
504
505inline static unsigned int norm_maxh(struct em28xx *dev)
506{
507	switch(dev->model){
508		case (EM2820_BOARD_MSI_VOX_USB_2): return(480);
509		default: return (dev->tvnorm->id & V4L2_STD_625_50) ? 576 : 480;
510	}
511}
512
513#endif
514