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.Sie dürfen keine Anhänge an diese Seite anhängen!