Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (126 commits) V4L/DVB (5847): Clean up schedule_timeout calls in cpia2 and ivtv code V4L/DVB (5846): Clean up setting state and scheduling timeouts V4L/DVB (5844): ivtv: add high volume debugging flag V4L/DVB (5843): ivtv: fix missing signal_pending check. V4L/DVB (5842): ivtv: Add locking to ensure stream setup is atomic. V4L/DVB (5841): tveeprom: add support for Philips FQ1216LME MK3 tuner. V4L/DVB (5840): fix dst and cx24123: tune() callback changed signess for delay V4L/DVB (5838): dvb-core: Fix signedness warnings (gcc 4.1.1, kernel 2.6.22) V4L/DVB (5837): stv0299: Fix signedness warning (gcc 4.1.1, kernel 2.6.22) V4L/DVB (5836): dvb-ttpci: re-initialize aspect ratio and pan scan after arm crash V4L/DVB (5835): saa7146/dvb-ttpci: Fix signedness warnings (gcc 4.1.1, kernel 2.6.22) V4L/DVB (5834): dvb-core: fix signedness warnings and const stripping V4L/DVB (5832): ir-common: optimize bit extract function V4L/DVB (5831): stradis: use ARRAY_SIZE V4L/DVB (5829): Firmware extract and loading for opera dvb-usb update V4L/DVB (5828): Kconfig: Added GemTek USB radio and removed experimental dependency. V4L/DVB (5826): Usbvision: video mux cleanup V4L/DVB (5825): Alter the tuner type for the WinTV USB UK PAL model. V4L/DVB (5824): Usbvision: Hauppauge WinTV USB SECAM_L fix V4L/DVB (5821): Saa7134: add remote control support for LifeView FlyDVB-S LR300 ...
This commit is contained in:
commit
a267c0a887
|
@ -9,19 +9,29 @@ for accessing the i2c bus and the gpio pins of the bt8xx chipset.
|
|||
Please see Documentation/dvb/cards.txt => o Cards based on the Conexant Bt8xx PCI bridge:
|
||||
|
||||
Compiling kernel please enable:
|
||||
a.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "BT848 Video For Linux"
|
||||
b.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Bt8xx based PCI Cards"
|
||||
a.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "Enable Video for Linux API 1 (DEPRECATED)"
|
||||
b.)"Device drivers" => "Multimedia devices" => "Video For Linux" => "Video Capture Adapters" => "BT848 Video For Linux"
|
||||
c.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices" => "DVB for Linux" "DVB Core Support" "Bt8xx based PCI Cards"
|
||||
|
||||
Please use the following options with care as deselection of drivers which are in fact necessary
|
||||
may result in DVB devices that cannot be tuned due to lack of driver support:
|
||||
You can save RAM by deselecting every frontend module that your DVB card does not need.
|
||||
|
||||
First please remove the static dependency of DVB card drivers on all frontend modules for all possible card variants by enabling:
|
||||
d.) "Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Load and attach frontend modules as needed"
|
||||
|
||||
If you know the frontend driver that your card needs please enable:
|
||||
e.)"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||
=> "DVB for Linux" "DVB Core Support" "Customise DVB Frontends" => "Customise the frontend modules to build"
|
||||
Then please select your card-specific frontend module.
|
||||
|
||||
2) Loading Modules
|
||||
==================
|
||||
|
||||
In default cases bttv is loaded automatically.
|
||||
To load the backend either place dvb-bt8xx in etc/modules, or apply manually:
|
||||
|
||||
$ modprobe dvb-bt8xx
|
||||
|
||||
All frontends will be loaded automatically.
|
||||
Regular case: If the bttv driver detects a bt8xx-based DVB card, all frontend and backend modules will be loaded automatically.
|
||||
Exceptions are:
|
||||
- Old TwinHan DST cards or clones with or without CA slot and not containing an Eeprom.
|
||||
People running udev please see Documentation/dvb/udev.txt.
|
||||
|
||||
In the following cases overriding the PCI type detection for dvb-bt8xx might be necessary:
|
||||
|
@ -30,7 +40,6 @@ In the following cases overriding the PCI type detection for dvb-bt8xx might be
|
|||
------------------------------
|
||||
|
||||
$ modprobe bttv card=113
|
||||
$ modprobe dvb-bt8xx
|
||||
$ modprobe dst
|
||||
|
||||
Useful parameters for verbosity level and debugging the dst module:
|
||||
|
@ -65,10 +74,9 @@ DViCO FusionHDTV 5 Lite: 135
|
|||
Notice: The order of the card ID should be uprising:
|
||||
Example:
|
||||
$ modprobe bttv card=113 card=135
|
||||
$ modprobe dvb-bt8xx
|
||||
|
||||
For a full list of card ID's please see Documentation/video4linux/CARDLIST.bttv.
|
||||
In case of further problems send questions to the mailing list: www.linuxdvb.org.
|
||||
In case of further problems please subscribe and send questions to the mailing list: linux-dvb@linuxtv.org.
|
||||
|
||||
Authors: Richard Walker,
|
||||
Jamie Honan,
|
||||
|
|
|
@ -24,7 +24,8 @@ use IO::Handle;
|
|||
@components = ( "sp8870", "sp887x", "tda10045", "tda10046",
|
||||
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
||||
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird");
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||
"opera1");
|
||||
|
||||
# Check args
|
||||
syntax() if (scalar(@ARGV) != 1);
|
||||
|
@ -56,7 +57,7 @@ syntax();
|
|||
|
||||
sub sp8870 {
|
||||
my $sourcefile = "tt_Premium_217g.zip";
|
||||
my $url = "http://www.technotrend.de/new/217g/$sourcefile";
|
||||
my $url = "http://www.softwarepatch.pl/9999ccd06a4813cb827dbb0005071c71/$sourcefile";
|
||||
my $hash = "53970ec17a538945a6d8cb608a7b3899";
|
||||
my $outfile = "dvb-fe-sp8870.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
@ -210,6 +211,45 @@ sub dec3000s {
|
|||
|
||||
$outfile;
|
||||
}
|
||||
sub opera1{
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 0);
|
||||
|
||||
checkstandard();
|
||||
my $fwfile1="dvb-usb-opera1-fpga-01.fw";
|
||||
my $fwfile2="dvb-usb-opera-01.fw";
|
||||
extract("2830SCap2.sys", 0x62e8, 55024, "$tmpdir/opera1-fpga.fw");
|
||||
extract("2830SLoad2.sys",0x3178,0x3685-0x3178,"$tmpdir/fw1part1");
|
||||
extract("2830SLoad2.sys",0x0980,0x3150-0x0980,"$tmpdir/fw1part2");
|
||||
delzero("$tmpdir/fw1part1","$tmpdir/fw1part1-1");
|
||||
delzero("$tmpdir/fw1part2","$tmpdir/fw1part2-1");
|
||||
verify("$tmpdir/fw1part1-1","5e0909858fdf0b5b09ad48b9fe622e70");
|
||||
verify("$tmpdir/fw1part2-1","d6e146f321427e931df2c6fcadac37a1");
|
||||
verify("$tmpdir/opera1-fpga.fw","0f8133f5e9051f5f3c1928f7e5a1b07d");
|
||||
|
||||
my $RES1="\x01\x92\x7f\x00\x01\x00";
|
||||
my $RES0="\x01\x92\x7f\x00\x00\x00";
|
||||
my $DAT1="\x01\x00\xe6\x00\x01\x00";
|
||||
my $DAT0="\x01\x00\xe6\x00\x00\x00";
|
||||
open FW,">$tmpdir/opera.fw";
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
appendfile(FW,"$tmpdir/fw1part1-1");
|
||||
print FW "$RES0";
|
||||
print FW "$DAT0";
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
appendfile(FW,"$tmpdir/fw1part2-1");
|
||||
print FW "$RES1";
|
||||
print FW "$DAT1";
|
||||
print FW "$RES0";
|
||||
print FW "$DAT0";
|
||||
copy ("$tmpdir/opera1-fpga.fw",$fwfile1);
|
||||
copy ("$tmpdir/opera.fw",$fwfile2);
|
||||
|
||||
$fwfile1.",".$fwfile2;
|
||||
}
|
||||
|
||||
sub vp7041 {
|
||||
my $sourcefile = "2.422.zip";
|
||||
|
@ -440,6 +480,25 @@ sub appendfile {
|
|||
close(INFILE);
|
||||
}
|
||||
|
||||
sub delzero{
|
||||
my ($infile,$outfile) =@_;
|
||||
|
||||
open INFILE,"<$infile";
|
||||
open OUTFILE,">$outfile";
|
||||
while (1){
|
||||
$rcount=sysread(INFILE,$buf,22);
|
||||
$len=ord(substr($buf,0,1));
|
||||
print OUTFILE substr($buf,0,1);
|
||||
print OUTFILE substr($buf,2,$len+3);
|
||||
last if ($rcount<1);
|
||||
printf OUTFILE "%c",0;
|
||||
#print $len." ".length($buf)."\n";
|
||||
|
||||
}
|
||||
close(INFILE);
|
||||
close(OUTFILE);
|
||||
}
|
||||
|
||||
sub syntax() {
|
||||
print STDERR "syntax: get_dvb_firmware <component>\n";
|
||||
print STDERR "Supported components:\n";
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
To extract the firmware for the Opera DVB-S1 USB-Box
|
||||
you need to copy the files:
|
||||
|
||||
2830SCap2.sys
|
||||
2830SLoad2.sys
|
||||
|
||||
from the windriver disk into this directory.
|
||||
|
||||
Then run
|
||||
|
||||
./get_dvb_firware opera1
|
||||
|
||||
and after that you have 2 files:
|
||||
|
||||
dvb-usb-opera-01.fw
|
||||
dvb-usb-opera1-fpga-01.fw
|
||||
|
||||
in here.
|
||||
|
||||
Copy them into /lib/firmware/ .
|
||||
|
||||
After that the driver can load the firmware
|
||||
(if you have enabled firmware loading
|
||||
in kernel config and have hotplug running).
|
||||
|
||||
|
||||
Marco Gittler <g.marco@freenet.de>
|
|
@ -66,7 +66,7 @@
|
|||
65 -> Lifeview FlyVideo 2000S LR90
|
||||
66 -> Terratec TValueRadio [153b:1135,153b:ff3b]
|
||||
67 -> IODATA GV-BCTV4/PCI [10fc:4050]
|
||||
68 -> 3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA) [121a:3000,10b4:2637]
|
||||
68 -> 3Dfx VoodooTV FM (Euro) [10b4:2637]
|
||||
69 -> Active Imaging AIMMS
|
||||
70 -> Prolink Pixelview PV-BT878P+ (Rev.4C,8E)
|
||||
71 -> Lifeview FlyVideo 98EZ (capture only) LR51 [1851:1851]
|
||||
|
@ -145,3 +145,5 @@
|
|||
144 -> MagicTV
|
||||
145 -> SSAI Security Video Interface [4149:5353]
|
||||
146 -> SSAI Ultrasound Video Interface [414a:5353]
|
||||
147 -> VoodooTV 200 (USA) [121a:3000]
|
||||
148 -> DViCO FusionHDTV 2 [dbc0:d200]
|
||||
|
|
|
@ -55,3 +55,4 @@
|
|||
54 -> Norwood Micro TV Tuner
|
||||
55 -> Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM [c180:c980]
|
||||
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
||||
57 -> ADS Tech Instant Video PCI [1421:0390]
|
||||
|
|
|
@ -114,3 +114,4 @@
|
|||
113 -> Elitegroup ECS TVP3XP FM1246 Tuner Card (PAL,FM) [1019:4cb6]
|
||||
114 -> KWorld DVB-T 210 [17de:7250]
|
||||
115 -> Sabrent PCMCIA TV-PCB05 [0919:2003]
|
||||
116 -> 10MOONS TM300 TV Card [1131:2304]
|
||||
|
|
|
@ -40,7 +40,7 @@ tuner=38 - Philips PAL/SECAM multi (FM1216ME MK3)
|
|||
tuner=39 - LG NTSC (newer TAPC series)
|
||||
tuner=40 - HITACHI V7-J180AT
|
||||
tuner=41 - Philips PAL_MK (FI1216 MK)
|
||||
tuner=42 - Philips 1236D ATSC/NTSC dual in
|
||||
tuner=42 - Philips FCV1236D ATSC/NTSC dual in
|
||||
tuner=43 - Philips NTSC MK3 (FM1236MK3 or FM1236/F)
|
||||
tuner=44 - Philips 4 in 1 (ATI TV Wonder Pro/Conexant)
|
||||
tuner=45 - Microtune 4049 FM5
|
||||
|
@ -72,3 +72,4 @@ tuner=70 - Samsung TCPN 2121P30A
|
|||
tuner=71 - Xceive xc3028
|
||||
tuner=72 - Thomson FE6600
|
||||
tuner=73 - Samsung TCPG 6121P30A
|
||||
tuner=75 - Philips TEA5761 FM Radio
|
||||
|
|
|
@ -436,7 +436,7 @@ HV7131D Hynix Semiconductor | Yes No No No
|
|||
HV7131R Hynix Semiconductor | No Yes Yes Yes
|
||||
MI-0343 Micron Technology | Yes No No No
|
||||
MI-0360 Micron Technology | No Yes Yes Yes
|
||||
OV7630 OmniVision Technologies | Yes Yes No No
|
||||
OV7630 OmniVision Technologies | Yes Yes Yes Yes
|
||||
OV7660 OmniVision Technologies | No No Yes Yes
|
||||
PAS106B PixArt Imaging | Yes No No No
|
||||
PAS202B PixArt Imaging | Yes Yes No No
|
||||
|
@ -583,6 +583,7 @@ order):
|
|||
- Bertrik Sikken, who reverse-engineered and documented the Huffman compression
|
||||
algorithm used in the SN9C101, SN9C102 and SN9C103 controllers and
|
||||
implemented the first decoder;
|
||||
- Ronny Standke for the donation of a webcam;
|
||||
- Mizuno Takafumi for the donation of a webcam;
|
||||
- an "anonymous" donator (who didn't want his name to be revealed) for the
|
||||
donation of a webcam.
|
||||
|
|
|
@ -62,4 +62,4 @@ Vendor Product Distributor Model
|
|||
0x0784 0x0040 Traveler Slimline X5
|
||||
0x06d6 0x0034 Trust Powerc@m 750
|
||||
0x0a17 0x0062 Pentax Optio 50L
|
||||
|
||||
0x06d6 0x003b Trust Powerc@m 970Z
|
||||
|
|
|
@ -80,8 +80,12 @@ config VIDEO_BUF_DVB
|
|||
config VIDEO_BTCX
|
||||
tristate
|
||||
|
||||
config VIDEO_IR_I2C
|
||||
tristate
|
||||
|
||||
config VIDEO_IR
|
||||
tristate
|
||||
select VIDEO_IR_I2C if I2C
|
||||
|
||||
config VIDEO_TVEEPROM
|
||||
tristate
|
||||
|
|
|
@ -107,21 +107,20 @@ void ir_input_keydown(struct input_dev *dev, struct ir_input_state *ir,
|
|||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/* extract mask bits out of data and pack them into the result */
|
||||
u32 ir_extract_bits(u32 data, u32 mask)
|
||||
{
|
||||
int mbit, vbit;
|
||||
u32 value;
|
||||
u32 vbit = 1, value = 0;
|
||||
|
||||
do {
|
||||
if (mask&1) {
|
||||
if (data&1)
|
||||
value |= vbit;
|
||||
vbit<<=1;
|
||||
}
|
||||
data>>=1;
|
||||
} while (mask>>=1);
|
||||
|
||||
value = 0;
|
||||
vbit = 0;
|
||||
for (mbit = 0; mbit < 32; mbit++) {
|
||||
if (!(mask & ((u32)1 << mbit)))
|
||||
continue;
|
||||
if (data & ((u32)1 << mbit))
|
||||
value |= (1 << vbit);
|
||||
vbit++;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ static int saa7146_num;
|
|||
|
||||
unsigned int saa7146_debug;
|
||||
|
||||
module_param(saa7146_debug, int, 0644);
|
||||
module_param(saa7146_debug, uint, 0644);
|
||||
MODULE_PARM_DESC(saa7146_debug, "debug level (default: 0)");
|
||||
|
||||
#if 0
|
||||
|
@ -130,10 +130,10 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
|
|||
/********************************************************************************/
|
||||
/* common page table functions */
|
||||
|
||||
char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt)
|
||||
void *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt)
|
||||
{
|
||||
int pages = (length+PAGE_SIZE-1)/PAGE_SIZE;
|
||||
char *mem = vmalloc_32(length);
|
||||
void *mem = vmalloc_32(length);
|
||||
int slen = 0;
|
||||
|
||||
if (NULL == mem)
|
||||
|
@ -168,7 +168,7 @@ err_null:
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void saa7146_vfree_destroy_pgtable(struct pci_dev *pci, char *mem, struct saa7146_pgtable *pt)
|
||||
void saa7146_vfree_destroy_pgtable(struct pci_dev *pci, void *mem, struct saa7146_pgtable *pt)
|
||||
{
|
||||
pci_unmap_sg(pci, pt->slist, pt->nents, PCI_DMA_FROMDEVICE);
|
||||
saa7146_pgtable_free(pci, pt);
|
||||
|
|
|
@ -889,9 +889,9 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
|
|||
|
||||
DEB_EE(("VIDIOC_QUERYCAP\n"));
|
||||
|
||||
strcpy(cap->driver, "saa7146 v4l2");
|
||||
strlcpy(cap->card, dev->ext->name, sizeof(cap->card));
|
||||
sprintf(cap->bus_info,"PCI:%s", pci_name(dev->pci));
|
||||
strcpy((char *)cap->driver, "saa7146 v4l2");
|
||||
strlcpy((char *)cap->card, dev->ext->name, sizeof(cap->card));
|
||||
sprintf((char *)cap->bus_info,"PCI:%s", pci_name(dev->pci));
|
||||
cap->version = SAA7146_VERSION_CODE;
|
||||
cap->capabilities =
|
||||
V4L2_CAP_VIDEO_CAPTURE |
|
||||
|
@ -968,7 +968,7 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
|
|||
}
|
||||
memset(f,0,sizeof(*f));
|
||||
f->index = index;
|
||||
strlcpy(f->description,formats[index].name,sizeof(f->description));
|
||||
strlcpy((char *)f->description,formats[index].name,sizeof(f->description));
|
||||
f->pixelformat = formats[index].pixelformat;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
config DVB_B2C2_FLEXCOP
|
||||
tristate "Technisat/B2C2 FlexCopII(b) and FlexCopIII adapters"
|
||||
depends on DVB_CORE && I2C
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
||||
select DVB_MT352 if !DVB_FE_CUSTOMISE
|
||||
select DVB_MT312 if !DVB_FE_CUSTOMISE
|
||||
|
|
|
@ -12,4 +12,4 @@ obj-$(CONFIG_DVB_B2C2_FLEXCOP_PCI) += b2c2-flexcop-pci.o
|
|||
b2c2-flexcop-usb-objs = flexcop-usb.o
|
||||
obj-$(CONFIG_DVB_B2C2_FLEXCOP_USB) += b2c2-flexcop-usb.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
|
|
|
@ -500,13 +500,13 @@ int flexcop_frontend_init(struct flexcop_device *fc)
|
|||
/* try the air atsc 2nd generation (nxt2002) */
|
||||
if ((fc->fe = dvb_attach(nxt200x_attach, &samsung_tbmv_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC2;
|
||||
dvb_attach(dvb_pll_attach, fc->fe, 0x61, NULL, &dvb_pll_samsung_tbmv);
|
||||
dvb_attach(dvb_pll_attach, fc->fe, 0x61, NULL, DVB_PLL_SAMSUNG_TBMV);
|
||||
info("found the nxt2002 at i2c address: 0x%02x",samsung_tbmv_config.demod_address);
|
||||
} else
|
||||
/* try the air atsc 3nd generation (lgdt3303) */
|
||||
if ((fc->fe = dvb_attach(lgdt330x_attach, &air2pc_atsc_hd5000_config, &fc->i2c_adap)) != NULL) {
|
||||
fc->dev_type = FC_AIR_ATSC3;
|
||||
dvb_attach(dvb_pll_attach, fc->fe, 0x61, &fc->i2c_adap, &dvb_pll_lg_tdvs_h06xf);
|
||||
dvb_attach(dvb_pll_attach, fc->fe, 0x61, &fc->i2c_adap, DVB_PLL_LG_TDVS_H06XF);
|
||||
info("found the lgdt3303 at i2c address: 0x%02x",air2pc_atsc_hd5000_config.demod_address);
|
||||
} else
|
||||
/* try the air atsc 1nd generation (bcm3510)/panasonic ct10s */
|
||||
|
|
|
@ -7,7 +7,7 @@ config DVB_BT8XX
|
|||
select DVB_CX24110 if !DVB_FE_CUSTOMISE
|
||||
select DVB_OR51211 if !DVB_FE_CUSTOMISE
|
||||
select DVB_LGDT330X if !DVB_FE_CUSTOMISE
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_ZL10353 if !DVB_FE_CUSTOMISE
|
||||
select FW_LOADER
|
||||
help
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-$(CONFIG_DVB_BT8XX) += bt878.o dvb-bt8xx.o dst.o dst_ca.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video/bt8xx -Idrivers/media/dvb/frontends
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/video/bt8xx -Idrivers/media/dvb/frontends
|
||||
|
|
|
@ -1652,7 +1652,7 @@ static int dst_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_paramet
|
|||
static int dst_tune_frontend(struct dvb_frontend* fe,
|
||||
struct dvb_frontend_parameters* p,
|
||||
unsigned int mode_flags,
|
||||
int *delay,
|
||||
unsigned int *delay,
|
||||
fe_status_t *status)
|
||||
{
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
|
|
|
@ -611,7 +611,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
|
|||
card->fe = dvb_attach(lgdt330x_attach, &tdvs_tua6034_config, card->i2c_adapter);
|
||||
if (card->fe != NULL) {
|
||||
dvb_attach(dvb_pll_attach, card->fe, 0x61,
|
||||
card->i2c_adapter, &dvb_pll_lg_tdvs_h06xf);
|
||||
card->i2c_adapter, DVB_PLL_LG_TDVS_H06XF);
|
||||
dprintk ("dvb_bt8xx: lgdt330x detected\n");
|
||||
}
|
||||
break;
|
||||
|
@ -692,6 +692,9 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
|
|||
|
||||
case BTTV_BOARD_PC_HDTV:
|
||||
card->fe = dvb_attach(or51211_attach, &or51211_config, card->i2c_adapter);
|
||||
if (card->fe != NULL)
|
||||
dvb_attach(dvb_pll_attach, card->fe, 0x61,
|
||||
card->i2c_adapter, DVB_PLL_FCV1236D);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-$(CONFIG_DVB_CINERGYT2) += cinergyT2.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/
|
||||
|
|
|
@ -829,7 +829,7 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2)
|
|||
input_dev->id.vendor = cinergyt2->udev->descriptor.idVendor;
|
||||
input_dev->id.product = cinergyt2->udev->descriptor.idProduct;
|
||||
input_dev->id.version = 1;
|
||||
input_dev->cdev.dev = &cinergyt2->udev->dev;
|
||||
input_dev->dev.parent = &cinergyt2->udev->dev;
|
||||
|
||||
err = input_register_device(input_dev);
|
||||
if (err) {
|
||||
|
@ -1000,18 +1000,15 @@ static int cinergyt2_suspend (struct usb_interface *intf, pm_message_t state)
|
|||
if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->wq_sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (1) {
|
||||
cinergyt2_suspend_rc(cinergyt2);
|
||||
cancel_rearming_delayed_work(&cinergyt2->query_work);
|
||||
cinergyt2_suspend_rc(cinergyt2);
|
||||
cancel_rearming_delayed_work(&cinergyt2->query_work);
|
||||
|
||||
mutex_lock(&cinergyt2->sem);
|
||||
if (cinergyt2->streaming)
|
||||
cinergyt2_stop_stream_xfer(cinergyt2);
|
||||
cinergyt2_sleep(cinergyt2, 1);
|
||||
mutex_unlock(&cinergyt2->sem);
|
||||
}
|
||||
mutex_lock(&cinergyt2->sem);
|
||||
if (cinergyt2->streaming)
|
||||
cinergyt2_stop_stream_xfer(cinergyt2);
|
||||
cinergyt2_sleep(cinergyt2, 1);
|
||||
mutex_unlock(&cinergyt2->sem);
|
||||
|
||||
mutex_unlock(&cinergyt2->wq_sem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
|
|||
if (avail > todo)
|
||||
avail = todo;
|
||||
|
||||
ret = dvb_ringbuffer_read(src, buf, avail, 1);
|
||||
ret = dvb_ringbuffer_read(src, (u8 *)buf, avail, 1);
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot, u8 * e
|
|||
* @param nlen Number of bytes in needle.
|
||||
* @return Pointer into haystack needle was found at, or NULL if not found.
|
||||
*/
|
||||
static u8 *findstr(u8 * haystack, int hlen, u8 * needle, int nlen)
|
||||
static char *findstr(char * haystack, int hlen, char * needle, int nlen)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -482,7 +482,7 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
|
|||
}
|
||||
|
||||
/* check it contains the correct DVB string */
|
||||
dvb_str = findstr(tuple, tupleLength, "DVB_CI_V", 8);
|
||||
dvb_str = findstr((char *)tuple, tupleLength, "DVB_CI_V", 8);
|
||||
if (dvb_str == NULL)
|
||||
return -EINVAL;
|
||||
if (tupleLength < ((dvb_str - (char *) tuple) + 12))
|
||||
|
@ -513,8 +513,8 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
|
|||
ca->slot_info[slot].config_option = tuple[0] & 0x3f;
|
||||
|
||||
/* OK, check it contains the correct strings */
|
||||
if ((findstr(tuple, tupleLength, "DVB_HOST", 8) == NULL) ||
|
||||
(findstr(tuple, tupleLength, "DVB_CI_MODULE", 13) == NULL))
|
||||
if ((findstr((char *)tuple, tupleLength, "DVB_HOST", 8) == NULL) ||
|
||||
(findstr((char *)tuple, tupleLength, "DVB_CI_MODULE", 13) == NULL))
|
||||
break;
|
||||
|
||||
got_cftableentry = 1;
|
||||
|
@ -1300,7 +1300,7 @@ static ssize_t dvb_ca_en50221_io_write(struct file *file,
|
|||
struct dvb_ca_private *ca = dvbdev->priv;
|
||||
u8 slot, connection_id;
|
||||
int status;
|
||||
char fragbuf[HOST_LINK_BUF_SIZE];
|
||||
u8 fragbuf[HOST_LINK_BUF_SIZE];
|
||||
int fragpos = 0;
|
||||
int fraglen;
|
||||
unsigned long timeout;
|
||||
|
@ -1486,7 +1486,7 @@ static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
|
|||
}
|
||||
|
||||
if ((status = dvb_ringbuffer_pkt_read(&ca->slot_info[slot].rx_buffer, idx, 2,
|
||||
buf + pktlen, fraglen, 1)) < 0) {
|
||||
(u8 *)buf + pktlen, fraglen, 1)) < 0) {
|
||||
goto exit;
|
||||
}
|
||||
pktlen += fraglen;
|
||||
|
|
|
@ -1068,7 +1068,7 @@ static int dvbdmx_write(struct dmx_demux *demux, const char *buf, size_t count)
|
|||
|
||||
if (mutex_lock_interruptible(&dvbdemux->mutex))
|
||||
return -ERESTARTSYS;
|
||||
dvb_dmx_swfilter(dvbdemux, buf, count);
|
||||
dvb_dmx_swfilter(dvbdemux, (u8 *)buf, count);
|
||||
mutex_unlock(&dvbdemux->mutex);
|
||||
|
||||
if (signal_pending(current))
|
||||
|
|
|
@ -103,7 +103,7 @@ struct dvb_frontend_ops {
|
|||
int (*tune)(struct dvb_frontend* fe,
|
||||
struct dvb_frontend_parameters* params,
|
||||
unsigned int mode_flags,
|
||||
int *delay,
|
||||
unsigned int *delay,
|
||||
fe_status_t *status);
|
||||
/* get frontend tuning algorithm from the module */
|
||||
int (*get_frontend_algo)(struct dvb_frontend *fe);
|
||||
|
|
|
@ -347,7 +347,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
|
|||
{
|
||||
struct dvb_net_priv *priv = dev->priv;
|
||||
unsigned long skipped = 0L;
|
||||
u8 *ts, *ts_end, *from_where = NULL, ts_remain = 0, how_much = 0, new_ts = 1;
|
||||
const u8 *ts, *ts_end, *from_where = NULL;
|
||||
u8 ts_remain = 0, how_much = 0, new_ts = 1;
|
||||
struct ethhdr *ethh = NULL;
|
||||
|
||||
#ifdef ULE_DEBUG
|
||||
|
@ -364,7 +365,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len )
|
|||
/* For all TS cells in current buffer.
|
||||
* Appearently, we are called for every single TS cell.
|
||||
*/
|
||||
for (ts = (char *)buf, ts_end = (char *)buf + buf_len; ts < ts_end; /* no default incr. */ ) {
|
||||
for (ts = buf, ts_end = buf + buf_len; ts < ts_end; /* no default incr. */ ) {
|
||||
|
||||
if (new_ts) {
|
||||
/* We are about to process a new TS cell. */
|
||||
|
|
|
@ -208,7 +208,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||
if ((id = dvbdev_get_free_id (adap, type)) < 0){
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
*pdvbdev = NULL;
|
||||
printk ("%s: could get find free device id...\n", __FUNCTION__);
|
||||
printk(KERN_ERR "%s: couldn't find free device id\n", __FUNCTION__);
|
||||
return -ENFILE;
|
||||
}
|
||||
|
||||
|
@ -252,7 +252,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||
return PTR_ERR(clsdev);
|
||||
}
|
||||
|
||||
dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
|
||||
dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
|
||||
adap->num, dnames[type], id, nums2minor(adap->num, type, id),
|
||||
nums2minor(adap->num, type, id));
|
||||
|
||||
|
@ -311,7 +311,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
|
|||
memset (adap, 0, sizeof(struct dvb_adapter));
|
||||
INIT_LIST_HEAD (&adap->device_list);
|
||||
|
||||
printk ("DVB: registering new adapter (%s).\n", name);
|
||||
printk(KERN_INFO "DVB: registering new adapter (%s)\n", name);
|
||||
|
||||
adap->num = num;
|
||||
adap->name = name;
|
||||
|
@ -407,13 +407,13 @@ static int __init init_dvbdev(void)
|
|||
dev_t dev = MKDEV(DVB_MAJOR, 0);
|
||||
|
||||
if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) {
|
||||
printk("dvb-core: unable to get major %d\n", DVB_MAJOR);
|
||||
printk(KERN_ERR "dvb-core: unable to get major %d\n", DVB_MAJOR);
|
||||
return retval;
|
||||
}
|
||||
|
||||
cdev_init(&dvb_device_cdev, &dvb_device_fops);
|
||||
if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) {
|
||||
printk("dvb-core: unable to get major %d\n", DVB_MAJOR);
|
||||
printk(KERN_ERR "dvb-core: unable register character device\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ config DVB_USB
|
|||
tristate "Support for various USB DVB devices"
|
||||
depends on DVB_CORE && USB && I2C
|
||||
select FW_LOADER
|
||||
select DVB_PLL
|
||||
help
|
||||
By enabling this you will be able to choose the various supported
|
||||
USB1.1 and USB2.0 DVB devices.
|
||||
|
@ -27,13 +26,14 @@ config DVB_USB_A800
|
|||
depends on DVB_USB
|
||||
select DVB_DIB3000MC
|
||||
select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Say Y here to support the AVerMedia AverTV DVB-T USB 2.0 (A800) receiver.
|
||||
|
||||
config DVB_USB_DIBUSB_MB
|
||||
tristate "DiBcom USB DVB-T devices (based on the DiB3000M-B) (see help for device list)"
|
||||
depends on DVB_USB
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_DIB3000MB
|
||||
select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
|
@ -89,7 +89,7 @@ config DVB_USB_DIB0700
|
|||
config DVB_USB_UMT_010
|
||||
tristate "HanfTek UMT-010 DVB-T USB2.0 support"
|
||||
depends on DVB_USB
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_DIB3000MC
|
||||
select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
|
@ -98,7 +98,7 @@ config DVB_USB_UMT_010
|
|||
config DVB_USB_CXUSB
|
||||
tristate "Conexant USB2.0 hybrid reference design support"
|
||||
depends on DVB_USB
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_CX22702 if !DVB_FE_CUSTOMISE
|
||||
select DVB_LGDT330X if !DVB_FE_CUSTOMISE
|
||||
select DVB_MT352 if !DVB_FE_CUSTOMISE
|
||||
|
@ -142,7 +142,7 @@ config DVB_USB_AU6610
|
|||
config DVB_USB_DIGITV
|
||||
tristate "Nebula Electronics uDigiTV DVB-T USB2.0 support"
|
||||
depends on DVB_USB
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_NXT6000 if !DVB_FE_CUSTOMISE
|
||||
select DVB_MT352 if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
|
@ -188,6 +188,7 @@ config DVB_USB_NOVA_T_USB2
|
|||
depends on DVB_USB
|
||||
select DVB_DIB3000MC
|
||||
select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Say Y here to support the Hauppauge WinTV-NOVA-T usb2 DVB-T USB2.0 receiver.
|
||||
|
||||
|
@ -216,5 +217,23 @@ config DVB_USB_OPERA1
|
|||
tristate "Opera1 DVB-S USB2.0 receiver"
|
||||
depends on DVB_USB
|
||||
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Say Y here to support the Opera DVB-S USB2.0 receiver.
|
||||
|
||||
config DVB_USB_AF9005
|
||||
tristate "Afatech AF9005 DVB-T USB1.1 support"
|
||||
depends on DVB_USB && EXPERIMENTAL
|
||||
select DVB_TUNER_MT2060 if !DVB_FE_CUSTOMISE
|
||||
select DVB_TUNER_QT1010 if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Say Y here to support the Afatech AF9005 based DVB-T USB1.1 receiver
|
||||
and the TerraTec Cinergy T USB XE (Rev.1)
|
||||
|
||||
config DVB_USB_AF9005_REMOTE
|
||||
tristate "Afatech AF9005 default remote control support"
|
||||
depends on DVB_USB_AF9005
|
||||
help
|
||||
Say Y here to support the default remote control decoding for the
|
||||
Afatech AF9005 based receiver.
|
||||
|
||||
|
|
|
@ -55,4 +55,10 @@ dvb-usb-opera-objs = opera1.o
|
|||
obj-$(CONFIG_DVB_USB_OPERA1) += dvb-usb-opera.o
|
||||
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
dvb-usb-af9005-objs = af9005.o af9005-fe.o
|
||||
obj-$(CONFIG_DVB_USB_AF9005) += dvb-usb-af9005.o
|
||||
|
||||
dvb-usb-af9005-remote-objs = af9005-remote.o
|
||||
obj-$(CONFIG_DVB_USB_AF9005_REMOTE) += dvb-usb-af9005-remote.o
|
||||
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,157 @@
|
|||
/* DVB USB compliant Linux driver for the Afatech 9005
|
||||
* USB1.1 DVB-T receiver.
|
||||
*
|
||||
* Standard remote decode function
|
||||
*
|
||||
* Copyright (C) 2007 Luca Olivetti (luca@ventoso.org)
|
||||
*
|
||||
* Thanks to Afatech who kindly provided information.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* see Documentation/dvb/REDME.dvb-usb for more information
|
||||
*/
|
||||
#include "af9005.h"
|
||||
/* debug */
|
||||
int dvb_usb_af9005_remote_debug;
|
||||
module_param_named(debug, dvb_usb_af9005_remote_debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug,
|
||||
"enable (1) or disable (0) debug messages."
|
||||
DVB_USB_DEBUG_STATUS);
|
||||
|
||||
#define deb_decode(args...) dprintk(dvb_usb_af9005_remote_debug,0x01,args)
|
||||
|
||||
struct dvb_usb_rc_key af9005_rc_keys[] = {
|
||||
|
||||
{0x01, 0xb7, KEY_POWER},
|
||||
{0x01, 0xa7, KEY_VOLUMEUP},
|
||||
{0x01, 0x87, KEY_CHANNELUP},
|
||||
{0x01, 0x7f, KEY_MUTE},
|
||||
{0x01, 0xbf, KEY_VOLUMEDOWN},
|
||||
{0x01, 0x3f, KEY_CHANNELDOWN},
|
||||
{0x01, 0xdf, KEY_1},
|
||||
{0x01, 0x5f, KEY_2},
|
||||
{0x01, 0x9f, KEY_3},
|
||||
{0x01, 0x1f, KEY_4},
|
||||
{0x01, 0xef, KEY_5},
|
||||
{0x01, 0x6f, KEY_6},
|
||||
{0x01, 0xaf, KEY_7},
|
||||
{0x01, 0x27, KEY_8},
|
||||
{0x01, 0x07, KEY_9},
|
||||
{0x01, 0xcf, KEY_ZOOM},
|
||||
{0x01, 0x4f, KEY_0},
|
||||
{0x01, 0x8f, KEY_GOTO}, /* marked jump on the remote */
|
||||
|
||||
{0x00, 0xbd, KEY_POWER},
|
||||
{0x00, 0x7d, KEY_VOLUMEUP},
|
||||
{0x00, 0xfd, KEY_CHANNELUP},
|
||||
{0x00, 0x9d, KEY_MUTE},
|
||||
{0x00, 0x5d, KEY_VOLUMEDOWN},
|
||||
{0x00, 0xdd, KEY_CHANNELDOWN},
|
||||
{0x00, 0xad, KEY_1},
|
||||
{0x00, 0x6d, KEY_2},
|
||||
{0x00, 0xed, KEY_3},
|
||||
{0x00, 0x8d, KEY_4},
|
||||
{0x00, 0x4d, KEY_5},
|
||||
{0x00, 0xcd, KEY_6},
|
||||
{0x00, 0xb5, KEY_7},
|
||||
{0x00, 0x75, KEY_8},
|
||||
{0x00, 0xf5, KEY_9},
|
||||
{0x00, 0x95, KEY_ZOOM},
|
||||
{0x00, 0x55, KEY_0},
|
||||
{0x00, 0xd5, KEY_GOTO}, /* marked jump on the remote */
|
||||
};
|
||||
|
||||
int af9005_rc_keys_size = ARRAY_SIZE(af9005_rc_keys);
|
||||
|
||||
static int repeatable_keys[] = {
|
||||
KEY_VOLUMEUP,
|
||||
KEY_VOLUMEDOWN,
|
||||
KEY_CHANNELUP,
|
||||
KEY_CHANNELDOWN
|
||||
};
|
||||
|
||||
int af9005_rc_decode(struct dvb_usb_device *d, u8 * data, int len, u32 * event,
|
||||
int *state)
|
||||
{
|
||||
u16 mark, space;
|
||||
u32 result;
|
||||
u8 cust, dat, invdat;
|
||||
int i;
|
||||
|
||||
if (len >= 6) {
|
||||
mark = (u16) (data[0] << 8) + data[1];
|
||||
space = (u16) (data[2] << 8) + data[3];
|
||||
if (space * 3 < mark) {
|
||||
for (i = 0; i < ARRAY_SIZE(repeatable_keys); i++) {
|
||||
if (d->last_event == repeatable_keys[i]) {
|
||||
*state = REMOTE_KEY_REPEAT;
|
||||
*event = d->last_event;
|
||||
deb_decode("repeat key, event %x\n",
|
||||
*event);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
deb_decode("repeated key ignored (non repeatable)\n");
|
||||
return 0;
|
||||
} else if (len >= 33 * 4) { /*32 bits + start code */
|
||||
result = 0;
|
||||
for (i = 4; i < 4 + 32 * 4; i += 4) {
|
||||
result <<= 1;
|
||||
mark = (u16) (data[i] << 8) + data[i + 1];
|
||||
mark >>= 1;
|
||||
space = (u16) (data[i + 2] << 8) + data[i + 3];
|
||||
space >>= 1;
|
||||
if (mark * 2 > space)
|
||||
result += 1;
|
||||
}
|
||||
deb_decode("key pressed, raw value %x\n", result);
|
||||
if ((result & 0xff000000) != 0xfe000000) {
|
||||
deb_decode
|
||||
("doesn't start with 0xfe, ignored\n");
|
||||
return 0;
|
||||
}
|
||||
cust = (result >> 16) & 0xff;
|
||||
dat = (result >> 8) & 0xff;
|
||||
invdat = (~result) & 0xff;
|
||||
if (dat != invdat) {
|
||||
deb_decode("code != inverted code\n");
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < af9005_rc_keys_size; i++) {
|
||||
if (af9005_rc_keys[i].custom == cust
|
||||
&& af9005_rc_keys[i].data == dat) {
|
||||
*event = af9005_rc_keys[i].event;
|
||||
*state = REMOTE_KEY_PRESSED;
|
||||
deb_decode
|
||||
("key pressed, event %x\n", *event);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
deb_decode("not found in table\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(af9005_rc_keys);
|
||||
EXPORT_SYMBOL(af9005_rc_keys_size);
|
||||
EXPORT_SYMBOL(af9005_rc_decode);
|
||||
|
||||
MODULE_AUTHOR("Luca Olivetti <luca@ventoso.org>");
|
||||
MODULE_DESCRIPTION
|
||||
("Standard remote control decoder for Afatech 9005 DVB-T USB1.1 stick");
|
||||
MODULE_VERSION("1.0");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,203 @@
|
|||
/*
|
||||
File automatically generated by createinit.py using data
|
||||
extracted from AF05BDA.sys (windows driver):
|
||||
|
||||
dd if=AF05BDA.sys of=initsequence bs=1 skip=88316 count=1110
|
||||
python createinit.py > af9005-script.h
|
||||
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
u16 reg;
|
||||
u8 pos;
|
||||
u8 len;
|
||||
u8 val;
|
||||
} RegDesc;
|
||||
|
||||
RegDesc script[] = {
|
||||
{0xa180, 0x0, 0x8, 0xa},
|
||||
{0xa181, 0x0, 0x8, 0xd7},
|
||||
{0xa182, 0x0, 0x8, 0xa3},
|
||||
{0xa0a0, 0x0, 0x8, 0x0},
|
||||
{0xa0a1, 0x0, 0x5, 0x0},
|
||||
{0xa0a1, 0x5, 0x1, 0x1},
|
||||
{0xa0c0, 0x0, 0x4, 0x1},
|
||||
{0xa20e, 0x4, 0x4, 0xa},
|
||||
{0xa20f, 0x0, 0x8, 0x40},
|
||||
{0xa210, 0x0, 0x8, 0x8},
|
||||
{0xa32a, 0x0, 0x4, 0xa},
|
||||
{0xa32c, 0x0, 0x8, 0x20},
|
||||
{0xa32b, 0x0, 0x8, 0x15},
|
||||
{0xa1a0, 0x1, 0x1, 0x1},
|
||||
{0xa000, 0x0, 0x1, 0x1},
|
||||
{0xa000, 0x1, 0x1, 0x0},
|
||||
{0xa001, 0x1, 0x1, 0x1},
|
||||
{0xa001, 0x0, 0x1, 0x0},
|
||||
{0xa001, 0x5, 0x1, 0x0},
|
||||
{0xa00e, 0x0, 0x5, 0x10},
|
||||
{0xa00f, 0x0, 0x3, 0x4},
|
||||
{0xa00f, 0x3, 0x3, 0x5},
|
||||
{0xa010, 0x0, 0x3, 0x4},
|
||||
{0xa010, 0x3, 0x3, 0x5},
|
||||
{0xa016, 0x4, 0x4, 0x3},
|
||||
{0xa01f, 0x0, 0x6, 0xa},
|
||||
{0xa020, 0x0, 0x6, 0xa},
|
||||
{0xa2bc, 0x0, 0x1, 0x1},
|
||||
{0xa2bc, 0x5, 0x1, 0x1},
|
||||
{0xa015, 0x0, 0x8, 0x50},
|
||||
{0xa016, 0x0, 0x1, 0x0},
|
||||
{0xa02a, 0x0, 0x8, 0x50},
|
||||
{0xa029, 0x0, 0x8, 0x4b},
|
||||
{0xa614, 0x0, 0x8, 0x46},
|
||||
{0xa002, 0x0, 0x5, 0x19},
|
||||
{0xa003, 0x0, 0x5, 0x1a},
|
||||
{0xa004, 0x0, 0x5, 0x19},
|
||||
{0xa005, 0x0, 0x5, 0x1a},
|
||||
{0xa008, 0x0, 0x8, 0x69},
|
||||
{0xa009, 0x0, 0x2, 0x2},
|
||||
{0xae1b, 0x0, 0x8, 0x69},
|
||||
{0xae1c, 0x0, 0x8, 0x2},
|
||||
{0xae1d, 0x0, 0x8, 0x2a},
|
||||
{0xa022, 0x0, 0x8, 0xaa},
|
||||
{0xa006, 0x0, 0x8, 0xc8},
|
||||
{0xa007, 0x0, 0x2, 0x0},
|
||||
{0xa00c, 0x0, 0x8, 0xba},
|
||||
{0xa00d, 0x0, 0x2, 0x2},
|
||||
{0xa608, 0x0, 0x8, 0xba},
|
||||
{0xa60e, 0x0, 0x2, 0x2},
|
||||
{0xa609, 0x0, 0x8, 0x80},
|
||||
{0xa60e, 0x2, 0x2, 0x3},
|
||||
{0xa00a, 0x0, 0x8, 0xb6},
|
||||
{0xa00b, 0x0, 0x2, 0x0},
|
||||
{0xa011, 0x0, 0x8, 0xb9},
|
||||
{0xa012, 0x0, 0x2, 0x0},
|
||||
{0xa013, 0x0, 0x8, 0xbd},
|
||||
{0xa014, 0x0, 0x2, 0x2},
|
||||
{0xa366, 0x0, 0x1, 0x1},
|
||||
{0xa2bc, 0x3, 0x1, 0x0},
|
||||
{0xa2bd, 0x0, 0x8, 0xa},
|
||||
{0xa2be, 0x0, 0x8, 0x14},
|
||||
{0xa2bf, 0x0, 0x8, 0x8},
|
||||
{0xa60a, 0x0, 0x8, 0xbd},
|
||||
{0xa60e, 0x4, 0x2, 0x2},
|
||||
{0xa60b, 0x0, 0x8, 0x86},
|
||||
{0xa60e, 0x6, 0x2, 0x3},
|
||||
{0xa001, 0x2, 0x2, 0x1},
|
||||
{0xa1c7, 0x0, 0x8, 0xf5},
|
||||
{0xa03d, 0x0, 0x8, 0xb1},
|
||||
{0xa616, 0x0, 0x8, 0xff},
|
||||
{0xa617, 0x0, 0x8, 0xad},
|
||||
{0xa618, 0x0, 0x8, 0xad},
|
||||
{0xa61e, 0x3, 0x1, 0x1},
|
||||
{0xae1a, 0x0, 0x8, 0x0},
|
||||
{0xae19, 0x0, 0x8, 0xc8},
|
||||
{0xae18, 0x0, 0x8, 0x61},
|
||||
{0xa140, 0x0, 0x8, 0x0},
|
||||
{0xa141, 0x0, 0x8, 0xc8},
|
||||
{0xa142, 0x0, 0x7, 0x61},
|
||||
{0xa023, 0x0, 0x8, 0xff},
|
||||
{0xa021, 0x0, 0x8, 0xad},
|
||||
{0xa026, 0x0, 0x1, 0x0},
|
||||
{0xa024, 0x0, 0x8, 0xff},
|
||||
{0xa025, 0x0, 0x8, 0xff},
|
||||
{0xa1c8, 0x0, 0x8, 0xf},
|
||||
{0xa2bc, 0x1, 0x1, 0x0},
|
||||
{0xa60c, 0x0, 0x4, 0x5},
|
||||
{0xa60c, 0x4, 0x4, 0x6},
|
||||
{0xa60d, 0x0, 0x8, 0xa},
|
||||
{0xa371, 0x0, 0x1, 0x1},
|
||||
{0xa366, 0x1, 0x3, 0x7},
|
||||
{0xa338, 0x0, 0x8, 0x10},
|
||||
{0xa339, 0x0, 0x6, 0x7},
|
||||
{0xa33a, 0x0, 0x6, 0x1f},
|
||||
{0xa33b, 0x0, 0x8, 0xf6},
|
||||
{0xa33c, 0x3, 0x5, 0x4},
|
||||
{0xa33d, 0x4, 0x4, 0x0},
|
||||
{0xa33d, 0x1, 0x1, 0x1},
|
||||
{0xa33d, 0x2, 0x1, 0x1},
|
||||
{0xa33d, 0x3, 0x1, 0x1},
|
||||
{0xa16d, 0x0, 0x4, 0xf},
|
||||
{0xa161, 0x0, 0x5, 0x5},
|
||||
{0xa162, 0x0, 0x4, 0x5},
|
||||
{0xa165, 0x0, 0x8, 0xff},
|
||||
{0xa166, 0x0, 0x8, 0x9c},
|
||||
{0xa2c3, 0x0, 0x4, 0x5},
|
||||
{0xa61a, 0x0, 0x6, 0xf},
|
||||
{0xb200, 0x0, 0x8, 0xa1},
|
||||
{0xb201, 0x0, 0x8, 0x7},
|
||||
{0xa093, 0x0, 0x1, 0x0},
|
||||
{0xa093, 0x1, 0x5, 0xf},
|
||||
{0xa094, 0x0, 0x8, 0xff},
|
||||
{0xa095, 0x0, 0x8, 0xf},
|
||||
{0xa080, 0x2, 0x5, 0x3},
|
||||
{0xa081, 0x0, 0x4, 0x0},
|
||||
{0xa081, 0x4, 0x4, 0x9},
|
||||
{0xa082, 0x0, 0x5, 0x1f},
|
||||
{0xa08d, 0x0, 0x8, 0x1},
|
||||
{0xa083, 0x0, 0x8, 0x32},
|
||||
{0xa084, 0x0, 0x1, 0x0},
|
||||
{0xa08e, 0x0, 0x8, 0x3},
|
||||
{0xa085, 0x0, 0x8, 0x32},
|
||||
{0xa086, 0x0, 0x3, 0x0},
|
||||
{0xa087, 0x0, 0x8, 0x6e},
|
||||
{0xa088, 0x0, 0x5, 0x15},
|
||||
{0xa089, 0x0, 0x8, 0x0},
|
||||
{0xa08a, 0x0, 0x5, 0x19},
|
||||
{0xa08b, 0x0, 0x8, 0x92},
|
||||
{0xa08c, 0x0, 0x5, 0x1c},
|
||||
{0xa120, 0x0, 0x8, 0x0},
|
||||
{0xa121, 0x0, 0x5, 0x10},
|
||||
{0xa122, 0x0, 0x8, 0x0},
|
||||
{0xa123, 0x0, 0x7, 0x40},
|
||||
{0xa123, 0x7, 0x1, 0x0},
|
||||
{0xa124, 0x0, 0x8, 0x13},
|
||||
{0xa125, 0x0, 0x7, 0x10},
|
||||
{0xa1c0, 0x0, 0x8, 0x0},
|
||||
{0xa1c1, 0x0, 0x5, 0x4},
|
||||
{0xa1c2, 0x0, 0x8, 0x0},
|
||||
{0xa1c3, 0x0, 0x5, 0x10},
|
||||
{0xa1c3, 0x5, 0x3, 0x0},
|
||||
{0xa1c4, 0x0, 0x6, 0x0},
|
||||
{0xa1c5, 0x0, 0x7, 0x10},
|
||||
{0xa100, 0x0, 0x8, 0x0},
|
||||
{0xa101, 0x0, 0x5, 0x10},
|
||||
{0xa102, 0x0, 0x8, 0x0},
|
||||
{0xa103, 0x0, 0x7, 0x40},
|
||||
{0xa103, 0x7, 0x1, 0x0},
|
||||
{0xa104, 0x0, 0x8, 0x18},
|
||||
{0xa105, 0x0, 0x7, 0xa},
|
||||
{0xa106, 0x0, 0x8, 0x20},
|
||||
{0xa107, 0x0, 0x8, 0x40},
|
||||
{0xa108, 0x0, 0x4, 0x0},
|
||||
{0xa38c, 0x0, 0x8, 0xfc},
|
||||
{0xa38d, 0x0, 0x8, 0x0},
|
||||
{0xa38e, 0x0, 0x8, 0x7e},
|
||||
{0xa38f, 0x0, 0x8, 0x0},
|
||||
{0xa390, 0x0, 0x8, 0x2f},
|
||||
{0xa60f, 0x5, 0x1, 0x1},
|
||||
{0xa170, 0x0, 0x8, 0xdc},
|
||||
{0xa171, 0x0, 0x2, 0x0},
|
||||
{0xa2ae, 0x0, 0x1, 0x1},
|
||||
{0xa2ae, 0x1, 0x1, 0x1},
|
||||
{0xa392, 0x0, 0x1, 0x1},
|
||||
{0xa391, 0x2, 0x1, 0x0},
|
||||
{0xabc1, 0x0, 0x8, 0xff},
|
||||
{0xabc2, 0x0, 0x8, 0x0},
|
||||
{0xabc8, 0x0, 0x8, 0x8},
|
||||
{0xabca, 0x0, 0x8, 0x10},
|
||||
{0xabcb, 0x0, 0x1, 0x0},
|
||||
{0xabc3, 0x5, 0x3, 0x7},
|
||||
{0xabc0, 0x6, 0x1, 0x0},
|
||||
{0xabc0, 0x4, 0x2, 0x0},
|
||||
{0xa344, 0x4, 0x4, 0x1},
|
||||
{0xabc0, 0x7, 0x1, 0x1},
|
||||
{0xabc0, 0x2, 0x1, 0x1},
|
||||
{0xa345, 0x0, 0x8, 0x66},
|
||||
{0xa346, 0x0, 0x8, 0x66},
|
||||
{0xa347, 0x0, 0x4, 0x0},
|
||||
{0xa343, 0x0, 0x4, 0xa},
|
||||
{0xa347, 0x4, 0x4, 0x2},
|
||||
{0xa348, 0x0, 0x4, 0xc},
|
||||
{0xa348, 0x4, 0x4, 0x7},
|
||||
{0xa349, 0x0, 0x6, 0x2},
|
||||
};
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -354,41 +354,35 @@ static struct mt352_config cxusb_mt352_config = {
|
|||
/* Callbacks for DVB USB */
|
||||
static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
u8 bpll[4] = { 0x0b, 0xdc, 0x9c, 0xa0 };
|
||||
adap->pll_addr = 0x61;
|
||||
memcpy(adap->pll_init, bpll, 4);
|
||||
adap->pll_desc = &dvb_pll_fmd1216me;
|
||||
|
||||
adap->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c;
|
||||
adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
|
||||
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
|
||||
DVB_PLL_FMD1216ME);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61,
|
||||
NULL, &dvb_pll_thomson_dtt7579);
|
||||
NULL, DVB_PLL_THOMSON_DTT7579);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61, NULL, &dvb_pll_lg_z201);
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61, NULL, DVB_PLL_LG_Z201);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x60,
|
||||
NULL, &dvb_pll_thomson_dtt7579);
|
||||
NULL, DVB_PLL_THOMSON_DTT7579);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
|
||||
&dvb_pll_lg_tdvs_h06xf);
|
||||
DVB_PLL_LG_TDVS_H06XF);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -295,7 +295,7 @@ int dibusb_dib3000mc_tuner_attach(struct dvb_usb_adapter *adap)
|
|||
tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1);
|
||||
if (dvb_attach(mt2060_attach, adap->fe, tun_i2c, &stk3000p_mt2060_config, if1) == NULL) {
|
||||
/* not found - use panasonic pll parameters */
|
||||
if (dvb_attach(dvb_pll_attach, adap->fe, 0x60, tun_i2c, &dvb_pll_env57h1xd5) == NULL)
|
||||
if (dvb_attach(dvb_pll_attach, adap->fe, 0x60, tun_i2c, DVB_PLL_ENV57H1XD5) == NULL)
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
st->mt2060_present = 1;
|
||||
|
|
|
@ -14,6 +14,14 @@
|
|||
*/
|
||||
#include "dibusb.h"
|
||||
|
||||
static int dib3000mb_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
struct dibusb_state *st = adap->priv;
|
||||
|
||||
return st->ops.tuner_pass_ctrl(fe, enable, st->tuner_addr);
|
||||
}
|
||||
|
||||
static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
struct dib3000_config demod_cfg;
|
||||
|
@ -21,21 +29,34 @@ static int dibusb_dib3000mb_frontend_attach(struct dvb_usb_adapter *adap)
|
|||
|
||||
demod_cfg.demod_address = 0x8;
|
||||
|
||||
if ((adap->fe = dib3000mb_attach(&demod_cfg,&adap->dev->i2c_adap,&st->ops)) == NULL)
|
||||
if ((adap->fe = dvb_attach(dib3000mb_attach, &demod_cfg,
|
||||
&adap->dev->i2c_adap, &st->ops)) == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
adap->fe->ops.tuner_ops.init = dvb_usb_tuner_init_i2c;
|
||||
adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
|
||||
|
||||
adap->tuner_pass_ctrl = st->ops.tuner_pass_ctrl;
|
||||
adap->fe->ops.i2c_gate_ctrl = dib3000mb_i2c_gate_ctrl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dibusb_thomson_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
adap->pll_addr = 0x61;
|
||||
adap->pll_desc = &dvb_pll_tua6010xs;
|
||||
struct dibusb_state *st = adap->priv;
|
||||
|
||||
st->tuner_addr = 0x61;
|
||||
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61, &adap->dev->i2c_adap,
|
||||
DVB_PLL_TUA6010XS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dibusb_panasonic_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
struct dibusb_state *st = adap->priv;
|
||||
|
||||
st->tuner_addr = 0x60;
|
||||
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x60, &adap->dev->i2c_adap,
|
||||
DVB_PLL_TDA665X);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -50,30 +71,28 @@ static int dibusb_tuner_probe_and_attach(struct dvb_usb_adapter *adap)
|
|||
{ .flags = 0, .buf = b, .len = 2 },
|
||||
{ .flags = I2C_M_RD, .buf = b2, .len = 1 },
|
||||
};
|
||||
struct dibusb_state *st = adap->priv;
|
||||
|
||||
/* the Panasonic sits on I2C addrass 0x60, the Thomson on 0x61 */
|
||||
msg[0].addr = msg[1].addr = 0x60;
|
||||
msg[0].addr = msg[1].addr = st->tuner_addr = 0x60;
|
||||
|
||||
if (adap->tuner_pass_ctrl)
|
||||
adap->tuner_pass_ctrl(adap->fe,1,msg[0].addr);
|
||||
if (adap->fe->ops.i2c_gate_ctrl)
|
||||
adap->fe->ops.i2c_gate_ctrl(adap->fe,1);
|
||||
|
||||
if (i2c_transfer(&adap->dev->i2c_adap, msg, 2) != 2) {
|
||||
err("tuner i2c write failed.");
|
||||
ret = -EREMOTEIO;
|
||||
}
|
||||
|
||||
if (adap->tuner_pass_ctrl)
|
||||
adap->tuner_pass_ctrl(adap->fe,0,msg[0].addr);
|
||||
if (adap->fe->ops.i2c_gate_ctrl)
|
||||
adap->fe->ops.i2c_gate_ctrl(adap->fe,0);
|
||||
|
||||
if (b2[0] == 0xfe) {
|
||||
info("This device has the Thomson Cable onboard. Which is default.");
|
||||
dibusb_thomson_tuner_attach(adap);
|
||||
ret = dibusb_thomson_tuner_attach(adap);
|
||||
} else {
|
||||
u8 bpll[4] = { 0x0b, 0xf5, 0x85, 0xab };
|
||||
info("This device has the Panasonic ENV77H11D5 onboard.");
|
||||
adap->pll_addr = 0x60;
|
||||
memcpy(adap->pll_init,bpll,4);
|
||||
adap->pll_desc = &dvb_pll_tda665x;
|
||||
ret = dibusb_panasonic_tuner_attach(adap);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -99,6 +99,7 @@
|
|||
struct dibusb_state {
|
||||
struct dib_fe_xfer_ops ops;
|
||||
int mt2060_present;
|
||||
u8 tuner_addr;
|
||||
};
|
||||
|
||||
struct dibusb_device_state {
|
||||
|
|
|
@ -118,7 +118,8 @@ static int digitv_nxt6000_tuner_set_params(struct dvb_frontend *fe, struct dvb_f
|
|||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
u8 b[5];
|
||||
dvb_usb_tuner_calc_regs(fe,fep,b, 5);
|
||||
|
||||
fe->ops.tuner_ops.calc_regs(fe, fep, b, sizeof(b));
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
return digitv_ctrl_msg(adap->dev, USB_WRITE_TUNER, 0, &b[1], 4, NULL, 0);
|
||||
|
@ -130,12 +131,14 @@ static struct nxt6000_config digitv_nxt6000_config = {
|
|||
|
||||
static int digitv_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
struct digitv_state *st = adap->dev->priv;
|
||||
|
||||
if ((adap->fe = dvb_attach(mt352_attach, &digitv_mt352_config, &adap->dev->i2c_adap)) != NULL) {
|
||||
adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
|
||||
st->is_nxt6000 = 0;
|
||||
return 0;
|
||||
}
|
||||
if ((adap->fe = dvb_attach(nxt6000_attach, &digitv_nxt6000_config, &adap->dev->i2c_adap)) != NULL) {
|
||||
adap->fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
|
||||
st->is_nxt6000 = 1;
|
||||
return 0;
|
||||
}
|
||||
return -EIO;
|
||||
|
@ -143,8 +146,14 @@ static int digitv_frontend_attach(struct dvb_usb_adapter *adap)
|
|||
|
||||
static int digitv_tuner_attach(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
adap->pll_addr = 0x60;
|
||||
adap->pll_desc = &dvb_pll_tded4;
|
||||
struct digitv_state *st = adap->dev->priv;
|
||||
|
||||
if (!dvb_attach(dvb_pll_attach, adap->fe, 0x60, NULL, DVB_PLL_TDED4))
|
||||
return -ENODEV;
|
||||
|
||||
if (st->is_nxt6000)
|
||||
adap->fe->ops.tuner_ops.set_params = digitv_nxt6000_tuner_set_params;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -273,6 +282,8 @@ static struct dvb_usb_device_properties digitv_properties = {
|
|||
.usb_ctrl = CYPRESS_FX2,
|
||||
.firmware = "dvb-usb-digitv-02.fw",
|
||||
|
||||
.size_of_priv = sizeof(struct digitv_state),
|
||||
|
||||
.num_adapters = 1,
|
||||
.adapter = {
|
||||
{
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
#define DVB_USB_LOG_PREFIX "digitv"
|
||||
#include "dvb-usb.h"
|
||||
|
||||
struct digitv_state {
|
||||
int is_nxt6000;
|
||||
};
|
||||
|
||||
extern int dvb_usb_digitv_debug;
|
||||
#define deb_rc(args...) dprintk(dvb_usb_digitv_debug,0x01,args)
|
||||
|
||||
|
|
|
@ -46,82 +46,3 @@ int dvb_usb_i2c_exit(struct dvb_usb_device *d)
|
|||
d->state &= ~DVB_USB_STATE_I2C;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_usb_tuner_init_i2c(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
struct i2c_msg msg = { .addr = adap->pll_addr, .flags = 0, .buf = adap->pll_init, .len = 4 };
|
||||
int ret = 0;
|
||||
|
||||
/* if pll_desc is not used */
|
||||
if (adap->pll_desc == NULL)
|
||||
return 0;
|
||||
|
||||
if (adap->tuner_pass_ctrl)
|
||||
adap->tuner_pass_ctrl(fe, 1, adap->pll_addr);
|
||||
|
||||
deb_pll("pll init: %x\n",adap->pll_addr);
|
||||
deb_pll("pll-buf: %x %x %x %x\n",adap->pll_init[0], adap->pll_init[1],
|
||||
adap->pll_init[2], adap->pll_init[3]);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
if (i2c_transfer (&adap->dev->i2c_adap, &msg, 1) != 1) {
|
||||
err("tuner i2c write failed for pll_init.");
|
||||
ret = -EREMOTEIO;
|
||||
}
|
||||
msleep(1);
|
||||
|
||||
if (adap->tuner_pass_ctrl)
|
||||
adap->tuner_pass_ctrl(fe,0,adap->pll_addr);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_usb_tuner_init_i2c);
|
||||
|
||||
int dvb_usb_tuner_calc_regs(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep, u8 *b, int buf_len)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
|
||||
if (buf_len != 5)
|
||||
return -EINVAL;
|
||||
if (adap->pll_desc == NULL)
|
||||
return 0;
|
||||
|
||||
deb_pll("pll addr: %x, freq: %d %p\n",adap->pll_addr, fep->frequency, adap->pll_desc);
|
||||
|
||||
b[0] = adap->pll_addr;
|
||||
dvb_pll_configure(adap->pll_desc, &b[1], fep->frequency, fep->u.ofdm.bandwidth);
|
||||
|
||||
deb_pll("pll-buf: %x %x %x %x %x\n",b[0],b[1],b[2],b[3],b[4]);
|
||||
|
||||
return 5;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_usb_tuner_calc_regs);
|
||||
|
||||
int dvb_usb_tuner_set_params_i2c(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep)
|
||||
{
|
||||
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
||||
int ret = 0;
|
||||
u8 b[5];
|
||||
struct i2c_msg msg = { .addr = adap->pll_addr, .flags = 0, .buf = &b[1], .len = 4 };
|
||||
|
||||
dvb_usb_tuner_calc_regs(fe,fep,b,5);
|
||||
|
||||
if (adap->tuner_pass_ctrl)
|
||||
adap->tuner_pass_ctrl(fe, 1, adap->pll_addr);
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
|
||||
if (i2c_transfer(&adap->dev->i2c_adap, &msg, 1) != 1) {
|
||||
err("tuner i2c write failed for pll_set.");
|
||||
ret = -EREMOTEIO;
|
||||
}
|
||||
msleep(1);
|
||||
|
||||
if (adap->tuner_pass_ctrl)
|
||||
adap->tuner_pass_ctrl(fe, 0, adap->pll_addr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_usb_tuner_set_params_i2c);
|
||||
|
|
|
@ -11,7 +11,9 @@
|
|||
|
||||
/* Vendor IDs */
|
||||
#define USB_VID_ADSTECH 0x06e1
|
||||
#define USB_VID_AFATECH 0x15a4
|
||||
#define USB_VID_ALCOR_MICRO 0x058f
|
||||
#define USB_VID_ALINK 0x05e3
|
||||
#define USB_VID_ANCHOR 0x0547
|
||||
#define USB_VID_ANUBIS_ELECTRONIC 0x10fd
|
||||
#define USB_VID_AVERMEDIA 0x07ca
|
||||
|
@ -35,6 +37,7 @@
|
|||
#define USB_VID_MSI 0x0db0
|
||||
#define USB_VID_OPERA1 0x695c
|
||||
#define USB_VID_PINNACLE 0x2304
|
||||
#define USB_VID_TERRATEC 0x0ccd
|
||||
#define USB_VID_VISIONPLUS 0x13d3
|
||||
#define USB_VID_TWINHAN 0x1822
|
||||
#define USB_VID_ULTIMA_ELECTRONIC 0x05d8
|
||||
|
@ -44,6 +47,8 @@
|
|||
/* Product IDs */
|
||||
#define USB_PID_ADSTECH_USB2_COLD 0xa333
|
||||
#define USB_PID_ADSTECH_USB2_WARM 0xa334
|
||||
#define USB_PID_AFATECH_AF9005 0x9020
|
||||
#define USB_VID_ALINK_DTU 0xf170
|
||||
#define USB_PID_AVERMEDIA_DVBT_USB_COLD 0x0001
|
||||
#define USB_PID_AVERMEDIA_DVBT_USB_WARM 0x0002
|
||||
#define USB_PID_AVERMEDIA_DVBT_USB2_COLD 0xa800
|
||||
|
@ -69,6 +74,7 @@
|
|||
#define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
|
||||
#define USB_PID_KWORLD_VSTREAM_COLD 0x17de
|
||||
#define USB_PID_KWORLD_VSTREAM_WARM 0x17df
|
||||
#define USB_PID_TERRATEC_CINERGY_T_USB_XE 0x0055
|
||||
#define USB_PID_TWINHAN_VP7041_COLD 0x3201
|
||||
#define USB_PID_TWINHAN_VP7041_WARM 0x3202
|
||||
#define USB_PID_TWINHAN_VP7020_COLD 0x3203
|
||||
|
|
|
@ -110,7 +110,7 @@ int dvb_usb_remote_init(struct dvb_usb_device *d)
|
|||
input_dev->name = "IR-receiver inside an USB DVB receiver";
|
||||
input_dev->phys = d->rc_phys;
|
||||
usb_to_input_id(d->udev, &input_dev->id);
|
||||
input_dev->cdev.dev = &d->udev->dev;
|
||||
input_dev->dev.parent = &d->udev->dev;
|
||||
|
||||
/* set the bits for the keys */
|
||||
deb_rc("key map size: %d\n", d->props.rc_key_map_size);
|
||||
|
|
|
@ -297,12 +297,6 @@ struct dvb_usb_adapter {
|
|||
int feedcount;
|
||||
int pid_filtering;
|
||||
|
||||
/* tuner programming information */
|
||||
u8 pll_addr;
|
||||
u8 pll_init[4];
|
||||
struct dvb_pll_desc *pll_desc;
|
||||
int (*tuner_pass_ctrl) (struct dvb_frontend *, int, u8);
|
||||
|
||||
/* dvb */
|
||||
struct dvb_adapter dvb_adap;
|
||||
struct dmxdev dmxdev;
|
||||
|
@ -388,11 +382,6 @@ extern int dvb_usb_generic_write(struct dvb_usb_device *, u8 *, u16);
|
|||
/* commonly used remote control parsing */
|
||||
extern int dvb_usb_nec_rc_key_to_event(struct dvb_usb_device *, u8[], u32 *, int *);
|
||||
|
||||
/* commonly used pll init and set functions */
|
||||
extern int dvb_usb_tuner_init_i2c(struct dvb_frontend *);
|
||||
extern int dvb_usb_tuner_calc_regs(struct dvb_frontend *, struct dvb_frontend_parameters *, u8 *buf, int buf_len);
|
||||
extern int dvb_usb_tuner_set_params_i2c(struct dvb_frontend *, struct dvb_frontend_parameters *);
|
||||
|
||||
/* commonly used firmware download types and function */
|
||||
struct hexline {
|
||||
u8 len;
|
||||
|
|
|
@ -157,6 +157,7 @@ static int gl861_probe(struct usb_interface *intf,
|
|||
|
||||
static struct usb_device_id gl861_table [] = {
|
||||
{ USB_DEVICE(USB_VID_MSI, USB_PID_MSI_MEGASKY580_55801) },
|
||||
{ USB_DEVICE(USB_VID_ALINK, USB_VID_ALINK_DTU) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE (usb, gl861_table);
|
||||
|
@ -187,12 +188,16 @@ static struct dvb_usb_device_properties gl861_properties = {
|
|||
}},
|
||||
.i2c_algo = &gl861_i2c_algo,
|
||||
|
||||
.num_device_descs = 1,
|
||||
.num_device_descs = 2,
|
||||
.devices = {
|
||||
{ "MSI Mega Sky 55801 DVB-T USB2.0",
|
||||
{ &gl861_table[0], NULL },
|
||||
{ NULL },
|
||||
},
|
||||
{ "A-LINK DTU DVB-T USB2.0",
|
||||
{ &gl861_table[1], NULL },
|
||||
{ NULL },
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -22,6 +22,8 @@ static int dvb_usb_m920x_debug;
|
|||
module_param_named(debug,dvb_usb_m920x_debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
|
||||
|
||||
static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid);
|
||||
|
||||
static inline int m920x_read(struct usb_device *udev, u8 request, u16 value,
|
||||
u16 index, void *data, int size)
|
||||
{
|
||||
|
@ -57,7 +59,8 @@ static inline int m920x_write(struct usb_device *udev, u8 request,
|
|||
|
||||
static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret = 0, i, epi, flags = 0;
|
||||
int adap_enabled[M9206_MAX_ADAPTERS] = { 0 };
|
||||
|
||||
/* Remote controller init. */
|
||||
if (d->props.rc_query) {
|
||||
|
@ -76,9 +79,51 @@ static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq)
|
|||
deb("Initialising remote control success\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < d->props.num_adapters; i++)
|
||||
flags |= d->adapter[i].props.caps;
|
||||
|
||||
/* Some devices(Dposh) might crash if we attempt touch at all. */
|
||||
if (flags & DVB_USB_ADAP_HAS_PID_FILTER) {
|
||||
for (i = 0; i < d->props.num_adapters; i++) {
|
||||
epi = d->adapter[i].props.stream.endpoint - 0x81;
|
||||
|
||||
if (epi < 0 || epi >= M9206_MAX_ADAPTERS) {
|
||||
printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
adap_enabled[epi] = 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < M9206_MAX_ADAPTERS; i++) {
|
||||
if (adap_enabled[i])
|
||||
continue;
|
||||
|
||||
if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int m920x_init_ep(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
struct usb_host_interface *alt;
|
||||
|
||||
if ((alt = usb_altnum_to_altsetting(intf, 1)) == NULL) {
|
||||
deb("No alt found!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return usb_set_interface(udev, alt->desc.bInterfaceNumber,
|
||||
alt->desc.bAlternateSetting);
|
||||
}
|
||||
|
||||
static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
||||
{
|
||||
struct m920x_state *m = d->priv;
|
||||
|
@ -211,8 +256,7 @@ static struct i2c_algorithm m920x_i2c_algo = {
|
|||
};
|
||||
|
||||
/* pid filter */
|
||||
static int m920x_set_filter(struct dvb_usb_adapter *adap,
|
||||
int type, int idx, int pid)
|
||||
static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
|
@ -221,10 +265,10 @@ static int m920x_set_filter(struct dvb_usb_adapter *adap,
|
|||
|
||||
pid |= 0x8000;
|
||||
|
||||
if ((ret = m920x_write(adap->dev->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0)
|
||||
if ((ret = m920x_write(d->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = m920x_write(adap->dev->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0)
|
||||
if ((ret = m920x_write(d->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
|
@ -233,40 +277,35 @@ static int m920x_set_filter(struct dvb_usb_adapter *adap,
|
|||
static int m920x_update_filters(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
struct m920x_state *m = adap->dev->priv;
|
||||
int enabled = m->filtering_enabled;
|
||||
int enabled = m->filtering_enabled[adap->id];
|
||||
int i, ret = 0, filter = 0;
|
||||
int ep = adap->props.stream.endpoint;
|
||||
|
||||
for (i = 0; i < M9206_MAX_FILTERS; i++)
|
||||
if (m->filters[i] == 8192)
|
||||
if (m->filters[adap->id][i] == 8192)
|
||||
enabled = 0;
|
||||
|
||||
/* Disable all filters */
|
||||
if ((ret = m920x_set_filter(adap, 0x81, 1, enabled)) != 0)
|
||||
if ((ret = m920x_set_filter(adap->dev, ep, 1, enabled)) != 0)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < M9206_MAX_FILTERS; i++)
|
||||
if ((ret = m920x_set_filter(adap, 0x81, i + 2, 0)) != 0)
|
||||
if ((ret = m920x_set_filter(adap->dev, ep, i + 2, 0)) != 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = m920x_set_filter(adap, 0x82, 0, 0x0)) != 0)
|
||||
return ret;
|
||||
|
||||
/* Set */
|
||||
if (enabled) {
|
||||
for (i = 0; i < M9206_MAX_FILTERS; i++) {
|
||||
if (m->filters[i] == 0)
|
||||
if (m->filters[adap->id][i] == 0)
|
||||
continue;
|
||||
|
||||
if ((ret = m920x_set_filter(adap, 0x81, filter + 2, m->filters[i])) != 0)
|
||||
if ((ret = m920x_set_filter(adap->dev, ep, filter + 2, m->filters[adap->id][i])) != 0)
|
||||
return ret;
|
||||
|
||||
filter++;
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret = m920x_set_filter(adap, 0x82, 0, 0x02f5)) != 0)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -274,7 +313,7 @@ static int m920x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff)
|
|||
{
|
||||
struct m920x_state *m = adap->dev->priv;
|
||||
|
||||
m->filtering_enabled = onoff ? 1 : 0;
|
||||
m->filtering_enabled[adap->id] = onoff ? 1 : 0;
|
||||
|
||||
return m920x_update_filters(adap);
|
||||
}
|
||||
|
@ -283,7 +322,7 @@ static int m920x_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, in
|
|||
{
|
||||
struct m920x_state *m = adap->dev->priv;
|
||||
|
||||
m->filters[index] = onoff ? pid : 0;
|
||||
m->filters[adap->id][index] = onoff ? pid : 0;
|
||||
|
||||
return m920x_update_filters(adap);
|
||||
}
|
||||
|
@ -368,6 +407,7 @@ static int m920x_identify_state(struct usb_device *udev,
|
|||
/* demod configurations */
|
||||
static int m920x_mt352_demod_init(struct dvb_frontend *fe)
|
||||
{
|
||||
int ret;
|
||||
u8 config[] = { CONFIG, 0x3d };
|
||||
u8 clock[] = { CLOCK_CTL, 0x30 };
|
||||
u8 reset[] = { RESET, 0x80 };
|
||||
|
@ -377,17 +417,25 @@ static int m920x_mt352_demod_init(struct dvb_frontend *fe)
|
|||
u8 unk1[] = { 0x93, 0x1a };
|
||||
u8 unk2[] = { 0xb5, 0x7a };
|
||||
|
||||
mt352_write(fe, config, ARRAY_SIZE(config));
|
||||
mt352_write(fe, clock, ARRAY_SIZE(clock));
|
||||
mt352_write(fe, reset, ARRAY_SIZE(reset));
|
||||
mt352_write(fe, adc_ctl, ARRAY_SIZE(adc_ctl));
|
||||
mt352_write(fe, agc, ARRAY_SIZE(agc));
|
||||
mt352_write(fe, sec_agc, ARRAY_SIZE(sec_agc));
|
||||
mt352_write(fe, unk1, ARRAY_SIZE(unk1));
|
||||
mt352_write(fe, unk2, ARRAY_SIZE(unk2));
|
||||
|
||||
deb("Demod init!\n");
|
||||
|
||||
if ((ret = mt352_write(fe, config, ARRAY_SIZE(config))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, clock, ARRAY_SIZE(clock))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, reset, ARRAY_SIZE(reset))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, adc_ctl, ARRAY_SIZE(adc_ctl))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, agc, ARRAY_SIZE(agc))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, sec_agc, ARRAY_SIZE(sec_agc))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, unk1, ARRAY_SIZE(unk1))) != 0)
|
||||
return ret;
|
||||
if ((ret = mt352_write(fe, unk2, ARRAY_SIZE(unk2))) != 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -558,8 +606,7 @@ static struct dvb_usb_device_properties dposh_properties;
|
|||
static int m920x_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct dvb_usb_device *d;
|
||||
struct usb_host_interface *alt;
|
||||
struct dvb_usb_device *d = NULL;
|
||||
int ret;
|
||||
struct m920x_inits *rc_init_seq = NULL;
|
||||
int bInterfaceNumber = intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
@ -604,23 +651,13 @@ static int m920x_probe(struct usb_interface *intf,
|
|||
* tvwalkertwin_properties already configured both
|
||||
* tuners, so there is nothing for us to do here
|
||||
*/
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
found:
|
||||
alt = usb_altnum_to_altsetting(intf, 1);
|
||||
if (alt == NULL) {
|
||||
deb("No alt found!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = usb_set_interface(d->udev, alt->desc.bInterfaceNumber,
|
||||
alt->desc.bAlternateSetting);
|
||||
if (ret < 0)
|
||||
if ((ret = m920x_init_ep(intf)) < 0)
|
||||
return ret;
|
||||
|
||||
if ((ret = m920x_init(d, rc_init_seq)) != 0)
|
||||
if (d && (ret = m920x_init(d, rc_init_seq)) != 0)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
|
@ -737,9 +774,9 @@ static struct dvb_usb_device_properties digivox_mini_ii_properties = {
|
|||
*
|
||||
* LifeView TV Walker Twin has 1 x M9206, 2 x TDA10046, 2 x TDA8275A
|
||||
* TDA10046 #0 is located at i2c address 0x08
|
||||
* TDA10046 #1 is located at i2c address 0x0b (presently disabled - not yet working)
|
||||
* TDA10046 #1 is located at i2c address 0x0b
|
||||
* TDA8275A #0 is located at i2c address 0x60
|
||||
* TDA8275A #1 is located at i2c address 0x61 (presently disabled - not yet working)
|
||||
* TDA8275A #1 is located at i2c address 0x61
|
||||
*/
|
||||
static struct dvb_usb_device_properties tvwalkertwin_properties = {
|
||||
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||
|
@ -756,7 +793,7 @@ static struct dvb_usb_device_properties tvwalkertwin_properties = {
|
|||
.size_of_priv = sizeof(struct m920x_state),
|
||||
|
||||
.identify_state = m920x_identify_state,
|
||||
.num_adapters = 1,
|
||||
.num_adapters = 2,
|
||||
.adapter = {{
|
||||
.caps = DVB_USB_ADAP_HAS_PID_FILTER |
|
||||
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#define M9206_FW 0x30
|
||||
|
||||
#define M9206_MAX_FILTERS 8
|
||||
#define M9206_MAX_ADAPTERS 2
|
||||
|
||||
/*
|
||||
sequences found in logs:
|
||||
|
@ -60,8 +61,8 @@ response to a write, is unknown.
|
|||
*/
|
||||
|
||||
struct m920x_state {
|
||||
u16 filters[M9206_MAX_FILTERS];
|
||||
int filtering_enabled;
|
||||
u16 filters[M9206_MAX_ADAPTERS][M9206_MAX_FILTERS];
|
||||
int filtering_enabled[M9206_MAX_ADAPTERS];
|
||||
int rep_count;
|
||||
};
|
||||
|
||||
|
|
|
@ -263,7 +263,7 @@ static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
|
|||
{
|
||||
dvb_attach(
|
||||
dvb_pll_attach, adap->fe, 0xc0>>1,
|
||||
&adap->dev->i2c_adap, &dvb_pll_opera1
|
||||
&adap->dev->i2c_adap, DVB_PLL_OPERA1
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
@ -435,9 +435,9 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev,
|
|||
{
|
||||
const struct firmware *fw = NULL;
|
||||
u8 *b, *p;
|
||||
int ret = 0, i;
|
||||
int ret = 0, i,fpgasize=40;
|
||||
u8 testval;
|
||||
info("start downloading fpga firmware");
|
||||
info("start downloading fpga firmware %s",filename);
|
||||
|
||||
if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) {
|
||||
err("did not find the firmware file. (%s) "
|
||||
|
@ -454,17 +454,20 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev,
|
|||
/* clear fpga ? */
|
||||
opera1_xilinx_rw(dev, 0xbc, 0xaa, &fpga_command, 1,
|
||||
OPERA_WRITE_MSG);
|
||||
for (i = 0; p[i] != 0 && i < fw->size;) {
|
||||
for (i = 0; i < fw->size;) {
|
||||
if ( (fw->size - i) <fpgasize){
|
||||
fpgasize=fw->size-i;
|
||||
}
|
||||
b = (u8 *) p + i;
|
||||
if (opera1_xilinx_rw
|
||||
(dev, OPERA_WRITE_FX2, 0x0, b + 1, b[0],
|
||||
OPERA_WRITE_MSG) != b[0]
|
||||
(dev, OPERA_WRITE_FX2, 0x0, b , fpgasize,
|
||||
OPERA_WRITE_MSG) != fpgasize
|
||||
) {
|
||||
err("error while transferring firmware");
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
i = i + 1 + b[0];
|
||||
i = i + fpgasize;
|
||||
}
|
||||
/* restart the CPU */
|
||||
if (ret || opera1_xilinx_rw
|
||||
|
@ -534,18 +537,16 @@ static struct dvb_usb_device_properties opera1_properties = {
|
|||
static int opera1_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct dvb_usb_device *d;
|
||||
struct usb_device *udev = interface_to_usbdev(intf);
|
||||
|
||||
if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM &&
|
||||
udev->descriptor.idVendor == USB_VID_OPERA1 &&
|
||||
(d == NULL
|
||||
|| opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga.fw") != 0)
|
||||
) {
|
||||
opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga-01.fw") != 0
|
||||
) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (dvb_usb_device_init(intf, &opera1_properties, THIS_MODULE, &d) != 0)
|
||||
if (dvb_usb_device_init(intf, &opera1_properties, THIS_MODULE, NULL) != 0)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -65,9 +65,7 @@ static int umt_mt352_frontend_attach(struct dvb_usb_adapter *adap)
|
|||
|
||||
static int umt_tuner_attach (struct dvb_usb_adapter *adap)
|
||||
{
|
||||
adap->pll_addr = 0x61;
|
||||
adap->pll_desc = &dvb_pll_tua6034;
|
||||
adap->fe->ops.tuner_ops.calc_regs = dvb_usb_tuner_calc_regs;
|
||||
dvb_attach(dvb_pll_attach, adap->fe, 0x61, NULL, DVB_PLL_TUA6034);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -84,8 +82,8 @@ static int umt_probe(struct usb_interface *intf,
|
|||
|
||||
/* do not change the order of the ID table */
|
||||
static struct usb_device_id umt_table [] = {
|
||||
/* 00 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_COLD) },
|
||||
/* 01 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_WARM) },
|
||||
/* 00 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_COLD) },
|
||||
/* 01 */ { USB_DEVICE(USB_VID_HANFTEK, USB_PID_HANFTEK_UMT_010_WARM) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE (usb, umt_table);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Makefile for the kernel DVB frontend device drivers.
|
||||
#
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/
|
||||
|
||||
obj-$(CONFIG_DVB_PLL) += dvb-pll.o
|
||||
obj-$(CONFIG_DVB_STV0299) += stv0299.o
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include "dvb-pll.h"
|
||||
#include "cx22702.h"
|
||||
|
||||
|
||||
|
|
|
@ -917,7 +917,7 @@ static int cx24123_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
|
|||
static int cx24123_tune(struct dvb_frontend* fe,
|
||||
struct dvb_frontend_parameters* params,
|
||||
unsigned int mode_flags,
|
||||
int *delay,
|
||||
unsigned int *delay,
|
||||
fe_status_t *status)
|
||||
{
|
||||
int retval = 0;
|
||||
|
|
|
@ -24,6 +24,23 @@
|
|||
|
||||
#include "dvb-pll.h"
|
||||
|
||||
struct dvb_pll_desc {
|
||||
char *name;
|
||||
u32 min;
|
||||
u32 max;
|
||||
u32 iffreq;
|
||||
void (*set)(u8 *buf, const struct dvb_frontend_parameters *params);
|
||||
u8 *initdata;
|
||||
u8 *sleepdata;
|
||||
int count;
|
||||
struct {
|
||||
u32 limit;
|
||||
u32 stepsize;
|
||||
u8 config;
|
||||
u8 cb;
|
||||
} entries[12];
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
/* descriptions */
|
||||
|
||||
|
@ -38,7 +55,13 @@
|
|||
0x50 = AGC Take over point = 103 dBuV */
|
||||
static u8 tua603x_agc103[] = { 2, 0x80|0x40|0x18|0x06|0x01, 0x00|0x50 };
|
||||
|
||||
struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
|
||||
/* 0x04 = 166.67 kHz divider
|
||||
|
||||
0x80 = AGC Time constant 50ms Iagc = 9 uA
|
||||
0x20 = AGC Take over point = 112 dBuV */
|
||||
static u8 tua603x_agc112[] = { 2, 0x80|0x40|0x18|0x04|0x01, 0x80|0x20 };
|
||||
|
||||
static struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
|
||||
.name = "Thomson dtt7579",
|
||||
.min = 177000000,
|
||||
.max = 858000000,
|
||||
|
@ -52,9 +75,8 @@ struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
|
|||
{ 999999999, 166667, 0xf4, 0x08 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_thomson_dtt7579);
|
||||
|
||||
struct dvb_pll_desc dvb_pll_thomson_dtt7610 = {
|
||||
static struct dvb_pll_desc dvb_pll_thomson_dtt7610 = {
|
||||
.name = "Thomson dtt7610",
|
||||
.min = 44000000,
|
||||
.max = 958000000,
|
||||
|
@ -66,19 +88,19 @@ struct dvb_pll_desc dvb_pll_thomson_dtt7610 = {
|
|||
{ 999999999, 62500, 0x8e, 0x3c },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_thomson_dtt7610);
|
||||
|
||||
static void thomson_dtt759x_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
static void thomson_dtt759x_bw(u8 *buf,
|
||||
const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
if (BANDWIDTH_7_MHZ == bandwidth)
|
||||
if (BANDWIDTH_7_MHZ == params->u.ofdm.bandwidth)
|
||||
buf[3] |= 0x10;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
|
||||
static struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
|
||||
.name = "Thomson dtt759x",
|
||||
.min = 177000000,
|
||||
.max = 896000000,
|
||||
.setbw = thomson_dtt759x_bw,
|
||||
.set = thomson_dtt759x_bw,
|
||||
.iffreq= 36166667,
|
||||
.sleepdata = (u8[]){ 2, 0x84, 0x03 },
|
||||
.count = 5,
|
||||
|
@ -90,9 +112,8 @@ struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
|
|||
{ 999999999, 166667, 0xfc, 0x08 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_thomson_dtt759x);
|
||||
|
||||
struct dvb_pll_desc dvb_pll_lg_z201 = {
|
||||
static struct dvb_pll_desc dvb_pll_lg_z201 = {
|
||||
.name = "LG z201",
|
||||
.min = 174000000,
|
||||
.max = 862000000,
|
||||
|
@ -107,9 +128,8 @@ struct dvb_pll_desc dvb_pll_lg_z201 = {
|
|||
{ 999999999, 166667, 0xfc, 0x04 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_lg_z201);
|
||||
|
||||
struct dvb_pll_desc dvb_pll_microtune_4042 = {
|
||||
static struct dvb_pll_desc dvb_pll_microtune_4042 = {
|
||||
.name = "Microtune 4042 FI5",
|
||||
.min = 57000000,
|
||||
.max = 858000000,
|
||||
|
@ -121,9 +141,8 @@ struct dvb_pll_desc dvb_pll_microtune_4042 = {
|
|||
{ 999999999, 62500, 0x8e, 0x31 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_microtune_4042);
|
||||
|
||||
struct dvb_pll_desc dvb_pll_thomson_dtt761x = {
|
||||
static struct dvb_pll_desc dvb_pll_thomson_dtt761x = {
|
||||
/* DTT 7611 7611A 7612 7613 7613A 7614 7615 7615A */
|
||||
.name = "Thomson dtt761x",
|
||||
.min = 57000000,
|
||||
|
@ -137,9 +156,8 @@ struct dvb_pll_desc dvb_pll_thomson_dtt761x = {
|
|||
{ 999999999, 62500, 0x8e, 0x3c },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_thomson_dtt761x);
|
||||
|
||||
struct dvb_pll_desc dvb_pll_unknown_1 = {
|
||||
static struct dvb_pll_desc dvb_pll_unknown_1 = {
|
||||
.name = "unknown 1", /* used by dntv live dvb-t */
|
||||
.min = 174000000,
|
||||
.max = 862000000,
|
||||
|
@ -157,12 +175,11 @@ struct dvb_pll_desc dvb_pll_unknown_1 = {
|
|||
{ 999999999, 166667, 0xfc, 0x08 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_unknown_1);
|
||||
|
||||
/* Infineon TUA6010XS
|
||||
* used in Thomson Cable Tuner
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_tua6010xs = {
|
||||
static struct dvb_pll_desc dvb_pll_tua6010xs = {
|
||||
.name = "Infineon TUA6010XS",
|
||||
.min = 44250000,
|
||||
.max = 858000000,
|
||||
|
@ -174,10 +191,9 @@ struct dvb_pll_desc dvb_pll_tua6010xs = {
|
|||
{ 999999999, 62500, 0x8e, 0x85 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tua6010xs);
|
||||
|
||||
/* Panasonic env57h1xd5 (some Philips PLL ?) */
|
||||
struct dvb_pll_desc dvb_pll_env57h1xd5 = {
|
||||
static struct dvb_pll_desc dvb_pll_env57h1xd5 = {
|
||||
.name = "Panasonic ENV57H1XD5",
|
||||
.min = 44250000,
|
||||
.max = 858000000,
|
||||
|
@ -190,23 +206,23 @@ struct dvb_pll_desc dvb_pll_env57h1xd5 = {
|
|||
{ 999999999, 166667, 0xc2, 0xa4 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_env57h1xd5);
|
||||
|
||||
/* Philips TDA6650/TDA6651
|
||||
* used in Panasonic ENV77H11D5
|
||||
*/
|
||||
static void tda665x_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
static void tda665x_bw(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
if (bandwidth == BANDWIDTH_8_MHZ)
|
||||
if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
|
||||
buf[3] |= 0x08;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_tda665x = {
|
||||
static struct dvb_pll_desc dvb_pll_tda665x = {
|
||||
.name = "Philips TDA6650/TDA6651",
|
||||
.min = 44250000,
|
||||
.max = 858000000,
|
||||
.setbw = tda665x_bw,
|
||||
.set = tda665x_bw,
|
||||
.iffreq= 36166667,
|
||||
.initdata = (u8[]){ 4, 0x0b, 0xf5, 0x85, 0xab },
|
||||
.count = 12,
|
||||
.entries = {
|
||||
{ 93834000, 166667, 0xca, 0x61 /* 011 0 0 0 01 */ },
|
||||
|
@ -223,36 +239,34 @@ struct dvb_pll_desc dvb_pll_tda665x = {
|
|||
{ 861000000, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tda665x);
|
||||
|
||||
/* Infineon TUA6034
|
||||
* used in LG TDTP E102P
|
||||
*/
|
||||
static void tua6034_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
static void tua6034_bw(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
if (BANDWIDTH_7_MHZ != bandwidth)
|
||||
if (BANDWIDTH_7_MHZ != params->u.ofdm.bandwidth)
|
||||
buf[3] |= 0x08;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_tua6034 = {
|
||||
static struct dvb_pll_desc dvb_pll_tua6034 = {
|
||||
.name = "Infineon TUA6034",
|
||||
.min = 44250000,
|
||||
.max = 858000000,
|
||||
.iffreq= 36166667,
|
||||
.count = 3,
|
||||
.setbw = tua6034_bw,
|
||||
.set = tua6034_bw,
|
||||
.entries = {
|
||||
{ 174500000, 62500, 0xce, 0x01 },
|
||||
{ 230000000, 62500, 0xce, 0x02 },
|
||||
{ 999999999, 62500, 0xce, 0x04 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tua6034);
|
||||
|
||||
/* Infineon TUA6034
|
||||
* used in LG TDVS-H061F, LG TDVS-H062F and LG TDVS-H064F
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf = {
|
||||
static struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf = {
|
||||
.name = "LG TDVS-H06xF",
|
||||
.min = 54000000,
|
||||
.max = 863000000,
|
||||
|
@ -265,23 +279,25 @@ struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf = {
|
|||
{ 999999999, 62500, 0xce, 0x04 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_lg_tdvs_h06xf);
|
||||
|
||||
/* Philips FMD1216ME
|
||||
* used in Medion Hybrid PCMCIA card and USB Box
|
||||
*/
|
||||
static void fmd1216me_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
static void fmd1216me_bw(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
if (bandwidth == BANDWIDTH_8_MHZ && freq >= 158870000)
|
||||
if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ &&
|
||||
params->frequency >= 158870000)
|
||||
buf[3] |= 0x08;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_fmd1216me = {
|
||||
static struct dvb_pll_desc dvb_pll_fmd1216me = {
|
||||
.name = "Philips FMD1216ME",
|
||||
.min = 50870000,
|
||||
.max = 858000000,
|
||||
.iffreq= 36125000,
|
||||
.setbw = fmd1216me_bw,
|
||||
.set = fmd1216me_bw,
|
||||
.initdata = tua603x_agc112,
|
||||
.sleepdata = (u8[]){ 4, 0x9c, 0x60, 0x85, 0x54 },
|
||||
.count = 7,
|
||||
.entries = {
|
||||
{ 143870000, 166667, 0xbc, 0x41 },
|
||||
|
@ -293,23 +309,22 @@ struct dvb_pll_desc dvb_pll_fmd1216me = {
|
|||
{ 999999999, 166667, 0xfc, 0x44 },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_fmd1216me);
|
||||
|
||||
/* ALPS TDED4
|
||||
* used in Nebula-Cards and USB boxes
|
||||
*/
|
||||
static void tded4_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
static void tded4_bw(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
if (bandwidth == BANDWIDTH_8_MHZ)
|
||||
if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
|
||||
buf[3] |= 0x04;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_tded4 = {
|
||||
static struct dvb_pll_desc dvb_pll_tded4 = {
|
||||
.name = "ALPS TDED4",
|
||||
.min = 47000000,
|
||||
.max = 863000000,
|
||||
.iffreq= 36166667,
|
||||
.setbw = tded4_bw,
|
||||
.set = tded4_bw,
|
||||
.count = 4,
|
||||
.entries = {
|
||||
{ 153000000, 166667, 0x85, 0x01 },
|
||||
|
@ -318,12 +333,11 @@ struct dvb_pll_desc dvb_pll_tded4 = {
|
|||
{ 999999999, 166667, 0x85, 0x88 },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tded4);
|
||||
|
||||
/* ALPS TDHU2
|
||||
* used in AverTVHD MCE A180
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_tdhu2 = {
|
||||
static struct dvb_pll_desc dvb_pll_tdhu2 = {
|
||||
.name = "ALPS TDHU2",
|
||||
.min = 54000000,
|
||||
.max = 864000000,
|
||||
|
@ -336,16 +350,29 @@ struct dvb_pll_desc dvb_pll_tdhu2 = {
|
|||
{ 999999999, 62500, 0x85, 0x88 },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tdhu2);
|
||||
|
||||
/* Philips TUV1236D
|
||||
* used in ATI HDTV Wonder
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_tuv1236d = {
|
||||
static void tuv1236d_rf(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
switch (params->u.vsb.modulation) {
|
||||
case QAM_64:
|
||||
case QAM_256:
|
||||
buf[3] |= 0x08;
|
||||
break;
|
||||
case VSB_8:
|
||||
default:
|
||||
buf[3] &= ~0x08;
|
||||
}
|
||||
}
|
||||
|
||||
static struct dvb_pll_desc dvb_pll_tuv1236d = {
|
||||
.name = "Philips TUV1236D",
|
||||
.min = 54000000,
|
||||
.max = 864000000,
|
||||
.iffreq= 44000000,
|
||||
.set = tuv1236d_rf,
|
||||
.count = 3,
|
||||
.entries = {
|
||||
{ 157250000, 62500, 0xc6, 0x41 },
|
||||
|
@ -353,12 +380,11 @@ struct dvb_pll_desc dvb_pll_tuv1236d = {
|
|||
{ 999999999, 62500, 0xc6, 0x44 },
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_tuv1236d);
|
||||
|
||||
/* Samsung TBMV30111IN / TBMV30712IN1
|
||||
* used in Air2PC ATSC - 2nd generation (nxt2002)
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_samsung_tbmv = {
|
||||
static struct dvb_pll_desc dvb_pll_samsung_tbmv = {
|
||||
.name = "Samsung TBMV30111IN / TBMV30712IN1",
|
||||
.min = 54000000,
|
||||
.max = 860000000,
|
||||
|
@ -373,12 +399,11 @@ struct dvb_pll_desc dvb_pll_samsung_tbmv = {
|
|||
{ 999999999, 166667, 0xfc, 0x02 },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_samsung_tbmv);
|
||||
|
||||
/*
|
||||
* Philips SD1878 Tuner.
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
|
||||
static struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
|
||||
.name = "Philips SD1878",
|
||||
.min = 950000,
|
||||
.max = 2150000,
|
||||
|
@ -391,19 +416,18 @@ struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
|
|||
{ 2150000, 500, 0xc4, 0xc0},
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_philips_sd1878_tda8261);
|
||||
|
||||
/*
|
||||
* Philips TD1316 Tuner.
|
||||
*/
|
||||
static void td1316_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
static void td1316_bw(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
u8 band;
|
||||
|
||||
/* determine band */
|
||||
if (freq < 161000000)
|
||||
if (params->frequency < 161000000)
|
||||
band = 1;
|
||||
else if (freq < 444000000)
|
||||
else if (params->frequency < 444000000)
|
||||
band = 2;
|
||||
else
|
||||
band = 4;
|
||||
|
@ -411,16 +435,16 @@ static void td1316_bw(u8 *buf, u32 freq, int bandwidth)
|
|||
buf[3] |= band;
|
||||
|
||||
/* setup PLL filter */
|
||||
if (bandwidth == BANDWIDTH_8_MHZ)
|
||||
if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
|
||||
buf[3] |= 1 << 3;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_philips_td1316 = {
|
||||
static struct dvb_pll_desc dvb_pll_philips_td1316 = {
|
||||
.name = "Philips TD1316",
|
||||
.min = 87000000,
|
||||
.max = 895000000,
|
||||
.iffreq= 36166667,
|
||||
.setbw = td1316_bw,
|
||||
.set = td1316_bw,
|
||||
.count = 9,
|
||||
.entries = {
|
||||
{ 93834000, 166667, 0xca, 0x60},
|
||||
|
@ -434,10 +458,9 @@ struct dvb_pll_desc dvb_pll_philips_td1316 = {
|
|||
{ 858834000, 166667, 0xca, 0xe0},
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_philips_td1316);
|
||||
|
||||
/* FE6600 used on DViCO Hybrid */
|
||||
struct dvb_pll_desc dvb_pll_thomson_fe6600 = {
|
||||
static struct dvb_pll_desc dvb_pll_thomson_fe6600 = {
|
||||
.name = "Thomson FE6600",
|
||||
.min = 44250000,
|
||||
.max = 858000000,
|
||||
|
@ -450,19 +473,19 @@ struct dvb_pll_desc dvb_pll_thomson_fe6600 = {
|
|||
{ 999999999, 166667, 0xf4, 0x18 },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_thomson_fe6600);
|
||||
static void opera1_bw(u8 *buf, u32 freq, int bandwidth)
|
||||
|
||||
static void opera1_bw(u8 *buf, const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
if (bandwidth == BANDWIDTH_8_MHZ)
|
||||
if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
|
||||
buf[2] |= 0x08;
|
||||
}
|
||||
|
||||
struct dvb_pll_desc dvb_pll_opera1 = {
|
||||
static struct dvb_pll_desc dvb_pll_opera1 = {
|
||||
.name = "Opera Tuner",
|
||||
.min = 900000,
|
||||
.max = 2250000,
|
||||
.iffreq= 0,
|
||||
.setbw = opera1_bw,
|
||||
.set = opera1_bw,
|
||||
.count = 8,
|
||||
.entries = {
|
||||
{ 1064000, 500, 0xe5, 0xc6 },
|
||||
|
@ -475,7 +498,54 @@ struct dvb_pll_desc dvb_pll_opera1 = {
|
|||
{ 2250000, 500, 0xe5, 0xc4 },
|
||||
}
|
||||
};
|
||||
EXPORT_SYMBOL(dvb_pll_opera1);
|
||||
|
||||
/* Philips FCV1236D
|
||||
*/
|
||||
struct dvb_pll_desc dvb_pll_fcv1236d = {
|
||||
/* Bit_0: RF Input select
|
||||
* Bit_1: 0=digital, 1=analog
|
||||
*/
|
||||
.name = "Philips FCV1236D",
|
||||
.min = 53000000,
|
||||
.max = 803000000,
|
||||
.iffreq= 44000000,
|
||||
.count = 3,
|
||||
.entries = {
|
||||
{ 159000000, 62500, 0x8e, 0xa0 },
|
||||
{ 453000000, 62500, 0x8e, 0x90 },
|
||||
{ 999999999, 62500, 0x8e, 0x30 },
|
||||
},
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
static struct dvb_pll_desc *pll_list[] = {
|
||||
[DVB_PLL_UNDEFINED] = NULL,
|
||||
[DVB_PLL_THOMSON_DTT7579] = &dvb_pll_thomson_dtt7579,
|
||||
[DVB_PLL_THOMSON_DTT759X] = &dvb_pll_thomson_dtt759x,
|
||||
[DVB_PLL_THOMSON_DTT7610] = &dvb_pll_thomson_dtt7610,
|
||||
[DVB_PLL_LG_Z201] = &dvb_pll_lg_z201,
|
||||
[DVB_PLL_MICROTUNE_4042] = &dvb_pll_microtune_4042,
|
||||
[DVB_PLL_THOMSON_DTT761X] = &dvb_pll_thomson_dtt761x,
|
||||
[DVB_PLL_UNKNOWN_1] = &dvb_pll_unknown_1,
|
||||
[DVB_PLL_TUA6010XS] = &dvb_pll_tua6010xs,
|
||||
[DVB_PLL_ENV57H1XD5] = &dvb_pll_env57h1xd5,
|
||||
[DVB_PLL_TUA6034] = &dvb_pll_tua6034,
|
||||
[DVB_PLL_LG_TDVS_H06XF] = &dvb_pll_lg_tdvs_h06xf,
|
||||
[DVB_PLL_TDA665X] = &dvb_pll_tda665x,
|
||||
[DVB_PLL_FMD1216ME] = &dvb_pll_fmd1216me,
|
||||
[DVB_PLL_TDED4] = &dvb_pll_tded4,
|
||||
[DVB_PLL_TUV1236D] = &dvb_pll_tuv1236d,
|
||||
[DVB_PLL_TDHU2] = &dvb_pll_tdhu2,
|
||||
[DVB_PLL_SAMSUNG_TBMV] = &dvb_pll_samsung_tbmv,
|
||||
[DVB_PLL_PHILIPS_SD1878_TDA8261] = &dvb_pll_philips_sd1878_tda8261,
|
||||
[DVB_PLL_PHILIPS_TD1316] = &dvb_pll_philips_td1316,
|
||||
[DVB_PLL_THOMSON_FE6600] = &dvb_pll_thomson_fe6600,
|
||||
[DVB_PLL_OPERA1] = &dvb_pll_opera1,
|
||||
[DVB_PLL_FCV1236D] = &dvb_pll_fcv1236d,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
struct dvb_pll_priv {
|
||||
/* i2c details */
|
||||
|
@ -497,35 +567,37 @@ static int debug = 0;
|
|||
module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "enable verbose debug messages");
|
||||
|
||||
int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
|
||||
u32 freq, int bandwidth)
|
||||
static int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
|
||||
const struct dvb_frontend_parameters *params)
|
||||
{
|
||||
u32 div;
|
||||
int i;
|
||||
|
||||
if (freq != 0 && (freq < desc->min || freq > desc->max))
|
||||
return -EINVAL;
|
||||
if (params->frequency != 0 && (params->frequency < desc->min ||
|
||||
params->frequency > desc->max))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < desc->count; i++) {
|
||||
if (freq > desc->entries[i].limit)
|
||||
if (params->frequency > desc->entries[i].limit)
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
|
||||
if (debug)
|
||||
printk("pll: %s: freq=%d bw=%d | i=%d/%d\n",
|
||||
desc->name, freq, bandwidth, i, desc->count);
|
||||
printk("pll: %s: freq=%d | i=%d/%d\n", desc->name,
|
||||
params->frequency, i, desc->count);
|
||||
if (i == desc->count)
|
||||
return -EINVAL;
|
||||
|
||||
div = (freq + desc->iffreq + desc->entries[i].stepsize/2) /
|
||||
desc->entries[i].stepsize;
|
||||
div = (params->frequency + desc->iffreq +
|
||||
desc->entries[i].stepsize/2) / desc->entries[i].stepsize;
|
||||
buf[0] = div >> 8;
|
||||
buf[1] = div & 0xff;
|
||||
buf[2] = desc->entries[i].config;
|
||||
buf[3] = desc->entries[i].cb;
|
||||
|
||||
if (desc->setbw)
|
||||
desc->setbw(buf, freq, bandwidth);
|
||||
if (desc->set)
|
||||
desc->set(buf, params);
|
||||
|
||||
if (debug)
|
||||
printk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
|
||||
|
@ -534,7 +606,6 @@ int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
|
|||
// calculate the frequency we set it to
|
||||
return (div * desc->entries[i].stepsize) - desc->iffreq;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_pll_configure);
|
||||
|
||||
static int dvb_pll_release(struct dvb_frontend *fe)
|
||||
{
|
||||
|
@ -578,18 +649,12 @@ static int dvb_pll_set_params(struct dvb_frontend *fe,
|
|||
{ .addr = priv->pll_i2c_address, .flags = 0,
|
||||
.buf = buf, .len = sizeof(buf) };
|
||||
int result;
|
||||
u32 bandwidth = 0, frequency = 0;
|
||||
u32 frequency = 0;
|
||||
|
||||
if (priv->i2c == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
// DVBT bandwidth only just now
|
||||
if (fe->ops.info.type == FE_OFDM) {
|
||||
bandwidth = params->u.ofdm.bandwidth;
|
||||
}
|
||||
|
||||
if ((result = dvb_pll_configure(priv->pll_desc, buf,
|
||||
params->frequency, bandwidth)) < 0)
|
||||
if ((result = dvb_pll_configure(priv->pll_desc, buf, params)) < 0)
|
||||
return result;
|
||||
else
|
||||
frequency = result;
|
||||
|
@ -601,7 +666,7 @@ static int dvb_pll_set_params(struct dvb_frontend *fe,
|
|||
}
|
||||
|
||||
priv->frequency = frequency;
|
||||
priv->bandwidth = bandwidth;
|
||||
priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -612,18 +677,12 @@ static int dvb_pll_calc_regs(struct dvb_frontend *fe,
|
|||
{
|
||||
struct dvb_pll_priv *priv = fe->tuner_priv;
|
||||
int result;
|
||||
u32 bandwidth = 0, frequency = 0;
|
||||
u32 frequency = 0;
|
||||
|
||||
if (buf_len < 5)
|
||||
return -EINVAL;
|
||||
|
||||
// DVBT bandwidth only just now
|
||||
if (fe->ops.info.type == FE_OFDM) {
|
||||
bandwidth = params->u.ofdm.bandwidth;
|
||||
}
|
||||
|
||||
if ((result = dvb_pll_configure(priv->pll_desc, buf+1,
|
||||
params->frequency, bandwidth)) < 0)
|
||||
if ((result = dvb_pll_configure(priv->pll_desc, buf+1, params)) < 0)
|
||||
return result;
|
||||
else
|
||||
frequency = result;
|
||||
|
@ -631,7 +690,7 @@ static int dvb_pll_calc_regs(struct dvb_frontend *fe,
|
|||
buf[0] = priv->pll_i2c_address;
|
||||
|
||||
priv->frequency = frequency;
|
||||
priv->bandwidth = bandwidth;
|
||||
priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
|
||||
|
||||
return 5;
|
||||
}
|
||||
|
@ -687,13 +746,18 @@ static struct dvb_tuner_ops dvb_pll_tuner_ops = {
|
|||
|
||||
struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
|
||||
struct i2c_adapter *i2c,
|
||||
struct dvb_pll_desc *desc)
|
||||
unsigned int pll_desc_id)
|
||||
{
|
||||
u8 b1 [] = { 0 };
|
||||
struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD,
|
||||
.buf = b1, .len = 1 };
|
||||
struct dvb_pll_priv *priv = NULL;
|
||||
int ret;
|
||||
struct dvb_pll_desc *desc;
|
||||
|
||||
BUG_ON(pll_desc_id < 1 || pll_desc_id >= ARRAY_SIZE(pll_list));
|
||||
|
||||
desc = pll_list[pll_desc_id];
|
||||
|
||||
if (i2c != NULL) {
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
|
|
|
@ -8,50 +8,29 @@
|
|||
#include <linux/i2c.h>
|
||||
#include "dvb_frontend.h"
|
||||
|
||||
struct dvb_pll_desc {
|
||||
char *name;
|
||||
u32 min;
|
||||
u32 max;
|
||||
u32 iffreq;
|
||||
void (*setbw)(u8 *buf, u32 freq, int bandwidth);
|
||||
u8 *initdata;
|
||||
u8 *sleepdata;
|
||||
int count;
|
||||
struct {
|
||||
u32 limit;
|
||||
u32 stepsize;
|
||||
u8 config;
|
||||
u8 cb;
|
||||
} entries[12];
|
||||
};
|
||||
|
||||
extern struct dvb_pll_desc dvb_pll_thomson_dtt7579;
|
||||
extern struct dvb_pll_desc dvb_pll_thomson_dtt759x;
|
||||
extern struct dvb_pll_desc dvb_pll_thomson_dtt7610;
|
||||
extern struct dvb_pll_desc dvb_pll_lg_z201;
|
||||
extern struct dvb_pll_desc dvb_pll_microtune_4042;
|
||||
extern struct dvb_pll_desc dvb_pll_thomson_dtt761x;
|
||||
extern struct dvb_pll_desc dvb_pll_unknown_1;
|
||||
|
||||
extern struct dvb_pll_desc dvb_pll_tua6010xs;
|
||||
extern struct dvb_pll_desc dvb_pll_env57h1xd5;
|
||||
extern struct dvb_pll_desc dvb_pll_tua6034;
|
||||
extern struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf;
|
||||
extern struct dvb_pll_desc dvb_pll_tda665x;
|
||||
extern struct dvb_pll_desc dvb_pll_fmd1216me;
|
||||
extern struct dvb_pll_desc dvb_pll_tded4;
|
||||
|
||||
extern struct dvb_pll_desc dvb_pll_tuv1236d;
|
||||
extern struct dvb_pll_desc dvb_pll_tdhu2;
|
||||
extern struct dvb_pll_desc dvb_pll_samsung_tbmv;
|
||||
extern struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261;
|
||||
extern struct dvb_pll_desc dvb_pll_philips_td1316;
|
||||
|
||||
extern struct dvb_pll_desc dvb_pll_thomson_fe6600;
|
||||
extern struct dvb_pll_desc dvb_pll_opera1;
|
||||
|
||||
extern int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
|
||||
u32 freq, int bandwidth);
|
||||
#define DVB_PLL_UNDEFINED 0
|
||||
#define DVB_PLL_THOMSON_DTT7579 1
|
||||
#define DVB_PLL_THOMSON_DTT759X 2
|
||||
#define DVB_PLL_THOMSON_DTT7610 3
|
||||
#define DVB_PLL_LG_Z201 4
|
||||
#define DVB_PLL_MICROTUNE_4042 5
|
||||
#define DVB_PLL_THOMSON_DTT761X 6
|
||||
#define DVB_PLL_UNKNOWN_1 7
|
||||
#define DVB_PLL_TUA6010XS 8
|
||||
#define DVB_PLL_ENV57H1XD5 9
|
||||
#define DVB_PLL_TUA6034 10
|
||||
#define DVB_PLL_LG_TDVS_H06XF 11
|
||||
#define DVB_PLL_TDA665X 12
|
||||
#define DVB_PLL_FMD1216ME 13
|
||||
#define DVB_PLL_TDED4 14
|
||||
#define DVB_PLL_TUV1236D 15
|
||||
#define DVB_PLL_TDHU2 16
|
||||
#define DVB_PLL_SAMSUNG_TBMV 17
|
||||
#define DVB_PLL_PHILIPS_SD1878_TDA8261 18
|
||||
#define DVB_PLL_PHILIPS_TD1316 19
|
||||
#define DVB_PLL_THOMSON_FE6600 20
|
||||
#define DVB_PLL_OPERA1 21
|
||||
#define DVB_PLL_FCV1236D 22
|
||||
|
||||
/**
|
||||
* Attach a dvb-pll to the supplied frontend structure.
|
||||
|
@ -59,19 +38,19 @@ extern int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
|
|||
* @param fe Frontend to attach to.
|
||||
* @param pll_addr i2c address of the PLL (if used).
|
||||
* @param i2c i2c adapter to use (set to NULL if not used).
|
||||
* @param desc dvb_pll_desc to use.
|
||||
* @param pll_desc_id dvb_pll_desc to use.
|
||||
* @return Frontend pointer on success, NULL on failure
|
||||
*/
|
||||
#if defined(CONFIG_DVB_PLL) || (defined(CONFIG_DVB_PLL_MODULE) && defined(MODULE))
|
||||
extern struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe,
|
||||
int pll_addr,
|
||||
struct i2c_adapter *i2c,
|
||||
struct dvb_pll_desc *desc);
|
||||
unsigned int pll_desc_id);
|
||||
#else
|
||||
static inline struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe,
|
||||
int pll_addr,
|
||||
struct i2c_adapter *i2c,
|
||||
struct dvb_pll_desc *desc)
|
||||
unsigned int pll_desc_id)
|
||||
{
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
|
||||
return NULL;
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#include <linux/string.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include "dvb-pll.h"
|
||||
#include "nxt200x.h"
|
||||
|
||||
struct nxt200x_state {
|
||||
|
@ -546,11 +545,6 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe,
|
|||
nxt200x_writebytes(state, 0x17, buf, 1);
|
||||
}
|
||||
|
||||
/* get tuning information */
|
||||
if (fe->ops.tuner_ops.calc_regs) {
|
||||
fe->ops.tuner_ops.calc_regs(fe, p, buf, 5);
|
||||
}
|
||||
|
||||
/* set additional params */
|
||||
switch (p->u.vsb.modulation) {
|
||||
case QAM_64:
|
||||
|
@ -559,27 +553,24 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe,
|
|||
/* This is just a guess since I am unable to test it */
|
||||
if (state->config->set_ts_params)
|
||||
state->config->set_ts_params(fe, 1);
|
||||
|
||||
/* set input */
|
||||
if (state->config->set_pll_input)
|
||||
state->config->set_pll_input(buf+1, 1);
|
||||
break;
|
||||
case VSB_8:
|
||||
/* Set non-punctured clock for VSB */
|
||||
if (state->config->set_ts_params)
|
||||
state->config->set_ts_params(fe, 0);
|
||||
|
||||
/* set input */
|
||||
if (state->config->set_pll_input)
|
||||
state->config->set_pll_input(buf+1, 0);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
/* write frequency information */
|
||||
nxt200x_writetuner(state, buf);
|
||||
if (fe->ops.tuner_ops.calc_regs) {
|
||||
/* get tuning information */
|
||||
fe->ops.tuner_ops.calc_regs(fe, p, buf, 5);
|
||||
|
||||
/* write frequency information */
|
||||
nxt200x_writetuner(state, buf);
|
||||
}
|
||||
|
||||
/* reset the agc now that tuning has been completed */
|
||||
nxt200x_agc_reset(state);
|
||||
|
|
|
@ -38,9 +38,6 @@ struct nxt200x_config
|
|||
/* the demodulator's i2c address */
|
||||
u8 demod_address;
|
||||
|
||||
/* used to set pll input */
|
||||
int (*set_pll_input)(u8* buf, int input);
|
||||
|
||||
/* need to set device param for start_dma */
|
||||
int (*set_ts_params)(struct dvb_frontend* fe, int is_punctured);
|
||||
};
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
|
||||
#include "dvb_math.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include "dvb-pll.h"
|
||||
#include "or51132.h"
|
||||
|
||||
static int debug;
|
||||
|
|
|
@ -223,38 +223,13 @@ static int or51211_set_parameters(struct dvb_frontend* fe,
|
|||
struct dvb_frontend_parameters *param)
|
||||
{
|
||||
struct or51211_state* state = fe->demodulator_priv;
|
||||
u32 freq = 0;
|
||||
u16 tunerfreq = 0;
|
||||
u8 buf[4];
|
||||
|
||||
/* Change only if we are actually changing the channel */
|
||||
if (state->current_frequency != param->frequency) {
|
||||
freq = 44000 + (param->frequency/1000);
|
||||
tunerfreq = freq * 16/1000;
|
||||
|
||||
dprintk("set_parameters frequency = %d (tunerfreq = %d)\n",
|
||||
param->frequency,tunerfreq);
|
||||
|
||||
buf[0] = (tunerfreq >> 8) & 0x7F;
|
||||
buf[1] = (tunerfreq & 0xFF);
|
||||
buf[2] = 0x8E;
|
||||
|
||||
if (param->frequency < 157250000) {
|
||||
buf[3] = 0xA0;
|
||||
dprintk("set_parameters VHF low range\n");
|
||||
} else if (param->frequency < 454000000) {
|
||||
buf[3] = 0x90;
|
||||
dprintk("set_parameters VHF high range\n");
|
||||
} else {
|
||||
buf[3] = 0x30;
|
||||
dprintk("set_parameters UHF range\n");
|
||||
if (fe->ops.tuner_ops.set_params) {
|
||||
fe->ops.tuner_ops.set_params(fe, param);
|
||||
if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
|
||||
}
|
||||
dprintk("set_parameters tuner bytes: 0x%02x 0x%02x "
|
||||
"0x%02x 0x%02x\n",buf[0],buf[1],buf[2],buf[3]);
|
||||
|
||||
if (i2c_writebytes(state,0xC2>>1,buf,4))
|
||||
printk(KERN_WARNING "or51211:set_parameters error "
|
||||
"writing to tuner\n");
|
||||
|
||||
/* Set to ATSC mode */
|
||||
or51211_setmode(fe,0);
|
||||
|
|
|
@ -249,7 +249,7 @@ static int stv0299_get_symbolrate (struct stv0299_state* state)
|
|||
dprintk ("%s\n", __FUNCTION__);
|
||||
|
||||
stv0299_readregs (state, 0x1f, sfr, 3);
|
||||
stv0299_readregs (state, 0x1a, &rtf, 1);
|
||||
stv0299_readregs (state, 0x1a, (u8 *)&rtf, 1);
|
||||
|
||||
srate = (sfr[0] << 8) | sfr[1];
|
||||
srate *= Mclk;
|
||||
|
|
|
@ -478,7 +478,7 @@ struct dvb_frontend* tda10023_attach(const struct tda1002x_config* config,
|
|||
state->i2c = i2c;
|
||||
memcpy(&state->frontend.ops, &tda10023_ops, sizeof(struct dvb_frontend_ops));
|
||||
state->pwm = pwm;
|
||||
for (i=0; i < sizeof(tda10023_inittab)/sizeof(*tda10023_inittab);i+=3) {
|
||||
for (i=0; i < ARRAY_SIZE(tda10023_inittab);i+=3) {
|
||||
if (tda10023_inittab[i] == 0x00) {
|
||||
state->reg0 = tda10023_inittab[i+2];
|
||||
break;
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-$(CONFIG_DVB_PLUTO2) += pluto2.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
|
|
|
@ -108,7 +108,7 @@ config DVB_BUDGET_AV
|
|||
tristate "Budget cards with analog video inputs"
|
||||
depends on DVB_CORE && PCI && I2C && VIDEO_V4L1
|
||||
select VIDEO_SAA7146_VV
|
||||
select DVB_PLL
|
||||
select DVB_PLL if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0299 if !DVB_FE_CUSTOMISE
|
||||
select DVB_TDA1004X if !DVB_FE_CUSTOMISE
|
||||
select DVB_TDA10021 if !DVB_FE_CUSTOMISE
|
||||
|
|
|
@ -11,7 +11,7 @@ obj-$(CONFIG_DVB_BUDGET_CI) += budget-core.o budget-ci.o ttpci-eeprom.o
|
|||
obj-$(CONFIG_DVB_BUDGET_PATCH) += budget-core.o budget-patch.o ttpci-eeprom.o
|
||||
obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o ttpci-eeprom.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
|
||||
|
||||
hostprogs-y := fdump
|
||||
|
||||
|
|
|
@ -137,6 +137,15 @@ static void init_av7110_av(struct av7110 *av7110)
|
|||
if (ret < 0)
|
||||
printk("dvb-ttpci:cannot set internal volume to maximum:%d\n",ret);
|
||||
|
||||
ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetMonitorType,
|
||||
1, (u16) av7110->display_ar);
|
||||
if (ret < 0)
|
||||
printk("dvb-ttpci: unable to set aspect ratio\n");
|
||||
ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType,
|
||||
1, av7110->display_panscan);
|
||||
if (ret < 0)
|
||||
printk("dvb-ttpci: unable to set pan scan\n");
|
||||
|
||||
ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetWSSConfig, 2, 2, wss_cfg_4_3);
|
||||
if (ret < 0)
|
||||
printk("dvb-ttpci: unable to configure 4:3 wss\n");
|
||||
|
@ -2639,12 +2648,12 @@ static int __devinit av7110_attach(struct saa7146_dev* dev,
|
|||
av7110->mixer.volume_left = volume;
|
||||
av7110->mixer.volume_right = volume;
|
||||
|
||||
init_av7110_av(av7110);
|
||||
|
||||
ret = av7110_register(av7110);
|
||||
if (ret < 0)
|
||||
goto err_arm_thread_stop_10;
|
||||
|
||||
init_av7110_av(av7110);
|
||||
|
||||
/* special case DVB-C: these cards have an analog tuner
|
||||
plus need some special handling, so we have separate
|
||||
saa7146_ext_vv data for these... */
|
||||
|
|
|
@ -194,6 +194,7 @@ struct av7110 {
|
|||
|
||||
int video_blank;
|
||||
struct video_status videostate;
|
||||
u16 display_panscan;
|
||||
int display_ar;
|
||||
int trickmode;
|
||||
#define TRICK_NONE 0
|
||||
|
|
|
@ -391,7 +391,7 @@ static int get_video_format(struct av7110 *av7110, u8 *buf, int count)
|
|||
****************************************************************************/
|
||||
|
||||
static inline long aux_ring_buffer_write(struct dvb_ringbuffer *rbuf,
|
||||
const char *buf, unsigned long count)
|
||||
const u8 *buf, unsigned long count)
|
||||
{
|
||||
unsigned long todo = count;
|
||||
int free;
|
||||
|
@ -436,7 +436,7 @@ static void play_audio_cb(u8 *buf, int count, void *priv)
|
|||
#define FREE_COND (dvb_ringbuffer_free(&av7110->avout) >= 20 * 1024 && \
|
||||
dvb_ringbuffer_free(&av7110->aout) >= 20 * 1024)
|
||||
|
||||
static ssize_t dvb_play(struct av7110 *av7110, const u8 __user *buf,
|
||||
static ssize_t dvb_play(struct av7110 *av7110, const char __user *buf,
|
||||
unsigned long count, int nonblock, int type)
|
||||
{
|
||||
unsigned long todo = count, n;
|
||||
|
@ -499,7 +499,7 @@ static ssize_t dvb_play_kernel(struct av7110 *av7110, const u8 *buf,
|
|||
return count - todo;
|
||||
}
|
||||
|
||||
static ssize_t dvb_aplay(struct av7110 *av7110, const u8 __user *buf,
|
||||
static ssize_t dvb_aplay(struct av7110 *av7110, const char __user *buf,
|
||||
unsigned long count, int nonblock, int type)
|
||||
{
|
||||
unsigned long todo = count, n;
|
||||
|
@ -959,7 +959,7 @@ static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x
|
|||
|
||||
#define MIN_IFRAME 400000
|
||||
|
||||
static int play_iframe(struct av7110 *av7110, u8 __user *buf, unsigned int len, int nonblock)
|
||||
static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len, int nonblock)
|
||||
{
|
||||
int i, n;
|
||||
|
||||
|
@ -1082,19 +1082,18 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file,
|
|||
case VIDEO_SET_DISPLAY_FORMAT:
|
||||
{
|
||||
video_displayformat_t format = (video_displayformat_t) arg;
|
||||
u16 val = 0;
|
||||
|
||||
switch (format) {
|
||||
case VIDEO_PAN_SCAN:
|
||||
val = VID_PAN_SCAN_PREF;
|
||||
av7110->display_panscan = VID_PAN_SCAN_PREF;
|
||||
break;
|
||||
|
||||
case VIDEO_LETTER_BOX:
|
||||
val = VID_VC_AND_PS_PREF;
|
||||
av7110->display_panscan = VID_VC_AND_PS_PREF;
|
||||
break;
|
||||
|
||||
case VIDEO_CENTER_CUT_OUT:
|
||||
val = VID_CENTRE_CUT_PREF;
|
||||
av7110->display_panscan = VID_CENTRE_CUT_PREF;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1104,7 +1103,7 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file,
|
|||
break;
|
||||
av7110->videostate.display_format = format;
|
||||
ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetPanScanType,
|
||||
1, (u16) val);
|
||||
1, av7110->display_panscan);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1466,8 +1465,9 @@ int av7110_av_register(struct av7110 *av7110)
|
|||
av7110->videostate.play_state = VIDEO_STOPPED;
|
||||
av7110->videostate.stream_source = VIDEO_SOURCE_DEMUX;
|
||||
av7110->videostate.video_format = VIDEO_FORMAT_4_3;
|
||||
av7110->videostate.display_format = VIDEO_CENTER_CUT_OUT;
|
||||
av7110->videostate.display_format = VIDEO_LETTER_BOX;
|
||||
av7110->display_ar = VIDEO_FORMAT_4_3;
|
||||
av7110->display_panscan = VID_VC_AND_PS_PREF;
|
||||
|
||||
init_waitqueue_head(&av7110->video_events.wait_queue);
|
||||
spin_lock_init(&av7110->video_events.lock);
|
||||
|
|
|
@ -151,7 +151,7 @@ static ssize_t ci_ll_write(struct dvb_ringbuffer *cibuf, struct file *file,
|
|||
{
|
||||
int free;
|
||||
int non_blocking = file->f_flags & O_NONBLOCK;
|
||||
char *page = (char *)__get_free_page(GFP_USER);
|
||||
u8 *page = (u8 *)__get_free_page(GFP_USER);
|
||||
int res;
|
||||
|
||||
if (!page)
|
||||
|
@ -208,7 +208,7 @@ static ssize_t ci_ll_read(struct dvb_ringbuffer *cibuf, struct file *file,
|
|||
return -EINVAL;
|
||||
DVB_RINGBUFFER_SKIP(cibuf, 2);
|
||||
|
||||
return dvb_ringbuffer_read(cibuf, buf, len, 1);
|
||||
return dvb_ringbuffer_read(cibuf, (u8 *)buf, len, 1);
|
||||
}
|
||||
|
||||
static int dvb_ca_open(struct inode *inode, struct file *file)
|
||||
|
|
|
@ -158,7 +158,7 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
|
|||
}
|
||||
dprintk(4, "writing DRAM block %d\n", i);
|
||||
mwdebi(av7110, DEBISWAB, bootblock,
|
||||
((char*)data) + i * AV7110_BOOT_MAX_SIZE, AV7110_BOOT_MAX_SIZE);
|
||||
((u8 *)data) + i * AV7110_BOOT_MAX_SIZE, AV7110_BOOT_MAX_SIZE);
|
||||
bootblock ^= 0x1400;
|
||||
iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
|
||||
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, AV7110_BOOT_MAX_SIZE, 2);
|
||||
|
@ -173,10 +173,10 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
|
|||
}
|
||||
if (rest > 4)
|
||||
mwdebi(av7110, DEBISWAB, bootblock,
|
||||
((char*)data) + i * AV7110_BOOT_MAX_SIZE, rest);
|
||||
((u8 *)data) + i * AV7110_BOOT_MAX_SIZE, rest);
|
||||
else
|
||||
mwdebi(av7110, DEBISWAB, bootblock,
|
||||
((char*)data) + i * AV7110_BOOT_MAX_SIZE - 4, rest + 4);
|
||||
((u8 *)data) + i * AV7110_BOOT_MAX_SIZE - 4, rest + 4);
|
||||
|
||||
iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
|
||||
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, rest, 2);
|
||||
|
@ -751,7 +751,7 @@ static int FlushText(struct av7110 *av7110)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf)
|
||||
static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, char *buf)
|
||||
{
|
||||
int i, ret;
|
||||
unsigned long start;
|
||||
|
|
|
@ -393,7 +393,7 @@ static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val,
|
|||
}
|
||||
|
||||
/* buffer writes */
|
||||
static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, char *val, int count)
|
||||
static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, u8 *val, int count)
|
||||
{
|
||||
memcpy(av7110->debi_virt, val, count);
|
||||
av7110_debiwrite(av7110, config, addr, 0, count);
|
||||
|
|
|
@ -356,7 +356,7 @@ int __devinit av7110_ir_init(struct av7110 *av7110)
|
|||
input_dev->id.vendor = av7110->dev->pci->vendor;
|
||||
input_dev->id.product = av7110->dev->pci->device;
|
||||
}
|
||||
input_dev->cdev.dev = &av7110->dev->pci->dev;
|
||||
input_dev->dev.parent = &av7110->dev->pci->dev;
|
||||
/* initial keymap */
|
||||
memcpy(av7110->ir.key_map, default_key_map, sizeof av7110->ir.key_map);
|
||||
input_register_keys(&av7110->ir);
|
||||
|
|
|
@ -333,7 +333,7 @@ static int av7110_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg)
|
|||
return -EINVAL;
|
||||
|
||||
memset(t, 0, sizeof(*t));
|
||||
strcpy(t->name, "Television");
|
||||
strcpy((char *)t->name, "Television");
|
||||
|
||||
t->type = V4L2_TUNER_ANALOG_TV;
|
||||
t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
|
||||
|
|
|
@ -828,29 +828,6 @@ static u8 philips_sd1878_inittab[] = {
|
|||
0xff, 0xff
|
||||
};
|
||||
|
||||
static int philips_sd1878_tda8261_tuner_set_params(struct dvb_frontend *fe,
|
||||
struct dvb_frontend_parameters *params)
|
||||
{
|
||||
u8 buf[4];
|
||||
int rc;
|
||||
struct i2c_msg tuner_msg = {.addr=0x60,.flags=0,.buf=buf,.len=sizeof(buf)};
|
||||
struct budget *budget = (struct budget *) fe->dvb->priv;
|
||||
|
||||
if((params->frequency < 950000) || (params->frequency > 2150000))
|
||||
return -EINVAL;
|
||||
|
||||
rc=dvb_pll_configure(&dvb_pll_philips_sd1878_tda8261, buf,
|
||||
params->frequency, 0);
|
||||
if(rc < 0) return rc;
|
||||
|
||||
if (fe->ops.i2c_gate_ctrl)
|
||||
fe->ops.i2c_gate_ctrl(fe, 1);
|
||||
if(i2c_transfer(&budget->i2c_adap, &tuner_msg, 1) != 1)
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int philips_sd1878_ci_set_symbol_rate(struct dvb_frontend *fe,
|
||||
u32 srate, u32 ratio)
|
||||
{
|
||||
|
@ -921,6 +898,7 @@ static u8 read_pwm(struct budget_av *budget_av)
|
|||
#define SUBID_DVBS_TV_STAR 0x0014
|
||||
#define SUBID_DVBS_TV_STAR_CI 0x0016
|
||||
#define SUBID_DVBS_EASYWATCH_1 0x001a
|
||||
#define SUBID_DVBS_EASYWATCH_2 0x001b
|
||||
#define SUBID_DVBS_EASYWATCH 0x001e
|
||||
|
||||
#define SUBID_DVBC_EASYWATCH 0x002a
|
||||
|
@ -982,10 +960,13 @@ static void frontend_init(struct budget_av *budget_av)
|
|||
case SUBID_DVBS_TV_STAR_CI:
|
||||
case SUBID_DVBS_CYNERGY1200N:
|
||||
case SUBID_DVBS_EASYWATCH:
|
||||
case SUBID_DVBS_EASYWATCH_2:
|
||||
fe = dvb_attach(stv0299_attach, &philips_sd1878_config,
|
||||
&budget_av->budget.i2c_adap);
|
||||
if (fe) {
|
||||
fe->ops.tuner_ops.set_params = philips_sd1878_tda8261_tuner_set_params;
|
||||
dvb_attach(dvb_pll_attach, fe, 0x60,
|
||||
&budget_av->budget.i2c_adap,
|
||||
DVB_PLL_PHILIPS_SD1878_TDA8261);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1264,6 +1245,7 @@ MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T);
|
|||
MAKE_BUDGET_INFO(kncxs, "KNC TV STAR DVB-S", BUDGET_TVSTAR);
|
||||
MAKE_BUDGET_INFO(satewpls, "Satelco EasyWatch DVB-S light", BUDGET_TVSTAR);
|
||||
MAKE_BUDGET_INFO(satewpls1, "Satelco EasyWatch DVB-S light", BUDGET_KNC1S);
|
||||
MAKE_BUDGET_INFO(satewps, "Satelco EasyWatch DVB-S", BUDGET_KNC1S);
|
||||
MAKE_BUDGET_INFO(satewplc, "Satelco EasyWatch DVB-C", BUDGET_KNC1CP);
|
||||
MAKE_BUDGET_INFO(satewcmk3, "Satelco EasyWatch DVB-C MK3", BUDGET_KNC1C_MK3);
|
||||
MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP);
|
||||
|
@ -1287,6 +1269,7 @@ static struct pci_device_id pci_tbl[] = {
|
|||
MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0016),
|
||||
MAKE_EXTENSION_PCI(satewpls, 0x1894, 0x001e),
|
||||
MAKE_EXTENSION_PCI(satewpls1, 0x1894, 0x001a),
|
||||
MAKE_EXTENSION_PCI(satewps, 0x1894, 0x001b),
|
||||
MAKE_EXTENSION_PCI(satewplc, 0x1894, 0x002a),
|
||||
MAKE_EXTENSION_PCI(satewcmk3, 0x1894, 0x002c),
|
||||
MAKE_EXTENSION_PCI(knc1c, 0x1894, 0x0020),
|
||||
|
|
|
@ -206,7 +206,7 @@ static int msp430_ir_init(struct budget_ci *budget_ci)
|
|||
input_dev->id.vendor = saa->pci->vendor;
|
||||
input_dev->id.product = saa->pci->device;
|
||||
}
|
||||
input_dev->cdev.dev = &saa->pci->dev;
|
||||
input_dev->dev.parent = &saa->pci->dev;
|
||||
|
||||
/* Select keymap and address */
|
||||
switch (budget_ci->budget.dev->pci->subsystem_device) {
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-$(CONFIG_DVB_TTUSB_BUDGET) += dvb-ttusb-budget.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-$(CONFIG_DVB_TTUSB_DEC) += ttusb_dec.o ttusbdecfe.o
|
||||
|
||||
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
|
||||
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/
|
||||
|
|
|
@ -324,8 +324,8 @@ config RADIO_ZOLTRIX_PORT
|
|||
Enter the I/O port of your Zoltrix radio card.
|
||||
|
||||
config USB_DSBR
|
||||
tristate "D-Link USB FM radio support (EXPERIMENTAL)"
|
||||
depends on USB && VIDEO_V4L2 && EXPERIMENTAL
|
||||
tristate "D-Link/GemTek USB FM radio support"
|
||||
depends on USB && VIDEO_V4L2
|
||||
---help---
|
||||
Say Y here if you want to connect this type of radio to your
|
||||
computer's USB port. Note that the audio is not digital, and
|
||||
|
|
|
@ -392,7 +392,6 @@ static struct video_device rtrack_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "RadioTrack radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &rtrack_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -355,7 +355,6 @@ static struct video_device aztech_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "Aztech radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &aztech_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -377,7 +377,6 @@ static struct video_device vdev_template = {
|
|||
.owner = THIS_MODULE,
|
||||
.name = "Gemtek PCI Radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &gemtek_pci_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -330,7 +330,6 @@ static struct video_device gemtek_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "GemTek radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &gemtek_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -297,7 +297,6 @@ static struct video_device rtrack2_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "RadioTrack II radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &rtrack2_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -297,7 +297,6 @@ static struct video_device fmi_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "SF16FMx radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &fmi_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -442,7 +442,6 @@ static struct video_device fmr2_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "SF16FMR2 radio",
|
||||
. type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &fmr2_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -369,7 +369,6 @@ static struct video_device terratec_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "TerraTec ActiveRadio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &terratec_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -349,7 +349,6 @@ static struct video_device trust_radio=
|
|||
.owner = THIS_MODULE,
|
||||
.name = "Trust FM Radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &trust_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -349,7 +349,6 @@ static struct video_device typhoon_radio =
|
|||
.owner = THIS_MODULE,
|
||||
.name = "Typhoon Radio",
|
||||
.type = VID_TYPE_TUNER,
|
||||
.hardware = 0,
|
||||
.fops = &typhoon_fops,
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
|
|
|
@ -489,6 +489,15 @@ config TUNER_3036
|
|||
Say Y here to include support for Philips SAB3036 compatible tuners.
|
||||
If in doubt, say N.
|
||||
|
||||
config TUNER_TEA5761
|
||||
bool "TEA 5761 radio tuner (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
depends on I2C
|
||||
select VIDEO_TUNER
|
||||
help
|
||||
Say Y here to include support for Philips TEA5761 radio tuner.
|
||||
If in doubt, say N.
|
||||
|
||||
config VIDEO_VINO
|
||||
tristate "SGI Vino Video For Linux (EXPERIMENTAL)"
|
||||
depends on I2C && SGI_IP22 && EXPERIMENTAL && VIDEO_V4L2
|
||||
|
|
|
@ -7,6 +7,8 @@ zr36067-objs := zoran_procfs.o zoran_device.o \
|
|||
tuner-objs := tuner-core.o tuner-types.o tuner-simple.o \
|
||||
mt20xx.o tda8290.o tea5767.o tda9887.o
|
||||
|
||||
tuner-$(CONFIG_TUNER_TEA5761) += tea5761.o
|
||||
|
||||
msp3400-objs := msp3400-driver.o msp3400-kthreads.o
|
||||
|
||||
obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o compat_ioctl32.o
|
||||
|
@ -16,7 +18,7 @@ ifeq ($(CONFIG_VIDEO_V4L1_COMPAT),y)
|
|||
endif
|
||||
|
||||
obj-$(CONFIG_VIDEO_BT848) += bt8xx/
|
||||
obj-$(CONFIG_VIDEO_BT848) += ir-kbd-i2c.o
|
||||
obj-$(CONFIG_VIDEO_IR_I2C) += ir-kbd-i2c.o
|
||||
obj-$(CONFIG_VIDEO_TVAUDIO) += tvaudio.o
|
||||
obj-$(CONFIG_VIDEO_TDA7432) += tda7432.o
|
||||
obj-$(CONFIG_VIDEO_TDA9875) += tda9875.o
|
||||
|
@ -59,7 +61,7 @@ obj-$(CONFIG_VIDEO_CPIA) += cpia.o
|
|||
obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o
|
||||
obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb.o
|
||||
obj-$(CONFIG_VIDEO_MEYE) += meye.o
|
||||
obj-$(CONFIG_VIDEO_SAA7134) += ir-kbd-i2c.o saa7134/
|
||||
obj-$(CONFIG_VIDEO_SAA7134) += saa7134/
|
||||
obj-$(CONFIG_VIDEO_CX88) += cx88/
|
||||
obj-$(CONFIG_VIDEO_IVTV) += ivtv/
|
||||
obj-$(CONFIG_VIDEO_EM28XX) += em28xx/
|
||||
|
|
|
@ -38,23 +38,23 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include <linux/videodev.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/video_encoder.h>
|
||||
|
||||
MODULE_DESCRIPTION("Analog Devices ADV7170 video encoder driver");
|
||||
MODULE_AUTHOR("Maxim Yevtyushkin");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#define I2C_NAME(x) (x)->name
|
||||
|
||||
#include <linux/video_encoder.h>
|
||||
|
||||
static int debug = 0;
|
||||
module_param(debug, int, 0);
|
||||
|
|
|
@ -34,23 +34,23 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include <linux/videodev.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/video_encoder.h>
|
||||
|
||||
MODULE_DESCRIPTION("Analog Devices ADV7175 video encoder driver");
|
||||
MODULE_AUTHOR("Dave Perks");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#define I2C_NAME(s) (s)->name
|
||||
|
||||
#include <linux/video_encoder.h>
|
||||
|
||||
static int debug = 0;
|
||||
module_param(debug, int, 0);
|
||||
|
|
|
@ -38,23 +38,24 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include <linux/videodev.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/video_decoder.h>
|
||||
|
||||
|
||||
MODULE_DESCRIPTION("Brooktree-819 video decoder driver");
|
||||
MODULE_AUTHOR("Mike Bernson & Dave Perks");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#define I2C_NAME(s) (s)->name
|
||||
|
||||
#include <linux/video_decoder.h>
|
||||
|
||||
static int debug = 0;
|
||||
module_param(debug, int, 0);
|
||||
|
|
|
@ -38,23 +38,23 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/video_encoder.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/page.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include <linux/videodev.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
MODULE_DESCRIPTION("Brooktree-856A video encoder driver");
|
||||
MODULE_AUTHOR("Mike Bernson & Dave Perks");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#define I2C_NAME(s) (s)->name
|
||||
|
||||
#include <linux/video_encoder.h>
|
||||
|
||||
static int debug = 0;
|
||||
module_param(debug, int, 0);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1218,7 +1218,14 @@ audio_mux(struct bttv *btv, int input, int mute)
|
|||
break;
|
||||
case TVAUDIO_INPUT_TUNER:
|
||||
default:
|
||||
route.input = MSP_INPUT_DEFAULT;
|
||||
/* This is the only card that uses TUNER2, and afaik,
|
||||
is the only difference between the VOODOOTV_FM
|
||||
and VOODOOTV_200 */
|
||||
if (btv->c.type == BTTV_BOARD_VOODOOTV_200)
|
||||
route.input = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER2, \
|
||||
MSP_DSP_IN_TUNER, MSP_DSP_IN_TUNER);
|
||||
else
|
||||
route.input = MSP_INPUT_DEFAULT;
|
||||
break;
|
||||
}
|
||||
route.output = MSP_OUTPUT_DEFAULT;
|
||||
|
@ -1253,7 +1260,7 @@ i2c_vidiocschan(struct bttv *btv)
|
|||
v4l2_std_id std = bttv_tvnorms[btv->tvnorm].v4l2_id;
|
||||
|
||||
bttv_call_i2c_clients(btv, VIDIOC_S_STD, &std);
|
||||
if (btv->c.type == BTTV_BOARD_VOODOOTV_FM)
|
||||
if (btv->c.type == BTTV_BOARD_VOODOOTV_FM || btv->c.type == BTTV_BOARD_VOODOOTV_200)
|
||||
bttv_tda9880_setnorm(btv,btv->tvnorm);
|
||||
}
|
||||
|
||||
|
@ -1323,6 +1330,7 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
|
|||
|
||||
switch (btv->c.type) {
|
||||
case BTTV_BOARD_VOODOOTV_FM:
|
||||
case BTTV_BOARD_VOODOOTV_200:
|
||||
bttv_tda9880_setnorm(btv,norm);
|
||||
break;
|
||||
}
|
||||
|
@ -2251,6 +2259,24 @@ static int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg)
|
|||
printk(KERN_INFO "bttv%d: ================== END STATUS CARD #%d ==================\n", btv->c.nr, btv->c.nr);
|
||||
return 0;
|
||||
}
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
case VIDIOC_DBG_G_REGISTER:
|
||||
case VIDIOC_DBG_S_REGISTER:
|
||||
{
|
||||
struct v4l2_register *reg = arg;
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
|
||||
return -EINVAL;
|
||||
/* bt848 has a 12-bit register space */
|
||||
reg->reg &= 0xfff;
|
||||
if (cmd == VIDIOC_DBG_G_REGISTER)
|
||||
reg->val = btread(reg->reg);
|
||||
else
|
||||
btwrite(reg->val, reg->reg);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
|
@ -3561,6 +3587,8 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
|
|||
case VIDIOC_G_FREQUENCY:
|
||||
case VIDIOC_S_FREQUENCY:
|
||||
case VIDIOC_LOG_STATUS:
|
||||
case VIDIOC_DBG_G_REGISTER:
|
||||
case VIDIOC_DBG_S_REGISTER:
|
||||
return bttv_common_ioctls(btv,cmd,arg);
|
||||
|
||||
default:
|
||||
|
@ -3943,6 +3971,8 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
|
|||
case VIDIOCGAUDIO:
|
||||
case VIDIOCSAUDIO:
|
||||
case VIDIOC_LOG_STATUS:
|
||||
case VIDIOC_DBG_G_REGISTER:
|
||||
case VIDIOC_DBG_S_REGISTER:
|
||||
return bttv_common_ioctls(btv,cmd,arg);
|
||||
|
||||
default:
|
||||
|
|
|
@ -313,7 +313,7 @@ int bttv_input_init(struct bttv *btv)
|
|||
input_dev->id.vendor = btv->c.pci->vendor;
|
||||
input_dev->id.product = btv->c.pci->device;
|
||||
}
|
||||
input_dev->cdev.dev = &btv->c.pci->dev;
|
||||
input_dev->dev.parent = &btv->c.pci->dev;
|
||||
|
||||
btv->remote = ir;
|
||||
bttv_ir_start(btv, ir);
|
||||
|
|
|
@ -170,6 +170,8 @@
|
|||
#define BTTV_BOARD_MACHTV_MAGICTV 0x90
|
||||
#define BTTV_BOARD_SSAI_SECURITY 0x91
|
||||
#define BTTV_BOARD_SSAI_ULTRASOUND 0x92
|
||||
#define BTTV_BOARD_VOODOOTV_200 0x93
|
||||
#define BTTV_BOARD_DVICO_FUSIONHDTV_2 0x94
|
||||
|
||||
/* more card-specific defines */
|
||||
#define PT2254_L_CHANNEL 0x10
|
||||
|
|
|
@ -33,12 +33,12 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/videodev.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/scatterlist.h>
|
||||
#include <asm/io.h>
|
||||
#include <media/v4l2-common.h>
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <media/video-buf.h>
|
||||
|
|
|
@ -663,15 +663,13 @@ int cpia2_reset_camera(struct camera_data *cam)
|
|||
cpia2_send_command(cam, &cmd);
|
||||
}
|
||||
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule_timeout(100 * HZ / 1000); /* wait for 100 msecs */
|
||||
schedule_timeout_interruptible(msecs_to_jiffies(100));
|
||||
|
||||
if (cam->params.pnp_id.device_type == DEVICE_STV_672)
|
||||
retval = apply_vp_patch(cam);
|
||||
|
||||
/* wait for vp to go to sleep */
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule_timeout(100 * HZ / 1000); /* wait for 100 msecs */
|
||||
schedule_timeout_interruptible(msecs_to_jiffies(100));
|
||||
|
||||
/***
|
||||
* If this is a 676, apply VP5 fixes before we start streaming
|
||||
|
@ -720,8 +718,7 @@ int cpia2_reset_camera(struct camera_data *cam)
|
|||
set_default_user_mode(cam);
|
||||
|
||||
/* Give VP time to wake up */
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule_timeout(100 * HZ / 1000); /* wait for 100 msecs */
|
||||
schedule_timeout_interruptible(msecs_to_jiffies(100));
|
||||
|
||||
set_all_properties(cam);
|
||||
|
||||
|
|
|
@ -105,7 +105,7 @@ static struct control_menu_info framerate_controls[] =
|
|||
{ CPIA2_VP_FRAMERATE_25, "25 fps" },
|
||||
{ CPIA2_VP_FRAMERATE_30, "30 fps" },
|
||||
};
|
||||
#define NUM_FRAMERATE_CONTROLS (sizeof(framerate_controls)/sizeof(framerate_controls[0]))
|
||||
#define NUM_FRAMERATE_CONTROLS (ARRAY_SIZE(framerate_controls))
|
||||
|
||||
static struct control_menu_info flicker_controls[] =
|
||||
{
|
||||
|
@ -113,7 +113,7 @@ static struct control_menu_info flicker_controls[] =
|
|||
{ FLICKER_50, "50 Hz" },
|
||||
{ FLICKER_60, "60 Hz" },
|
||||
};
|
||||
#define NUM_FLICKER_CONTROLS (sizeof(flicker_controls)/sizeof(flicker_controls[0]))
|
||||
#define NUM_FLICKER_CONTROLS (ARRAY_SIZE(flicker_controls))
|
||||
|
||||
static struct control_menu_info lights_controls[] =
|
||||
{
|
||||
|
@ -122,7 +122,7 @@ static struct control_menu_info lights_controls[] =
|
|||
{ 128, "Bottom" },
|
||||
{ 192, "Both" },
|
||||
};
|
||||
#define NUM_LIGHTS_CONTROLS (sizeof(lights_controls)/sizeof(lights_controls[0]))
|
||||
#define NUM_LIGHTS_CONTROLS (ARRAY_SIZE(lights_controls))
|
||||
#define GPIO_LIGHTS_MASK 192
|
||||
|
||||
static struct v4l2_queryctrl controls[] = {
|
||||
|
@ -235,7 +235,7 @@ static struct v4l2_queryctrl controls[] = {
|
|||
.default_value = 0,
|
||||
},
|
||||
};
|
||||
#define NUM_CONTROLS (sizeof(controls)/sizeof(controls[0]))
|
||||
#define NUM_CONTROLS (ARRAY_SIZE(controls))
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue