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