Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (49 commits) V4L/DVB (3667b): cpia2: fix function prototype V4L/DVB (3702): Make msp3400 routing defines more consistent V4L/DVB (3700): Remove obsolete commands from tvp5150.c V4L/DVB (3697): More msp3400 and bttv fixes V4L/DVB (3696): Previous change for cx2341X boards broke the remote support V4L/DVB (3693): Fix msp3400c and bttv stereo/mono/bilingual detection/handling V4L/DVB (3692): Keep experimental SLICED_VBI defines under an #if 0 V4L/DVB (3689): Kconfig: fix VP-3054 Secondary I2C Bus build configuration menu dependencies V4L/DVB (3673): Fix budget-av CAM reset V4L/DVB (3672): Fix memory leak in dvr open V4L/DVB (3671): New module parameter 'tv_standard' (dvb-ttpci driver) V4L/DVB (3670): Fix typo in comment V4L/DVB (3669): Configurable dma buffer size for saa7146-based budget dvb cards V4L/DVB (3653h): Move usb v4l docs into Documentation/video4linux V4L/DVB (3667a): Fix SAP + stereo mode at msp3400 V4L/DVB (3666): Remove trailing newlines V4L/DVB (3665): Add new NEC uPD64031A and uPD64083 i2c drivers V4L/DVB (3663): Fix msp3400c wait time and better audio mode fallbacks V4L/DVB (3662): Don't set msp3400c-non-existent register V4L/DVB (3661): Add wm8739 stereo audio ADC i2c driver ...
This commit is contained in:
Коммит
b043b673dc
|
@ -52,7 +52,7 @@
|
|||
51 -> ProVideo PV952 [1540:9524]
|
||||
52 -> AverMedia AverTV/305 [1461:2108]
|
||||
53 -> ASUS TV-FM 7135 [1043:4845]
|
||||
54 -> LifeView FlyTV Platinum FM [5168:0214,1489:0214]
|
||||
54 -> LifeView FlyTV Platinum FM / Gold [5168:0214,1489:0214,5168:0304]
|
||||
55 -> LifeView FlyDVB-T DUO [5168:0306]
|
||||
56 -> Avermedia AVerTV 307 [1461:a70a]
|
||||
57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
|
||||
|
@ -84,7 +84,7 @@
|
|||
83 -> Terratec Cinergy 250 PCI TV [153b:1160]
|
||||
84 -> LifeView FlyDVB Trio [5168:0319]
|
||||
85 -> AverTV DVB-T 777 [1461:2c05]
|
||||
86 -> LifeView FlyDVB-T [5168:0301]
|
||||
86 -> LifeView FlyDVB-T / Genius VideoWonder DVB-T [5168:0301,1489:0301]
|
||||
87 -> ADS Instant TV Duo Cardbus PTV331 [0331:1421]
|
||||
88 -> Tevion/KWorld DVB-T 220RF [17de:7201]
|
||||
89 -> ELSA EX-VISION 700TV [1048:226c]
|
||||
|
@ -92,3 +92,4 @@
|
|||
91 -> AVerMedia A169 B [1461:7360]
|
||||
92 -> AVerMedia A169 B1 [1461:6360]
|
||||
93 -> Medion 7134 Bridge #2 [16be:0005]
|
||||
94 -> LifeView FlyDVB-T Hybrid Cardbus [5168:3306,5168:3502]
|
||||
|
|
|
@ -122,7 +122,7 @@ WHAT YOU NEED:
|
|||
- A Linux box with USB support (2.3/2.4; 2.2 w/backport may work)
|
||||
|
||||
- A Video4Linux compatible frame grabber program such as xawtv.
|
||||
|
||||
|
||||
HOW TO COMPILE THE DRIVER:
|
||||
|
||||
You need to compile the driver only if you are a developer
|
|
@ -9,7 +9,7 @@ INTRODUCTION:
|
|||
|
||||
This is a driver for the OV511, a USB-only chip used in many "webcam" devices.
|
||||
Any camera using the OV511/OV511+ and the OV6620/OV7610/20/20AE should work.
|
||||
Video capture devices that use the Philips SAA7111A decoder also work. It
|
||||
Video capture devices that use the Philips SAA7111A decoder also work. It
|
||||
supports streaming and capture of color or monochrome video via the Video4Linux
|
||||
API. Most V4L apps are compatible with it. Most resolutions with a width and
|
||||
height that are a multiple of 8 are supported.
|
||||
|
@ -52,15 +52,15 @@ from it:
|
|||
|
||||
chmod 666 /dev/video
|
||||
chmod 666 /dev/video0 (if necessary)
|
||||
|
||||
|
||||
Now you are ready to run a video app! Both vidcat and xawtv work well for me
|
||||
at 640x480.
|
||||
|
||||
|
||||
[Using vidcat:]
|
||||
|
||||
vidcat -s 640x480 -p c > test.jpg
|
||||
xview test.jpg
|
||||
|
||||
|
||||
[Using xawtv:]
|
||||
|
||||
From the main xawtv directory:
|
||||
|
@ -70,7 +70,7 @@ From the main xawtv directory:
|
|||
make
|
||||
make install
|
||||
|
||||
Now you should be able to run xawtv. Right click for the options dialog.
|
||||
Now you should be able to run xawtv. Right click for the options dialog.
|
||||
|
||||
MODULE PARAMETERS:
|
||||
|
||||
|
@ -286,4 +286,3 @@ Randy Dunlap, and others. Big thanks to them for their pioneering work on that
|
|||
and the USB stack. Thanks to Bret Wallach for getting camera reg IO, ISOC, and
|
||||
image capture working. Thanks to Orion Sky Lawlor, Kevin Moore, and Claudio
|
||||
Matsuoka for their work as well.
|
||||
|
|
@ -174,7 +174,7 @@ Module parameters are listed below:
|
|||
-------------------------------------------------------------------------------
|
||||
Name: video_nr
|
||||
Type: short array (min = 0, max = 64)
|
||||
Syntax: <-1|n[,...]>
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Specify V4L2 minor mode number:
|
||||
-1 = use next available
|
||||
n = use minor number n
|
||||
|
@ -187,7 +187,7 @@ Default: -1
|
|||
-------------------------------------------------------------------------------
|
||||
Name: force_munmap
|
||||
Type: bool array (min = 0, max = 64)
|
||||
Syntax: <0|1[,...]>
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Force the application to unmap previously mapped buffer memory
|
||||
before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not
|
||||
all the applications support this feature. This parameter is
|
||||
|
@ -206,7 +206,7 @@ Default: 2
|
|||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
Type: ushort
|
||||
Syntax: <n>
|
||||
Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
|
@ -267,7 +267,7 @@ The sysfs interface also provides the "frame_header" entry, which exports the
|
|||
frame header of the most recent requested and captured video frame. The header
|
||||
is always 18-bytes long and is appended to every video frame by the SN9C10x
|
||||
controllers. As an example, this additional information can be used by the user
|
||||
application for implementing auto-exposure features via software.
|
||||
application for implementing auto-exposure features via software.
|
||||
|
||||
The following table describes the frame header:
|
||||
|
||||
|
@ -441,7 +441,7 @@ blue pixels in one video frame. Each pixel is associated with a 8-bit long
|
|||
value and is disposed in memory according to the pattern shown below:
|
||||
|
||||
B[0] G[1] B[2] G[3] ... B[m-2] G[m-1]
|
||||
G[m] R[m+1] G[m+2] R[m+2] ... G[2m-2] R[2m-1]
|
||||
G[m] R[m+1] G[m+2] R[m+2] ... G[2m-2] R[2m-1]
|
||||
...
|
||||
... B[(n-1)(m-2)] G[(n-1)(m-1)]
|
||||
... G[n(m-2)] R[n(m-1)]
|
||||
|
@ -472,12 +472,12 @@ The pixel reference value is calculated as follows:
|
|||
The algorithm purely describes the conversion from compressed Bayer code used
|
||||
in the SN9C10x chips to uncompressed Bayer. Additional steps are required to
|
||||
convert this to a color image (i.e. a color interpolation algorithm).
|
||||
|
||||
|
||||
The following Huffman codes have been found:
|
||||
0: +0 (relative to reference pixel value)
|
||||
0: +0 (relative to reference pixel value)
|
||||
100: +4
|
||||
101: -4?
|
||||
1110xxxx: set absolute value to xxxx.0000
|
||||
1110xxxx: set absolute value to xxxx.0000
|
||||
1101: +11
|
||||
1111: -11
|
||||
11001: +20
|
|
@ -5,15 +5,15 @@ Copyright, 2001, Kevin Sisson
|
|||
|
||||
INTRODUCTION:
|
||||
|
||||
STMicroelectronics produces the STV0680B chip, which comes in two
|
||||
types, -001 and -003. The -003 version allows the recording and downloading
|
||||
of sound clips from the camera, and allows a flash attachment. Otherwise,
|
||||
it uses the same commands as the -001 version. Both versions support a
|
||||
variety of SDRAM sizes and sensors, allowing for a maximum of 26 VGA or 20
|
||||
CIF pictures. The STV0680 supports either a serial or a usb interface, and
|
||||
STMicroelectronics produces the STV0680B chip, which comes in two
|
||||
types, -001 and -003. The -003 version allows the recording and downloading
|
||||
of sound clips from the camera, and allows a flash attachment. Otherwise,
|
||||
it uses the same commands as the -001 version. Both versions support a
|
||||
variety of SDRAM sizes and sensors, allowing for a maximum of 26 VGA or 20
|
||||
CIF pictures. The STV0680 supports either a serial or a usb interface, and
|
||||
video is possible through the usb interface.
|
||||
|
||||
The following cameras are known to work with this driver, although any
|
||||
The following cameras are known to work with this driver, although any
|
||||
camera with Vendor/Product codes of 0553/0202 should work:
|
||||
|
||||
Aiptek Pencam (various models)
|
||||
|
@ -34,15 +34,15 @@ http://www.linux-usb.org
|
|||
MODULE OPTIONS:
|
||||
|
||||
When the driver is compiled as a module, you can set a "swapRGB=1"
|
||||
option, if necessary, for those applications that require it
|
||||
(such as xawtv). However, the driver should detect and set this
|
||||
option, if necessary, for those applications that require it
|
||||
(such as xawtv). However, the driver should detect and set this
|
||||
automatically, so this option should not normally be used.
|
||||
|
||||
|
||||
KNOWN PROBLEMS:
|
||||
|
||||
The driver seems to work better with the usb-ohci than the usb-uhci host
|
||||
controller driver.
|
||||
The driver seems to work better with the usb-ohci than the usb-uhci host
|
||||
controller driver.
|
||||
|
||||
HELP:
|
||||
|
||||
|
@ -50,6 +50,4 @@ The latest info on this driver can be found at:
|
|||
http://personal.clt.bellsouth.net/~kjsisson or at
|
||||
http://stv0680-usb.sourceforge.net
|
||||
|
||||
Any questions to me can be send to: kjsisson@bellsouth.net
|
||||
|
||||
|
||||
Any questions to me can be send to: kjsisson@bellsouth.net
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
W996[87]CF JPEG USB Dual Mode Camera Chip
|
||||
W996[87]CF JPEG USB Dual Mode Camera Chip
|
||||
Driver for Linux 2.6 (basic version)
|
||||
=========================================
|
||||
|
||||
|
@ -115,7 +115,7 @@ additional testing and full support, would be much appreciated.
|
|||
======================
|
||||
For it to work properly, the driver needs kernel support for Video4Linux, USB
|
||||
and I2C, and the "ovcamchip" module for the image sensor. Make sure you are not
|
||||
actually using any external "ovcamchip" module, given that the W996[87]CF
|
||||
actually using any external "ovcamchip" module, given that the W996[87]CF
|
||||
driver depends on the version of the module present in the official kernels.
|
||||
|
||||
The following options of the kernel configuration file must be enabled and
|
||||
|
@ -197,16 +197,16 @@ Note: The kernel must be compiled with the CONFIG_KMOD option
|
|||
enabled for the 'ovcamchip' module to be loaded and for
|
||||
this parameter to be present.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: simcams
|
||||
Type: int
|
||||
Syntax: <n>
|
||||
Name: simcams
|
||||
Type: int
|
||||
Syntax: <n>
|
||||
Description: Number of cameras allowed to stream simultaneously.
|
||||
n may vary from 0 to 32.
|
||||
Default: 32
|
||||
-------------------------------------------------------------------------------
|
||||
Name: video_nr
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <-1|n[,...]>
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Specify V4L minor mode number.
|
||||
-1 = use next available
|
||||
n = use minor number n
|
||||
|
@ -219,7 +219,7 @@ Default: -1
|
|||
-------------------------------------------------------------------------------
|
||||
Name: packet_size
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Syntax: <n[,...]>
|
||||
Description: Specify the maximum data payload size in bytes for alternate
|
||||
settings, for each device. n is scaled between 63 and 1023.
|
||||
Default: 1023
|
||||
|
@ -234,7 +234,7 @@ Default: 2
|
|||
-------------------------------------------------------------------------------
|
||||
Name: double_buffer
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Hardware double buffering: 0 disabled, 1 enabled.
|
||||
It should be enabled if you want smooth video output: if you
|
||||
obtain out of sync. video, disable it, or try to
|
||||
|
@ -243,13 +243,13 @@ Default: 1 for every device.
|
|||
-------------------------------------------------------------------------------
|
||||
Name: clamping
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Video data clamping: 0 disabled, 1 enabled.
|
||||
Default: 0 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: filter_type
|
||||
Type: int array (min = 0, max = 32)
|
||||
Syntax: <0|1|2[,...]>
|
||||
Syntax: <0|1|2[,...]>
|
||||
Description: Video filter type.
|
||||
0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter.
|
||||
The filter is used to reduce noise and aliasing artifacts
|
||||
|
@ -258,13 +258,13 @@ Default: 0 for every device.
|
|||
-------------------------------------------------------------------------------
|
||||
Name: largeview
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Large view: 0 disabled, 1 enabled.
|
||||
Default: 1 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: upscaling
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Software scaling (for non-compressed video only):
|
||||
0 disabled, 1 enabled.
|
||||
Disable it if you have a slow CPU or you don't have enough
|
||||
|
@ -341,8 +341,8 @@ Default: 50 for every device.
|
|||
-------------------------------------------------------------------------------
|
||||
Name: bandingfilter
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Banding filter to reduce effects of fluorescent
|
||||
Syntax: <0|1[,...]>
|
||||
Description: Banding filter to reduce effects of fluorescent
|
||||
lighting:
|
||||
0 disabled, 1 enabled.
|
||||
This filter tries to reduce the pattern of horizontal
|
||||
|
@ -374,7 +374,7 @@ Default: 0 for every device.
|
|||
-------------------------------------------------------------------------------
|
||||
Name: monochrome
|
||||
Type: bool array (min = 0, max = 32)
|
||||
Syntax: <0|1[,...]>
|
||||
Syntax: <0|1[,...]>
|
||||
Description: The image sensor is monochrome:
|
||||
0 = no, 1 = yes
|
||||
Default: 0 for every device.
|
||||
|
@ -400,19 +400,19 @@ Default: 32768 for every device.
|
|||
-------------------------------------------------------------------------------
|
||||
Name: contrast
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture contrast (0-65535).
|
||||
Default: 50000 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: whiteness
|
||||
Type: long array (min = 0, max = 32)
|
||||
Syntax: <n[,...]>
|
||||
Syntax: <n[,...]>
|
||||
Description: Set picture whiteness (0-65535).
|
||||
Default: 32768 for every device.
|
||||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
Type: int
|
||||
Syntax: <n>
|
||||
Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 6:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
|
@ -51,18 +51,18 @@ config VIDEO_TVEEPROM
|
|||
tristate
|
||||
|
||||
config USB_DABUSB
|
||||
tristate "DABUSB driver"
|
||||
depends on USB
|
||||
---help---
|
||||
A Digital Audio Broadcasting (DAB) Receiver for USB and Linux
|
||||
brought to you by the DAB-Team
|
||||
<http://wwwbode.cs.tum.edu/Par/arch/dab/>. This driver can be taken
|
||||
as an example for URB-based bulk, control, and isochronous
|
||||
transactions. URB's are explained in
|
||||
<Documentation/usb/URB.txt>.
|
||||
tristate "DABUSB driver"
|
||||
depends on USB
|
||||
---help---
|
||||
A Digital Audio Broadcasting (DAB) Receiver for USB and Linux
|
||||
brought to you by the DAB-Team
|
||||
<http://wwwbode.cs.tum.edu/Par/arch/dab/>. This driver can be taken
|
||||
as an example for URB-based bulk, control, and isochronous
|
||||
transactions. URB's are explained in
|
||||
<Documentation/usb/URB.txt>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dabusb.
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dabusb.
|
||||
|
||||
endmenu
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ config DVB_BT8XX
|
|||
select DVB_CX24110
|
||||
select DVB_OR51211
|
||||
select DVB_LGDT330X
|
||||
select FW_LOADER
|
||||
help
|
||||
Support for PCI cards based on the Bt8xx PCI bridge. Examples are
|
||||
the Nebula cards, the Pinnacle PCTV cards, the Twinhan DST cards,
|
||||
|
|
|
@ -141,12 +141,18 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
void *mem = vmalloc(DVR_BUFFER_SIZE);
|
||||
void *mem;
|
||||
if (!dvbdev->readers) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -EBUSY;
|
||||
}
|
||||
mem = vmalloc(DVR_BUFFER_SIZE);
|
||||
if (!mem) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
|
||||
dvbdev->readers--;
|
||||
}
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
|
||||
|
@ -184,6 +190,7 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
|
|||
dmxdev->dvr_orig_fe);
|
||||
}
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
dvbdev->readers++;
|
||||
if (dmxdev->dvr_buffer.data) {
|
||||
void *mem = dmxdev->dvr_buffer.data;
|
||||
mb();
|
||||
|
@ -1029,8 +1036,7 @@ static struct file_operations dvb_dvr_fops = {
|
|||
|
||||
static struct dvb_device dvbdev_dvr = {
|
||||
.priv = NULL,
|
||||
.users = 1,
|
||||
.writers = 1,
|
||||
.readers = 1,
|
||||
.fops = &dvb_dvr_fops
|
||||
};
|
||||
|
||||
|
|
|
@ -105,6 +105,7 @@ struct dvb_frontend_private {
|
|||
fe_status_t status;
|
||||
unsigned long tune_mode_flags;
|
||||
unsigned int delay;
|
||||
unsigned int reinitialise;
|
||||
|
||||
/* swzigzag values */
|
||||
unsigned int state;
|
||||
|
@ -121,6 +122,7 @@ struct dvb_frontend_private {
|
|||
unsigned int check_wrapped;
|
||||
};
|
||||
|
||||
static void dvb_frontend_wakeup(struct dvb_frontend *fe);
|
||||
|
||||
static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
|
||||
{
|
||||
|
@ -213,6 +215,15 @@ static void dvb_frontend_init(struct dvb_frontend *fe)
|
|||
fe->ops->init(fe);
|
||||
}
|
||||
|
||||
void dvb_frontend_reinitialise(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
|
||||
fepriv->reinitialise = 1;
|
||||
dvb_frontend_wakeup(fe);
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_frontend_reinitialise);
|
||||
|
||||
static void dvb_frontend_swzigzag_update_delay(struct dvb_frontend_private *fepriv, int locked)
|
||||
{
|
||||
int q2;
|
||||
|
@ -505,8 +516,8 @@ static int dvb_frontend_thread(void *data)
|
|||
fepriv->quality = 0;
|
||||
fepriv->delay = 3*HZ;
|
||||
fepriv->status = 0;
|
||||
dvb_frontend_init(fe);
|
||||
fepriv->wakeup = 0;
|
||||
fepriv->reinitialise = 1;
|
||||
|
||||
while (1) {
|
||||
up(&fepriv->sem); /* is locked when we enter the thread... */
|
||||
|
@ -524,6 +535,11 @@ static int dvb_frontend_thread(void *data)
|
|||
if (down_interruptible(&fepriv->sem))
|
||||
break;
|
||||
|
||||
if (fepriv->reinitialise) {
|
||||
dvb_frontend_init(fe);
|
||||
fepriv->reinitialise = 0;
|
||||
}
|
||||
|
||||
/* do an iteration of the tuning loop */
|
||||
if (fe->ops->tune) {
|
||||
/* have we been asked to retune? */
|
||||
|
|
|
@ -112,6 +112,8 @@ extern int dvb_register_frontend(struct dvb_adapter* dvb,
|
|||
|
||||
extern int dvb_unregister_frontend(struct dvb_frontend* fe);
|
||||
|
||||
extern void dvb_frontend_reinitialise(struct dvb_frontend *fe);
|
||||
|
||||
extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
|
||||
extern s32 timeval_usec_diff(struct timeval lasttime, struct timeval curtime);
|
||||
|
||||
|
|
|
@ -233,6 +233,45 @@ static struct dvb_usb_rc_key dvico_mce_rc_keys[] = {
|
|||
{ 0xfe, 0x4e, KEY_POWER },
|
||||
};
|
||||
|
||||
static struct dvb_usb_rc_key dvico_portable_rc_keys[] = {
|
||||
{ 0xfc, 0x02, KEY_SETUP }, /* Profile */
|
||||
{ 0xfc, 0x43, KEY_POWER2 },
|
||||
{ 0xfc, 0x06, KEY_EPG },
|
||||
{ 0xfc, 0x5a, KEY_BACK },
|
||||
{ 0xfc, 0x05, KEY_MENU },
|
||||
{ 0xfc, 0x47, KEY_INFO },
|
||||
{ 0xfc, 0x01, KEY_TAB },
|
||||
{ 0xfc, 0x42, KEY_PREVIOUSSONG },/* Replay */
|
||||
{ 0xfc, 0x49, KEY_VOLUMEUP },
|
||||
{ 0xfc, 0x09, KEY_VOLUMEDOWN },
|
||||
{ 0xfc, 0x54, KEY_CHANNELUP },
|
||||
{ 0xfc, 0x0b, KEY_CHANNELDOWN },
|
||||
{ 0xfc, 0x16, KEY_CAMERA },
|
||||
{ 0xfc, 0x40, KEY_TUNER }, /* ATV/DTV */
|
||||
{ 0xfc, 0x45, KEY_OPEN },
|
||||
{ 0xfc, 0x19, KEY_1 },
|
||||
{ 0xfc, 0x18, KEY_2 },
|
||||
{ 0xfc, 0x1b, KEY_3 },
|
||||
{ 0xfc, 0x1a, KEY_4 },
|
||||
{ 0xfc, 0x58, KEY_5 },
|
||||
{ 0xfc, 0x59, KEY_6 },
|
||||
{ 0xfc, 0x15, KEY_7 },
|
||||
{ 0xfc, 0x14, KEY_8 },
|
||||
{ 0xfc, 0x17, KEY_9 },
|
||||
{ 0xfc, 0x44, KEY_ANGLE }, /* Aspect */
|
||||
{ 0xfc, 0x55, KEY_0 },
|
||||
{ 0xfc, 0x07, KEY_ZOOM },
|
||||
{ 0xfc, 0x0a, KEY_REWIND },
|
||||
{ 0xfc, 0x08, KEY_PLAYPAUSE },
|
||||
{ 0xfc, 0x4b, KEY_FASTFORWARD },
|
||||
{ 0xfc, 0x5b, KEY_MUTE },
|
||||
{ 0xfc, 0x04, KEY_STOP },
|
||||
{ 0xfc, 0x56, KEY_RECORD },
|
||||
{ 0xfc, 0x57, KEY_POWER },
|
||||
{ 0xfc, 0x41, KEY_UNKNOWN }, /* INPUT */
|
||||
{ 0xfc, 0x00, KEY_UNKNOWN }, /* HD */
|
||||
};
|
||||
|
||||
static int cxusb_dee1601_demod_init(struct dvb_frontend* fe)
|
||||
{
|
||||
static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x28 };
|
||||
|
@ -511,6 +550,11 @@ static struct dvb_usb_properties cxusb_bluebird_lgh064f_properties = {
|
|||
|
||||
.i2c_algo = &cxusb_i2c_algo,
|
||||
|
||||
.rc_interval = 100,
|
||||
.rc_key_map = dvico_portable_rc_keys,
|
||||
.rc_key_map_size = ARRAY_SIZE(dvico_portable_rc_keys),
|
||||
.rc_query = cxusb_rc_query,
|
||||
|
||||
.generic_bulk_ctrl_endpoint = 0x01,
|
||||
/* parameter for the MPEG2-data transfer */
|
||||
.urb = {
|
||||
|
@ -600,6 +644,11 @@ static struct dvb_usb_properties cxusb_bluebird_lgz201_properties = {
|
|||
|
||||
.i2c_algo = &cxusb_i2c_algo,
|
||||
|
||||
.rc_interval = 100,
|
||||
.rc_key_map = dvico_portable_rc_keys,
|
||||
.rc_key_map_size = ARRAY_SIZE(dvico_portable_rc_keys),
|
||||
.rc_query = cxusb_rc_query,
|
||||
|
||||
.generic_bulk_ctrl_endpoint = 0x01,
|
||||
/* parameter for the MPEG2-data transfer */
|
||||
.urb = {
|
||||
|
@ -640,6 +689,11 @@ static struct dvb_usb_properties cxusb_bluebird_dtt7579_properties = {
|
|||
|
||||
.i2c_algo = &cxusb_i2c_algo,
|
||||
|
||||
.rc_interval = 100,
|
||||
.rc_key_map = dvico_portable_rc_keys,
|
||||
.rc_key_map_size = ARRAY_SIZE(dvico_portable_rc_keys),
|
||||
.rc_query = cxusb_rc_query,
|
||||
|
||||
.generic_bulk_ctrl_endpoint = 0x01,
|
||||
/* parameter for the MPEG2-data transfer */
|
||||
.urb = {
|
||||
|
|
|
@ -94,12 +94,14 @@ static int dtt200u_frontend_attach(struct dvb_usb_device *d)
|
|||
|
||||
static struct dvb_usb_properties dtt200u_properties;
|
||||
static struct dvb_usb_properties wt220u_properties;
|
||||
static struct dvb_usb_properties wt220u_zl0353_properties;
|
||||
|
||||
static int dtt200u_usb_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
if (dvb_usb_device_init(intf,&dtt200u_properties,THIS_MODULE,NULL) == 0 ||
|
||||
dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0)
|
||||
dvb_usb_device_init(intf,&wt220u_properties,THIS_MODULE,NULL) == 0 ||
|
||||
dvb_usb_device_init(intf,&wt220u_zl0353_properties,THIS_MODULE,NULL) == 0)
|
||||
return 0;
|
||||
|
||||
return -ENODEV;
|
||||
|
@ -110,6 +112,8 @@ static struct usb_device_id dtt200u_usb_table [] = {
|
|||
{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_DTT200U_WARM) },
|
||||
{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_COLD) },
|
||||
{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_WARM) },
|
||||
{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_COLD) },
|
||||
{ USB_DEVICE(USB_VID_WIDEVIEW, USB_PID_WT220U_ZL0353_WARM) },
|
||||
{ 0 },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, dtt200u_usb_table);
|
||||
|
@ -196,6 +200,47 @@ static struct dvb_usb_properties wt220u_properties = {
|
|||
}
|
||||
};
|
||||
|
||||
static struct dvb_usb_properties wt220u_zl0353_properties = {
|
||||
.caps = DVB_USB_HAS_PID_FILTER | DVB_USB_NEED_PID_FILTERING,
|
||||
.pid_filter_count = 15,
|
||||
|
||||
.usb_ctrl = CYPRESS_FX2,
|
||||
.firmware = "dvb-usb-wt220u-zl0353-01.fw",
|
||||
|
||||
.power_ctrl = dtt200u_power_ctrl,
|
||||
.streaming_ctrl = dtt200u_streaming_ctrl,
|
||||
.pid_filter = dtt200u_pid_filter,
|
||||
.frontend_attach = dtt200u_frontend_attach,
|
||||
|
||||
.rc_interval = 300,
|
||||
.rc_key_map = dtt200u_rc_keys,
|
||||
.rc_key_map_size = ARRAY_SIZE(dtt200u_rc_keys),
|
||||
.rc_query = dtt200u_rc_query,
|
||||
|
||||
.generic_bulk_ctrl_endpoint = 0x01,
|
||||
|
||||
/* parameter for the MPEG2-data transfer */
|
||||
.urb = {
|
||||
.type = DVB_USB_BULK,
|
||||
.count = 7,
|
||||
.endpoint = 0x02,
|
||||
.u = {
|
||||
.bulk = {
|
||||
.buffersize = 4096,
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
.num_device_descs = 1,
|
||||
.devices = {
|
||||
{ .name = "WideView WT-220U PenType Receiver (based on ZL353)",
|
||||
.cold_ids = { &dtt200u_usb_table[4], NULL },
|
||||
.warm_ids = { &dtt200u_usb_table[5], NULL },
|
||||
},
|
||||
{ NULL },
|
||||
}
|
||||
};
|
||||
|
||||
/* usb specific object needed to register this driver with the usb subsystem */
|
||||
static struct usb_driver dtt200u_usb_driver = {
|
||||
.name = "dvb_usb_dtt200u",
|
||||
|
|
|
@ -83,6 +83,8 @@
|
|||
#define USB_PID_DTT200U_WARM 0x0301
|
||||
#define USB_PID_WT220U_COLD 0x0222
|
||||
#define USB_PID_WT220U_WARM 0x0221
|
||||
#define USB_PID_WT220U_ZL0353_COLD 0x022a
|
||||
#define USB_PID_WT220U_ZL0353_WARM 0x022b
|
||||
#define USB_PID_WINTV_NOVA_T_USB2_COLD 0x9300
|
||||
#define USB_PID_WINTV_NOVA_T_USB2_WARM 0x9301
|
||||
#define USB_PID_NEBULA_DIGITV 0x0201
|
||||
|
|
|
@ -147,8 +147,9 @@ static int vp702x_fe_set_frontend(struct dvb_frontend* fe,
|
|||
cmd[4] = (sr >> 4) & 0xff;
|
||||
cmd[5] = (sr << 4) & 0xf0;
|
||||
|
||||
deb_fe("setting frontend to: %u -> %u (%x) LNB-based GHz, symbolrate: %d -> %Lu (%Lx)\n",
|
||||
fep->frequency,freq,freq, fep->u.qpsk.symbol_rate, sr, sr);
|
||||
deb_fe("setting frontend to: %u -> %u (%x) LNB-based GHz, symbolrate: %d -> %lu (%lx)\n",
|
||||
fep->frequency,freq,freq, fep->u.qpsk.symbol_rate,
|
||||
(unsigned long) sr, (unsigned long) sr);
|
||||
|
||||
/* if (fep->inversion == INVERSION_ON)
|
||||
cmd[6] |= 0x80; */
|
||||
|
|
|
@ -181,6 +181,11 @@ config DVB_OR51211
|
|||
help
|
||||
An ATSC 8VSB tuner module. Say Y when you want to support this frontend.
|
||||
|
||||
This driver needs external firmware. Please use the command
|
||||
"<kerneldir>/Documentation/dvb/get_dvb_firmware or51211" to
|
||||
download it, and then copy it to /usr/lib/hotplug/firmware
|
||||
or /lib/firmware (depending on configuration of firmware hotplug).
|
||||
|
||||
config DVB_OR51132
|
||||
tristate "Oren OR51132 based"
|
||||
depends on DVB_CORE
|
||||
|
@ -189,6 +194,13 @@ config DVB_OR51132
|
|||
An ATSC 8VSB and QAM64/256 tuner module. Say Y when you want
|
||||
to support this frontend.
|
||||
|
||||
This driver needs external firmware. Please use the commands
|
||||
"<kerneldir>/Documentation/dvb/get_dvb_firmware or51132_vsb" and/or
|
||||
"<kerneldir>/Documentation/dvb/get_dvb_firmware or51132_qam" to
|
||||
download firmwares for 8VSB and QAM64/256, respectively. Copy them to
|
||||
/usr/lib/hotplug/firmware or /lib/firmware (depending on
|
||||
configuration of firmware hotplug).
|
||||
|
||||
config DVB_BCM3510
|
||||
tristate "Broadcom BCM3510"
|
||||
depends on DVB_CORE
|
||||
|
|
|
@ -52,7 +52,6 @@ struct tda1004x_state {
|
|||
struct dvb_frontend frontend;
|
||||
|
||||
/* private demod data */
|
||||
u8 initialised;
|
||||
enum tda1004x_demod demod_type;
|
||||
};
|
||||
|
||||
|
@ -594,9 +593,6 @@ static int tda10045_init(struct dvb_frontend* fe)
|
|||
|
||||
dprintk("%s\n", __FUNCTION__);
|
||||
|
||||
if (state->initialised)
|
||||
return 0;
|
||||
|
||||
if (tda10045_fwupload(fe)) {
|
||||
printk("tda1004x: firmware upload failed\n");
|
||||
return -EIO;
|
||||
|
@ -626,7 +622,6 @@ static int tda10045_init(struct dvb_frontend* fe)
|
|||
|
||||
tda1004x_write_mask(state, 0x1f, 0x01, state->config->invert_oclk);
|
||||
|
||||
state->initialised = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -635,9 +630,6 @@ static int tda10046_init(struct dvb_frontend* fe)
|
|||
struct tda1004x_state* state = fe->demodulator_priv;
|
||||
dprintk("%s\n", __FUNCTION__);
|
||||
|
||||
if (state->initialised)
|
||||
return 0;
|
||||
|
||||
if (tda10046_fwupload(fe)) {
|
||||
printk("tda1004x: firmware upload failed\n");
|
||||
return -EIO;
|
||||
|
@ -697,7 +689,6 @@ static int tda10046_init(struct dvb_frontend* fe)
|
|||
// tda1004x_write_mask(state, 0x50, 0x80, 0x80); // handle out of guard echoes
|
||||
tda1004x_write_mask(state, 0x3a, 0x80, state->config->invert_oclk << 7);
|
||||
|
||||
state->initialised = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1207,7 +1198,6 @@ static int tda1004x_sleep(struct dvb_frontend* fe)
|
|||
tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 1);
|
||||
break;
|
||||
}
|
||||
state->initialised = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1271,7 +1261,6 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
|
|||
state->config = config;
|
||||
state->i2c = i2c;
|
||||
memcpy(&state->ops, &tda10045_ops, sizeof(struct dvb_frontend_ops));
|
||||
state->initialised = 0;
|
||||
state->demod_type = TDA1004X_DEMOD_TDA10045;
|
||||
|
||||
/* check if the demod is there */
|
||||
|
@ -1330,7 +1319,6 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
|
|||
state->config = config;
|
||||
state->i2c = i2c;
|
||||
memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops));
|
||||
state->initialised = 0;
|
||||
state->demod_type = TDA1004X_DEMOD_TDA10046;
|
||||
|
||||
/* check if the demod is there */
|
||||
|
|
|
@ -87,6 +87,7 @@ static int volume = 255;
|
|||
static int budgetpatch;
|
||||
static int wss_cfg_4_3 = 0x4008;
|
||||
static int wss_cfg_16_9 = 0x0007;
|
||||
static int tv_standard;
|
||||
|
||||
module_param_named(debug, av7110_debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "debug level (bitmask, default 0)");
|
||||
|
@ -109,6 +110,8 @@ module_param(wss_cfg_4_3, int, 0444);
|
|||
MODULE_PARM_DESC(wss_cfg_4_3, "WSS 4:3 - default 0x4008 - bit 15: disable, 14: burst mode, 13..0: wss data");
|
||||
module_param(wss_cfg_16_9, int, 0444);
|
||||
MODULE_PARM_DESC(wss_cfg_16_9, "WSS 16:9 - default 0x0007 - bit 15: disable, 14: burst mode, 13..0: wss data");
|
||||
module_param(tv_standard, int, 0444);
|
||||
MODULE_PARM_DESC(tv_standard, "TV standard: 0 PAL (default), 1 NTSC");
|
||||
|
||||
static void restart_feeds(struct av7110 *av7110);
|
||||
|
||||
|
@ -2123,7 +2126,7 @@ static int frontend_init(struct av7110 *av7110)
|
|||
read_pwm(av7110));
|
||||
break;
|
||||
case 0x0003:
|
||||
/* Haupauge DVB-C 2.1 VES1820/ALPS TDBE2 */
|
||||
/* Hauppauge DVB-C 2.1 VES1820/ALPS TDBE2 */
|
||||
av7110->fe = ves1820_attach(&alps_tdbe2_config, &av7110->i2c_adap,
|
||||
read_pwm(av7110));
|
||||
break;
|
||||
|
@ -2543,6 +2546,9 @@ static int __devinit av7110_attach(struct saa7146_dev* dev,
|
|||
av7110->osdwin = 1;
|
||||
mutex_init(&av7110->osd_mutex);
|
||||
|
||||
/* TV standard */
|
||||
av7110->vidmode = tv_standard == 1 ? VIDEO_MODE_NTSC : VIDEO_MODE_PAL;
|
||||
|
||||
/* ARM "watchdog" */
|
||||
init_waitqueue_head(&av7110->arm_wait);
|
||||
av7110->arm_thread = NULL;
|
||||
|
|
|
@ -1479,8 +1479,6 @@ int av7110_av_init(struct av7110 *av7110)
|
|||
void (*play[])(u8 *, int, void *) = { play_audio_cb, play_video_cb };
|
||||
int i, ret;
|
||||
|
||||
av7110->vidmode = VIDEO_MODE_PAL;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
struct ipack *ipack = av7110->ipack + i;
|
||||
|
||||
|
|
|
@ -60,11 +60,11 @@ struct budget_av {
|
|||
struct dvb_ca_en50221 ca;
|
||||
};
|
||||
|
||||
/* GPIO CI Connections:
|
||||
* 0 - Vcc/Reset (Reset is controlled by capacitor)
|
||||
* 1 - Attribute Memory
|
||||
* 2 - Card Enable (Active Low)
|
||||
* 3 - Card Detect
|
||||
/* GPIO Connections:
|
||||
* 0 - Vcc/Reset (Reset is controlled by capacitor). Resets the frontend *AS WELL*!
|
||||
* 1 - CI memory select 0=>IO memory, 1=>Attribute Memory
|
||||
* 2 - CI Card Enable (Active Low)
|
||||
* 3 - CI Card Detect
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -214,6 +214,9 @@ static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
|
|||
while (--timeout > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d)
|
||||
msleep(100);
|
||||
|
||||
/* reinitialise the frontend */
|
||||
dvb_frontend_reinitialise(budget_av->budget.dvb_frontend);
|
||||
|
||||
if (timeout <= 0)
|
||||
{
|
||||
printk(KERN_ERR "budget-av: cam reset failed (timeout).\n");
|
||||
|
|
|
@ -39,9 +39,21 @@
|
|||
#include "budget.h"
|
||||
#include "ttpci-eeprom.h"
|
||||
|
||||
#define TS_WIDTH (2 * TS_SIZE)
|
||||
#define TS_WIDTH_ACTIVY TS_SIZE
|
||||
#define TS_HEIGHT_MASK 0xf00
|
||||
#define TS_HEIGHT_MASK_ACTIVY 0xc00
|
||||
#define TS_MIN_BUFSIZE_K 188
|
||||
#define TS_MAX_BUFSIZE_K 1410
|
||||
#define TS_MAX_BUFSIZE_K_ACTIVY 564
|
||||
#define BUFFER_WARNING_WAIT (30*HZ)
|
||||
|
||||
int budget_debug;
|
||||
static int dma_buffer_size = TS_MIN_BUFSIZE_K;
|
||||
module_param_named(debug, budget_debug, int, 0644);
|
||||
module_param_named(bufsize, dma_buffer_size, int, 0444);
|
||||
MODULE_PARM_DESC(debug, "Turn on/off budget debugging (default:off).");
|
||||
MODULE_PARM_DESC(bufsize, "DMA buffer size in KB, default: 188, min: 188, max: 1410 (Activy: 564)");
|
||||
|
||||
/****************************************************************************
|
||||
* TT budget / WinTV Nova
|
||||
|
@ -70,11 +82,10 @@ static int start_ts_capture(struct budget *budget)
|
|||
|
||||
saa7146_write(dev, MC1, MASK_20); // DMA3 off
|
||||
|
||||
memset(budget->grabbing, 0x00, TS_HEIGHT * TS_WIDTH);
|
||||
memset(budget->grabbing, 0x00, budget->buffer_size);
|
||||
|
||||
saa7146_write(dev, PCI_BT_V1, 0x001c0000 | (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000));
|
||||
|
||||
budget->tsf = 0xff;
|
||||
budget->ttbp = 0;
|
||||
|
||||
/*
|
||||
|
@ -115,16 +126,12 @@ static int start_ts_capture(struct budget *budget)
|
|||
|
||||
saa7146_write(dev, BASE_ODD3, 0);
|
||||
saa7146_write(dev, BASE_EVEN3, 0);
|
||||
saa7146_write(dev, PROT_ADDR3, TS_WIDTH * TS_HEIGHT);
|
||||
saa7146_write(dev, PROT_ADDR3, budget->buffer_size);
|
||||
saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90);
|
||||
|
||||
if (budget->card->type == BUDGET_FS_ACTIVY) {
|
||||
saa7146_write(dev, PITCH3, TS_WIDTH / 2);
|
||||
saa7146_write(dev, NUM_LINE_BYTE3, ((TS_HEIGHT * 2) << 16) | (TS_WIDTH / 2));
|
||||
} else {
|
||||
saa7146_write(dev, PITCH3, TS_WIDTH);
|
||||
saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT << 16) | TS_WIDTH);
|
||||
}
|
||||
saa7146_write(dev, PITCH3, budget->buffer_width);
|
||||
saa7146_write(dev, NUM_LINE_BYTE3,
|
||||
(budget->buffer_height << 16) | budget->buffer_width);
|
||||
|
||||
saa7146_write(dev, MC2, (MASK_04 | MASK_20));
|
||||
|
||||
|
@ -141,11 +148,12 @@ static void vpeirq(unsigned long data)
|
|||
u8 *mem = (u8 *) (budget->grabbing);
|
||||
u32 olddma = budget->ttbp;
|
||||
u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
|
||||
u32 count;
|
||||
|
||||
/* nearest lower position divisible by 188 */
|
||||
newdma -= newdma % 188;
|
||||
|
||||
if (newdma >= TS_BUFLEN)
|
||||
if (newdma >= budget->buffer_size)
|
||||
return;
|
||||
|
||||
budget->ttbp = newdma;
|
||||
|
@ -154,11 +162,24 @@ static void vpeirq(unsigned long data)
|
|||
return;
|
||||
|
||||
if (newdma > olddma) { /* no wraparound, dump olddma..newdma */
|
||||
dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (newdma - olddma) / 188);
|
||||
count = newdma - olddma;
|
||||
dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188);
|
||||
} else { /* wraparound, dump olddma..buflen and 0..newdma */
|
||||
dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, (TS_BUFLEN - olddma) / 188);
|
||||
count = budget->buffer_size - olddma;
|
||||
dvb_dmx_swfilter_packets(&budget->demux, mem + olddma, count / 188);
|
||||
count += newdma;
|
||||
dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188);
|
||||
}
|
||||
|
||||
if (count > budget->buffer_warning_threshold)
|
||||
budget->buffer_warnings++;
|
||||
|
||||
if (budget->buffer_warnings && time_after(jiffies, budget->buffer_warning_time)) {
|
||||
printk("%s %s: used %d times >80%% of buffer (%u bytes now)\n",
|
||||
budget->dev->name, __FUNCTION__, budget->buffer_warnings, count);
|
||||
budget->buffer_warning_time = jiffies + BUFFER_WARNING_WAIT;
|
||||
budget->buffer_warnings = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -341,9 +362,10 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
|||
struct saa7146_pci_extension_data *info,
|
||||
struct module *owner)
|
||||
{
|
||||
int length = TS_WIDTH * TS_HEIGHT;
|
||||
int ret = 0;
|
||||
struct budget_info *bi = info->ext_priv;
|
||||
int max_bufsize;
|
||||
int height_mask;
|
||||
|
||||
memset(budget, 0, sizeof(struct budget));
|
||||
|
||||
|
@ -352,6 +374,32 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
|||
budget->card = bi;
|
||||
budget->dev = (struct saa7146_dev *) dev;
|
||||
|
||||
if (budget->card->type == BUDGET_FS_ACTIVY) {
|
||||
budget->buffer_width = TS_WIDTH_ACTIVY;
|
||||
max_bufsize = TS_MAX_BUFSIZE_K_ACTIVY;
|
||||
height_mask = TS_HEIGHT_MASK_ACTIVY;
|
||||
} else {
|
||||
budget->buffer_width = TS_WIDTH;
|
||||
max_bufsize = TS_MAX_BUFSIZE_K;
|
||||
height_mask = TS_HEIGHT_MASK;
|
||||
}
|
||||
|
||||
if (dma_buffer_size < TS_MIN_BUFSIZE_K)
|
||||
dma_buffer_size = TS_MIN_BUFSIZE_K;
|
||||
else if (dma_buffer_size > max_bufsize)
|
||||
dma_buffer_size = max_bufsize;
|
||||
|
||||
budget->buffer_height = dma_buffer_size * 1024 / budget->buffer_width;
|
||||
budget->buffer_height &= height_mask;
|
||||
budget->buffer_size = budget->buffer_height * budget->buffer_width;
|
||||
budget->buffer_warning_threshold = budget->buffer_size * 80/100;
|
||||
budget->buffer_warnings = 0;
|
||||
budget->buffer_warning_time = jiffies;
|
||||
|
||||
dprintk(2, "%s: width = %d, height = %d\n",
|
||||
budget->dev->name, budget->buffer_width, budget->buffer_height);
|
||||
printk("%s: dma buffer size %u\n", budget->dev->name, budget->buffer_size);
|
||||
|
||||
dvb_register_adapter(&budget->dvb_adapter, budget->card->name, owner);
|
||||
|
||||
/* set dd1 stream a & b */
|
||||
|
@ -392,7 +440,7 @@ int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev,
|
|||
ttpci_eeprom_parse_mac(&budget->i2c_adap, budget->dvb_adapter.proposed_mac);
|
||||
|
||||
if (NULL ==
|
||||
(budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, length, &budget->pt))) {
|
||||
(budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci, budget->buffer_size, &budget->pt))) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
|
|
@ -577,20 +577,6 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
|
|||
saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
|
||||
// Set RPS1 Address register to point to RPS code (r108 p42)
|
||||
saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
|
||||
// Set Source Line Counter Threshold, using BRS (rCC p43)
|
||||
// It generates HS event every TS_HEIGHT lines
|
||||
// this is related to TS_WIDTH set in register
|
||||
// NUM_LINE_BYTE3 in budget-core.c. If NUM_LINE_BYTE
|
||||
// low 16 bits are set to TS_WIDTH bytes (TS_WIDTH=2*188
|
||||
//,then RPS_THRESH1
|
||||
// should be set to trigger every TS_HEIGHT (512) lines.
|
||||
//
|
||||
saa7146_write(dev, RPS_THRESH1, (TS_HEIGHT*1) | MASK_12 );
|
||||
|
||||
// saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 );
|
||||
// Enable RPS1 (rFC p33)
|
||||
saa7146_write(dev, MC1, (MASK_13 | MASK_29));
|
||||
|
||||
|
||||
if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
@ -602,6 +588,20 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte
|
|||
return err;
|
||||
}
|
||||
|
||||
// Set Source Line Counter Threshold, using BRS (rCC p43)
|
||||
// It generates HS event every TS_HEIGHT lines
|
||||
// this is related to TS_WIDTH set in register
|
||||
// NUM_LINE_BYTE3 in budget-core.c. If NUM_LINE_BYTE
|
||||
// low 16 bits are set to TS_WIDTH bytes (TS_WIDTH=2*188
|
||||
//,then RPS_THRESH1
|
||||
// should be set to trigger every TS_HEIGHT (512) lines.
|
||||
//
|
||||
saa7146_write(dev, RPS_THRESH1, budget->buffer_height | MASK_12 );
|
||||
|
||||
// saa7146_write(dev, RPS_THRESH0, ((TS_HEIGHT/2)<<16) |MASK_28| (TS_HEIGHT/2) |MASK_12 );
|
||||
// Enable RPS1 (rFC p33)
|
||||
saa7146_write(dev, MC1, (MASK_13 | MASK_29));
|
||||
|
||||
|
||||
dev->ext_priv = budget;
|
||||
|
||||
|
|
|
@ -58,7 +58,13 @@ struct budget {
|
|||
int ci_present;
|
||||
int video_port;
|
||||
|
||||
u8 tsf;
|
||||
u32 buffer_width;
|
||||
u32 buffer_height;
|
||||
u32 buffer_size;
|
||||
u32 buffer_warning_threshold;
|
||||
u32 buffer_warnings;
|
||||
unsigned long buffer_warning_time;
|
||||
|
||||
u32 ttbp;
|
||||
int feeding;
|
||||
|
||||
|
@ -79,11 +85,6 @@ static struct saa7146_pci_extension_data x_var = { \
|
|||
.ext_priv = &x_var ## _info, \
|
||||
.ext = &budget_extension };
|
||||
|
||||
#define TS_WIDTH (376)
|
||||
#define TS_HEIGHT (512)
|
||||
#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
|
||||
#define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
|
||||
|
||||
#define BUDGET_TT 0
|
||||
#define BUDGET_TT_HW_DISEQC 1
|
||||
#define BUDGET_PATCH 3
|
||||
|
|
|
@ -300,7 +300,7 @@ config VIDEO_OVCAMCHIP
|
|||
camera drivers.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ovcamchip
|
||||
module will be called ovcamchip.
|
||||
|
||||
config VIDEO_M32R_AR
|
||||
tristate "AR devices"
|
||||
|
@ -316,6 +316,13 @@ config VIDEO_M32R_AR_M64278
|
|||
Say Y here to use the Renesas M64278E-800 camera module,
|
||||
which supports VGA(640x480 pixcels) size of images.
|
||||
|
||||
#
|
||||
# Encoder / Decoder module configuration
|
||||
#
|
||||
|
||||
menu "Encoders and Decoders"
|
||||
depends on VIDEO_DEV
|
||||
|
||||
config VIDEO_MSP3400
|
||||
tristate "Micronas MSP34xx audio decoders"
|
||||
depends on VIDEO_DEV && I2C
|
||||
|
@ -323,7 +330,7 @@ config VIDEO_MSP3400
|
|||
Support for the Micronas MSP34xx series of audio decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called msp3400
|
||||
module will be called msp3400.
|
||||
|
||||
config VIDEO_CS53L32A
|
||||
tristate "Cirrus Logic CS53L32A audio ADC"
|
||||
|
@ -333,17 +340,27 @@ config VIDEO_CS53L32A
|
|||
stereo A/D converter.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called cs53l32a
|
||||
module will be called cs53l32a.
|
||||
|
||||
config VIDEO_WM8775
|
||||
tristate "Wolfson Microelectronics WM8775 audio ADC"
|
||||
tristate "Wolfson Microelectronics WM8775 audio ADC with input mixer"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the Wolfson Microelectronics WM8775
|
||||
high performance stereo A/D Converter.
|
||||
Support for the Wolfson Microelectronics WM8775 high
|
||||
performance stereo A/D Converter with a 4 channel input mixer.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called wm8775
|
||||
module will be called wm8775.
|
||||
|
||||
config VIDEO_WM8739
|
||||
tristate "Wolfson Microelectronics WM8739 stereo audio ADC"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the Wolfson Microelectronics WM8739
|
||||
stereo A/D Converter.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called wm8739.
|
||||
|
||||
source "drivers/media/video/cx25840/Kconfig"
|
||||
|
||||
|
@ -354,7 +371,7 @@ config VIDEO_SAA711X
|
|||
Support for the Philips SAA7113/4/5 video decoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called saa7115
|
||||
module will be called saa7115.
|
||||
|
||||
config VIDEO_SAA7127
|
||||
tristate "Philips SAA7127/9 digital video encoders"
|
||||
|
@ -363,7 +380,32 @@ config VIDEO_SAA7127
|
|||
Support for the Philips SAA7127/9 digital video encoders.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called saa7127
|
||||
module will be called saa7127.
|
||||
|
||||
config VIDEO_UPD64031A
|
||||
tristate "NEC Electronics uPD64031A Ghost Reduction"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the NEC Electronics uPD64031A Ghost Reduction
|
||||
video chip. It is most often found in NTSC TV cards made for
|
||||
Japan and is used to reduce the 'ghosting' effect that can
|
||||
be present in analog TV broadcasts.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called upd64031a.
|
||||
|
||||
config VIDEO_UPD64083
|
||||
tristate "NEC Electronics uPD64083 3-Dimensional Y/C separation"
|
||||
depends on VIDEO_DEV && I2C && EXPERIMENTAL
|
||||
---help---
|
||||
Support for the NEC Electronics uPD64083 3-Dimensional Y/C
|
||||
separation video chip. It is used to improve the quality of
|
||||
the colors of a composite signal.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called upd64083.
|
||||
|
||||
endmenu # encoder / decoder chips
|
||||
|
||||
#
|
||||
# USB Multimedia device configuration
|
||||
|
@ -374,20 +416,6 @@ menu "V4L USB devices"
|
|||
|
||||
source "drivers/media/video/em28xx/Kconfig"
|
||||
|
||||
config USB_VICAM
|
||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
---help---
|
||||
Say Y here if you have 3com homeconnect camera (vicam).
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" (under Multimedia Devices) to use this driver.
|
||||
Information on this API and pointers to "v4l" programs may be found
|
||||
at <file:Documentation/video4linux/API.html>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called vicam.
|
||||
|
||||
config USB_DSBR
|
||||
tristate "D-Link USB FM radio support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
|
@ -397,79 +425,20 @@ config USB_DSBR
|
|||
you must connect the line out connector to a sound card or a
|
||||
set of speakers.
|
||||
|
||||
This driver uses the Video For Linux API. You must enable
|
||||
(Y or M in config) Video For Linux (under Character Devices)
|
||||
to use this driver. Information on this API and pointers to
|
||||
"v4l" programs may be found at
|
||||
<file:Documentation/video4linux/API.html>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dsbr100.
|
||||
|
||||
config USB_ET61X251
|
||||
tristate "USB ET61X[12]51 PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on Etoms ET61X151
|
||||
or ET61X251 PC Camera Controllers.
|
||||
source "drivers/media/video/usbvideo/Kconfig"
|
||||
|
||||
See <file:Documentation/usb/et61x251.txt> for more informations.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" to use this driver.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called et61x251.
|
||||
|
||||
config USB_IBMCAM
|
||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
||||
"Xirlink PC Camera" to your computer's USB port. For more
|
||||
information, read <file:Documentation/usb/ibmcam.txt>.
|
||||
|
||||
This driver uses the Video For Linux API. You must enable
|
||||
(Y or M in config) Video For Linux (under Character Devices)
|
||||
to use this driver. Information on this API and pointers to
|
||||
"v4l" programs may be found at
|
||||
<file:Documentation/video4linux/API.html>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ibmcam.
|
||||
|
||||
This camera has several configuration options which
|
||||
can be specified when you load the module. Read
|
||||
<file:Documentation/usb/ibmcam.txt> to learn more.
|
||||
|
||||
config USB_KONICAWC
|
||||
tristate "USB Konica Webcam support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for webcams based on a Konica
|
||||
chipset. This is known to work with the Intel YC76 webcam.
|
||||
|
||||
This driver uses the Video For Linux API. You must enable
|
||||
(Y or M in config) Video For Linux (under Character Devices)
|
||||
to use this driver. Information on this API and pointers to
|
||||
"v4l" programs may be found at
|
||||
<file:Documentation/video4linux/API.html>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called konicawc.
|
||||
source "drivers/media/video/et61x251/Kconfig"
|
||||
|
||||
config USB_OV511
|
||||
tristate "USB OV511 Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. See <file:Documentation/usb/ov511.txt> for more
|
||||
information and for a list of supported cameras.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" (under Character Devices) to use this driver.
|
||||
Information on this API and pointers to "v4l" programs may be found
|
||||
at <file:Documentation/video4linux/API.html>.
|
||||
computer's USB port. See <file:Documentation/video4linux/ov511.txt>
|
||||
for more information and for a list of supported cameras.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ov511.
|
||||
|
@ -479,31 +448,13 @@ config USB_SE401
|
|||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. See <file:Documentation/usb/se401.txt> for more
|
||||
information and for a list of supported cameras.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" (under Multimedia Devices) to use this driver.
|
||||
Information on this API and pointers to "v4l" programs may be found
|
||||
at <file:Documentation/video4linux/API.html>.
|
||||
computer's USB port. See <file:Documentation/video4linux/se401.txt>
|
||||
for more information and for a list of supported cameras.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called se401.
|
||||
|
||||
config USB_SN9C102
|
||||
tristate "USB SN9C10x PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on SONiX SN9C101,
|
||||
SN9C102 or SN9C103 PC Camera Controllers.
|
||||
|
||||
See <file:Documentation/usb/sn9c102.txt> for more informations.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" to use this driver.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called sn9c102.
|
||||
source "drivers/media/video/sn9c102/Kconfig"
|
||||
|
||||
config USB_STV680
|
||||
tristate "USB STV680 (Pencam) Camera support"
|
||||
|
@ -511,20 +462,16 @@ config USB_STV680
|
|||
---help---
|
||||
Say Y here if you want to connect this type of camera to your
|
||||
computer's USB port. This includes the Pencam line of cameras.
|
||||
See <file:Documentation/usb/stv680.txt> for more information and for
|
||||
a list of supported cameras.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" (under Multimedia Devices) to use this driver.
|
||||
Information on this API and pointers to "v4l" programs may be found
|
||||
at <file:Documentation/video4linux/API.html>.
|
||||
See <file:Documentation/video4linux/stv680.txt> for more information
|
||||
and for a list of supported cameras.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called stv680.
|
||||
|
||||
config USB_W9968CF
|
||||
tristate "USB W996[87]CF JPEG Dual Mode Camera support"
|
||||
depends on USB && VIDEO_DEV && I2C && VIDEO_OVCAMCHIP
|
||||
depends on USB && VIDEO_DEV && I2C
|
||||
select VIDEO_OVCAMCHIP
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on OV681 or
|
||||
Winbond W9967CF/W9968CF JPEG USB Dual Mode Camera Chips.
|
||||
|
@ -534,64 +481,14 @@ config USB_W9968CF
|
|||
resolutions and framerates, but cannot be included in the official
|
||||
Linux kernel for performance purposes.
|
||||
|
||||
See <file:Documentation/usb/w9968cf.txt> for more informations.
|
||||
|
||||
This driver uses the Video For Linux and the I2C APIs. It needs the
|
||||
OmniVision Camera Chip support as well. You must say Y or M to
|
||||
"Video For Linux", "I2C Support" and "OmniVision Camera Chip
|
||||
support" to use this driver.
|
||||
See <file:Documentation/video4linux/w9968cf.txt> for more info.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called w9968cf.
|
||||
|
||||
config USB_ZC0301
|
||||
tristate "USB ZC0301 Image Processor and Control Chip support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on the ZC0301
|
||||
Image Processor and Control Chip.
|
||||
source "drivers/media/video/zc0301/Kconfig"
|
||||
|
||||
See <file:Documentation/usb/zc0301.txt> for more informations.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" to use this driver.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called zc0301.
|
||||
|
||||
config USB_PWC
|
||||
tristate "USB Philips Cameras"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y or M here if you want to use one of these Philips & OEM
|
||||
webcams:
|
||||
* Philips PCA645, PCA646
|
||||
* Philips PCVC675, PCVC680, PCVC690
|
||||
* Philips PCVC720/40, PCVC730, PCVC740, PCVC750
|
||||
* Askey VC010
|
||||
* Logitech QuickCam Pro 3000, 4000, 'Zoom', 'Notebook Pro'
|
||||
and 'Orbit'/'Sphere'
|
||||
* Samsung MPC-C10, MPC-C30
|
||||
* Creative Webcam 5, Pro Ex
|
||||
* SOTEC Afina Eye
|
||||
* Visionite VCS-UC300, VCS-UM100
|
||||
|
||||
The PCA635, PCVC665 and PCVC720/20 are not supported by this driver
|
||||
and never will be, but the 665 and 720/20 are supported by other
|
||||
drivers.
|
||||
|
||||
See <file:Documentation/usb/philips.txt> for more information and
|
||||
installation instructions.
|
||||
|
||||
The built-in microphone is enabled by selecting USB Audio support.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" (under Character Devices) to use this driver.
|
||||
Information on this API and pointers to "v4l" programs may be found
|
||||
at <file:Documentation/video4linux/API.html>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pwc.
|
||||
source "drivers/media/video/pwc/Kconfig"
|
||||
|
||||
endmenu # V4L USB devices
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ obj-$(CONFIG_VIDEO_EM28XX) += tvp5150.o
|
|||
obj-$(CONFIG_VIDEO_MSP3400) += msp3400.o
|
||||
obj-$(CONFIG_VIDEO_CS53L32A) += cs53l32a.o
|
||||
obj-$(CONFIG_VIDEO_WM8775) += wm8775.o
|
||||
obj-$(CONFIG_VIDEO_WM8739) += wm8739.o
|
||||
obj-$(CONFIG_VIDEO_OVCAMCHIP) += ovcamchip/
|
||||
obj-$(CONFIG_VIDEO_CPIA2) += cpia2/
|
||||
obj-$(CONFIG_VIDEO_MXB) += saa7111.o tda9840.o tea6415c.o tea6420.o mxb.o
|
||||
|
@ -64,9 +65,8 @@ obj-$(CONFIG_VIDEO_M32R_AR_M64278) += arv.o
|
|||
obj-$(CONFIG_VIDEO_CX25840) += cx25840/
|
||||
obj-$(CONFIG_VIDEO_SAA711X) += saa7115.o
|
||||
obj-$(CONFIG_VIDEO_SAA7127) += saa7127.o
|
||||
|
||||
et61x251-objs := et61x251_core.o et61x251_tas5130d1b.o
|
||||
zc0301-objs := zc0301_core.o zc0301_pas202bcb.o
|
||||
obj-$(CONFIG_VIDEO_UPD64031A) += upd64031a.o
|
||||
obj-$(CONFIG_VIDEO_UPD64083) += upd64083.o
|
||||
|
||||
obj-$(CONFIG_USB_DABUSB) += dabusb.o
|
||||
obj-$(CONFIG_USB_DSBR) += dsbr100.o
|
||||
|
|
|
@ -973,12 +973,12 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||
For now this is sufficient. */
|
||||
switch (input) {
|
||||
case TVAUDIO_INPUT_RADIO:
|
||||
route.input = MSP_INPUT(MSP_IN_SCART_2, MSP_IN_TUNER_1,
|
||||
MSP_DSP_OUT_SCART, MSP_DSP_OUT_SCART);
|
||||
route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
|
||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
||||
break;
|
||||
case TVAUDIO_INPUT_EXTERN:
|
||||
route.input = MSP_INPUT(MSP_IN_SCART_1, MSP_IN_TUNER_1,
|
||||
MSP_DSP_OUT_SCART, MSP_DSP_OUT_SCART);
|
||||
route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
|
||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
||||
break;
|
||||
case TVAUDIO_INPUT_INTERN:
|
||||
/* Yes, this is the same input as for RADIO. I doubt
|
||||
|
@ -986,8 +986,8 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||
input is the BTTV_BOARD_AVERMEDIA98. I wonder how
|
||||
that was tested. My guess is that the whole INTERN
|
||||
input does not work. */
|
||||
route.input = MSP_INPUT(MSP_IN_SCART_2, MSP_IN_TUNER_1,
|
||||
MSP_DSP_OUT_SCART, MSP_DSP_OUT_SCART);
|
||||
route.input = MSP_INPUT(MSP_IN_SCART2, MSP_IN_TUNER1,
|
||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART);
|
||||
break;
|
||||
case TVAUDIO_INPUT_TUNER:
|
||||
default:
|
||||
|
@ -1023,14 +1023,11 @@ audio_input(struct bttv *btv, int input)
|
|||
static void
|
||||
i2c_vidiocschan(struct bttv *btv)
|
||||
{
|
||||
struct video_channel c;
|
||||
v4l2_std_id std = bttv_tvnorms[btv->tvnorm].v4l2_id;
|
||||
|
||||
memset(&c,0,sizeof(c));
|
||||
c.norm = btv->tvnorm;
|
||||
c.channel = btv->input;
|
||||
bttv_call_i2c_clients(btv,VIDIOCSCHAN,&c);
|
||||
bttv_call_i2c_clients(btv, VIDIOC_S_STD, &std);
|
||||
if (btv->c.type == BTTV_BOARD_VOODOOTV_FM)
|
||||
bttv_tda9880_setnorm(btv,c.norm);
|
||||
bttv_tda9880_setnorm(btv,btv->tvnorm);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -1184,11 +1181,27 @@ static int get_control(struct bttv *btv, struct v4l2_control *c)
|
|||
break;
|
||||
if (i == BTTV_CTLS)
|
||||
return -EINVAL;
|
||||
if (i >= 4 && i <= 8) {
|
||||
if (btv->audio_hook && i >= 4 && i <= 8) {
|
||||
memset(&va,0,sizeof(va));
|
||||
bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
|
||||
if (btv->audio_hook)
|
||||
btv->audio_hook(btv,&va,0);
|
||||
btv->audio_hook(btv,&va,0);
|
||||
switch (c->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
c->value = (VIDEO_AUDIO_MUTE & va.flags) ? 1 : 0;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
c->value = va.volume;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BALANCE:
|
||||
c->value = va.balance;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BASS:
|
||||
c->value = va.bass;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_TREBLE:
|
||||
c->value = va.treble;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
switch (c->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
|
@ -1205,19 +1218,11 @@ static int get_control(struct bttv *btv, struct v4l2_control *c)
|
|||
break;
|
||||
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
c->value = (VIDEO_AUDIO_MUTE & va.flags) ? 1 : 0;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
c->value = va.volume;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BALANCE:
|
||||
c->value = va.balance;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BASS:
|
||||
c->value = va.bass;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_TREBLE:
|
||||
c->value = va.treble;
|
||||
bttv_call_i2c_clients(btv,VIDIOC_G_CTRL,c);
|
||||
break;
|
||||
|
||||
case V4L2_CID_PRIVATE_CHROMA_AGC:
|
||||
|
@ -1269,11 +1274,35 @@ static int set_control(struct bttv *btv, struct v4l2_control *c)
|
|||
break;
|
||||
if (i == BTTV_CTLS)
|
||||
return -EINVAL;
|
||||
if (i >= 4 && i <= 8) {
|
||||
if (btv->audio_hook && i >= 4 && i <= 8) {
|
||||
memset(&va,0,sizeof(va));
|
||||
bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
|
||||
if (btv->audio_hook)
|
||||
btv->audio_hook(btv,&va,0);
|
||||
btv->audio_hook(btv,&va,0);
|
||||
switch (c->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
if (c->value) {
|
||||
va.flags |= VIDEO_AUDIO_MUTE;
|
||||
audio_mute(btv, 1);
|
||||
} else {
|
||||
va.flags &= ~VIDEO_AUDIO_MUTE;
|
||||
audio_mute(btv, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
va.volume = c->value;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BALANCE:
|
||||
va.balance = c->value;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BASS:
|
||||
va.bass = c->value;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_TREBLE:
|
||||
va.treble = c->value;
|
||||
break;
|
||||
}
|
||||
btv->audio_hook(btv,&va,1);
|
||||
return 0;
|
||||
}
|
||||
switch (c->id) {
|
||||
case V4L2_CID_BRIGHTNESS:
|
||||
|
@ -1289,26 +1318,13 @@ static int set_control(struct bttv *btv, struct v4l2_control *c)
|
|||
bt848_sat(btv,c->value);
|
||||
break;
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
if (c->value) {
|
||||
va.flags |= VIDEO_AUDIO_MUTE;
|
||||
audio_mute(btv, 1);
|
||||
} else {
|
||||
va.flags &= ~VIDEO_AUDIO_MUTE;
|
||||
audio_mute(btv, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
audio_mute(btv, c->value);
|
||||
/* fall through */
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
va.volume = c->value;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BALANCE:
|
||||
va.balance = c->value;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_BASS:
|
||||
va.bass = c->value;
|
||||
break;
|
||||
case V4L2_CID_AUDIO_TREBLE:
|
||||
va.treble = c->value;
|
||||
bttv_call_i2c_clients(btv,VIDIOC_S_CTRL,c);
|
||||
break;
|
||||
|
||||
case V4L2_CID_PRIVATE_CHROMA_AGC:
|
||||
|
@ -1364,11 +1380,6 @@ static int set_control(struct bttv *btv, struct v4l2_control *c)
|
|||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
if (i >= 4 && i <= 8) {
|
||||
bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
|
||||
if (btv->audio_hook)
|
||||
btv->audio_hook(btv,&va,1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1591,12 +1602,16 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
}
|
||||
case VIDIOCSFREQ:
|
||||
{
|
||||
unsigned long *freq = arg;
|
||||
struct v4l2_frequency freq;
|
||||
|
||||
memset(&freq, 0, sizeof(freq));
|
||||
freq.frequency = *(unsigned long *)arg;
|
||||
mutex_lock(&btv->lock);
|
||||
btv->freq=*freq;
|
||||
bttv_call_i2c_clients(btv,VIDIOCSFREQ,freq);
|
||||
freq.type = btv->radio_user ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
|
||||
btv->freq = *(unsigned long *)arg;
|
||||
bttv_call_i2c_clients(btv,VIDIOC_S_FREQUENCY,&freq);
|
||||
if (btv->has_matchbox && btv->radio_user)
|
||||
tea5757_set_freq(btv,*freq);
|
||||
tea5757_set_freq(btv,*(unsigned long *)arg);
|
||||
mutex_unlock(&btv->lock);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1827,33 +1842,26 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
return -EINVAL;
|
||||
mutex_lock(&btv->lock);
|
||||
memset(t,0,sizeof(*t));
|
||||
strcpy(t->name, "Television");
|
||||
t->type = V4L2_TUNER_ANALOG_TV;
|
||||
t->capability = V4L2_TUNER_CAP_NORM;
|
||||
t->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
bttv_call_i2c_clients(btv, VIDIOC_G_TUNER, t);
|
||||
strcpy(t->name, "Television");
|
||||
t->capability = V4L2_TUNER_CAP_NORM;
|
||||
t->type = V4L2_TUNER_ANALOG_TV;
|
||||
if (btread(BT848_DSTATUS)&BT848_DSTATUS_HLOC)
|
||||
t->signal = 0xffff;
|
||||
{
|
||||
struct video_tuner tuner;
|
||||
|
||||
memset(&tuner, 0, sizeof (tuner));
|
||||
tuner.rangehigh = 0xffffffffUL;
|
||||
bttv_call_i2c_clients(btv, VIDIOCGTUNER, &tuner);
|
||||
t->rangelow = tuner.rangelow;
|
||||
t->rangehigh = tuner.rangehigh;
|
||||
}
|
||||
{
|
||||
if (btv->audio_hook) {
|
||||
/* Hmmm ... */
|
||||
struct video_audio va;
|
||||
memset(&va, 0, sizeof(struct video_audio));
|
||||
bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
|
||||
if (btv->audio_hook)
|
||||
btv->audio_hook(btv,&va,0);
|
||||
btv->audio_hook(btv,&va,0);
|
||||
t->audmode = V4L2_TUNER_MODE_MONO;
|
||||
t->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
if(va.mode & VIDEO_SOUND_STEREO) {
|
||||
t->audmode = V4L2_TUNER_MODE_STEREO;
|
||||
t->rxsubchans |= V4L2_TUNER_SUB_STEREO;
|
||||
t->audmode = V4L2_TUNER_MODE_STEREO;
|
||||
t->rxsubchans = V4L2_TUNER_SUB_STEREO;
|
||||
}
|
||||
if(va.mode & VIDEO_SOUND_LANG1) {
|
||||
if(va.mode & VIDEO_SOUND_LANG2) {
|
||||
t->audmode = V4L2_TUNER_MODE_LANG1;
|
||||
t->rxsubchans = V4L2_TUNER_SUB_LANG1
|
||||
| V4L2_TUNER_SUB_LANG2;
|
||||
|
@ -1872,10 +1880,10 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
if (0 != t->index)
|
||||
return -EINVAL;
|
||||
mutex_lock(&btv->lock);
|
||||
{
|
||||
bttv_call_i2c_clients(btv, VIDIOC_S_TUNER, t);
|
||||
if (btv->audio_hook) {
|
||||
struct video_audio va;
|
||||
memset(&va, 0, sizeof(struct video_audio));
|
||||
bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
|
||||
if (t->audmode == V4L2_TUNER_MODE_MONO)
|
||||
va.mode = VIDEO_SOUND_MONO;
|
||||
else if (t->audmode == V4L2_TUNER_MODE_STEREO ||
|
||||
|
@ -1885,9 +1893,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
va.mode = VIDEO_SOUND_LANG1;
|
||||
else if (t->audmode == V4L2_TUNER_MODE_LANG2)
|
||||
va.mode = VIDEO_SOUND_LANG2;
|
||||
bttv_call_i2c_clients(btv, VIDIOCSAUDIO, &va);
|
||||
if (btv->audio_hook)
|
||||
btv->audio_hook(btv,&va,1);
|
||||
btv->audio_hook(btv,&va,1);
|
||||
}
|
||||
mutex_unlock(&btv->lock);
|
||||
return 0;
|
||||
|
@ -1912,7 +1918,7 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
return -EINVAL;
|
||||
mutex_lock(&btv->lock);
|
||||
btv->freq = f->frequency;
|
||||
bttv_call_i2c_clients(btv,VIDIOCSFREQ,&btv->freq);
|
||||
bttv_call_i2c_clients(btv,VIDIOC_S_FREQUENCY,f);
|
||||
if (btv->has_matchbox && btv->radio_user)
|
||||
tea5757_set_freq(btv,btv->freq);
|
||||
mutex_unlock(&btv->lock);
|
||||
|
@ -1920,7 +1926,9 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
}
|
||||
case VIDIOC_LOG_STATUS:
|
||||
{
|
||||
printk(KERN_INFO "bttv%d: ================= START STATUS CARD #%d =================\n", btv->c.nr, btv->c.nr);
|
||||
bttv_call_i2c_clients(btv, VIDIOC_LOG_STATUS, NULL);
|
||||
printk(KERN_INFO "bttv%d: ================== END STATUS CARD #%d ==================\n", btv->c.nr, btv->c.nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2870,12 +2878,10 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
|
|||
return 0;
|
||||
}
|
||||
*c = bttv_ctls[i];
|
||||
if (i >= 4 && i <= 8) {
|
||||
if (btv->audio_hook && i >= 4 && i <= 8) {
|
||||
struct video_audio va;
|
||||
memset(&va,0,sizeof(va));
|
||||
bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va);
|
||||
if (btv->audio_hook)
|
||||
btv->audio_hook(btv,&va,0);
|
||||
btv->audio_hook(btv,&va,0);
|
||||
switch (bttv_ctls[i].id) {
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
if (!(va.flags & VIDEO_AUDIO_VOLUME))
|
||||
|
|
|
@ -184,7 +184,7 @@ void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f)
|
|||
- tvnorm->vbistart[0];
|
||||
count1 = (s64) f->fmt.vbi.start[1] + f->fmt.vbi.count[1]
|
||||
- tvnorm->vbistart[1];
|
||||
count = clamp (max (count0, count1), 1LL, (s64) VBI_MAXLINES);
|
||||
count = clamp (max (count0, count1), (s64) 1, (s64) VBI_MAXLINES);
|
||||
|
||||
f->fmt.vbi.start[0] = tvnorm->vbistart[0];
|
||||
f->fmt.vbi.start[1] = tvnorm->vbistart[1];
|
||||
|
|
|
@ -64,14 +64,13 @@ MODULE_LICENSE("GPL");
|
|||
MODULE_SUPPORTED_DEVICE("video");
|
||||
#endif
|
||||
|
||||
static unsigned short colorspace_conv = 0;
|
||||
static unsigned short colorspace_conv;
|
||||
module_param(colorspace_conv, ushort, 0444);
|
||||
MODULE_PARM_DESC(colorspace_conv,
|
||||
"\n<n> Colorspace conversion:"
|
||||
"\n0 = disable"
|
||||
"\n1 = enable"
|
||||
"\nDefault value is 0"
|
||||
"\n");
|
||||
" Colorspace conversion:"
|
||||
"\n 0 = disable, 1 = enable"
|
||||
"\n Default value is 0"
|
||||
);
|
||||
|
||||
#define ABOUT "V4L-Driver for Vision CPiA based cameras"
|
||||
|
||||
|
@ -4042,7 +4041,7 @@ static int __init cpia_init(void)
|
|||
"allowed, it is disabled by default now. Users should fix the "
|
||||
"applications in case they don't work without conversion "
|
||||
"reenabled by setting the 'colorspace_conv' module "
|
||||
"parameter to 1");
|
||||
"parameter to 1\n");
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
proc_cpia_create();
|
||||
|
|
|
@ -456,7 +456,7 @@ int cpia2_init_camera(struct camera_data *cam);
|
|||
int cpia2_allocate_buffers(struct camera_data *cam);
|
||||
void cpia2_free_buffers(struct camera_data *cam);
|
||||
long cpia2_read(struct camera_data *cam,
|
||||
char *buf, unsigned long count, int noblock);
|
||||
char __user *buf, unsigned long count, int noblock);
|
||||
unsigned int cpia2_poll(struct camera_data *cam,
|
||||
struct file *filp, poll_table *wait);
|
||||
int cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma);
|
||||
|
|
|
@ -19,8 +19,9 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/cx25840.h>
|
||||
|
||||
#include "cx25840.h"
|
||||
#include "cx25840-core.h"
|
||||
|
||||
static int set_audclk_freq(struct i2c_client *client, u32 freq)
|
||||
{
|
||||
|
|
|
@ -32,8 +32,9 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/cx25840.h>
|
||||
|
||||
#include "cx25840.h"
|
||||
#include "cx25840-core.h"
|
||||
|
||||
MODULE_DESCRIPTION("Conexant CX25840 audio/video decoder driver");
|
||||
MODULE_AUTHOR("Ulf Eklund, Chris Kennedy, Hans Verkuil, Tyler Trafford");
|
||||
|
@ -668,6 +669,7 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
|
|||
{
|
||||
struct cx25840_state *state = i2c_get_clientdata(client);
|
||||
struct v4l2_tuner *vt = arg;
|
||||
struct v4l2_routing *route = arg;
|
||||
|
||||
switch (cmd) {
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
|
@ -749,19 +751,21 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
|
|||
state->radio = 1;
|
||||
break;
|
||||
|
||||
case VIDIOC_G_INPUT:
|
||||
*(int *)arg = state->vid_input;
|
||||
case VIDIOC_INT_G_VIDEO_ROUTING:
|
||||
route->input = state->vid_input;
|
||||
route->output = 0;
|
||||
break;
|
||||
|
||||
case VIDIOC_S_INPUT:
|
||||
return set_input(client, *(enum cx25840_video_input *)arg, state->aud_input);
|
||||
case VIDIOC_INT_S_VIDEO_ROUTING:
|
||||
return set_input(client, route->input, state->aud_input);
|
||||
|
||||
case VIDIOC_S_AUDIO:
|
||||
{
|
||||
struct v4l2_audio *input = arg;
|
||||
case VIDIOC_INT_G_AUDIO_ROUTING:
|
||||
route->input = state->aud_input;
|
||||
route->output = 0;
|
||||
break;
|
||||
|
||||
return set_input(client, state->vid_input, input->index);
|
||||
}
|
||||
case VIDIOC_INT_S_AUDIO_ROUTING:
|
||||
return set_input(client, state->vid_input, route->input);
|
||||
|
||||
case VIDIOC_S_FREQUENCY:
|
||||
input_change(client);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* cx25840 API header
|
||||
/* cx25840 internal API header
|
||||
*
|
||||
* Copyright (C) 2003-2004 Chris Kennedy
|
||||
*
|
||||
|
@ -17,8 +17,8 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _CX25840_H_
|
||||
#define _CX25840_H_
|
||||
#ifndef _CX25840_CORE_H_
|
||||
#define _CX25840_CORE_H_
|
||||
|
||||
|
||||
#include <linux/videodev2.h>
|
||||
|
@ -32,46 +32,6 @@
|
|||
providing this information. */
|
||||
#define CX25840_CID_ENABLE_PVR150_WORKAROUND (V4L2_CID_PRIVATE_BASE+0)
|
||||
|
||||
enum cx25840_video_input {
|
||||
/* Composite video inputs In1-In8 */
|
||||
CX25840_COMPOSITE1 = 1,
|
||||
CX25840_COMPOSITE2,
|
||||
CX25840_COMPOSITE3,
|
||||
CX25840_COMPOSITE4,
|
||||
CX25840_COMPOSITE5,
|
||||
CX25840_COMPOSITE6,
|
||||
CX25840_COMPOSITE7,
|
||||
CX25840_COMPOSITE8,
|
||||
|
||||
/* S-Video inputs consist of one luma input (In1-In4) ORed with one
|
||||
chroma input (In5-In8) */
|
||||
CX25840_SVIDEO_LUMA1 = 0x10,
|
||||
CX25840_SVIDEO_LUMA2 = 0x20,
|
||||
CX25840_SVIDEO_LUMA3 = 0x30,
|
||||
CX25840_SVIDEO_LUMA4 = 0x40,
|
||||
CX25840_SVIDEO_CHROMA4 = 0x400,
|
||||
CX25840_SVIDEO_CHROMA5 = 0x500,
|
||||
CX25840_SVIDEO_CHROMA6 = 0x600,
|
||||
CX25840_SVIDEO_CHROMA7 = 0x700,
|
||||
CX25840_SVIDEO_CHROMA8 = 0x800,
|
||||
|
||||
/* S-Video aliases for common luma/chroma combinations */
|
||||
CX25840_SVIDEO1 = 0x510,
|
||||
CX25840_SVIDEO2 = 0x620,
|
||||
CX25840_SVIDEO3 = 0x730,
|
||||
CX25840_SVIDEO4 = 0x840,
|
||||
};
|
||||
|
||||
enum cx25840_audio_input {
|
||||
/* Audio inputs: serial or In4-In8 */
|
||||
CX25840_AUDIO_SERIAL,
|
||||
CX25840_AUDIO4 = 4,
|
||||
CX25840_AUDIO5,
|
||||
CX25840_AUDIO6,
|
||||
CX25840_AUDIO7,
|
||||
CX25840_AUDIO8,
|
||||
};
|
||||
|
||||
struct cx25840_state {
|
||||
int pvr150_workaround;
|
||||
int radio;
|
|
@ -20,11 +20,22 @@
|
|||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/cx25840.h>
|
||||
|
||||
#include "cx25840.h"
|
||||
#include "cx25840-core.h"
|
||||
|
||||
#define FWFILE "v4l-cx25840.fw"
|
||||
#define FWSEND 1024
|
||||
|
||||
/*
|
||||
* Mike Isely <isely@pobox.com> - The FWSEND parameter controls the
|
||||
* size of the firmware chunks sent down the I2C bus to the chip.
|
||||
* Previously this had been set to 1024 but unfortunately some I2C
|
||||
* implementations can't transfer data in such big gulps.
|
||||
* Specifically, the pvrusb2 driver has a hard limit of around 60
|
||||
* bytes, due to the encapsulation there of I2C traffic into USB
|
||||
* messages. So we have to significantly reduce this parameter.
|
||||
*/
|
||||
#define FWSEND 48
|
||||
|
||||
#define FWDEV(x) &((x)->adapter->dev)
|
||||
|
||||
|
|
|
@ -19,8 +19,9 @@
|
|||
#include <linux/videodev2.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/cx25840.h>
|
||||
|
||||
#include "cx25840.h"
|
||||
#include "cx25840-core.h"
|
||||
|
||||
static int odd_parity(u8 c)
|
||||
{
|
||||
|
@ -151,7 +152,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
case VIDIOC_G_FMT:
|
||||
{
|
||||
static u16 lcr2vbi[] = {
|
||||
0, V4L2_SLICED_TELETEXT_PAL_B, 0, /* 1 */
|
||||
0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
|
||||
0, V4L2_SLICED_WSS_625, 0, /* 4 */
|
||||
V4L2_SLICED_CAPTION_525, /* 6 */
|
||||
0, 0, V4L2_SLICED_VPS, 0, 0, /* 9 */
|
||||
|
@ -231,7 +232,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
for (i = 7; i <= 23; i++) {
|
||||
for (x = 0; x <= 1; x++) {
|
||||
switch (svbi->service_lines[1-x][i]) {
|
||||
case V4L2_SLICED_TELETEXT_PAL_B:
|
||||
case V4L2_SLICED_TELETEXT_B:
|
||||
lcr[i] |= 1 << (4 * x);
|
||||
break;
|
||||
case V4L2_SLICED_WSS_625:
|
||||
|
@ -282,7 +283,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
|
||||
switch (id2) {
|
||||
case 1:
|
||||
id2 = V4L2_SLICED_TELETEXT_PAL_B;
|
||||
id2 = V4L2_SLICED_TELETEXT_B;
|
||||
break;
|
||||
case 4:
|
||||
id2 = V4L2_SLICED_WSS_625;
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
config VIDEO_CX88_VP3054
|
||||
tristate
|
||||
depends on VIDEO_CX88_DVB && DVB_MT352
|
||||
|
||||
config VIDEO_CX88
|
||||
tristate "Conexant 2388x (bt878 successor) support"
|
||||
depends on VIDEO_DEV && PCI && I2C
|
||||
|
@ -25,7 +29,7 @@ config VIDEO_CX88_ALSA
|
|||
|
||||
It only works with boards with function 01 enabled.
|
||||
To check if your board supports, use lspci -n.
|
||||
If supported, you should see 1471:8801 or 1471:8811
|
||||
If supported, you should see 14f1:8801 or 14f1:8811
|
||||
PCI device.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
|
@ -73,10 +77,11 @@ config VIDEO_CX88_DVB_MT352
|
|||
This adds DVB-T support for cards based on the
|
||||
Connexant 2388x chip and the MT352 demodulator.
|
||||
|
||||
config VIDEO_CX88_VP3054
|
||||
tristate "VP-3054 Secondary I2C Bus Support"
|
||||
default m
|
||||
depends on DVB_MT352
|
||||
config VIDEO_CX88_DVB_VP3054
|
||||
bool "VP-3054 Secondary I2C Bus Support"
|
||||
default y
|
||||
depends on VIDEO_CX88_DVB_MT352
|
||||
select VIDEO_CX88_VP3054
|
||||
---help---
|
||||
This adds DVB-T support for cards based on the
|
||||
Connexant 2388x chip and the MT352 demodulator,
|
||||
|
|
|
@ -151,8 +151,8 @@ struct em28xx_board em28xx_boards[] = {
|
|||
},{
|
||||
.type = EM28XX_VMUX_SVIDEO,
|
||||
.vmux = 2,
|
||||
.amux = MSP_INPUT(MSP_IN_SCART_1, MSP_IN_TUNER_1,
|
||||
MSP_DSP_OUT_SCART, MSP_DSP_OUT_SCART),
|
||||
.amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
|
||||
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
|
||||
}},
|
||||
},
|
||||
[EM2820_BOARD_MSI_VOX_USB_2] = {
|
||||
|
|
|
@ -222,7 +222,7 @@ static void video_mux(struct em28xx *dev, int index)
|
|||
if (dev->i2s_speed)
|
||||
em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed);
|
||||
route.input = dev->ctl_ainput;
|
||||
route.output = MSP_OUTPUT(MSP_OUT_SCART1_DA);
|
||||
route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
|
||||
/* Note: this is msp3400 specific */
|
||||
em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, &route);
|
||||
ainput = EM28XX_AUDIO_SRC_TUNER;
|
||||
|
@ -1141,26 +1141,16 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
|
|||
case VIDIOC_G_TUNER:
|
||||
{
|
||||
struct v4l2_tuner *t = arg;
|
||||
int status = 0;
|
||||
|
||||
if (0 != t->index)
|
||||
return -EINVAL;
|
||||
|
||||
memset(t, 0, sizeof(*t));
|
||||
strcpy(t->name, "Tuner");
|
||||
t->type = V4L2_TUNER_ANALOG_TV;
|
||||
t->capability = V4L2_TUNER_CAP_NORM;
|
||||
t->rangehigh = 0xffffffffUL; /* FIXME: set correct range */
|
||||
/* t->signal = 0xffff;*/
|
||||
/* em28xx_i2c_call_clients(dev,VIDIOC_G_TUNER,t);*/
|
||||
/* No way to get signal strength? */
|
||||
mutex_lock(&dev->lock);
|
||||
em28xx_i2c_call_clients(dev, DECODER_GET_STATUS,
|
||||
&status);
|
||||
/* let clients fill in the remainder of this struct */
|
||||
em28xx_i2c_call_clients(dev, cmd, t);
|
||||
mutex_unlock(&dev->lock);
|
||||
t->signal =
|
||||
(status & DECODER_STATUS_GOOD) != 0 ? 0xffff : 0;
|
||||
|
||||
em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal,
|
||||
t->afc);
|
||||
return 0;
|
||||
|
@ -1168,26 +1158,13 @@ static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
|
|||
case VIDIOC_S_TUNER:
|
||||
{
|
||||
struct v4l2_tuner *t = arg;
|
||||
int status = 0;
|
||||
|
||||
if (0 != t->index)
|
||||
return -EINVAL;
|
||||
memset(t, 0, sizeof(*t));
|
||||
strcpy(t->name, "Tuner");
|
||||
t->type = V4L2_TUNER_ANALOG_TV;
|
||||
t->capability = V4L2_TUNER_CAP_NORM;
|
||||
t->rangehigh = 0xffffffffUL; /* FIXME: set correct range */
|
||||
/* t->signal = 0xffff; */
|
||||
/* No way to get signal strength? */
|
||||
mutex_lock(&dev->lock);
|
||||
em28xx_i2c_call_clients(dev, DECODER_GET_STATUS,
|
||||
&status);
|
||||
/* let clients handle this */
|
||||
em28xx_i2c_call_clients(dev, cmd, t);
|
||||
mutex_unlock(&dev->lock);
|
||||
t->signal =
|
||||
(status & DECODER_STATUS_GOOD) != 0 ? 0xffff : 0;
|
||||
|
||||
em28xx_videodbg("VIDIO_S_TUNER: signal=%x, afc=%x\n",
|
||||
t->signal, t->afc);
|
||||
return 0;
|
||||
}
|
||||
case VIDIOC_G_FREQUENCY:
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
config USB_ET61X251
|
||||
tristate "USB ET61X[12]51 PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on Etoms ET61X151
|
||||
or ET61X251 PC Camera Controllers.
|
||||
|
||||
See <file:Documentation/video4linux/et61x251.txt> for more info.
|
||||
|
||||
This driver uses the Video For Linux API. You must say Y or M to
|
||||
"Video For Linux" to use this driver.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called et61x251.
|
|
@ -411,6 +411,9 @@ static int ir_probe(struct i2c_adapter *adap)
|
|||
case I2C_HW_B_BT848:
|
||||
probe = probe_bttv;
|
||||
break;
|
||||
case I2C_HW_B_CX2341X:
|
||||
probe = probe_bttv;
|
||||
break;
|
||||
case I2C_HW_SAA7134:
|
||||
probe = probe_saa7134;
|
||||
break;
|
||||
|
|
|
@ -279,20 +279,8 @@ void msp_set_scart(struct i2c_client *client, int in, int out)
|
|||
msp_write_dsp(client, 0x13, state->acb);
|
||||
|
||||
/* Sets I2S speed 0 = 1.024 Mbps, 1 = 2.048 Mbps */
|
||||
msp_write_dem(client, 0x40, state->i2s_mode);
|
||||
}
|
||||
|
||||
void msp_set_mute(struct i2c_client *client)
|
||||
{
|
||||
struct msp_state *state = i2c_get_clientdata(client);
|
||||
|
||||
v4l_dbg(1, msp_debug, client, "mute audio\n");
|
||||
msp_write_dsp(client, 0x0000, 0);
|
||||
msp_write_dsp(client, 0x0007, 1);
|
||||
if (state->has_scart2_out_volume)
|
||||
msp_write_dsp(client, 0x0040, 1);
|
||||
if (state->has_headphones)
|
||||
msp_write_dsp(client, 0x0006, 0);
|
||||
if (state->has_i2s_conf)
|
||||
msp_write_dem(client, 0x40, state->i2s_mode);
|
||||
}
|
||||
|
||||
void msp_set_audio(struct i2c_client *client)
|
||||
|
@ -300,17 +288,19 @@ void msp_set_audio(struct i2c_client *client)
|
|||
struct msp_state *state = i2c_get_clientdata(client);
|
||||
int bal = 0, bass, treble, loudness;
|
||||
int val = 0;
|
||||
int reallymuted = state->muted | state->scan_in_progress;
|
||||
|
||||
if (!state->muted)
|
||||
if (!reallymuted)
|
||||
val = (state->volume * 0x7f / 65535) << 8;
|
||||
|
||||
v4l_dbg(1, msp_debug, client, "mute=%s volume=%d\n",
|
||||
state->muted ? "on" : "off", state->volume);
|
||||
v4l_dbg(1, msp_debug, client, "mute=%s scanning=%s volume=%d\n",
|
||||
state->muted ? "on" : "off", state->scan_in_progress ? "yes" : "no",
|
||||
state->volume);
|
||||
|
||||
msp_write_dsp(client, 0x0000, val);
|
||||
msp_write_dsp(client, 0x0007, state->muted ? 0x1 : (val | 0x1));
|
||||
msp_write_dsp(client, 0x0007, reallymuted ? 0x1 : (val | 0x1));
|
||||
if (state->has_scart2_out_volume)
|
||||
msp_write_dsp(client, 0x0040, state->muted ? 0x1 : (val | 0x1));
|
||||
msp_write_dsp(client, 0x0040, reallymuted ? 0x1 : (val | 0x1));
|
||||
if (state->has_headphones)
|
||||
msp_write_dsp(client, 0x0006, val);
|
||||
if (!state->has_sound_processing)
|
||||
|
@ -346,7 +336,6 @@ static void msp_wake_thread(struct i2c_client *client)
|
|||
|
||||
if (NULL == state->kthread)
|
||||
return;
|
||||
msp_set_mute(client);
|
||||
state->watch_stereo = 0;
|
||||
state->restart = 1;
|
||||
wake_up_interruptible(&state->wq);
|
||||
|
@ -374,19 +363,15 @@ int msp_sleep(struct msp_state *state, int timeout)
|
|||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int msp_mode_v4l2_to_v4l1(int rxsubchans)
|
||||
static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode)
|
||||
{
|
||||
int mode = 0;
|
||||
|
||||
if (rxsubchans & V4L2_TUNER_SUB_STEREO)
|
||||
mode |= VIDEO_SOUND_STEREO;
|
||||
if (rxsubchans & V4L2_TUNER_SUB_LANG2)
|
||||
mode |= VIDEO_SOUND_LANG2 | VIDEO_SOUND_STEREO;
|
||||
if (rxsubchans & V4L2_TUNER_SUB_LANG1)
|
||||
mode |= VIDEO_SOUND_LANG1 | VIDEO_SOUND_STEREO;
|
||||
if (mode == 0)
|
||||
mode |= VIDEO_SOUND_MONO;
|
||||
return mode;
|
||||
if (rxsubchans == V4L2_TUNER_SUB_MONO)
|
||||
return VIDEO_SOUND_MONO;
|
||||
if (rxsubchans == V4L2_TUNER_SUB_STEREO)
|
||||
return VIDEO_SOUND_STEREO;
|
||||
if (audmode == V4L2_TUNER_MODE_LANG2)
|
||||
return VIDEO_SOUND_LANG2;
|
||||
return VIDEO_SOUND_LANG1;
|
||||
}
|
||||
|
||||
static int msp_mode_v4l1_to_v4l2(int mode)
|
||||
|
@ -605,7 +590,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
break;
|
||||
if (state->opmode == OPMODE_AUTOSELECT)
|
||||
msp_detect_stereo(client);
|
||||
va->mode = msp_mode_v4l2_to_v4l1(state->rxsubchans);
|
||||
va->mode = msp_mode_v4l2_to_v4l1(state->rxsubchans, state->audmode);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -620,7 +605,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
state->treble = va->treble;
|
||||
msp_set_audio(client);
|
||||
|
||||
if (va->mode != 0 && state->radio == 0) {
|
||||
if (va->mode != 0 && state->radio == 0 &&
|
||||
state->audmode != msp_mode_v4l1_to_v4l2(va->mode)) {
|
||||
state->audmode = msp_mode_v4l1_to_v4l2(va->mode);
|
||||
msp_set_audmode(client);
|
||||
}
|
||||
|
@ -687,21 +673,23 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
int sc_in = rt->input & 0x7;
|
||||
int sc1_out = rt->output & 0xf;
|
||||
int sc2_out = (rt->output >> 4) & 0xf;
|
||||
u16 val;
|
||||
u16 val, reg;
|
||||
|
||||
if (state->routing.input == rt->input &&
|
||||
state->routing.output == rt->output)
|
||||
break;
|
||||
state->routing = *rt;
|
||||
if (state->opmode == OPMODE_AUTOSELECT) {
|
||||
val = msp_read_dem(client, 0x30) & ~0x100;
|
||||
msp_write_dem(client, 0x30, val | (tuner ? 0x100 : 0));
|
||||
} else {
|
||||
val = msp_read_dem(client, 0xbb) & ~0x100;
|
||||
msp_write_dem(client, 0xbb, val | (tuner ? 0x100 : 0));
|
||||
}
|
||||
msp_set_scart(client, sc_in, 0);
|
||||
msp_set_scart(client, sc1_out, 1);
|
||||
msp_set_scart(client, sc2_out, 2);
|
||||
msp_set_audmode(client);
|
||||
msp_wake_thread(client);
|
||||
reg = (state->opmode == OPMODE_AUTOSELECT) ? 0x30 : 0xbb;
|
||||
val = msp_read_dem(client, reg);
|
||||
if (tuner != ((val >> 8) & 1)) {
|
||||
msp_write_dem(client, reg, (val & ~0x100) | (tuner << 8));
|
||||
/* wake thread when a new tuner input is chosen */
|
||||
msp_wake_thread(client);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -715,7 +703,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
msp_detect_stereo(client);
|
||||
vt->audmode = state->audmode;
|
||||
vt->rxsubchans = state->rxsubchans;
|
||||
vt->capability = V4L2_TUNER_CAP_STEREO |
|
||||
vt->capability |= V4L2_TUNER_CAP_STEREO |
|
||||
V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
|
||||
break;
|
||||
}
|
||||
|
@ -726,6 +714,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
|
||||
if (state->radio) /* TODO: add mono/stereo support for radio */
|
||||
break;
|
||||
if (state->audmode == vt->audmode)
|
||||
break;
|
||||
state->audmode = vt->audmode;
|
||||
/* only set audmode */
|
||||
msp_set_audmode(client);
|
||||
|
@ -887,7 +877,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
|
|||
|
||||
memset(state, 0, sizeof(*state));
|
||||
state->v4l2_std = V4L2_STD_NTSC;
|
||||
state->audmode = V4L2_TUNER_MODE_LANG1;
|
||||
state->audmode = V4L2_TUNER_MODE_STEREO;
|
||||
state->volume = 58880; /* 0db gain */
|
||||
state->balance = 32768; /* 0db gain */
|
||||
state->bass = 32768;
|
||||
|
@ -931,13 +921,16 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind)
|
|||
state->has_radio = msp_revision >= 'G';
|
||||
/* Has headphones output: not for stripped down products */
|
||||
state->has_headphones = msp_prod_lo < 5;
|
||||
/* Has scart2 input: not in stripped down products of the '3' family */
|
||||
state->has_scart2 = msp_family >= 4 || msp_prod_lo < 7;
|
||||
/* Has scart3 input: not in stripped down products of the '3' family */
|
||||
state->has_scart3 = msp_family >= 4 || msp_prod_lo < 5;
|
||||
/* Has scart4 input: not in pre D revisions, not in stripped D revs */
|
||||
state->has_scart4 = msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5);
|
||||
/* Has scart2 and scart3 inputs and scart2 output: not in stripped
|
||||
down products of the '3' family */
|
||||
state->has_scart23_in_scart2_out = msp_family >= 4 || msp_prod_lo < 5;
|
||||
/* Has scart2 output: not in stripped down products of the '3' family */
|
||||
state->has_scart2_out = msp_family >= 4 || msp_prod_lo < 5;
|
||||
/* Has scart2 a volume control? Not in pre-D revisions. */
|
||||
state->has_scart2_out_volume = msp_revision > 'C' && state->has_scart23_in_scart2_out;
|
||||
state->has_scart2_out_volume = msp_revision > 'C' && state->has_scart2_out;
|
||||
/* Has a configurable i2s out? */
|
||||
state->has_i2s_conf = msp_revision >= 'G' && msp_prod_lo < 7;
|
||||
/* Has subwoofer output: not in pre-D revs and not in stripped down products */
|
||||
|
|
|
@ -54,8 +54,10 @@ struct msp_state {
|
|||
u8 has_radio;
|
||||
u8 has_headphones;
|
||||
u8 has_ntsc_jp_d_k3;
|
||||
u8 has_scart2;
|
||||
u8 has_scart3;
|
||||
u8 has_scart4;
|
||||
u8 has_scart23_in_scart2_out;
|
||||
u8 has_scart2_out;
|
||||
u8 has_scart2_out_volume;
|
||||
u8 has_i2s_conf;
|
||||
u8 has_subwoofer;
|
||||
|
@ -83,6 +85,7 @@ struct msp_state {
|
|||
int volume, muted;
|
||||
int balance, loudness;
|
||||
int bass, treble;
|
||||
int scan_in_progress;
|
||||
|
||||
/* thread */
|
||||
struct task_struct *kthread;
|
||||
|
@ -98,7 +101,6 @@ int msp_read_dem(struct i2c_client *client, int addr);
|
|||
int msp_read_dsp(struct i2c_client *client, int addr);
|
||||
int msp_reset(struct i2c_client *client);
|
||||
void msp_set_scart(struct i2c_client *client, int in, int out);
|
||||
void msp_set_mute(struct i2c_client *client);
|
||||
void msp_set_audio(struct i2c_client *client);
|
||||
int msp_sleep(struct msp_state *state, int timeout);
|
||||
|
||||
|
|
|
@ -170,7 +170,7 @@ static void msp_set_source(struct i2c_client *client, u16 src)
|
|||
msp_write_dsp(client, 0x000a, src);
|
||||
msp_write_dsp(client, 0x000b, src);
|
||||
msp_write_dsp(client, 0x000c, src);
|
||||
if (state->has_scart23_in_scart2_out)
|
||||
if (state->has_scart2_out)
|
||||
msp_write_dsp(client, 0x0041, src);
|
||||
}
|
||||
|
||||
|
@ -228,6 +228,7 @@ static void msp3400c_set_audmode(struct i2c_client *client)
|
|||
char *modestr = (state->audmode >= 0 && state->audmode < 5) ?
|
||||
strmode[state->audmode] : "unknown";
|
||||
int src = 0; /* channel source: FM/AM, nicam or SCART */
|
||||
int audmode = state->audmode;
|
||||
|
||||
if (state->opmode == OPMODE_AUTOSELECT) {
|
||||
/* this method would break everything, let's make sure
|
||||
|
@ -239,11 +240,29 @@ static void msp3400c_set_audmode(struct i2c_client *client)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Note: for the C and D revs no NTSC stereo + SAP is possible as
|
||||
the hardware does not support SAP. So the rxsubchans combination
|
||||
of STEREO | LANG2 does not occur. */
|
||||
|
||||
/* switch to mono if only mono is available */
|
||||
if (state->rxsubchans == V4L2_TUNER_SUB_MONO)
|
||||
audmode = V4L2_TUNER_MODE_MONO;
|
||||
/* if bilingual */
|
||||
else if (state->rxsubchans & V4L2_TUNER_SUB_LANG2) {
|
||||
/* and mono or stereo, then fallback to lang1 */
|
||||
if (audmode == V4L2_TUNER_MODE_MONO ||
|
||||
audmode == V4L2_TUNER_MODE_STEREO)
|
||||
audmode = V4L2_TUNER_MODE_LANG1;
|
||||
}
|
||||
/* if stereo, and audmode is not mono, then switch to stereo */
|
||||
else if (audmode != V4L2_TUNER_MODE_MONO)
|
||||
audmode = V4L2_TUNER_MODE_STEREO;
|
||||
|
||||
/* switch demodulator */
|
||||
switch (state->mode) {
|
||||
case MSP_MODE_FM_TERRA:
|
||||
v4l_dbg(1, msp_debug, client, "FM set_audmode: %s\n", modestr);
|
||||
switch (state->audmode) {
|
||||
switch (audmode) {
|
||||
case V4L2_TUNER_MODE_STEREO:
|
||||
msp_write_dsp(client, 0x000e, 0x3001);
|
||||
break;
|
||||
|
@ -257,7 +276,7 @@ static void msp3400c_set_audmode(struct i2c_client *client)
|
|||
break;
|
||||
case MSP_MODE_FM_SAT:
|
||||
v4l_dbg(1, msp_debug, client, "SAT set_audmode: %s\n", modestr);
|
||||
switch (state->audmode) {
|
||||
switch (audmode) {
|
||||
case V4L2_TUNER_MODE_MONO:
|
||||
msp3400c_set_carrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5));
|
||||
break;
|
||||
|
@ -296,7 +315,8 @@ static void msp3400c_set_audmode(struct i2c_client *client)
|
|||
}
|
||||
|
||||
/* switch audio */
|
||||
switch (state->audmode) {
|
||||
v4l_dbg(1, msp_debug, client, "set audmode %d\n", audmode);
|
||||
switch (audmode) {
|
||||
case V4L2_TUNER_MODE_STEREO:
|
||||
case V4L2_TUNER_MODE_LANG1_LANG2:
|
||||
src |= 0x0020;
|
||||
|
@ -314,10 +334,6 @@ static void msp3400c_set_audmode(struct i2c_client *client)
|
|||
src = 0x0030;
|
||||
break;
|
||||
case V4L2_TUNER_MODE_LANG1:
|
||||
/* switch to stereo for stereo transmission, otherwise
|
||||
keep first language */
|
||||
if (state->rxsubchans & V4L2_TUNER_SUB_STEREO)
|
||||
src |= 0x0020;
|
||||
break;
|
||||
case V4L2_TUNER_MODE_LANG2:
|
||||
src |= 0x0010;
|
||||
|
@ -367,7 +383,7 @@ static int msp3400c_detect_stereo(struct i2c_client *client)
|
|||
if (val > 32767)
|
||||
val -= 65536;
|
||||
v4l_dbg(2, msp_debug, client, "stereo detect register: %d\n", val);
|
||||
if (val > 4096) {
|
||||
if (val > 8192) {
|
||||
rxsubchans = V4L2_TUNER_SUB_STEREO;
|
||||
} else if (val < -4096) {
|
||||
rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
|
||||
|
@ -464,19 +480,22 @@ int msp3400c_thread(void *data)
|
|||
if (state->radio || MSP_MODE_EXTERN == state->mode) {
|
||||
/* no carrier scan, just unmute */
|
||||
v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n");
|
||||
state->scan_in_progress = 0;
|
||||
msp_set_audio(client);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* mute */
|
||||
msp_set_mute(client);
|
||||
/* mute audio */
|
||||
state->scan_in_progress = 1;
|
||||
msp_set_audio(client);
|
||||
|
||||
msp3400c_set_mode(client, MSP_MODE_AM_DETECT);
|
||||
val1 = val2 = 0;
|
||||
max1 = max2 = -1;
|
||||
state->watch_stereo = 0;
|
||||
state->nicam_on = 0;
|
||||
|
||||
/* some time for the tuner to sync */
|
||||
/* wait for tuner to settle down after a channel change */
|
||||
if (msp_sleep(state, 200))
|
||||
goto restart;
|
||||
|
||||
|
@ -552,7 +571,6 @@ int msp3400c_thread(void *data)
|
|||
/* B/G NICAM */
|
||||
state->second = msp3400c_carrier_detect_55[max2].cdo;
|
||||
msp3400c_set_mode(client, MSP_MODE_FM_NICAM1);
|
||||
msp3400c_set_carrier(client, state->second, state->main);
|
||||
state->nicam_on = 1;
|
||||
state->watch_stereo = 1;
|
||||
} else {
|
||||
|
@ -563,7 +581,6 @@ int msp3400c_thread(void *data)
|
|||
/* PAL I NICAM */
|
||||
state->second = MSP_CARRIER(6.552);
|
||||
msp3400c_set_mode(client, MSP_MODE_FM_NICAM2);
|
||||
msp3400c_set_carrier(client, state->second, state->main);
|
||||
state->nicam_on = 1;
|
||||
state->watch_stereo = 1;
|
||||
break;
|
||||
|
@ -577,13 +594,11 @@ int msp3400c_thread(void *data)
|
|||
/* L NICAM or AM-mono */
|
||||
state->second = msp3400c_carrier_detect_65[max2].cdo;
|
||||
msp3400c_set_mode(client, MSP_MODE_AM_NICAM);
|
||||
msp3400c_set_carrier(client, state->second, state->main);
|
||||
state->watch_stereo = 1;
|
||||
} else if (max2 == 0 && state->has_nicam) {
|
||||
/* D/K NICAM */
|
||||
state->second = msp3400c_carrier_detect_65[max2].cdo;
|
||||
msp3400c_set_mode(client, MSP_MODE_FM_NICAM1);
|
||||
msp3400c_set_carrier(client, state->second, state->main);
|
||||
state->nicam_on = 1;
|
||||
state->watch_stereo = 1;
|
||||
} else {
|
||||
|
@ -595,25 +610,25 @@ int msp3400c_thread(void *data)
|
|||
no_second:
|
||||
state->second = msp3400c_carrier_detect_main[max1].cdo;
|
||||
msp3400c_set_mode(client, MSP_MODE_FM_TERRA);
|
||||
msp3400c_set_carrier(client, state->second, state->main);
|
||||
state->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
break;
|
||||
}
|
||||
msp3400c_set_carrier(client, state->second, state->main);
|
||||
|
||||
/* unmute */
|
||||
msp_set_audio(client);
|
||||
state->scan_in_progress = 0;
|
||||
msp3400c_set_audmode(client);
|
||||
msp_set_audio(client);
|
||||
|
||||
if (msp_debug)
|
||||
msp3400c_print_mode(client);
|
||||
|
||||
/* monitor tv audio mode, the first time don't wait
|
||||
so long to get a quick stereo/bilingual result */
|
||||
if (msp_sleep(state, 1000))
|
||||
goto restart;
|
||||
count = 3;
|
||||
while (state->watch_stereo) {
|
||||
if (msp_sleep(state, 5000))
|
||||
if (msp_sleep(state, count ? 1000 : 5000))
|
||||
goto restart;
|
||||
if (count) count--;
|
||||
watch_stereo(client);
|
||||
}
|
||||
}
|
||||
|
@ -626,7 +641,7 @@ int msp3410d_thread(void *data)
|
|||
{
|
||||
struct i2c_client *client = data;
|
||||
struct msp_state *state = i2c_get_clientdata(client);
|
||||
int val, i, std;
|
||||
int val, i, std, count;
|
||||
|
||||
v4l_dbg(1, msp_debug, client, "msp3410 daemon started\n");
|
||||
|
||||
|
@ -644,16 +659,14 @@ int msp3410d_thread(void *data)
|
|||
if (state->mode == MSP_MODE_EXTERN) {
|
||||
/* no carrier scan needed, just unmute */
|
||||
v4l_dbg(1, msp_debug, client, "thread: no carrier scan\n");
|
||||
state->scan_in_progress = 0;
|
||||
msp_set_audio(client);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* put into sane state (and mute) */
|
||||
msp_reset(client);
|
||||
|
||||
/* some time for the tuner to sync */
|
||||
if (msp_sleep(state,200))
|
||||
goto restart;
|
||||
/* mute audio */
|
||||
state->scan_in_progress = 1;
|
||||
msp_set_audio(client);
|
||||
|
||||
/* start autodetect. Note: autodetect is not supported for
|
||||
NTSC-M and radio, hence we force the standard in those cases. */
|
||||
|
@ -664,6 +677,10 @@ int msp3410d_thread(void *data)
|
|||
state->watch_stereo = 0;
|
||||
state->nicam_on = 0;
|
||||
|
||||
/* wait for tuner to settle down after a channel change */
|
||||
if (msp_sleep(state, 200))
|
||||
goto restart;
|
||||
|
||||
if (msp_debug)
|
||||
v4l_dbg(2, msp_debug, client, "setting standard: %s (0x%04x)\n",
|
||||
msp_standard_std_name(std), std);
|
||||
|
@ -693,6 +710,7 @@ int msp3410d_thread(void *data)
|
|||
state->main = msp_stdlist[i].main;
|
||||
state->second = msp_stdlist[i].second;
|
||||
state->std = val;
|
||||
state->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
|
||||
if (msp_amsound && !state->radio && (state->v4l2_std & V4L2_STD_SECAM) &&
|
||||
(val != 0x0009)) {
|
||||
|
@ -714,20 +732,17 @@ int msp3410d_thread(void *data)
|
|||
else
|
||||
state->mode = MSP_MODE_FM_NICAM1;
|
||||
/* just turn on stereo */
|
||||
state->rxsubchans = V4L2_TUNER_SUB_STEREO;
|
||||
state->nicam_on = 1;
|
||||
state->watch_stereo = 1;
|
||||
break;
|
||||
case 0x0009:
|
||||
state->mode = MSP_MODE_AM_NICAM;
|
||||
state->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
state->nicam_on = 1;
|
||||
state->watch_stereo = 1;
|
||||
break;
|
||||
case 0x0020: /* BTSC */
|
||||
/* The pre-'G' models only have BTSC-mono */
|
||||
state->mode = MSP_MODE_BTSC;
|
||||
state->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
break;
|
||||
case 0x0040: /* FM radio */
|
||||
state->mode = MSP_MODE_FM_RADIO;
|
||||
|
@ -737,15 +752,12 @@ int msp3410d_thread(void *data)
|
|||
msp3400c_set_mode(client, MSP_MODE_FM_RADIO);
|
||||
msp3400c_set_carrier(client, MSP_CARRIER(10.7),
|
||||
MSP_CARRIER(10.7));
|
||||
/* scart routing (this doesn't belong here I think) */
|
||||
msp_set_scart(client,SCART_IN2,0);
|
||||
break;
|
||||
case 0x0002:
|
||||
case 0x0003:
|
||||
case 0x0004:
|
||||
case 0x0005:
|
||||
state->mode = MSP_MODE_FM_TERRA;
|
||||
state->rxsubchans = V4L2_TUNER_SUB_MONO;
|
||||
state->watch_stereo = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -759,20 +771,19 @@ int msp3410d_thread(void *data)
|
|||
if (state->has_i2s_conf)
|
||||
msp_write_dem(client, 0x40, state->i2s_mode);
|
||||
|
||||
/* unmute, restore misc registers */
|
||||
msp_set_audio(client);
|
||||
|
||||
msp_write_dsp(client, 0x13, state->acb);
|
||||
/* unmute */
|
||||
msp3400c_set_audmode(client);
|
||||
state->scan_in_progress = 0;
|
||||
msp_set_audio(client);
|
||||
|
||||
/* monitor tv audio mode, the first time don't wait
|
||||
so long to get a quick stereo/bilingual result */
|
||||
if (msp_sleep(state, 1000))
|
||||
goto restart;
|
||||
count = 3;
|
||||
while (state->watch_stereo) {
|
||||
watch_stereo(client);
|
||||
if (msp_sleep(state, 5000))
|
||||
if (msp_sleep(state, count ? 1000 : 5000))
|
||||
goto restart;
|
||||
if (count) count--;
|
||||
watch_stereo(client);
|
||||
}
|
||||
}
|
||||
v4l_dbg(1, msp_debug, client, "thread: exit\n");
|
||||
|
@ -829,27 +840,27 @@ static void msp34xxg_set_source(struct i2c_client *client, u16 reg, int in)
|
|||
source = 0; /* mono only */
|
||||
matrix = 0x30;
|
||||
break;
|
||||
case V4L2_TUNER_MODE_LANG1:
|
||||
source = 3; /* stereo or A */
|
||||
matrix = 0x00;
|
||||
break;
|
||||
case V4L2_TUNER_MODE_LANG2:
|
||||
source = 4; /* stereo or B */
|
||||
matrix = 0x10;
|
||||
break;
|
||||
case V4L2_TUNER_MODE_STEREO:
|
||||
case V4L2_TUNER_MODE_LANG1_LANG2:
|
||||
default:
|
||||
source = 1; /* stereo or A|B */
|
||||
matrix = 0x20;
|
||||
break;
|
||||
case V4L2_TUNER_MODE_STEREO:
|
||||
case V4L2_TUNER_MODE_LANG1:
|
||||
default:
|
||||
source = 3; /* stereo or A */
|
||||
matrix = 0x00;
|
||||
break;
|
||||
}
|
||||
|
||||
if (in == MSP_DSP_OUT_TUNER)
|
||||
if (in == MSP_DSP_IN_TUNER)
|
||||
source = (source << 8) | 0x20;
|
||||
/* the msp34x2g puts the MAIN_AVC, MAIN and AUX sources in 12, 13, 14
|
||||
instead of 11, 12, 13. So we add one for that msp version. */
|
||||
else if (in >= MSP_DSP_OUT_MAIN_AVC && state->has_dolby_pro_logic)
|
||||
else if (in >= MSP_DSP_IN_MAIN_AVC && state->has_dolby_pro_logic)
|
||||
source = ((in + 1) << 8) | matrix;
|
||||
else
|
||||
source = (in << 8) | matrix;
|
||||
|
@ -869,7 +880,7 @@ static void msp34xxg_set_sources(struct i2c_client *client)
|
|||
msp34xxg_set_source(client, 0x000c, (in >> 4) & 0xf);
|
||||
msp34xxg_set_source(client, 0x0009, (in >> 8) & 0xf);
|
||||
msp34xxg_set_source(client, 0x000a, (in >> 12) & 0xf);
|
||||
if (state->has_scart23_in_scart2_out)
|
||||
if (state->has_scart2_out)
|
||||
msp34xxg_set_source(client, 0x0041, (in >> 16) & 0xf);
|
||||
msp34xxg_set_source(client, 0x000b, (in >> 20) & 0xf);
|
||||
}
|
||||
|
@ -887,10 +898,6 @@ static void msp34xxg_reset(struct i2c_client *client)
|
|||
|
||||
msp_reset(client);
|
||||
|
||||
/* make sure that input/output is muted (paranoid mode) */
|
||||
/* ACB, mute DSP input, mute SCART 1 */
|
||||
msp_write_dsp(client, 0x13, 0x0f20);
|
||||
|
||||
if (state->has_i2s_conf)
|
||||
msp_write_dem(client, 0x40, state->i2s_mode);
|
||||
|
||||
|
@ -1028,7 +1035,7 @@ static void msp34xxg_set_audmode(struct i2c_client *client)
|
|||
|
||||
if (state->std == 0x20) {
|
||||
if ((state->rxsubchans & V4L2_TUNER_SUB_SAP) &&
|
||||
(state->audmode == V4L2_TUNER_MODE_STEREO ||
|
||||
(state->audmode == V4L2_TUNER_MODE_LANG1_LANG2 ||
|
||||
state->audmode == V4L2_TUNER_MODE_LANG2)) {
|
||||
msp_write_dem(client, 0x20, 0x21);
|
||||
} else {
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
config USB_PWC
|
||||
tristate "USB Philips Cameras"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y or M here if you want to use one of these Philips & OEM
|
||||
webcams:
|
||||
* Philips PCA645, PCA646
|
||||
* Philips PCVC675, PCVC680, PCVC690
|
||||
* Philips PCVC720/40, PCVC730, PCVC740, PCVC750
|
||||
* Askey VC010
|
||||
* Logitech QuickCam Pro 3000, 4000, 'Zoom', 'Notebook Pro'
|
||||
and 'Orbit'/'Sphere'
|
||||
* Samsung MPC-C10, MPC-C30
|
||||
* Creative Webcam 5, Pro Ex
|
||||
* SOTEC Afina Eye
|
||||
* Visionite VCS-UC300, VCS-UM100
|
||||
|
||||
The PCA635, PCVC665 and PCVC720/20 are not supported by this driver
|
||||
and never will be, but the 665 and 720/20 are supported by other
|
||||
drivers.
|
||||
|
||||
See <file:Documentation/usb/philips.txt> for more information and
|
||||
installation instructions.
|
||||
|
||||
The built-in microphone is enabled by selecting USB Audio support.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pwc.
|
|
@ -40,6 +40,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/saa7115.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
MODULE_DESCRIPTION("Philips SAA7113/SAA7114/SAA7115 video decoder driver");
|
||||
|
@ -53,7 +54,7 @@ module_param(debug, bool, 0644);
|
|||
MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
||||
|
||||
static unsigned short normal_i2c[] = {
|
||||
0x4a >>1, 0x48 >>1, /* SAA7113 */
|
||||
0x4a >> 1, 0x48 >> 1, /* SAA7113 */
|
||||
0x42 >> 1, 0x40 >> 1, /* SAA7114 and SAA7115 */
|
||||
I2C_CLIENT_END };
|
||||
|
||||
|
@ -722,16 +723,16 @@ static void saa7115_set_v4lstd(struct i2c_client *client, v4l2_std_id std)
|
|||
100 reserved NTSC-Japan (3.58MHz)
|
||||
*/
|
||||
if (state->ident == V4L2_IDENT_SAA7113) {
|
||||
u8 reg = saa7115_read(client, 0x0e) & 0x8f;
|
||||
u8 reg = saa7115_read(client, 0x0e) & 0x8f;
|
||||
|
||||
if (std == V4L2_STD_PAL_M) {
|
||||
reg|=0x30;
|
||||
reg |= 0x30;
|
||||
} else if (std == V4L2_STD_PAL_N) {
|
||||
reg|=0x20;
|
||||
reg |= 0x20;
|
||||
} else if (std == V4L2_STD_PAL_60) {
|
||||
reg|=0x10;
|
||||
reg |= 0x10;
|
||||
} else if (std == V4L2_STD_NTSC_M_JP) {
|
||||
reg|=0x40;
|
||||
reg |= 0x40;
|
||||
}
|
||||
saa7115_write(client, 0x0e, reg);
|
||||
}
|
||||
|
@ -811,7 +812,7 @@ static void saa7115_set_lcr(struct i2c_client *client, struct v4l2_sliced_vbi_fo
|
|||
u8 lcr[24];
|
||||
int i, x;
|
||||
|
||||
/* saa7113/71144 doesn't yet support VBI */
|
||||
/* saa7113/7114 doesn't yet support VBI */
|
||||
if (state->ident != V4L2_IDENT_SAA7115)
|
||||
return;
|
||||
|
||||
|
@ -851,7 +852,7 @@ static void saa7115_set_lcr(struct i2c_client *client, struct v4l2_sliced_vbi_fo
|
|||
case 0:
|
||||
lcr[i] |= 0xf << (4 * x);
|
||||
break;
|
||||
case V4L2_SLICED_TELETEXT_PAL_B:
|
||||
case V4L2_SLICED_TELETEXT_B:
|
||||
lcr[i] |= 1 << (4 * x);
|
||||
break;
|
||||
case V4L2_SLICED_CAPTION_525:
|
||||
|
@ -880,7 +881,7 @@ static void saa7115_set_lcr(struct i2c_client *client, struct v4l2_sliced_vbi_fo
|
|||
static int saa7115_get_v4lfmt(struct i2c_client *client, struct v4l2_format *fmt)
|
||||
{
|
||||
static u16 lcr2vbi[] = {
|
||||
0, V4L2_SLICED_TELETEXT_PAL_B, 0, /* 1 */
|
||||
0, V4L2_SLICED_TELETEXT_B, 0, /* 1 */
|
||||
0, V4L2_SLICED_CAPTION_525, /* 4 */
|
||||
V4L2_SLICED_WSS_625, 0, /* 5 */
|
||||
V4L2_SLICED_VPS, 0, 0, 0, 0, /* 7 */
|
||||
|
@ -1045,7 +1046,7 @@ static void saa7115_decode_vbi_line(struct i2c_client *client,
|
|||
/* decode payloads */
|
||||
switch (id2) {
|
||||
case 1:
|
||||
vbi->type = V4L2_SLICED_TELETEXT_PAL_B;
|
||||
vbi->type = V4L2_SLICED_TELETEXT_B;
|
||||
break;
|
||||
case 4:
|
||||
if (!saa7115_odd_parity(p[0]) || !saa7115_odd_parity(p[1]))
|
||||
|
@ -1180,6 +1181,46 @@ static int saa7115_command(struct i2c_client *client, unsigned int cmd, void *ar
|
|||
state->radio = 1;
|
||||
break;
|
||||
|
||||
case VIDIOC_INT_G_VIDEO_ROUTING:
|
||||
{
|
||||
struct v4l2_routing *route = arg;
|
||||
|
||||
route->input = state->input;
|
||||
route->output = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_INT_S_VIDEO_ROUTING:
|
||||
{
|
||||
struct v4l2_routing *route = arg;
|
||||
|
||||
v4l_dbg(1, debug, client, "decoder set input %d\n", route->input);
|
||||
/* saa7113 does not have these inputs */
|
||||
if (state->ident == V4L2_IDENT_SAA7113 &&
|
||||
(route->input == SAA7115_COMPOSITE4 ||
|
||||
route->input == SAA7115_COMPOSITE5)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
if (route->input > SAA7115_SVIDEO3)
|
||||
return -EINVAL;
|
||||
if (state->input == route->input)
|
||||
break;
|
||||
v4l_dbg(1, debug, client, "now setting %s input\n",
|
||||
(route->input >= SAA7115_SVIDEO0) ? "S-Video" : "Composite");
|
||||
state->input = route->input;
|
||||
|
||||
/* select mode */
|
||||
saa7115_write(client, 0x02,
|
||||
(saa7115_read(client, 0x02) & 0xf0) |
|
||||
state->input);
|
||||
|
||||
/* bypass chrominance trap for S-Video modes */
|
||||
saa7115_write(client, 0x09,
|
||||
(saa7115_read(client, 0x09) & 0x7f) |
|
||||
(state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_G_INPUT:
|
||||
*(int *)arg = state->input;
|
||||
break;
|
||||
|
@ -1321,7 +1362,7 @@ static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind)
|
|||
|
||||
saa7115_write(client, 0, 5);
|
||||
chip_id = saa7115_read(client, 0) & 0x0f;
|
||||
if (chip_id <3 && chip_id > 5) {
|
||||
if (chip_id < 3 && chip_id > 5) {
|
||||
v4l_dbg(1, debug, client, "saa7115 not found\n");
|
||||
kfree(client);
|
||||
return 0;
|
||||
|
@ -1360,7 +1401,7 @@ static int saa7115_attach(struct i2c_adapter *adapter, int address, int kind)
|
|||
v4l_dbg(1, debug, client, "writing init values\n");
|
||||
|
||||
/* init to 60hz/48khz */
|
||||
if (state->ident==V4L2_IDENT_SAA7113)
|
||||
if (state->ident == V4L2_IDENT_SAA7113)
|
||||
saa7115_writeregs(client, saa7113_init_auto_input);
|
||||
else
|
||||
saa7115_writeregs(client, saa7115_init_auto_input);
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/saa7127.h>
|
||||
|
||||
static int debug = 0;
|
||||
static int test_image = 0;
|
||||
|
@ -222,22 +223,6 @@ static struct i2c_reg_value saa7127_init_config_50hz[] = {
|
|||
{ 0, 0 }
|
||||
};
|
||||
|
||||
/* Enumeration for the Supported input types */
|
||||
enum saa7127_input_type {
|
||||
SAA7127_INPUT_TYPE_NORMAL,
|
||||
SAA7127_INPUT_TYPE_TEST_IMAGE
|
||||
};
|
||||
|
||||
/* Enumeration for the Supported Output signal types */
|
||||
enum saa7127_output_type {
|
||||
SAA7127_OUTPUT_TYPE_BOTH,
|
||||
SAA7127_OUTPUT_TYPE_COMPOSITE,
|
||||
SAA7127_OUTPUT_TYPE_SVIDEO,
|
||||
SAA7127_OUTPUT_TYPE_RGB,
|
||||
SAA7127_OUTPUT_TYPE_YUV_C,
|
||||
SAA7127_OUTPUT_TYPE_YUV_V
|
||||
};
|
||||
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
|
@ -561,7 +546,7 @@ static int saa7127_command(struct i2c_client *client,
|
|||
{
|
||||
struct saa7127_state *state = i2c_get_clientdata(client);
|
||||
struct v4l2_format *fmt = arg;
|
||||
int *iarg = arg;
|
||||
struct v4l2_routing *route = arg;
|
||||
|
||||
switch (cmd) {
|
||||
case VIDIOC_S_STD:
|
||||
|
@ -573,15 +558,23 @@ static int saa7127_command(struct i2c_client *client,
|
|||
*(v4l2_std_id *)arg = state->std;
|
||||
break;
|
||||
|
||||
case VIDIOC_S_INPUT:
|
||||
if (state->input_type == *iarg)
|
||||
break;
|
||||
return saa7127_set_input_type(client, *iarg);
|
||||
case VIDIOC_INT_G_VIDEO_ROUTING:
|
||||
route->input = state->input_type;
|
||||
route->output = state->output_type;
|
||||
break;
|
||||
|
||||
case VIDIOC_S_OUTPUT:
|
||||
if (state->output_type == *iarg)
|
||||
break;
|
||||
return saa7127_set_output_type(client, *iarg);
|
||||
case VIDIOC_INT_S_VIDEO_ROUTING:
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (state->input_type != route->input) {
|
||||
rc = saa7127_set_input_type(client, route->input);
|
||||
}
|
||||
if (rc == 0 && state->output_type != route->output) {
|
||||
rc = saa7127_set_output_type(client, route->output);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
case VIDIOC_STREAMON:
|
||||
case VIDIOC_STREAMOFF:
|
||||
|
|
|
@ -39,6 +39,7 @@ config VIDEO_SAA7134_DVB
|
|||
tristate "DVB/ATSC Support for saa7134 based TV cards"
|
||||
depends on VIDEO_SAA7134 && DVB_CORE
|
||||
select VIDEO_BUF_DVB
|
||||
select FW_LOADER
|
||||
---help---
|
||||
This adds support for DVB cards based on the
|
||||
Philips saa7134 chip.
|
||||
|
|
|
@ -208,7 +208,7 @@ struct saa7134_board saa7134_boards[] = {
|
|||
[SAA7134_BOARD_FLYTVPLATINUM_FM] = {
|
||||
/* LifeView FlyTV Platinum FM (LR214WF) */
|
||||
/* "Peter Missel <peter.missel@onlinehome.de> */
|
||||
.name = "LifeView FlyTV Platinum FM",
|
||||
.name = "LifeView FlyTV Platinum FM / Gold",
|
||||
.audio_clock = 0x00200000,
|
||||
.tuner_type = TUNER_PHILIPS_TDA8290,
|
||||
.radio_type = UNSET,
|
||||
|
@ -2660,7 +2660,7 @@ struct saa7134_board saa7134_boards[] = {
|
|||
.mpeg = SAA7134_MPEG_DVB,
|
||||
.inputs = {{
|
||||
.name = name_comp1,
|
||||
.vmux = 0,
|
||||
.vmux = 1,
|
||||
.amux = LINE1,
|
||||
},{
|
||||
.name = name_svideo,
|
||||
|
@ -2671,7 +2671,7 @@ struct saa7134_board saa7134_boards[] = {
|
|||
[SAA7134_BOARD_FLYDVBT_LR301] = {
|
||||
/* LifeView FlyDVB-T */
|
||||
/* Giampiero Giancipoli <gianci@libero.it> */
|
||||
.name = "LifeView FlyDVB-T",
|
||||
.name = "LifeView FlyDVB-T / Genius VideoWonder DVB-T",
|
||||
.audio_clock = 0x00200000,
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.radio_type = UNSET,
|
||||
|
@ -2808,6 +2808,40 @@ struct saa7134_board saa7134_boards[] = {
|
|||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
},
|
||||
[SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS] = {
|
||||
.name = "LifeView FlyDVB-T Hybrid Cardbus",
|
||||
.audio_clock = 0x00200000,
|
||||
.tuner_type = TUNER_PHILIPS_TDA8290,
|
||||
.radio_type = UNSET,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
.mpeg = SAA7134_MPEG_DVB,
|
||||
.gpiomask = 0x00600000, /* Bit 21 0=Radio, Bit 22 0=TV */
|
||||
.inputs = {{
|
||||
.name = name_tv,
|
||||
.vmux = 1,
|
||||
.amux = TV,
|
||||
.gpio = 0x200000, /* GPIO21=High for TV input */
|
||||
.tv = 1,
|
||||
},{
|
||||
.name = name_svideo, /* S-Video signal on S-Video input */
|
||||
.vmux = 8,
|
||||
.amux = LINE2,
|
||||
},{
|
||||
.name = name_comp1, /* Composite signal on S-Video input */
|
||||
.vmux = 0,
|
||||
.amux = LINE2,
|
||||
},{
|
||||
.name = name_comp2, /* Composite input */
|
||||
.vmux = 3,
|
||||
.amux = LINE2,
|
||||
}},
|
||||
.radio = {
|
||||
.name = name_radio,
|
||||
.amux = TV,
|
||||
.gpio = 0x000000, /* GPIO21=Low for FM radio antenna */
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
|
||||
|
@ -3332,6 +3366,30 @@ struct pci_device_id saa7134_pci_tbl[] = {
|
|||
.subvendor = 0x16be,
|
||||
.subdevice = 0x0005,
|
||||
.driver_data = SAA7134_BOARD_MD7134_BRIDGE_2,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7134,
|
||||
.subvendor = 0x1489,
|
||||
.subdevice = 0x0301,
|
||||
.driver_data = SAA7134_BOARD_FLYDVBT_LR301,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x5168, /* Animation Technologies (LifeView) */
|
||||
.subdevice = 0x0304,
|
||||
.driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x5168,
|
||||
.subdevice = 0x3306,
|
||||
.driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x5168,
|
||||
.subdevice = 0x3502, /* whats the difference to 0x3306 ?*/
|
||||
.driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
|
||||
},{
|
||||
/* --- boards without eeprom + subsystem ID --- */
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
|
@ -3462,6 +3520,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
|
|||
saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06);
|
||||
break;
|
||||
case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
|
||||
case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
|
||||
saa_writeb(SAA7134_GPIO_GPMODE3, 0x08);
|
||||
saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x00);
|
||||
break;
|
||||
|
@ -3633,6 +3692,7 @@ int saa7134_board_init2(struct saa7134_dev *dev)
|
|||
}
|
||||
break;
|
||||
case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
|
||||
case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
|
||||
/* make the tda10046 find its eeprom */
|
||||
{
|
||||
u8 data[] = { 0x3c, 0x33, 0x62};
|
||||
|
|
|
@ -1064,6 +1064,10 @@ static int dvb_init(struct saa7134_dev *dev)
|
|||
dev->dvb.frontend = tda10046_attach(&tevion_dvbt220rf_config,
|
||||
&dev->i2c_adap);
|
||||
break;
|
||||
case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
|
||||
dev->dvb.frontend = tda10046_attach(&ads_tech_duo_config,
|
||||
&dev->i2c_adap);
|
||||
break;
|
||||
#endif
|
||||
#ifdef HAVE_NXT200X
|
||||
case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
|
||||
|
|
|
@ -220,6 +220,7 @@ struct saa7134_format {
|
|||
#define SAA7134_BOARD_AVERMEDIA_A169_B 91
|
||||
#define SAA7134_BOARD_AVERMEDIA_A169_B1 92
|
||||
#define SAA7134_BOARD_MD7134_BRIDGE_2 93
|
||||
#define SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS 94
|
||||
|
||||
#define SAA7134_MAXBOARDS 8
|
||||
#define SAA7134_INPUT_MAX 8
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
config USB_SN9C102
|
||||
tristate "USB SN9C10x PC Camera Controller support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on SONiX SN9C101,
|
||||
SN9C102 or SN9C103 PC Camera Controllers.
|
||||
|
||||
See <file:Documentation/video4linux/sn9c102.txt> for more info.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called sn9c102.
|
|
@ -401,7 +401,7 @@ static void tuner_status(struct i2c_client *client)
|
|||
}
|
||||
tuner_info("Tuner mode: %s\n", p);
|
||||
tuner_info("Frequency: %lu.%02lu MHz\n", freq, freq_fraction);
|
||||
tuner_info("Standard: 0x%08llx\n", t->std);
|
||||
tuner_info("Standard: 0x%08lx\n", (unsigned long)t->std);
|
||||
if (t->mode != V4L2_TUNER_RADIO)
|
||||
return;
|
||||
if (t->has_signal) {
|
||||
|
@ -558,10 +558,10 @@ static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode,
|
|||
|
||||
static inline int check_v4l2(struct tuner *t)
|
||||
{
|
||||
if (t->using_v4l2) {
|
||||
tuner_dbg ("ignore v4l1 call\n");
|
||||
return EINVAL;
|
||||
}
|
||||
/* bttv still uses both v4l1 and v4l2 calls to the tuner (v4l2 for
|
||||
TV, v4l1 for radio), until that is fixed this code is disabled.
|
||||
Otherwise the radio (v4l1) wouldn't tune after using the TV (v4l2)
|
||||
first. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -744,6 +744,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
switch_v4l2();
|
||||
|
||||
tuner->type = t->mode;
|
||||
if (t->mode == V4L2_TUNER_ANALOG_TV)
|
||||
tuner->capability |= V4L2_TUNER_CAP_NORM;
|
||||
if (t->mode != V4L2_TUNER_RADIO) {
|
||||
tuner->rangelow = tv_range[0] * 16;
|
||||
tuner->rangehigh = tv_range[1] * 16;
|
||||
|
|
|
@ -1706,21 +1706,6 @@ static int chip_command(struct i2c_client *client,
|
|||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_S_AUDIO:
|
||||
{
|
||||
struct v4l2_audio *sarg = arg;
|
||||
|
||||
if (!(desc->flags & CHIP_HAS_INPUTSEL) || sarg->index >= 4)
|
||||
return -EINVAL;
|
||||
/* There are four inputs: tuner, radio, extern and intern. */
|
||||
chip->input = sarg->index;
|
||||
if (chip->muted)
|
||||
break;
|
||||
chip_write_masked(chip, desc->inputreg,
|
||||
desc->inputmap[chip->input], desc->inputmask);
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_S_TUNER:
|
||||
{
|
||||
struct v4l2_tuner *vt = arg;
|
||||
|
|
|
@ -757,9 +757,9 @@ tveeprom_detect_client(struct i2c_adapter *adapter,
|
|||
static int
|
||||
tveeprom_attach_adapter (struct i2c_adapter *adapter)
|
||||
{
|
||||
if (adapter->id != I2C_HW_B_BT848)
|
||||
return 0;
|
||||
return i2c_probe(adapter, &addr_data, tveeprom_detect_client);
|
||||
if (adapter->class & I2C_CLASS_TV_ANALOG)
|
||||
return i2c_probe(adapter, &addr_data, tveeprom_detect_client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -53,7 +53,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = {
|
|||
.minimum = 0,
|
||||
.maximum = 255,
|
||||
.step = 1,
|
||||
.default_value = 0,
|
||||
.default_value = 128,
|
||||
.flags = 0,
|
||||
}, {
|
||||
.id = V4L2_CID_CONTRAST,
|
||||
|
@ -62,7 +62,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = {
|
|||
.minimum = 0,
|
||||
.maximum = 255,
|
||||
.step = 0x1,
|
||||
.default_value = 0x10,
|
||||
.default_value = 128,
|
||||
.flags = 0,
|
||||
}, {
|
||||
.id = V4L2_CID_SATURATION,
|
||||
|
@ -71,7 +71,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = {
|
|||
.minimum = 0,
|
||||
.maximum = 255,
|
||||
.step = 0x1,
|
||||
.default_value = 0x10,
|
||||
.default_value = 128,
|
||||
.flags = 0,
|
||||
}, {
|
||||
.id = V4L2_CID_HUE,
|
||||
|
@ -80,7 +80,7 @@ static struct v4l2_queryctrl tvp5150_qctrl[] = {
|
|||
.minimum = -128,
|
||||
.maximum = 127,
|
||||
.step = 0x1,
|
||||
.default_value = 0x10,
|
||||
.default_value = 0,
|
||||
.flags = 0,
|
||||
}
|
||||
};
|
||||
|
@ -500,16 +500,21 @@ struct i2c_vbi_ram_value {
|
|||
|
||||
static struct i2c_vbi_ram_value vbi_ram_default[] =
|
||||
{
|
||||
/* FIXME: Current api doesn't handle all VBI types, those not
|
||||
yet supported are placed under #if 0 */
|
||||
#if 0
|
||||
{0x010, /* Teletext, SECAM, WST System A */
|
||||
{V4L2_SLICED_TELETEXT_SECAM,6,23,1},
|
||||
{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x26,
|
||||
0xe6, 0xb4, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00 }
|
||||
},
|
||||
#endif
|
||||
{0x030, /* Teletext, PAL, WST System B */
|
||||
{V4L2_SLICED_TELETEXT_PAL_B,6,22,1},
|
||||
{V4L2_SLICED_TELETEXT_B,6,22,1},
|
||||
{ 0xaa, 0xaa, 0xff, 0xff, 0x27, 0x2e, 0x20, 0x2b,
|
||||
0xa6, 0x72, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00 }
|
||||
},
|
||||
#if 0
|
||||
{0x050, /* Teletext, PAL, WST System C */
|
||||
{V4L2_SLICED_TELETEXT_PAL_C,6,22,1},
|
||||
{ 0xaa, 0xaa, 0xff, 0xff, 0xe7, 0x2e, 0x20, 0x22,
|
||||
|
@ -535,6 +540,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
|
|||
{ 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02,
|
||||
0xa6, 0x7b, 0x09, 0x00, 0x00, 0x00, 0x27, 0x00 }
|
||||
},
|
||||
#endif
|
||||
{0x0f0, /* Closed Caption, NTSC */
|
||||
{V4L2_SLICED_CAPTION_525,21,21,1},
|
||||
{ 0xaa, 0x2a, 0xff, 0x3f, 0x04, 0x51, 0x6e, 0x02,
|
||||
|
@ -545,6 +551,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
|
|||
{ 0x5b, 0x55, 0xc5, 0xff, 0x00, 0x71, 0x6e, 0x42,
|
||||
0xa6, 0xcd, 0x0f, 0x00, 0x00, 0x00, 0x3a, 0x00 }
|
||||
},
|
||||
#if 0
|
||||
{0x130, /* Wide Screen Signal, NTSC C */
|
||||
{V4L2_SLICED_WSS_525,20,20,1},
|
||||
{ 0x38, 0x00, 0x3f, 0x00, 0x00, 0x71, 0x6e, 0x43,
|
||||
|
@ -560,6 +567,7 @@ static struct i2c_vbi_ram_value vbi_ram_default[] =
|
|||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x6d, 0x49,
|
||||
0x69, 0x94, 0x08, 0x00, 0x00, 0x00, 0x4c, 0x00 }
|
||||
},
|
||||
#endif
|
||||
{0x190, /* Video Program System (VPS), PAL */
|
||||
{V4L2_SLICED_VPS,16,16,0},
|
||||
{ 0xaa, 0xaa, 0xff, 0xff, 0xba, 0xce, 0x2b, 0x0d,
|
||||
|
@ -850,7 +858,6 @@ static int tvp5150_command(struct i2c_client *c,
|
|||
|
||||
case 0:
|
||||
case VIDIOC_INT_RESET:
|
||||
case DECODER_INIT:
|
||||
tvp5150_reset(c);
|
||||
break;
|
||||
case VIDIOC_S_STD:
|
||||
|
@ -949,99 +956,15 @@ static int tvp5150_command(struct i2c_client *c,
|
|||
#endif
|
||||
|
||||
case VIDIOC_LOG_STATUS:
|
||||
case DECODER_DUMP:
|
||||
dump_reg(c);
|
||||
break;
|
||||
|
||||
case DECODER_GET_CAPABILITIES:
|
||||
case VIDIOC_G_TUNER:
|
||||
{
|
||||
struct video_decoder_capability *cap = arg;
|
||||
|
||||
cap->flags = VIDEO_DECODER_PAL |
|
||||
VIDEO_DECODER_NTSC |
|
||||
VIDEO_DECODER_SECAM |
|
||||
VIDEO_DECODER_AUTO | VIDEO_DECODER_CCIR;
|
||||
cap->inputs = 3;
|
||||
cap->outputs = 1;
|
||||
break;
|
||||
}
|
||||
case DECODER_GET_STATUS:
|
||||
{
|
||||
int *iarg = arg;
|
||||
int status;
|
||||
int res=0;
|
||||
status = tvp5150_read(c, 0x88);
|
||||
if(status&0x08){
|
||||
res |= DECODER_STATUS_COLOR;
|
||||
}
|
||||
if(status&0x04 && status&0x02){
|
||||
res |= DECODER_STATUS_GOOD;
|
||||
}
|
||||
*iarg=res;
|
||||
break;
|
||||
}
|
||||
|
||||
case DECODER_SET_GPIO:
|
||||
break;
|
||||
|
||||
case DECODER_SET_VBI_BYPASS:
|
||||
break;
|
||||
|
||||
case DECODER_SET_NORM:
|
||||
{
|
||||
int *iarg = arg;
|
||||
|
||||
switch (*iarg) {
|
||||
|
||||
case VIDEO_MODE_NTSC:
|
||||
break;
|
||||
|
||||
case VIDEO_MODE_PAL:
|
||||
break;
|
||||
|
||||
case VIDEO_MODE_SECAM:
|
||||
break;
|
||||
|
||||
case VIDEO_MODE_AUTO:
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
}
|
||||
decoder->norm = *iarg;
|
||||
break;
|
||||
}
|
||||
case DECODER_SET_INPUT:
|
||||
{
|
||||
int *iarg = arg;
|
||||
if (*iarg < 0 || *iarg > 3) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
decoder->input = *iarg;
|
||||
tvp5150_selmux(c, decoder->input);
|
||||
|
||||
break;
|
||||
}
|
||||
case DECODER_SET_OUTPUT:
|
||||
{
|
||||
int *iarg = arg;
|
||||
|
||||
/* not much choice of outputs */
|
||||
if (*iarg != 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DECODER_ENABLE_OUTPUT:
|
||||
{
|
||||
int *iarg = arg;
|
||||
|
||||
decoder->enable = (*iarg != 0);
|
||||
|
||||
tvp5150_selmux(c, decoder->input);
|
||||
struct v4l2_tuner *vt = arg;
|
||||
int status = tvp5150_read(c, 0x88);
|
||||
|
||||
vt->signal = ((status & 0x04) && (status & 0x02)) ? 0xffff : 0x0;
|
||||
break;
|
||||
}
|
||||
case VIDIOC_QUERYCTRL:
|
||||
|
@ -1087,35 +1010,6 @@ static int tvp5150_command(struct i2c_client *c,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
case DECODER_SET_PICTURE:
|
||||
{
|
||||
struct video_picture *pic = arg;
|
||||
if (decoder->bright != pic->brightness) {
|
||||
/* We want 0 to 255 we get 0-65535 */
|
||||
decoder->bright = pic->brightness;
|
||||
tvp5150_write(c, TVP5150_BRIGHT_CTL,
|
||||
decoder->bright >> 8);
|
||||
}
|
||||
if (decoder->contrast != pic->contrast) {
|
||||
/* We want 0 to 255 we get 0-65535 */
|
||||
decoder->contrast = pic->contrast;
|
||||
tvp5150_write(c, TVP5150_CONTRAST_CTL,
|
||||
decoder->contrast >> 8);
|
||||
}
|
||||
if (decoder->sat != pic->colour) {
|
||||
/* We want 0 to 255 we get 0-65535 */
|
||||
decoder->sat = pic->colour;
|
||||
tvp5150_write(c, TVP5150_SATURATION_CTL,
|
||||
decoder->contrast >> 8);
|
||||
}
|
||||
if (decoder->hue != pic->hue) {
|
||||
/* We want -128 to 127 we get 0-65535 */
|
||||
decoder->hue = pic->hue;
|
||||
tvp5150_write(c, TVP5150_HUE_CTL,
|
||||
(decoder->hue - 32768) >> 8);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,286 @@
|
|||
/*
|
||||
* upd64031A - NEC Electronics Ghost Reduction for NTSC in Japan
|
||||
*
|
||||
* 2003 by T.Adachi <tadachi@tadachi-net.com>
|
||||
* 2003 by Takeru KOMORIYA <komoriya@paken.org>
|
||||
* 2006 by Hans Verkuil <hverkuil@xs4all.nl>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/upd64031a.h>
|
||||
|
||||
// --------------------- read registers functions define -----------------------
|
||||
|
||||
/* bit masks */
|
||||
#define GR_MODE_MASK 0xc0
|
||||
#define DIRECT_3DYCS_CONNECT_MASK 0xc0
|
||||
#define SYNC_CIRCUIT_MASK 0xa0
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
MODULE_DESCRIPTION("uPD64031A driver");
|
||||
MODULE_AUTHOR("T. Adachi, Takeru KOMORIYA, Hans Verkuil");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int debug = 0;
|
||||
module_param(debug, int, 0644);
|
||||
|
||||
MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
||||
|
||||
static unsigned short normal_i2c[] = { 0x24 >> 1, 0x26 >> 1, I2C_CLIENT_END };
|
||||
|
||||
|
||||
I2C_CLIENT_INSMOD;
|
||||
|
||||
enum {
|
||||
R00 = 0, R01, R02, R03, R04,
|
||||
R05, R06, R07, R08, R09,
|
||||
R0A, R0B, R0C, R0D, R0E, R0F,
|
||||
/* unused registers
|
||||
R10, R11, R12, R13, R14,
|
||||
R15, R16, R17,
|
||||
*/
|
||||
TOT_REGS
|
||||
};
|
||||
|
||||
struct upd64031a_state {
|
||||
u8 regs[TOT_REGS];
|
||||
u8 gr_mode;
|
||||
u8 direct_3dycs_connect;
|
||||
u8 ext_comp_sync;
|
||||
u8 ext_vert_sync;
|
||||
};
|
||||
|
||||
static u8 upd64031a_init[] = {
|
||||
0x00, 0xb8, 0x48, 0xd2, 0xe6,
|
||||
0x03, 0x10, 0x0b, 0xaf, 0x7f,
|
||||
0x00, 0x00, 0x1d, 0x5e, 0x00,
|
||||
0xd0
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static u8 upd64031a_read(struct i2c_client *client, u8 reg)
|
||||
{
|
||||
u8 buf[2];
|
||||
|
||||
if (reg >= sizeof(buf))
|
||||
return 0xff;
|
||||
i2c_master_recv(client, buf, 2);
|
||||
return buf[reg];
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static void upd64031a_write(struct i2c_client *client, u8 reg, u8 val)
|
||||
{
|
||||
u8 buf[2];
|
||||
|
||||
buf[0] = reg;
|
||||
buf[1] = val;
|
||||
v4l_dbg(1, debug, client, "writing reg addr: %02X val: %02X\n", reg, val);
|
||||
if (i2c_master_send(client, buf, 2) != 2)
|
||||
v4l_err(client, "I/O error write 0x%02x/0x%02x\n", reg, val);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/* The input changed due to new input or channel changed */
|
||||
static void upd64031a_change(struct i2c_client *client)
|
||||
{
|
||||
struct upd64031a_state *state = i2c_get_clientdata(client);
|
||||
u8 reg = state->regs[R00];
|
||||
|
||||
v4l_dbg(1, debug, client, "changed input or channel\n");
|
||||
upd64031a_write(client, R00, reg | 0x10);
|
||||
upd64031a_write(client, R00, reg & ~0x10);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int upd64031a_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
{
|
||||
struct upd64031a_state *state = i2c_get_clientdata(client);
|
||||
struct v4l2_routing *route = arg;
|
||||
|
||||
switch (cmd) {
|
||||
case VIDIOC_S_FREQUENCY:
|
||||
upd64031a_change(client);
|
||||
break;
|
||||
|
||||
case VIDIOC_INT_G_VIDEO_ROUTING:
|
||||
route->input = (state->gr_mode >> 6) |
|
||||
(state->direct_3dycs_connect >> 4) |
|
||||
(state->ext_comp_sync >> 1) |
|
||||
(state->ext_vert_sync >> 2);
|
||||
route->output = 0;
|
||||
break;
|
||||
|
||||
case VIDIOC_INT_S_VIDEO_ROUTING:
|
||||
{
|
||||
u8 r00, r05, r08;
|
||||
|
||||
state->gr_mode = (route->input & 3) << 6;
|
||||
state->direct_3dycs_connect = (route->input & 0xc) << 4;
|
||||
state->ext_comp_sync = (route->input & UPD64031A_COMPOSITE_EXTERNAL) << 1;
|
||||
state->ext_vert_sync = (route->input & UPD64031A_VERTICAL_EXTERNAL) << 2;
|
||||
r00 = (state->regs[R00] & ~GR_MODE_MASK) | state->gr_mode;
|
||||
r05 = (state->regs[R00] & ~SYNC_CIRCUIT_MASK) |
|
||||
state->ext_comp_sync | state->ext_vert_sync;
|
||||
r08 = (state->regs[R08] & ~DIRECT_3DYCS_CONNECT_MASK) |
|
||||
state->direct_3dycs_connect;
|
||||
upd64031a_write(client, R00, r00);
|
||||
upd64031a_write(client, R05, r05);
|
||||
upd64031a_write(client, R08, r08);
|
||||
upd64031a_change(client);
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_LOG_STATUS:
|
||||
v4l_info(client, "Status: SA00=0x%02x SA01=0x%02x\n",
|
||||
upd64031a_read(client, 0), upd64031a_read(client, 1));
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
case VIDIOC_INT_G_REGISTER:
|
||||
{
|
||||
struct v4l2_register *reg = arg;
|
||||
|
||||
if (reg->i2c_id != I2C_DRIVERID_UPD64031A)
|
||||
return -EINVAL;
|
||||
reg->val = upd64031a_read(client, reg->reg & 0xff);
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_INT_S_REGISTER:
|
||||
{
|
||||
struct v4l2_register *reg = arg;
|
||||
u8 addr = reg->reg & 0xff;
|
||||
u8 val = reg->val & 0xff;
|
||||
|
||||
if (reg->i2c_id != I2C_DRIVERID_UPD64031A)
|
||||
return -EINVAL;
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
upd64031a_write(client, addr, val);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/* i2c implementation */
|
||||
|
||||
static struct i2c_driver i2c_driver;
|
||||
|
||||
static int upd64031a_attach(struct i2c_adapter *adapter, int address, int kind)
|
||||
{
|
||||
struct i2c_client *client;
|
||||
struct upd64031a_state *state;
|
||||
int i;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return 0;
|
||||
|
||||
client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
|
||||
if (client == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
client->addr = address;
|
||||
client->adapter = adapter;
|
||||
client->driver = &i2c_driver;
|
||||
snprintf(client->name, sizeof(client->name) - 1, "uPD64031A");
|
||||
|
||||
v4l_info(client, "chip found @ 0x%x (%s)\n", address << 1, adapter->name);
|
||||
|
||||
state = kmalloc(sizeof(struct upd64031a_state), GFP_KERNEL);
|
||||
if (state == NULL) {
|
||||
kfree(client);
|
||||
return -ENOMEM;
|
||||
}
|
||||
i2c_set_clientdata(client, state);
|
||||
memcpy(state->regs, upd64031a_init, sizeof(state->regs));
|
||||
state->gr_mode = UPD64031A_GR_ON << 6;
|
||||
state->direct_3dycs_connect = UPD64031A_3DYCS_COMPOSITE << 4;
|
||||
state->ext_comp_sync = state->ext_vert_sync = 0;
|
||||
for (i = 0; i < TOT_REGS; i++) {
|
||||
upd64031a_write(client, i, state->regs[i]);
|
||||
}
|
||||
|
||||
i2c_attach_client(client);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int upd64031a_probe(struct i2c_adapter *adapter)
|
||||
{
|
||||
if (adapter->class & I2C_CLASS_TV_ANALOG)
|
||||
return i2c_probe(adapter, &addr_data, upd64031a_attach);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int upd64031a_detach(struct i2c_client *client)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = i2c_detach_client(client);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
kfree(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
/* i2c implementation */
|
||||
static struct i2c_driver i2c_driver = {
|
||||
.driver = {
|
||||
.name = "upd64031a",
|
||||
},
|
||||
.id = I2C_DRIVERID_UPD64031A,
|
||||
.attach_adapter = upd64031a_probe,
|
||||
.detach_client = upd64031a_detach,
|
||||
.command = upd64031a_command,
|
||||
};
|
||||
|
||||
|
||||
static int __init upd64031a_init_module(void)
|
||||
{
|
||||
return i2c_add_driver(&i2c_driver);
|
||||
}
|
||||
|
||||
static void __exit upd64031a_exit_module(void)
|
||||
{
|
||||
i2c_del_driver(&i2c_driver);
|
||||
}
|
||||
|
||||
module_init(upd64031a_init_module);
|
||||
module_exit(upd64031a_exit_module);
|
|
@ -0,0 +1,262 @@
|
|||
/*
|
||||
* upd6408x - NEC Electronics 3-Dimensional Y/C separation driver
|
||||
*
|
||||
* 2003 by T.Adachi (tadachi@tadachi-net.com)
|
||||
* 2003 by Takeru KOMORIYA <komoriya@paken.org>
|
||||
* 2006 by Hans Verkuil <hverkuil@xs4all.nl>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/upd64083.h>
|
||||
|
||||
MODULE_DESCRIPTION("uPD64083 driver");
|
||||
MODULE_AUTHOR("T. Adachi, Takeru KOMORIYA, Hans Verkuil");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int debug = 0;
|
||||
module_param(debug, bool, 0644);
|
||||
|
||||
MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
||||
|
||||
static unsigned short normal_i2c[] = { 0xb8 >> 1, 0xba >> 1, I2C_CLIENT_END };
|
||||
|
||||
|
||||
I2C_CLIENT_INSMOD;
|
||||
|
||||
enum {
|
||||
R00 = 0, R01, R02, R03, R04,
|
||||
R05, R06, R07, R08, R09,
|
||||
R0A, R0B, R0C, R0D, R0E, R0F,
|
||||
R10, R11, R12, R13, R14,
|
||||
R15, R16,
|
||||
TOT_REGS
|
||||
};
|
||||
|
||||
struct upd64083_state {
|
||||
u8 mode;
|
||||
u8 ext_y_adc;
|
||||
u8 regs[TOT_REGS];
|
||||
};
|
||||
|
||||
/* Initial values when used in combination with the
|
||||
NEC upd64031a ghost reduction chip. */
|
||||
static u8 upd64083_init[] = {
|
||||
0x1f, 0x01, 0xa0, 0x2d, 0x29, /* we use EXCSS=0 */
|
||||
0x36, 0xdd, 0x05, 0x56, 0x48,
|
||||
0x00, 0x3a, 0xa0, 0x05, 0x08,
|
||||
0x44, 0x60, 0x08, 0x52, 0xf8,
|
||||
0x53, 0x60, 0x10
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static void upd64083_log_status(struct i2c_client *client)
|
||||
{
|
||||
u8 buf[7];
|
||||
|
||||
i2c_master_recv(client, buf, 7);
|
||||
v4l_info(client, "Status: SA00=%02x SA01=%02x SA02=%02x SA03=%02x "
|
||||
"SA04=%02x SA05=%02x SA06=%02x\n",
|
||||
buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static void upd64083_write(struct i2c_client *client, u8 reg, u8 val)
|
||||
{
|
||||
u8 buf[2];
|
||||
|
||||
buf[0] = reg;
|
||||
buf[1] = val;
|
||||
v4l_dbg(1, debug, client, "writing reg addr: %02x val: %02x\n", reg, val);
|
||||
if (i2c_master_send(client, buf, 2) != 2)
|
||||
v4l_err(client, "I/O error write 0x%02x/0x%02x\n", reg, val);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
static u8 upd64083_read(struct i2c_client *client, u8 reg)
|
||||
{
|
||||
u8 buf[7];
|
||||
|
||||
if (reg >= sizeof(buf))
|
||||
return 0xff;
|
||||
i2c_master_recv(client, buf, sizeof(buf));
|
||||
return buf[reg];
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int upd64083_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
{
|
||||
struct upd64083_state *state = i2c_get_clientdata(client);
|
||||
struct v4l2_routing *route = arg;
|
||||
|
||||
switch (cmd) {
|
||||
case VIDIOC_INT_G_VIDEO_ROUTING:
|
||||
route->input = (state->mode >> 6) | (state->ext_y_adc >> 3);
|
||||
route->output = 0;
|
||||
break;
|
||||
|
||||
case VIDIOC_INT_S_VIDEO_ROUTING:
|
||||
{
|
||||
u8 r00, r02;
|
||||
|
||||
if (route->input > 7 || (route->input & 6) == 6)
|
||||
return -EINVAL;
|
||||
state->mode = (route->input & 3) << 6;
|
||||
state->ext_y_adc = (route->input & UPD64083_EXT_Y_ADC) << 3;
|
||||
r00 = (state->regs[R00] & ~(3 << 6)) | state->mode;
|
||||
r02 = (state->regs[R02] & ~(1 << 5)) | state->ext_y_adc;
|
||||
upd64083_write(client, R00, r00);
|
||||
upd64083_write(client, R02, r02);
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_LOG_STATUS:
|
||||
upd64083_log_status(client);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
case VIDIOC_INT_G_REGISTER:
|
||||
{
|
||||
struct v4l2_register *reg = arg;
|
||||
|
||||
if (reg->i2c_id != I2C_DRIVERID_UPD64083)
|
||||
return -EINVAL;
|
||||
reg->val = upd64083_read(client, reg->reg & 0xff);
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_INT_S_REGISTER:
|
||||
{
|
||||
struct v4l2_register *reg = arg;
|
||||
u8 addr = reg->reg & 0xff;
|
||||
u8 val = reg->val & 0xff;
|
||||
|
||||
if (reg->i2c_id != I2C_DRIVERID_UPD64083)
|
||||
return -EINVAL;
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
upd64083_write(client, addr, val);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/* i2c implementation */
|
||||
|
||||
static struct i2c_driver i2c_driver;
|
||||
|
||||
static int upd64083_attach(struct i2c_adapter *adapter, int address, int kind)
|
||||
{
|
||||
struct i2c_client *client;
|
||||
struct upd64083_state *state;
|
||||
int i;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return 0;
|
||||
|
||||
client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
|
||||
if (client == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
client->addr = address;
|
||||
client->adapter = adapter;
|
||||
client->driver = &i2c_driver;
|
||||
snprintf(client->name, sizeof(client->name) - 1, "uPD64083");
|
||||
|
||||
v4l_info(client, "chip found @ 0x%x (%s)\n", address << 1, adapter->name);
|
||||
|
||||
state = kmalloc(sizeof(struct upd64083_state), GFP_KERNEL);
|
||||
if (state == NULL) {
|
||||
kfree(client);
|
||||
return -ENOMEM;
|
||||
}
|
||||
i2c_set_clientdata(client, state);
|
||||
/* Initially assume that a ghost reduction chip is present */
|
||||
state->mode = 0; /* YCS mode */
|
||||
state->ext_y_adc = (1 << 5);
|
||||
memcpy(state->regs, upd64083_init, TOT_REGS);
|
||||
for (i = 0; i < TOT_REGS; i++) {
|
||||
upd64083_write(client, i, state->regs[i]);
|
||||
}
|
||||
i2c_attach_client(client);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int upd64083_probe(struct i2c_adapter *adapter)
|
||||
{
|
||||
if (adapter->class & I2C_CLASS_TV_ANALOG)
|
||||
return i2c_probe(adapter, &addr_data, upd64083_attach);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int upd64083_detach(struct i2c_client *client)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = i2c_detach_client(client);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
kfree(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
/* i2c implementation */
|
||||
static struct i2c_driver i2c_driver = {
|
||||
.driver = {
|
||||
.name = "upd64083",
|
||||
},
|
||||
.id = I2C_DRIVERID_UPD64083,
|
||||
.attach_adapter = upd64083_probe,
|
||||
.detach_client = upd64083_detach,
|
||||
.command = upd64083_command,
|
||||
};
|
||||
|
||||
|
||||
static int __init upd64083_init_module(void)
|
||||
{
|
||||
return i2c_add_driver(&i2c_driver);
|
||||
}
|
||||
|
||||
static void __exit upd64083_exit_module(void)
|
||||
{
|
||||
i2c_del_driver(&i2c_driver);
|
||||
}
|
||||
|
||||
module_init(upd64083_init_module);
|
||||
module_exit(upd64083_exit_module);
|
|
@ -0,0 +1,38 @@
|
|||
config VIDEO_USBVIDEO
|
||||
tristate
|
||||
|
||||
config USB_VICAM
|
||||
tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_DEV && EXPERIMENTAL
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you have 3com homeconnect camera (vicam).
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called vicam.
|
||||
|
||||
config USB_IBMCAM
|
||||
tristate "USB IBM (Xirlink) C-it Camera support"
|
||||
depends on USB && VIDEO_DEV
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want to connect a IBM "C-It" camera, also known as
|
||||
"Xirlink PC Camera" to your computer's USB port.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ibmcam.
|
||||
|
||||
This camera has several configuration options which
|
||||
can be specified when you load the module. Read
|
||||
<file:Documentation/video4linux/ibmcam.txt> to learn more.
|
||||
|
||||
config USB_KONICAWC
|
||||
tristate "USB Konica Webcam support"
|
||||
depends on USB && VIDEO_DEV
|
||||
select VIDEO_USBVIDEO
|
||||
---help---
|
||||
Say Y here if you want support for webcams based on a Konica
|
||||
chipset. This is known to work with the Intel YC76 webcam.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called konicawc.
|
|
@ -1,4 +1,4 @@
|
|||
obj-$(CONFIG_USB_IBMCAM) += ibmcam.o usbvideo.o ultracam.o
|
||||
obj-$(CONFIG_USB_KONICAWC) += konicawc.o usbvideo.o
|
||||
obj-$(CONFIG_USB_VICAM) += vicam.o usbvideo.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_USBVIDEO) += usbvideo.o
|
||||
obj-$(CONFIG_USB_IBMCAM) += ibmcam.o ultracam.o
|
||||
obj-$(CONFIG_USB_KONICAWC) += konicawc.o
|
||||
obj-$(CONFIG_USB_VICAM) += vicam.o
|
||||
|
|
|
@ -317,6 +317,7 @@ static const char *v4l2_int_ioctls[] = {
|
|||
[_IOC_NR(TUNER_SET_STANDBY)] = "TUNER_SET_STANDBY",
|
||||
[_IOC_NR(TDA9887_SET_CONFIG)] = "TDA9887_SET_CONFIG",
|
||||
|
||||
[_IOC_NR(VIDIOC_INT_S_TUNER_MODE)] = "VIDIOC_INT_S_TUNER_MODE",
|
||||
[_IOC_NR(VIDIOC_INT_S_REGISTER)] = "VIDIOC_INT_S_REGISTER",
|
||||
[_IOC_NR(VIDIOC_INT_G_REGISTER)] = "VIDIOC_INT_G_REGISTER",
|
||||
[_IOC_NR(VIDIOC_INT_RESET)] = "VIDIOC_INT_RESET",
|
||||
|
@ -325,7 +326,12 @@ static const char *v4l2_int_ioctls[] = {
|
|||
[_IOC_NR(VIDIOC_INT_S_VBI_DATA)] = "VIDIOC_INT_S_VBI_DATA",
|
||||
[_IOC_NR(VIDIOC_INT_G_VBI_DATA)] = "VIDIOC_INT_G_VBI_DATA",
|
||||
[_IOC_NR(VIDIOC_INT_G_CHIP_IDENT)] = "VIDIOC_INT_G_CHIP_IDENT",
|
||||
[_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ"
|
||||
[_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)] = "VIDIOC_INT_I2S_CLOCK_FREQ",
|
||||
[_IOC_NR(VIDIOC_INT_S_STANDBY)] = "VIDIOC_INT_S_STANDBY",
|
||||
[_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)] = "VIDIOC_INT_S_AUDIO_ROUTING",
|
||||
[_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)] = "VIDIOC_INT_G_AUDIO_ROUTING",
|
||||
[_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)] = "VIDIOC_INT_S_VIDEO_ROUTING",
|
||||
[_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)] = "VIDIOC_INT_G_VIDEO_ROUTING"
|
||||
};
|
||||
#define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)
|
||||
|
||||
|
|
|
@ -399,19 +399,25 @@ void videobuf_queue_pci(struct videobuf_queue* q)
|
|||
int videobuf_pci_dma_map(struct pci_dev *pci,struct videobuf_dmabuf *dma)
|
||||
{
|
||||
struct videobuf_queue q;
|
||||
struct videobuf_queue_ops qops;
|
||||
|
||||
q.dev=pci;
|
||||
q.ops->vb_map_sg=(vb_map_sg_t *)pci_unmap_sg;
|
||||
qops.vb_map_sg=(vb_map_sg_t *)pci_map_sg;
|
||||
qops.vb_unmap_sg=(vb_map_sg_t *)pci_unmap_sg;
|
||||
q.ops = &qops;
|
||||
|
||||
return (videobuf_dma_unmap(&q,dma));
|
||||
return (videobuf_dma_map(&q,dma));
|
||||
}
|
||||
|
||||
int videobuf_pci_dma_unmap(struct pci_dev *pci,struct videobuf_dmabuf *dma)
|
||||
{
|
||||
struct videobuf_queue q;
|
||||
struct videobuf_queue_ops qops;
|
||||
|
||||
q.dev=pci;
|
||||
q.ops->vb_map_sg=(vb_map_sg_t *)pci_unmap_sg;
|
||||
qops.vb_map_sg=(vb_map_sg_t *)pci_map_sg;
|
||||
qops.vb_unmap_sg=(vb_map_sg_t *)pci_unmap_sg;
|
||||
q.ops = &qops;
|
||||
|
||||
return (videobuf_dma_unmap(&q,dma));
|
||||
}
|
||||
|
@ -923,7 +929,7 @@ ssize_t videobuf_read_one(struct videobuf_queue *q,
|
|||
/* need to capture a new frame */
|
||||
retval = -ENOMEM;
|
||||
q->read_buf = videobuf_alloc(q->msize);
|
||||
dprintk(1,"video alloc=0x%08x\n",(unsigned int) q->read_buf);
|
||||
dprintk(1,"video alloc=0x%p\n", q->read_buf);
|
||||
if (NULL == q->read_buf)
|
||||
goto done;
|
||||
q->read_buf->memory = V4L2_MEMORY_USERPTR;
|
||||
|
|
|
@ -0,0 +1,355 @@
|
|||
/*
|
||||
* wm8739
|
||||
*
|
||||
* Copyright (C) 2005 T. Adachi <tadachi@tadachi-net.com>
|
||||
*
|
||||
* Copyright (C) 2005 Hans Verkuil <hverkuil@xs4all.nl>
|
||||
* - Cleanup
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-id.h>
|
||||
#include <linux/videodev.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
MODULE_DESCRIPTION("wm8739 driver");
|
||||
MODULE_AUTHOR("T. Adachi, Hans Verkuil");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int debug = 0;
|
||||
static unsigned short normal_i2c[] = { 0x34 >> 1, 0x36 >> 1, I2C_CLIENT_END };
|
||||
|
||||
module_param(debug, int, 0644);
|
||||
|
||||
MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
||||
|
||||
|
||||
I2C_CLIENT_INSMOD;
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
enum {
|
||||
R0 = 0, R1,
|
||||
R5 = 5, R6, R7, R8, R9, R15 = 15,
|
||||
TOT_REGS
|
||||
};
|
||||
|
||||
struct wm8739_state {
|
||||
u32 clock_freq;
|
||||
u8 muted;
|
||||
u16 volume;
|
||||
u16 balance;
|
||||
u8 vol_l; /* +12dB to -34.5dB 1.5dB step (5bit) def:0dB */
|
||||
u8 vol_r; /* +12dB to -34.5dB 1.5dB step (5bit) def:0dB */
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int wm8739_write(struct i2c_client *client, int reg, u16 val)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (reg < 0 || reg >= TOT_REGS) {
|
||||
v4l_err(client, "Invalid register R%d\n", reg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
v4l_dbg(1, debug, client, "write: %02x %02x\n", reg, val);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (i2c_smbus_write_byte_data(client, (reg << 1) |
|
||||
(val >> 8), val & 0xff) == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
v4l_err(client, "I2C: cannot write %03x to register R%d\n", val, reg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* write regs to set audio volume etc */
|
||||
static void wm8739_set_audio(struct i2c_client *client)
|
||||
{
|
||||
struct wm8739_state *state = i2c_get_clientdata(client);
|
||||
u16 mute = state->muted ? 0x80 : 0;
|
||||
|
||||
/* Volume setting: bits 0-4, 0x1f = 12 dB, 0x00 = -34.5 dB
|
||||
* Default setting: 0x17 = 0 dB
|
||||
*/
|
||||
wm8739_write(client, R0, (state->vol_l & 0x1f) | mute);
|
||||
wm8739_write(client, R1, (state->vol_r & 0x1f) | mute);
|
||||
}
|
||||
|
||||
static int wm8739_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
|
||||
{
|
||||
struct wm8739_state *state = i2c_get_clientdata(client);
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
ctrl->value = state->muted;
|
||||
break;
|
||||
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
ctrl->value = state->volume;
|
||||
break;
|
||||
|
||||
case V4L2_CID_AUDIO_BALANCE:
|
||||
ctrl->value = state->balance;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm8739_set_ctrl(struct i2c_client *client, struct v4l2_control *ctrl)
|
||||
{
|
||||
struct wm8739_state *state = i2c_get_clientdata(client);
|
||||
unsigned int work_l, work_r;
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
state->muted = ctrl->value;
|
||||
break;
|
||||
|
||||
case V4L2_CID_AUDIO_VOLUME:
|
||||
state->volume = ctrl->value;
|
||||
break;
|
||||
|
||||
case V4L2_CID_AUDIO_BALANCE:
|
||||
state->balance = ctrl->value;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* normalize ( 65535 to 0 -> 31 to 0 (12dB to -34.5dB) ) */
|
||||
work_l = (min(65536 - state->balance, 32768) * state->volume) / 32768;
|
||||
work_r = (min(state->balance, (u16)32768) * state->volume) / 32768;
|
||||
|
||||
state->vol_l = (long)work_l * 31 / 65535;
|
||||
state->vol_r = (long)work_r * 31 / 65535;
|
||||
|
||||
/* set audio volume etc. */
|
||||
wm8739_set_audio(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static struct v4l2_queryctrl wm8739_qctrl[] = {
|
||||
{
|
||||
.id = V4L2_CID_AUDIO_VOLUME,
|
||||
.name = "Volume",
|
||||
.minimum = 0,
|
||||
.maximum = 65535,
|
||||
.step = 65535/100,
|
||||
.default_value = 58880,
|
||||
.flags = 0,
|
||||
.type = V4L2_CTRL_TYPE_INTEGER,
|
||||
},{
|
||||
.id = V4L2_CID_AUDIO_MUTE,
|
||||
.name = "Mute",
|
||||
.minimum = 0,
|
||||
.maximum = 1,
|
||||
.step = 1,
|
||||
.default_value = 1,
|
||||
.flags = 0,
|
||||
.type = V4L2_CTRL_TYPE_BOOLEAN,
|
||||
},{
|
||||
.id = V4L2_CID_AUDIO_BALANCE,
|
||||
.name = "Balance",
|
||||
.minimum = 0,
|
||||
.maximum = 65535,
|
||||
.step = 65535/100,
|
||||
.default_value = 32768,
|
||||
.flags = 0,
|
||||
.type = V4L2_CTRL_TYPE_INTEGER,
|
||||
}
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
static int wm8739_command(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
{
|
||||
struct wm8739_state *state = i2c_get_clientdata(client);
|
||||
|
||||
switch (cmd) {
|
||||
case VIDIOC_INT_AUDIO_CLOCK_FREQ:
|
||||
{
|
||||
u32 audiofreq = *(u32 *)arg;
|
||||
|
||||
state->clock_freq = audiofreq;
|
||||
wm8739_write(client, R9, 0x000); /* de-activate */
|
||||
switch (audiofreq) {
|
||||
case 44100:
|
||||
wm8739_write(client, R8, 0x020); /* 256fps, fs=44.1k */
|
||||
break;
|
||||
case 48000:
|
||||
wm8739_write(client, R8, 0x000); /* 256fps, fs=48k */
|
||||
break;
|
||||
case 32000:
|
||||
wm8739_write(client, R8, 0x018); /* 256fps, fs=32k */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
wm8739_write(client, R9, 0x001); /* activate */
|
||||
break;
|
||||
}
|
||||
|
||||
case VIDIOC_G_CTRL:
|
||||
return wm8739_get_ctrl(client, arg);
|
||||
|
||||
case VIDIOC_S_CTRL:
|
||||
return wm8739_set_ctrl(client, arg);
|
||||
|
||||
case VIDIOC_QUERYCTRL:
|
||||
{
|
||||
struct v4l2_queryctrl *qc = arg;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(wm8739_qctrl); i++)
|
||||
if (qc->id && qc->id == wm8739_qctrl[i].id) {
|
||||
memcpy(qc, &wm8739_qctrl[i], sizeof(*qc));
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
case VIDIOC_LOG_STATUS:
|
||||
v4l_info(client, "Frequency: %u Hz\n", state->clock_freq);
|
||||
v4l_info(client, "Volume L: %02x%s\n", state->vol_l & 0x1f,
|
||||
state->muted ? " (muted)" : "");
|
||||
v4l_info(client, "Volume R: %02x%s\n", state->vol_r & 0x1f,
|
||||
state->muted ? " (muted)" : "");
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/* i2c implementation */
|
||||
|
||||
static struct i2c_driver i2c_driver;
|
||||
|
||||
static int wm8739_attach(struct i2c_adapter *adapter, int address, int kind)
|
||||
{
|
||||
struct i2c_client *client;
|
||||
struct wm8739_state *state;
|
||||
|
||||
/* Check if the adapter supports the needed features */
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return 0;
|
||||
|
||||
client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
|
||||
if (client == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
client->addr = address;
|
||||
client->adapter = adapter;
|
||||
client->driver = &i2c_driver;
|
||||
snprintf(client->name, sizeof(client->name) - 1, "wm8739");
|
||||
|
||||
v4l_info(client, "chip found @ 0x%x (%s)\n", address << 1, adapter->name);
|
||||
|
||||
state = kmalloc(sizeof(struct wm8739_state), GFP_KERNEL);
|
||||
if (state == NULL) {
|
||||
kfree(client);
|
||||
return -ENOMEM;
|
||||
}
|
||||
state->vol_l = 0x17; /* 0dB */
|
||||
state->vol_r = 0x17; /* 0dB */
|
||||
state->muted = 0;
|
||||
state->balance = 32768;
|
||||
/* normalize (12dB(31) to -34.5dB(0) [0dB(23)] -> 65535 to 0) */
|
||||
state->volume = ((long)state->vol_l + 1) * 65535 / 31;
|
||||
state->clock_freq = 48000;
|
||||
i2c_set_clientdata(client, state);
|
||||
|
||||
/* initialize wm8739 */
|
||||
wm8739_write(client, R15, 0x00); /* reset */
|
||||
wm8739_write(client, R5, 0x000); /* filter setting, high path, offet clear */
|
||||
wm8739_write(client, R6, 0x000); /* ADC, OSC, Power Off mode Disable */
|
||||
wm8739_write(client, R7, 0x049); /* Digital Audio interface format */
|
||||
/* Enable Master mode */
|
||||
/* 24 bit, MSB first/left justified */
|
||||
wm8739_write(client, R8, 0x000); /* sampling control */
|
||||
/* normal, 256fs, 48KHz sampling rate */
|
||||
wm8739_write(client, R9, 0x001); /* activate */
|
||||
wm8739_set_audio(client); /* set volume/mute */
|
||||
|
||||
i2c_attach_client(client);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm8739_probe(struct i2c_adapter *adapter)
|
||||
{
|
||||
if (adapter->class & I2C_CLASS_TV_ANALOG)
|
||||
return i2c_probe(adapter, &addr_data, wm8739_attach);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm8739_detach(struct i2c_client *client)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = i2c_detach_client(client);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
kfree(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
/* i2c implementation */
|
||||
static struct i2c_driver i2c_driver = {
|
||||
.driver = {
|
||||
.name = "wm8739",
|
||||
},
|
||||
.id = I2C_DRIVERID_WM8739,
|
||||
.attach_adapter = wm8739_probe,
|
||||
.detach_client = wm8739_detach,
|
||||
.command = wm8739_command,
|
||||
};
|
||||
|
||||
|
||||
static int __init wm8739_init_module(void)
|
||||
{
|
||||
return i2c_add_driver(&i2c_driver);
|
||||
}
|
||||
|
||||
static void __exit wm8739_cleanup_module(void)
|
||||
{
|
||||
i2c_del_driver(&i2c_driver);
|
||||
}
|
||||
|
||||
module_init(wm8739_init_module);
|
||||
module_exit(wm8739_cleanup_module);
|
|
@ -0,0 +1,11 @@
|
|||
config USB_ZC0301
|
||||
tristate "USB ZC0301 Image Processor and Control Chip support"
|
||||
depends on USB && VIDEO_DEV
|
||||
---help---
|
||||
Say Y here if you want support for cameras based on the ZC0301
|
||||
Image Processor and Control Chip.
|
||||
|
||||
See <file:Documentation/video4linux/zc0301.txt> for more info.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called zc0301.
|
|
@ -966,66 +966,17 @@ struct v4l2_sliced_vbi_format
|
|||
|
||||
/* Teletext World System Teletext
|
||||
(WST), defined on ITU-R BT.653-2 */
|
||||
#define V4L2_SLICED_TELETEXT_PAL_B (0x000001)
|
||||
#define V4L2_SLICED_TELETEXT_PAL_C (0x000002)
|
||||
#define V4L2_SLICED_TELETEXT_NTSC_B (0x000010)
|
||||
#define V4L2_SLICED_TELETEXT_SECAM (0x000020)
|
||||
|
||||
/* Teletext North American Broadcast Teletext Specification
|
||||
(NABTS), defined on ITU-R BT.653-2 */
|
||||
#define V4L2_SLICED_TELETEXT_NTSC_C (0x000040)
|
||||
#define V4L2_SLICED_TELETEXT_NTSC_D (0x000080)
|
||||
|
||||
#define V4L2_SLICED_TELETEXT_B (0x0001)
|
||||
/* Video Program System, defined on ETS 300 231*/
|
||||
#define V4L2_SLICED_VPS (0x000400)
|
||||
|
||||
#define V4L2_SLICED_VPS (0x0400)
|
||||
/* Closed Caption, defined on EIA-608 */
|
||||
#define V4L2_SLICED_CAPTION_525 (0x001000)
|
||||
#define V4L2_SLICED_CAPTION_625 (0x002000)
|
||||
|
||||
#define V4L2_SLICED_CAPTION_525 (0x1000)
|
||||
/* Wide Screen System, defined on ITU-R BT1119.1 */
|
||||
#define V4L2_SLICED_WSS_625 (0x004000)
|
||||
#define V4L2_SLICED_WSS_625 (0x4000)
|
||||
|
||||
/* Wide Screen System, defined on IEC 61880 */
|
||||
#define V4L2_SLICED_WSS_525 (0x008000)
|
||||
#define V4L2_SLICED_VBI_525 (V4L2_SLICED_CAPTION_525)
|
||||
#define V4L2_SLICED_VBI_625 (V4L2_SLICED_TELETEXT_B | V4L2_SLICED_VPS | V4L2_SLICED_WSS_625)
|
||||
|
||||
/* Vertical Interval Timecode (VITC), defined on SMPTE 12M */
|
||||
#define V4l2_SLICED_VITC_625 (0x010000)
|
||||
#define V4l2_SLICED_VITC_525 (0x020000)
|
||||
|
||||
#define V4L2_SLICED_TELETEXT_B (V4L2_SLICED_TELETEXT_PAL_B |\
|
||||
V4L2_SLICED_TELETEXT_NTSC_B)
|
||||
|
||||
#define V4L2_SLICED_TELETEXT (V4L2_SLICED_TELETEXT_PAL_B |\
|
||||
V4L2_SLICED_TELETEXT_PAL_C |\
|
||||
V4L2_SLICED_TELETEXT_SECAM |\
|
||||
V4L2_SLICED_TELETEXT_NTSC_B |\
|
||||
V4L2_SLICED_TELETEXT_NTSC_C |\
|
||||
V4L2_SLICED_TELETEXT_NTSC_D)
|
||||
|
||||
#define V4L2_SLICED_CAPTION (V4L2_SLICED_CAPTION_525 |\
|
||||
V4L2_SLICED_CAPTION_625)
|
||||
|
||||
#define V4L2_SLICED_WSS (V4L2_SLICED_WSS_525 |\
|
||||
V4L2_SLICED_WSS_625)
|
||||
|
||||
#define V4L2_SLICED_VITC (V4L2_SLICED_VITC_525 |\
|
||||
V4L2_SLICED_VITC_625)
|
||||
|
||||
#define V4L2_SLICED_VBI_525 (V4L2_SLICED_TELETEXT_NTSC_B |\
|
||||
V4L2_SLICED_TELETEXT_NTSC_C |\
|
||||
V4L2_SLICED_TELETEXT_NTSC_D |\
|
||||
V4L2_SLICED_CAPTION_525 |\
|
||||
V4L2_SLICED_WSS_525 |\
|
||||
V4l2_SLICED_VITC_525)
|
||||
|
||||
#define V4L2_SLICED_VBI_625 (V4L2_SLICED_TELETEXT_PAL_B |\
|
||||
V4L2_SLICED_TELETEXT_PAL_C |\
|
||||
V4L2_SLICED_TELETEXT_SECAM |\
|
||||
V4L2_SLICED_VPS |\
|
||||
V4L2_SLICED_CAPTION_625 |\
|
||||
V4L2_SLICED_WSS_625 |\
|
||||
V4l2_SLICED_VITC_625)
|
||||
|
||||
struct v4l2_sliced_vbi_cap
|
||||
{
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
cx25840.h - definition for cx25840/1/2/3 inputs
|
||||
|
||||
Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _CX25840_H_
|
||||
#define _CX25840_H_
|
||||
|
||||
enum cx25840_video_input {
|
||||
/* Composite video inputs In1-In8 */
|
||||
CX25840_COMPOSITE1 = 1,
|
||||
CX25840_COMPOSITE2,
|
||||
CX25840_COMPOSITE3,
|
||||
CX25840_COMPOSITE4,
|
||||
CX25840_COMPOSITE5,
|
||||
CX25840_COMPOSITE6,
|
||||
CX25840_COMPOSITE7,
|
||||
CX25840_COMPOSITE8,
|
||||
|
||||
/* S-Video inputs consist of one luma input (In1-In4) ORed with one
|
||||
chroma input (In5-In8) */
|
||||
CX25840_SVIDEO_LUMA1 = 0x10,
|
||||
CX25840_SVIDEO_LUMA2 = 0x20,
|
||||
CX25840_SVIDEO_LUMA3 = 0x30,
|
||||
CX25840_SVIDEO_LUMA4 = 0x40,
|
||||
CX25840_SVIDEO_CHROMA4 = 0x400,
|
||||
CX25840_SVIDEO_CHROMA5 = 0x500,
|
||||
CX25840_SVIDEO_CHROMA6 = 0x600,
|
||||
CX25840_SVIDEO_CHROMA7 = 0x700,
|
||||
CX25840_SVIDEO_CHROMA8 = 0x800,
|
||||
|
||||
/* S-Video aliases for common luma/chroma combinations */
|
||||
CX25840_SVIDEO1 = 0x510,
|
||||
CX25840_SVIDEO2 = 0x620,
|
||||
CX25840_SVIDEO3 = 0x730,
|
||||
CX25840_SVIDEO4 = 0x840,
|
||||
};
|
||||
|
||||
enum cx25840_audio_input {
|
||||
/* Audio inputs: serial or In4-In8 */
|
||||
CX25840_AUDIO_SERIAL,
|
||||
CX25840_AUDIO4 = 4,
|
||||
CX25840_AUDIO5,
|
||||
CX25840_AUDIO6,
|
||||
CX25840_AUDIO7,
|
||||
CX25840_AUDIO8,
|
||||
};
|
||||
|
||||
#endif
|
|
@ -80,16 +80,16 @@
|
|||
*/
|
||||
|
||||
/* SCART input to DSP selection */
|
||||
#define MSP_IN_SCART_1 0 /* Pin SC1_IN */
|
||||
#define MSP_IN_SCART_2 1 /* Pin SC2_IN */
|
||||
#define MSP_IN_SCART_3 2 /* Pin SC3_IN */
|
||||
#define MSP_IN_SCART_4 3 /* Pin SC4_IN */
|
||||
#define MSP_IN_SCART1 0 /* Pin SC1_IN */
|
||||
#define MSP_IN_SCART2 1 /* Pin SC2_IN */
|
||||
#define MSP_IN_SCART3 2 /* Pin SC3_IN */
|
||||
#define MSP_IN_SCART4 3 /* Pin SC4_IN */
|
||||
#define MSP_IN_MONO 6 /* Pin MONO_IN */
|
||||
#define MSP_IN_MUTE 7 /* Mute DSP input */
|
||||
#define MSP_SCART_TO_DSP(in) (in)
|
||||
/* Tuner input to demodulator and DSP selection */
|
||||
#define MSP_IN_TUNER_1 0 /* Analog Sound IF input pin ANA_IN1 */
|
||||
#define MSP_IN_TUNER_2 1 /* Analog Sound IF input pin ANA_IN2 */
|
||||
#define MSP_IN_TUNER1 0 /* Analog Sound IF input pin ANA_IN1 */
|
||||
#define MSP_IN_TUNER2 1 /* Analog Sound IF input pin ANA_IN2 */
|
||||
#define MSP_TUNER_TO_DSP(in) ((in) << 3)
|
||||
|
||||
/* The msp has up to 5 DSP outputs, each output can independently select
|
||||
|
@ -109,14 +109,14 @@
|
|||
DSP. This is currently not implemented. Also not implemented is the
|
||||
multi-channel capable I2S3 input of the 44x0G. If someone can demonstrate
|
||||
a need for one of those features then additional support can be added. */
|
||||
#define MSP_DSP_OUT_TUNER 0 /* Tuner output */
|
||||
#define MSP_DSP_OUT_SCART 2 /* SCART output */
|
||||
#define MSP_DSP_OUT_I2S1 5 /* I2S1 output */
|
||||
#define MSP_DSP_OUT_I2S2 6 /* I2S2 output */
|
||||
#define MSP_DSP_OUT_I2S3 7 /* I2S3 output */
|
||||
#define MSP_DSP_OUT_MAIN_AVC 11 /* MAIN AVC processed output */
|
||||
#define MSP_DSP_OUT_MAIN 12 /* MAIN output */
|
||||
#define MSP_DSP_OUT_AUX 13 /* AUX output */
|
||||
#define MSP_DSP_IN_TUNER 0 /* Tuner DSP input */
|
||||
#define MSP_DSP_IN_SCART 2 /* SCART DSP input */
|
||||
#define MSP_DSP_IN_I2S1 5 /* I2S1 DSP input */
|
||||
#define MSP_DSP_IN_I2S2 6 /* I2S2 DSP input */
|
||||
#define MSP_DSP_IN_I2S3 7 /* I2S3 DSP input */
|
||||
#define MSP_DSP_IN_MAIN_AVC 11 /* MAIN AVC processed DSP input */
|
||||
#define MSP_DSP_IN_MAIN 12 /* MAIN DSP input */
|
||||
#define MSP_DSP_IN_AUX 13 /* AUX DSP input */
|
||||
#define MSP_DSP_TO_MAIN(in) ((in) << 4)
|
||||
#define MSP_DSP_TO_AUX(in) ((in) << 8)
|
||||
#define MSP_DSP_TO_SCART1(in) ((in) << 12)
|
||||
|
@ -125,16 +125,16 @@
|
|||
|
||||
/* Output SCART select: the SCART outputs can select which input
|
||||
to use. */
|
||||
#define MSP_OUT_SCART1 0 /* SCART1 input, bypassing the DSP */
|
||||
#define MSP_OUT_SCART2 1 /* SCART2 input, bypassing the DSP */
|
||||
#define MSP_OUT_SCART3 2 /* SCART3 input, bypassing the DSP */
|
||||
#define MSP_OUT_SCART4 3 /* SCART4 input, bypassing the DSP */
|
||||
#define MSP_OUT_SCART1_DA 4 /* DSP SCART1 output */
|
||||
#define MSP_OUT_SCART2_DA 5 /* DSP SCART2 output */
|
||||
#define MSP_OUT_MONO 6 /* MONO input, bypassing the DSP */
|
||||
#define MSP_OUT_MUTE 7 /* MUTE output */
|
||||
#define MSP_OUT_TO_SCART1(in) (in)
|
||||
#define MSP_OUT_TO_SCART2(in) ((in) << 4)
|
||||
#define MSP_SC_IN_SCART1 0 /* SCART1 input, bypassing the DSP */
|
||||
#define MSP_SC_IN_SCART2 1 /* SCART2 input, bypassing the DSP */
|
||||
#define MSP_SC_IN_SCART3 2 /* SCART3 input, bypassing the DSP */
|
||||
#define MSP_SC_IN_SCART4 3 /* SCART4 input, bypassing the DSP */
|
||||
#define MSP_SC_IN_DSP_SCART1 4 /* DSP SCART1 input */
|
||||
#define MSP_SC_IN_DSP_SCART2 5 /* DSP SCART2 input */
|
||||
#define MSP_SC_IN_MONO 6 /* MONO input, bypassing the DSP */
|
||||
#define MSP_SC_IN_MUTE 7 /* MUTE output */
|
||||
#define MSP_SC_TO_SCART1(in) (in)
|
||||
#define MSP_SC_TO_SCART2(in) ((in) << 4)
|
||||
|
||||
/* Shortcut macros */
|
||||
#define MSP_INPUT(sc, t, main_aux_src, sc_i2s_src) \
|
||||
|
@ -145,14 +145,14 @@
|
|||
MSP_DSP_TO_SCART1(sc_i2s_src) | \
|
||||
MSP_DSP_TO_SCART2(sc_i2s_src) | \
|
||||
MSP_DSP_TO_I2S(sc_i2s_src))
|
||||
#define MSP_INPUT_DEFAULT MSP_INPUT(MSP_IN_SCART_1, MSP_IN_TUNER_1, \
|
||||
MSP_DSP_OUT_TUNER, MSP_DSP_OUT_TUNER)
|
||||
#define MSP_INPUT_DEFAULT MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, \
|
||||
MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER)
|
||||
#define MSP_OUTPUT(sc) \
|
||||
(MSP_OUT_TO_SCART1(sc) | \
|
||||
MSP_OUT_TO_SCART2(sc))
|
||||
(MSP_SC_TO_SCART1(sc) | \
|
||||
MSP_SC_TO_SCART2(sc))
|
||||
/* This equals the RESET position of the msp3400 ACB register */
|
||||
#define MSP_OUTPUT_DEFAULT (MSP_OUT_TO_SCART1(MSP_OUT_SCART3) | \
|
||||
MSP_OUT_TO_SCART2(MSP_OUT_SCART1_DA))
|
||||
#define MSP_OUTPUT_DEFAULT (MSP_SC_TO_SCART1(MSP_SC_IN_SCART3) | \
|
||||
MSP_SC_TO_SCART2(MSP_SC_IN_DSP_SCART1))
|
||||
|
||||
/* Tuner inputs vs. msp version */
|
||||
/* Chip TUNER_1 TUNER_2
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
saa7115.h - definition for saa7113/4/5 inputs
|
||||
|
||||
Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _SAA7115_H_
|
||||
#define _SAA7115_H_
|
||||
|
||||
/* SAA7113/4/5 HW inputs */
|
||||
#define SAA7115_COMPOSITE0 0
|
||||
#define SAA7115_COMPOSITE1 1
|
||||
#define SAA7115_COMPOSITE2 2
|
||||
#define SAA7115_COMPOSITE3 3
|
||||
#define SAA7115_COMPOSITE4 4 /* not available for the saa7113 */
|
||||
#define SAA7115_COMPOSITE5 5 /* not available for the saa7113 */
|
||||
#define SAA7115_SVIDEO0 6
|
||||
#define SAA7115_SVIDEO1 7
|
||||
#define SAA7115_SVIDEO2 8
|
||||
#define SAA7115_SVIDEO3 9
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
saa7127.h - definition for saa7126/7/8/9 inputs/outputs
|
||||
|
||||
Copyright (C) 2006 Hans Verkuil (hverkuil@xs4all.nl)
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _SAA7127_H_
|
||||
#define _SAA7127_H_
|
||||
|
||||
/* Enumeration for the supported input types */
|
||||
enum saa7127_input_type {
|
||||
SAA7127_INPUT_TYPE_NORMAL,
|
||||
SAA7127_INPUT_TYPE_TEST_IMAGE
|
||||
};
|
||||
|
||||
/* Enumeration for the supported output signal types */
|
||||
enum saa7127_output_type {
|
||||
SAA7127_OUTPUT_TYPE_BOTH,
|
||||
SAA7127_OUTPUT_TYPE_COMPOSITE,
|
||||
SAA7127_OUTPUT_TYPE_SVIDEO,
|
||||
SAA7127_OUTPUT_TYPE_RGB,
|
||||
SAA7127_OUTPUT_TYPE_YUV_C,
|
||||
SAA7127_OUTPUT_TYPE_YUV_V
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* upd64031a - NEC Electronics Ghost Reduction input defines
|
||||
*
|
||||
* 2006 by Hans Verkuil (hverkuil@xs4all.nl)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _UPD64031A_H_
|
||||
#define _UPD64031A_H_
|
||||
|
||||
/* Ghost reduction modes */
|
||||
#define UPD64031A_GR_ON 0
|
||||
#define UPD64031A_GR_OFF 1
|
||||
#define UPD64031A_GR_THROUGH 3
|
||||
|
||||
/* Direct 3D/YCS Connection */
|
||||
#define UPD64031A_3DYCS_DISABLE (0 << 2)
|
||||
#define UPD64031A_3DYCS_COMPOSITE (2 << 2)
|
||||
#define UPD64031A_3DYCS_SVIDEO (3 << 2)
|
||||
|
||||
/* Composite sync digital separation circuit */
|
||||
#define UPD64031A_COMPOSITE_EXTERNAL (1 << 4)
|
||||
|
||||
/* Vertical sync digital separation circuit */
|
||||
#define UPD64031A_VERTICAL_EXTERNAL (1 << 5)
|
||||
|
||||
#endif
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* upd6408x - NEC Electronics 3-Dimensional Y/C separation input defines
|
||||
*
|
||||
* 2006 by Hans Verkuil (hverkuil@xs4all.nl)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _UPD64083_H_
|
||||
#define _UPD64083_H_
|
||||
|
||||
/* There are two bits of information that the driver needs in order
|
||||
to select the correct routing: the operating mode and the selection
|
||||
of the Y input (external or internal).
|
||||
|
||||
The first two operating modes expect a composite signal on the Y input,
|
||||
the second two operating modes use both the Y and C inputs.
|
||||
|
||||
Normally YCS_MODE is used for tuner and composite inputs, and the
|
||||
YCNR mode is used for S-Video inputs.
|
||||
|
||||
The external Y-ADC is selected when the composite input comes from a
|
||||
upd64031a ghost reduction device. If this device is not present, or
|
||||
the input is a S-Video signal, then the internal Y-ADC input should
|
||||
be used. */
|
||||
|
||||
/* Operating modes: */
|
||||
|
||||
/* YCS mode: Y/C separation (burst locked clocking) */
|
||||
#define UPD64083_YCS_MODE 0
|
||||
/* YCS+ mode: 2D Y/C separation and YCNR (burst locked clocking) */
|
||||
#define UPD64083_YCS_PLUS_MODE 1
|
||||
|
||||
/* Note: the following two modes cannot be used in combination with the
|
||||
external Y-ADC. */
|
||||
/* MNNR mode: frame comb type YNR+C delay (line locked clocking) */
|
||||
#define UPD64083_MNNR_MODE 2
|
||||
/* YCNR mode: frame recursive YCNR (burst locked clocking) */
|
||||
#define UPD64083_YCNR_MODE 3
|
||||
|
||||
/* Select external Y-ADC: this should be set if this device is used in
|
||||
combination with the upd64031a ghost reduction device.
|
||||
Otherwise leave at 0 (use internal Y-ADC). */
|
||||
#define UPD64083_EXT_Y_ADC (1 << 2)
|
||||
|
||||
#endif
|
Загрузка…
Ссылка в новой задаче