Dateianhang 'em28xx.h'

Herunterladen

   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/videodev2.h>
  29 #include <media/videobuf-vmalloc.h>
  30 
  31 #include <linux/i2c.h>
  32 #include <linux/mutex.h>
  33 #include <media/ir-kbd-i2c.h>
  34 #if defined(CONFIG_VIDEO_EM28XX_DVB) || defined(CONFIG_VIDEO_EM28XX_DVB_MODULE)
  35 #include <media/videobuf-dvb.h>
  36 #endif
  37 #include "tuner-xc2028.h"
  38 #include "em28xx-reg.h"
  39 
  40 /* Boards supported by driver */
  41 #define EM2800_BOARD_UNKNOWN			0
  42 #define EM2820_BOARD_UNKNOWN			1
  43 #define EM2820_BOARD_TERRATEC_CINERGY_250	2
  44 #define EM2820_BOARD_PINNACLE_USB_2		3
  45 #define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2      4
  46 #define EM2820_BOARD_MSI_VOX_USB_2              5
  47 #define EM2800_BOARD_TERRATEC_CINERGY_200       6
  48 #define EM2800_BOARD_LEADTEK_WINFAST_USBII      7
  49 #define EM2800_BOARD_KWORLD_USB2800             8
  50 #define EM2820_BOARD_PINNACLE_DVC_90		9
  51 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900	10
  52 #define EM2880_BOARD_TERRATEC_HYBRID_XS		11
  53 #define EM2820_BOARD_KWORLD_PVRTV2800RF		12
  54 #define EM2880_BOARD_TERRATEC_PRODIGY_XS	13
  55 #define EM2820_BOARD_PROLINK_PLAYTV_USB2	14
  56 #define EM2800_BOARD_VGEAR_POCKETTV             15
  57 #define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950	16
  58 #define EM2880_BOARD_PINNACLE_PCTV_HD_PRO	17
  59 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2	18
  60 #define EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA  19
  61 #define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600   20
  62 #define EM2800_BOARD_GRABBEEX_USB2800           21
  63 #define EM2750_BOARD_UNKNOWN			  22
  64 #define EM2750_BOARD_DLCW_130			  23
  65 #define EM2820_BOARD_DLINK_USB_TV		  24
  66 #define EM2820_BOARD_GADMEI_UTV310		  25
  67 #define EM2820_BOARD_HERCULES_SMART_TV_USB2	  26
  68 #define EM2820_BOARD_PINNACLE_USB_2_FM1216ME	  27
  69 #define EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE 28
  70 #define EM2820_BOARD_PINNACLE_DVC_100		  29
  71 #define EM2820_BOARD_VIDEOLOGY_20K14XUSB	  30
  72 #define EM2821_BOARD_USBGEAR_VD204		  31
  73 #define EM2821_BOARD_SUPERCOMP_USB_2		  32
  74 #define EM2821_BOARD_PROLINK_PLAYTV_USB2	  33
  75 #define EM2860_BOARD_TERRATEC_HYBRID_XS		  34
  76 #define EM2860_BOARD_TYPHOON_DVD_MAKER		  35
  77 #define EM2860_BOARD_NETGMBH_CAM		  36
  78 #define EM2860_BOARD_GADMEI_UTV330		  37
  79 #define EM2861_BOARD_YAKUMO_MOVIE_MIXER		  38
  80 #define EM2861_BOARD_KWORLD_PVRTV_300U		  39
  81 #define EM2861_BOARD_PLEXTOR_PX_TV100U		  40
  82 #define EM2870_BOARD_KWORLD_350U		  41
  83 #define EM2870_BOARD_KWORLD_355U		  42
  84 #define EM2870_BOARD_TERRATEC_XS		  43
  85 #define EM2870_BOARD_TERRATEC_XS_MT2060		  44
  86 #define EM2870_BOARD_PINNACLE_PCTV_DVB		  45
  87 #define EM2870_BOARD_COMPRO_VIDEOMATE		  46
  88 #define EM2880_BOARD_KWORLD_DVB_305U		  47
  89 #define EM2880_BOARD_KWORLD_DVB_310U		  48
  90 #define EM2880_BOARD_MSI_DIGIVOX_AD		  49
  91 #define EM2880_BOARD_MSI_DIGIVOX_AD_II		  50
  92 #define EM2880_BOARD_TERRATEC_HYBRID_XS_FR	  51
  93 #define EM2881_BOARD_DNT_DA2_HYBRID		  52
  94 #define EM2881_BOARD_PINNACLE_HYBRID_PRO	  53
  95 #define EM2882_BOARD_KWORLD_VS_DVBT		  54
  96 #define EM2882_BOARD_TERRATEC_HYBRID_XS		  55
  97 #define EM2882_BOARD_PINNACLE_HYBRID_PRO	  56
  98 #define EM2883_BOARD_KWORLD_HYBRID_A316		  57
  99 #define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU	  58
 100 #define EM2820_BOARD_POLLIN_USB_R1            59
 101 
 102 /* Limits minimum and default number of buffers */
 103 #define EM28XX_MIN_BUF 4
 104 #define EM28XX_DEF_BUF 8
 105 
 106 /* Params for validated field */
 107 #define EM28XX_BOARD_NOT_VALIDATED 1
 108 #define EM28XX_BOARD_VALIDATED	   0
 109 
 110 /* maximum number of em28xx boards */
 111 #define EM28XX_MAXBOARDS 4 /*FIXME: should be bigger */
 112 
 113 /* maximum number of frames that can be queued */
 114 #define EM28XX_NUM_FRAMES 5
 115 /* number of frames that get used for v4l2_read() */
 116 #define EM28XX_NUM_READ_FRAMES 2
 117 
 118 /* number of buffers for isoc transfers */
 119 #define EM28XX_NUM_BUFS 5
 120 
 121 /* number of packets for each buffer
 122    windows requests only 40 packets .. so we better do the same
 123    this is what I found out for all alternate numbers there!
 124  */
 125 #define EM28XX_NUM_PACKETS 40
 126 
 127 /* default alternate; 0 means choose the best */
 128 #define EM28XX_PINOUT 0
 129 
 130 #define EM28XX_INTERLACED_DEFAULT 1
 131 
 132 /*
 133 #define (use usbview if you want to get the other alternate number infos)
 134 #define
 135 #define alternate number 2
 136 #define 			Endpoint Address: 82
 137 			Direction: in
 138 			Attribute: 1
 139 			Type: Isoc
 140 			Max Packet Size: 1448
 141 			Interval: 125us
 142 
 143   alternate number 7
 144 
 145 			Endpoint Address: 82
 146 			Direction: in
 147 			Attribute: 1
 148 			Type: Isoc
 149 			Max Packet Size: 3072
 150 			Interval: 125us
 151 */
 152 
 153 /* time to wait when stopping the isoc transfer */
 154 #define EM28XX_URB_TIMEOUT       msecs_to_jiffies(EM28XX_NUM_BUFS * EM28XX_NUM_PACKETS)
 155 
 156 /* time in msecs to wait for i2c writes to finish */
 157 #define EM2800_I2C_WRITE_TIMEOUT 20
 158 
 159 enum em28xx_mode {
 160 	EM28XX_MODE_UNDEFINED,
 161 	EM28XX_ANALOG_MODE,
 162 	EM28XX_DIGITAL_MODE,
 163 };
 164 
 165 enum em28xx_stream_state {
 166 	STREAM_OFF,
 167 	STREAM_INTERRUPT,
 168 	STREAM_ON,
 169 };
 170 
 171 struct em28xx;
 172 
 173 struct em28xx_usb_isoc_ctl {
 174 		/* max packet size of isoc transaction */
 175 	int				max_pkt_size;
 176 
 177 		/* number of allocated urbs */
 178 	int				num_bufs;
 179 
 180 		/* urb for isoc transfers */
 181 	struct urb			**urb;
 182 
 183 		/* transfer buffers for isoc transfer */
 184 	char				**transfer_buffer;
 185 
 186 		/* Last buffer command and region */
 187 	u8				cmd;
 188 	int				pos, size, pktsize;
 189 
 190 		/* Last field: ODD or EVEN? */
 191 	int				field;
 192 
 193 		/* Stores incomplete commands */
 194 	u32				tmp_buf;
 195 	int				tmp_buf_len;
 196 
 197 		/* Stores already requested buffers */
 198 	struct em28xx_buffer    	*buf;
 199 
 200 		/* Stores the number of received fields */
 201 	int				nfields;
 202 
 203 		/* isoc urb callback */
 204 	int (*isoc_copy) (struct em28xx *dev, struct urb *urb);
 205 
 206 };
 207 
 208 struct em28xx_fmt {
 209 	char  *name;
 210 	u32   fourcc;          /* v4l2 format id */
 211 };
 212 
 213 /* buffer for one video frame */
 214 struct em28xx_buffer {
 215 	/* common v4l buffer stuff -- must be first */
 216 	struct videobuf_buffer vb;
 217 
 218 	struct list_head frame;
 219 	int top_field;
 220 	int receiving;
 221 };
 222 
 223 struct em28xx_dmaqueue {
 224 	struct list_head       active;
 225 	struct list_head       queued;
 226 
 227 	wait_queue_head_t          wq;
 228 
 229 	/* Counters to control buffer fill */
 230 	int                        pos;
 231 };
 232 
 233 /* io methods */
 234 enum em28xx_io_method {
 235 	IO_NONE,
 236 	IO_READ,
 237 	IO_MMAP,
 238 };
 239 
 240 /* inputs */
 241 
 242 #define MAX_EM28XX_INPUT 4
 243 enum enum28xx_itype {
 244 	EM28XX_VMUX_COMPOSITE1 = 1,
 245 	EM28XX_VMUX_COMPOSITE2,
 246 	EM28XX_VMUX_COMPOSITE3,
 247 	EM28XX_VMUX_COMPOSITE4,
 248 	EM28XX_VMUX_SVIDEO,
 249 	EM28XX_VMUX_TELEVISION,
 250 	EM28XX_VMUX_CABLE,
 251 	EM28XX_VMUX_DVB,
 252 	EM28XX_VMUX_DEBUG,
 253 	EM28XX_RADIO,
 254 };
 255 
 256 enum em28xx_amux {
 257 	EM28XX_AMUX_VIDEO,
 258 	EM28XX_AMUX_LINE_IN,
 259 	EM28XX_AMUX_AC97_VIDEO,
 260 	EM28XX_AMUX_AC97_LINE_IN,
 261 };
 262 
 263 struct em28xx_input {
 264 	enum enum28xx_itype type;
 265 	unsigned int vmux;
 266 	enum em28xx_amux amux;
 267 };
 268 
 269 #define INPUT(nr) (&em28xx_boards[dev->model].input[nr])
 270 
 271 enum em28xx_decoder {
 272 	EM28XX_TVP5150,
 273 	EM28XX_SAA7113,
 274 	EM28XX_SAA7114
 275 };
 276 
 277 struct em28xx_reg_seq {
 278 	int reg;
 279 	unsigned char val, mask;
 280 	int sleep;
 281 };
 282 
 283 struct em28xx_board {
 284 	char *name;
 285 	int vchannels;
 286 	int tuner_type;
 287 
 288 	/* i2c flags */
 289 	unsigned int tda9887_conf;
 290 
 291 	unsigned int is_em2800:1;
 292 	unsigned int has_msp34xx:1;
 293 	unsigned int mts_firmware:1;
 294 	unsigned int has_12mhz_i2s:1;
 295 	unsigned int max_range_640_480:1;
 296 	unsigned int has_dvb:1;
 297 	unsigned int has_snapshot_button:1;
 298 	unsigned int valid:1;
 299 
 300 	enum em28xx_decoder decoder;
 301 
 302 	struct em28xx_input       input[MAX_EM28XX_INPUT];
 303 	struct em28xx_input	  radio;
 304 };
 305 
 306 struct em28xx_eeprom {
 307 	u32 id;			/* 0x9567eb1a */
 308 	u16 vendor_ID;
 309 	u16 product_ID;
 310 
 311 	u16 chip_conf;
 312 
 313 	u16 board_conf;
 314 
 315 	u16 string1, string2, string3;
 316 
 317 	u8 string_idx_table;
 318 };
 319 
 320 /* device states */
 321 enum em28xx_dev_state {
 322 	DEV_INITIALIZED = 0x01,
 323 	DEV_DISCONNECTED = 0x02,
 324 	DEV_MISCONFIGURED = 0x04,
 325 };
 326 
 327 #define EM28XX_AUDIO_BUFS 5
 328 #define EM28XX_NUM_AUDIO_PACKETS 64
 329 #define EM28XX_AUDIO_MAX_PACKET_SIZE 196 /* static value */
 330 #define EM28XX_CAPTURE_STREAM_EN 1
 331 
 332 /* em28xx extensions */
 333 #define EM28XX_AUDIO   0x10
 334 #define EM28XX_DVB     0x20
 335 
 336 struct em28xx_audio {
 337 	char name[50];
 338 	char *transfer_buffer[EM28XX_AUDIO_BUFS];
 339 	struct urb *urb[EM28XX_AUDIO_BUFS];
 340 	struct usb_device *udev;
 341 	unsigned int capture_transfer_done;
 342 	struct snd_pcm_substream   *capture_pcm_substream;
 343 
 344 	unsigned int hwptr_done_capture;
 345 	struct snd_card            *sndcard;
 346 
 347 	int users, shutdown;
 348 	enum em28xx_stream_state capture_stream;
 349 	spinlock_t slock;
 350 };
 351 
 352 struct em28xx;
 353 
 354 struct em28xx_fh {
 355 	struct em28xx *dev;
 356 	unsigned int  stream_on:1;	/* Locks streams */
 357 	int           radio;
 358 
 359 	struct videobuf_queue        vb_vidq;
 360 
 361 	enum v4l2_buf_type           type;
 362 };
 363 
 364 /* main device struct */
 365 struct em28xx {
 366 	/* generic device properties */
 367 	char name[30];		/* name (including minor) of the device */
 368 	int model;		/* index in the device_data struct */
 369 	int devno;		/* marks the number of this device */
 370 	unsigned int is_em2800:1;
 371 	unsigned int has_msp34xx:1;
 372 	unsigned int has_tda9887:1;
 373 	unsigned int stream_on:1;	/* Locks streams */
 374 	unsigned int has_audio_class:1;
 375 	unsigned int has_12mhz_i2s:1;
 376 	unsigned int max_range_640_480:1;
 377 	unsigned int has_dvb:1;
 378 	unsigned int has_snapshot_button:1;
 379 	unsigned int valid:1;		/* report for validated boards */
 380 
 381 	/* Some older em28xx chips needs a waiting time after writing */
 382 	unsigned int wait_after_write;
 383 
 384 	/* GPIO sequences for analog and digital mode */
 385 	struct em28xx_reg_seq *analog_gpio, *digital_gpio;
 386 
 387 	/* GPIO sequences for tuner callbacks */
 388 	struct em28xx_reg_seq *tun_analog_gpio, *tun_digital_gpio;
 389 
 390 	int video_inputs;	/* number of video inputs */
 391 	struct list_head	devlist;
 392 
 393 	u32 i2s_speed;		/* I2S speed for audio digital stream */
 394 
 395 	enum em28xx_decoder decoder;
 396 
 397 	int tuner_type;		/* type of the tuner */
 398 	int tuner_addr;		/* tuner address */
 399 	int tda9887_conf;
 400 	/* i2c i/o */
 401 	struct i2c_adapter i2c_adap;
 402 	struct i2c_client i2c_client;
 403 	/* video for linux */
 404 	int users;		/* user count for exclusive use */
 405 	struct video_device *vdev;	/* video for linux device struct */
 406 	v4l2_std_id norm;	/* selected tv norm */
 407 	int ctl_freq;		/* selected frequency */
 408 	unsigned int ctl_input;	/* selected input */
 409 	unsigned int ctl_ainput;/* selected audio input */
 410 	int mute;
 411 	int volume;
 412 	/* frame properties */
 413 	int width;		/* current frame width */
 414 	int height;		/* current frame height */
 415 	int hscale;		/* horizontal scale factor (see datasheet) */
 416 	int vscale;		/* vertical scale factor (see datasheet) */
 417 	int interlaced;		/* 1=interlace fileds, 0=just top fileds */
 418 	unsigned int video_bytesread;	/* Number of bytes read */
 419 
 420 	unsigned long hash;	/* eeprom hash - for boards with generic ID */
 421 	unsigned long i2c_hash;	/* i2c devicelist hash -
 422 				   for boards with generic ID */
 423 
 424 	struct em28xx_audio *adev;
 425 
 426 	/* states */
 427 	enum em28xx_dev_state state;
 428 	enum em28xx_io_method io;
 429 
 430 	struct work_struct         request_module_wk;
 431 
 432 	/* locks */
 433 	struct mutex lock;
 434 	/* spinlock_t queue_lock; */
 435 	struct list_head inqueue, outqueue;
 436 	wait_queue_head_t open, wait_frame, wait_stream;
 437 	struct video_device *vbi_dev;
 438 	struct video_device *radio_dev;
 439 
 440 	unsigned char eedata[256];
 441 
 442 	/* Isoc control struct */
 443 	struct em28xx_dmaqueue vidq;
 444 	struct em28xx_usb_isoc_ctl isoc_ctl;
 445 	spinlock_t slock;
 446 
 447 	/* usb transfer */
 448 	struct usb_device *udev;	/* the usb device */
 449 	int alt;		/* alternate */
 450 	int max_pkt_size;	/* max packet size of isoc transaction */
 451 	int num_alt;		/* Number of alternative settings */
 452 	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
 453 	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
 454 	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
 455 	/* helper funcs that call usb_control_msg */
 456 	int (*em28xx_write_regs) (struct em28xx *dev, u16 reg,
 457 					char *buf, int len);
 458 	int (*em28xx_read_reg) (struct em28xx *dev, u16 reg);
 459 	int (*em28xx_read_reg_req_len) (struct em28xx *dev, u8 req, u16 reg,
 460 					char *buf, int len);
 461 	int (*em28xx_write_regs_req) (struct em28xx *dev, u8 req, u16 reg,
 462 				      char *buf, int len);
 463 	int (*em28xx_read_reg_req) (struct em28xx *dev, u8 req, u16 reg);
 464 
 465 	enum em28xx_mode mode;
 466 
 467 	/* Caches GPO and GPIO registers */
 468 	unsigned char	reg_gpo, reg_gpio;
 469 
 470 	/* Snapshot button */
 471 	char snapshot_button_path[30];	/* path of the input dev */
 472 	struct input_dev *sbutton_input_dev;
 473 	struct delayed_work sbutton_query_work;
 474 
 475 	struct em28xx_dvb *dvb;
 476 };
 477 
 478 struct em28xx_ops {
 479 	struct list_head next;
 480 	char *name;
 481 	int id;
 482 	int (*init)(struct em28xx *);
 483 	int (*fini)(struct em28xx *);
 484 };
 485 
 486 /* Provided by em28xx-i2c.c */
 487 
 488 void em28xx_i2c_call_clients(struct em28xx *dev, unsigned int cmd, void *arg);
 489 void em28xx_do_i2c_scan(struct em28xx *dev);
 490 int em28xx_i2c_register(struct em28xx *dev);
 491 int em28xx_i2c_unregister(struct em28xx *dev);
 492 
 493 /* Provided by em28xx-core.c */
 494 
 495 u32 em28xx_request_buffers(struct em28xx *dev, u32 count);
 496 void em28xx_queue_unusedframes(struct em28xx *dev);
 497 void em28xx_release_buffers(struct em28xx *dev);
 498 
 499 int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
 500 			    char *buf, int len);
 501 int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg);
 502 int em28xx_read_reg(struct em28xx *dev, u16 reg);
 503 int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
 504 			  int len);
 505 int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len);
 506 int em28xx_audio_analog_set(struct em28xx *dev);
 507 
 508 int em28xx_colorlevels_set_default(struct em28xx *dev);
 509 int em28xx_capture_start(struct em28xx *dev, int start);
 510 int em28xx_outfmt_set_yuv422(struct em28xx *dev);
 511 int em28xx_resolution_set(struct em28xx *dev);
 512 int em28xx_set_alternate(struct em28xx *dev);
 513 int em28xx_init_isoc(struct em28xx *dev, int max_packets,
 514 		     int num_bufs, int max_pkt_size,
 515 		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb));
 516 void em28xx_uninit_isoc(struct em28xx *dev);
 517 int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode);
 518 int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio);
 519 
 520 /* Provided by em28xx-video.c */
 521 int em28xx_register_extension(struct em28xx_ops *dev);
 522 void em28xx_unregister_extension(struct em28xx_ops *dev);
 523 
 524 /* Provided by em28xx-cards.c */
 525 extern int em2800_variant_detect(struct usb_device *udev, int model);
 526 extern void em28xx_pre_card_setup(struct em28xx *dev);
 527 extern void em28xx_card_setup(struct em28xx *dev);
 528 extern struct em28xx_board em28xx_boards[];
 529 extern struct usb_device_id em28xx_id_table[];
 530 extern const unsigned int em28xx_bcount;
 531 void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir);
 532 int em28xx_tuner_callback(void *ptr, int command, int arg);
 533 
 534 /* Provided by em28xx-input.c */
 535 /* TODO: Check if the standard get_key handlers on ir-common can be used */
 536 int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
 537 int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
 538 int em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key,
 539 				     u32 *ir_raw);
 540 void em28xx_register_snapshot_button(struct em28xx *dev);
 541 void em28xx_deregister_snapshot_button(struct em28xx *dev);
 542 
 543 /* printk macros */
 544 
 545 #define em28xx_err(fmt, arg...) do {\
 546 	printk(KERN_ERR fmt , ##arg); } while (0)
 547 
 548 #define em28xx_errdev(fmt, arg...) do {\
 549 	printk(KERN_ERR "%s: "fmt,\
 550 			dev->name , ##arg); } while (0)
 551 
 552 #define em28xx_info(fmt, arg...) do {\
 553 	printk(KERN_INFO "%s: "fmt,\
 554 			dev->name , ##arg); } while (0)
 555 #define em28xx_warn(fmt, arg...) do {\
 556 	printk(KERN_WARNING "%s: "fmt,\
 557 			dev->name , ##arg); } while (0)
 558 
 559 static inline int em28xx_compression_disable(struct em28xx *dev)
 560 {
 561 	/* side effect of disabling scaler and mixer */
 562 	return em28xx_write_regs(dev, EM28XX_R26_COMPR, "\x00", 1);
 563 }
 564 
 565 static inline int em28xx_contrast_get(struct em28xx *dev)
 566 {
 567 	return em28xx_read_reg(dev, EM28XX_R20_YGAIN) & 0x1f;
 568 }
 569 
 570 static inline int em28xx_brightness_get(struct em28xx *dev)
 571 {
 572 	return em28xx_read_reg(dev, EM28XX_R21_YOFFSET);
 573 }
 574 
 575 static inline int em28xx_saturation_get(struct em28xx *dev)
 576 {
 577 	return em28xx_read_reg(dev, EM28XX_R22_UVGAIN) & 0x1f;
 578 }
 579 
 580 static inline int em28xx_u_balance_get(struct em28xx *dev)
 581 {
 582 	return em28xx_read_reg(dev, EM28XX_R23_UOFFSET);
 583 }
 584 
 585 static inline int em28xx_v_balance_get(struct em28xx *dev)
 586 {
 587 	return em28xx_read_reg(dev, EM28XX_R24_VOFFSET);
 588 }
 589 
 590 static inline int em28xx_gamma_get(struct em28xx *dev)
 591 {
 592 	return em28xx_read_reg(dev, EM28XX_R14_GAMMA) & 0x3f;
 593 }
 594 
 595 static inline int em28xx_contrast_set(struct em28xx *dev, s32 val)
 596 {
 597 	u8 tmp = (u8) val;
 598 	return em28xx_write_regs(dev, EM28XX_R20_YGAIN, &tmp, 1);
 599 }
 600 
 601 static inline int em28xx_brightness_set(struct em28xx *dev, s32 val)
 602 {
 603 	u8 tmp = (u8) val;
 604 	return em28xx_write_regs(dev, EM28XX_R21_YOFFSET, &tmp, 1);
 605 }
 606 
 607 static inline int em28xx_saturation_set(struct em28xx *dev, s32 val)
 608 {
 609 	u8 tmp = (u8) val;
 610 	return em28xx_write_regs(dev, EM28XX_R22_UVGAIN, &tmp, 1);
 611 }
 612 
 613 static inline int em28xx_u_balance_set(struct em28xx *dev, s32 val)
 614 {
 615 	u8 tmp = (u8) val;
 616 	return em28xx_write_regs(dev, EM28XX_R23_UOFFSET, &tmp, 1);
 617 }
 618 
 619 static inline int em28xx_v_balance_set(struct em28xx *dev, s32 val)
 620 {
 621 	u8 tmp = (u8) val;
 622 	return em28xx_write_regs(dev, EM28XX_R24_VOFFSET, &tmp, 1);
 623 }
 624 
 625 static inline int em28xx_gamma_set(struct em28xx *dev, s32 val)
 626 {
 627 	u8 tmp = (u8) val;
 628 	return em28xx_write_regs(dev, EM28XX_R14_GAMMA, &tmp, 1);
 629 }
 630 
 631 /*FIXME: maxw should be dependent of alt mode */
 632 static inline unsigned int norm_maxw(struct em28xx *dev)
 633 {
 634 	if (dev->max_range_640_480)
 635 		return 640;
 636 	else
 637 		return 720;
 638 }
 639 
 640 static inline unsigned int norm_maxh(struct em28xx *dev)
 641 {
 642 	if (dev->max_range_640_480)
 643 		return 480;
 644 	else
 645 		return (dev->norm & V4L2_STD_625_50) ? 576 : 480;
 646 }
 647 #endif
 648 

Gespeicherte Dateianhänge

Um Dateianhänge in eine Seite einzufügen sollte unbedingt eine Angabe wie attachment:dateiname benutzt werden, wie sie auch in der folgenden Liste der Dateien erscheint. Es sollte niemals die URL des Verweises ("laden") kopiert werden, da sich diese jederzeit ändern kann und damit der Verweis auf die Datei brechen würde.
  • [laden | anzeigen] (16.09.2014 11:33, 49.7 KB) [[attachment:IMGP0335.jpg]]
  • [laden | anzeigen] (16.09.2014 11:33, 199.0 KB) [[attachment:MKFR.jpg]]
  • [laden | anzeigen] (16.09.2014 11:33, 51.3 KB) [[attachment:em28xx-cards.c]]
  • [laden | anzeigen] (16.09.2014 11:33, 17.8 KB) [[attachment:em28xx.h]]
 Alle Dateien | Ausgewählte Dateien: löschen verschieben auf Seite kopieren auf Seite

Sie dürfen keine Anhänge an diese Seite anhängen!