Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] Re: More thoughts on coldboot driver crash
Hi Ralph, hi everybody else,
Ralph Metzler wrote:
> Hi,
>
> although I can only type with my left hand right now, I had enough of
> this thread. This bug has been fixed a long time ago as part of the
> work I did for the KNC card support (this also already included SU1278
> support btw.).
> I don't understand why it was then decided by Convergence not to transfer
> this and other improvements to the NEWSTRUCT branch BEFORE just
> dropping the old branch.
well, enough ranting. I attached a diff with the related changes in CVS
in those days. Whoever owns a KNC1 card please review and apply these
changes to the current driver tree in order to fit Michael's recent
changes.
I have neither a KNC1 card nor do I know anybody who owns one, so please
please help if you want to see support for those cards in the driver.
@MiHu: Could you please review+apply the consistent_alloc() related
changes and those ones in fidbirq()?
many thanks,
Holger
? knc1_and_more.diff
Index: dmxdev.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dmxdev.c,v
retrieving revision 1.48
retrieving revision 1.52
diff -p -u -r1.48 -r1.52
--- dmxdev.c 1 Apr 2002 01:14:53 -0000 1.48
+++ dmxdev.c 1 Aug 2002 17:46:11 -0000 1.52
@@ -32,7 +32,7 @@
MODULE_DESCRIPTION("");
MODULE_AUTHOR("Ralph Metzler, Marcus Metzler");
#ifdef MODULE_LICENSE
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL and additional rights");
#endif
MODULE_PARM(debug,"i");
#endif
@@ -184,7 +184,9 @@ DmxDevDVROpen(dmxdev_t *dmxdev, struct f
{
dmx_frontend_t *front;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
if ((file->f_flags&O_ACCMODE)==O_RDWR) {
if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) {
up(&dmxdev->mutex);
@@ -226,7 +228,9 @@ DmxDevDVROpen(dmxdev_t *dmxdev, struct f
int
DmxDevDVRClose(dmxdev_t *dmxdev, struct file *file)
{
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
if ((file->f_flags&O_ACCMODE)==O_WRONLY) {
dmxdev->demux->disconnect_frontend(dmxdev->demux);
dmxdev->demux->connect_frontend(dmxdev->demux,
@@ -256,7 +260,8 @@ DmxDevDVRWrite(dmxdev_t *dmxdev, struct
return -EOPNOTSUPP;
if ((file->f_flags&O_ACCMODE)!=O_WRONLY)
return -EINVAL;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
ret=dmxdev->demux->write(dmxdev->demux, buf, count);
up(&dmxdev->mutex);
return ret;
@@ -268,7 +273,8 @@ DmxDevDVRRead(dmxdev_t *dmxdev, struct f
{
int ret;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
ret= DmxDevBufferRead(&dmxdev->dvr_buffer,
file->f_flags&O_NONBLOCK,
buf, count, ppos);
@@ -685,7 +691,10 @@ DmxDevFilterNum(dmxdev_t *dmxdev)
if (!dmxdev->filter)
return 0;
- down(&dmxdev->mutex);
+
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
for (i=0, num=0; i<dmxdev->filternum; i++)
if (dmxdev->filter[i].state==DMXDEV_STATE_FREE)
num++;
@@ -701,7 +710,10 @@ DmxDevFilterAlloc(dmxdev_t *dmxdev, stru
if (!dmxdev->filter)
return -EINVAL;
- down(&dmxdev->mutex);
+
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
for (i=0; i<dmxdev->filternum; i++)
if (dmxdev->filter[i].state==DMXDEV_STATE_FREE)
break;
@@ -728,7 +740,8 @@ DmxDevFilterFree(dmxdev_t *dmxdev, struc
{
dmxdev_filter_t *dmxdevfilter;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
if (!(dmxdevfilter=DmxDevFile2Filter(dmxdev, file))) {
up(&dmxdev->mutex);
@@ -894,7 +907,9 @@ DmxDevRead(dmxdev_t *dmxdev, struct file
dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(dmxdev, file);
int ret=0;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
if (dmxdevfilter->type==DMXDEV_TYPE_SEC)
ret=DmxDevReadSec(dmxdevfilter, file, buf, count, ppos);
else
@@ -917,7 +932,9 @@ int DmxDevIoctl(dmxdev_t *dmxdev, struct
if (!dmxdevfilter)
return -EINVAL;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
switch (cmd) {
case DMX_START:
if (dmxdevfilter->state<DMXDEV_STATE_SET)
@@ -1022,7 +1039,9 @@ int DmxDevDVRIoctl(dmxdev_t *dmxdev, str
//void *parg=(void *)arg;
int ret=0;
- down(&dmxdev->mutex);
+ if (down_interruptible(&dmxdev->mutex))
+ return -ERESTARTSYS;
+
switch (cmd) {
case DMX_SET_BUFFER_SIZE:
// FIXME: implement
@@ -1040,11 +1059,17 @@ unsigned int
DmxDevDVRPoll(dmxdev_t *dmxdev, struct file *file, poll_table * wait)
{
if ((file->f_flags&O_ACCMODE)==O_RDONLY) {
+ if (dmxdev->dvr_buffer.error)
+ return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+
if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite)
return (POLLIN | POLLRDNORM | POLLPRI);
poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
+ if (dmxdev->dvr_buffer.error)
+ return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+
if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite)
return (POLLIN | POLLRDNORM | POLLPRI);
Index: dvb.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/dvb.c,v
retrieving revision 1.132
retrieving revision 1.142
diff -p -u -r1.132 -r1.142
--- dvb.c 3 May 2002 14:16:14 -0000 1.132
+++ dvb.c 7 Aug 2002 14:07:14 -0000 1.142
@@ -7,6 +7,10 @@
* originally based on code by:
*
* Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
+
+ * Modifications for support of the KNC1 DVB-S card are:
+ *
+ * Copyright (C) 2002 ANDIgital
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -444,13 +448,15 @@ static int arm_thread(void *data)
break;
if (!dvb->arm_ready)
continue;
- down_interruptible(&dvb->dcomlock);
+ if (down_interruptible(&dvb->dcomlock))
+ break;
newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2);
up(&dvb->dcomlock);
if (newloops==dvb->arm_loops) {
printk("dvb%d: ARM crashed!\n", dvb->num);
arm_error(dvb);
- down_interruptible(&dvb->dcomlock);
+ if (down_interruptible(&dvb->dcomlock))
+ break;
newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
up(&dvb->dcomlock);
}
@@ -756,25 +762,31 @@ TTBStop(struct dvb_struct *dvb)
#define TS_WIDTH (4*188)
#define TS_HEIGHT (1024/4)
+#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
+
static int
TTBStart(struct dvb_struct *dvb)
{
struct saa7146 *saa=dvb->saa;
- //printk ("function : %s\n", __FUNCTION__);
+ dprintk ("function : %s\n", __FUNCTION__);
if (dvb->feeding) {
dvb->feeding++;
return dvb->feeding;
}
+
+ if (dvb->card_type==DVB_CARD_KNC1)
+ setgpio(dvb, 0, GPIO_OUTLO);
+
saa7146_write(saa->mem, MC1, MASK_20); // DMA3 off
- memset(saa->grabbing, 0x00, TS_HEIGHT*TS_WIDTH);
+ memset(dvb->ttb_virt, 0x00, TS_BUFLEN);
saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000);
dvb->tsf=0;
dvb->ttbp=0;
- saa7146_write(dvb->saa->mem, DD1_INIT, 0x02000680);
+ saa7146_write(dvb->saa->mem, DD1_INIT, 0x070006c0);
saa7146_write(dvb->saa->mem, MC2,
(MASK_09 | MASK_25 | MASK_10 | MASK_26));
@@ -782,10 +794,10 @@ TTBStart(struct dvb_struct *dvb)
saa7146_write(saa->mem, MC2, (MASK_08 | MASK_24));
mdelay(10);
- saa7146_write(saa->mem, BASE_ODD3, 0);
- saa7146_write(saa->mem, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2);
- saa7146_write(saa->mem, PROT_ADDR3, TS_WIDTH*TS_HEIGHT);
- saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0xb0);
+ saa7146_write(saa->mem, BASE_ODD3, dvb->ttb_bus);
+ saa7146_write(saa->mem, BASE_EVEN3, dvb->ttb_bus+TS_BUFLEN/2);
+ saa7146_write(saa->mem, PROT_ADDR3, dvb->ttb_bus+TS_BUFLEN);
+ saa7146_write(saa->mem, BASE_PAGE3, 0xb0);
saa7146_write(saa->mem, PITCH3, TS_WIDTH);
saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH);
@@ -922,9 +934,7 @@ static void vpeirq(struct saa7146* saa,
{
struct dvb_struct *dvb=(struct dvb_struct *) data;
- if (dvb->card_type!=DVB_CARD_TT_BUDGET)
- return;
- //printk("vpeirq %08x\n", saa7146_read(dvb->saa_mem, PCI_VDP3));
+ dprintk("vpeirq %08x\n", saa7146_read(dvb->saa_mem, PCI_VDP3));
}
@@ -932,21 +942,16 @@ static void vpeirq(struct saa7146* saa,
static void fidbirq(struct saa7146* saa, void *data)
{
struct dvb_struct *dvb=(struct dvb_struct *) data;
- u8 *mem;
-
- if (dvb->card_type!=DVB_CARD_TT_BUDGET)
- return;
-
- mem=(dvb->tsf ? TS_HEIGHT*TS_WIDTH/2 :0)+(u8 *)dvb->saa->grabbing;
+ u8 *mem=(dvb->tsf ? TS_BUFLEN/2 :0)+(u8 *)dvb->ttb_virt;
// FIXME: think of something better without busy waiting
if (dvb->tsf)
- while (saa7146_read(dvb->saa_mem, PCI_VDP3)>0x20000);
+ while (saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus>0x20000);
else
- while (saa7146_read(dvb->saa_mem, PCI_VDP3)<0x17800);
+ while (saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus<0x17800);
dvb->tsf^=1;
- saa7146_write(dvb->saa_mem, DD1_INIT, 0x02000600|(dvb->tsf ? 0x40:0x80));
+ saa7146_write(dvb->saa_mem, DD1_INIT, 0x07000600|(dvb->tsf ? 0x40:0x80));
saa7146_write(dvb->saa_mem, MC2,
(MASK_09 | MASK_25 | MASK_10 | MASK_26));
@@ -954,18 +959,22 @@ static void fidbirq(struct saa7146* saa,
if (dvb->feeding && mem[0]==0x47)
DvbDmxSWFilterPackets(&dvb->demux, mem, 512);
}
-#else
static void fidbirq(struct saa7146* saa, void *data)
{
struct dvb_struct *dvb=(struct dvb_struct *) data;
- u8 *mem=(u8 *)(dvb->saa->grabbing);
+ u8 *mem=dvb->ttb_virt;
int num;
u32 dmapos;
- dmapos=saa7146_read(dvb->saa_mem, PCI_VDP3);
+ dmapos=saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus;
dmapos-=(dmapos%188);
+
+ if (dmapos>=TS_BUFLEN)
+ return;
if (dvb->tsf) {
+ if (dvb->ttbp>TS_BUFLEN/2)
+ dvb->ttbp=TS_BUFLEN/2;
mem+=dvb->ttbp;
if (dmapos<0x20000) {
num=1024-dvb->ttbp/188;
@@ -975,18 +984,17 @@ static void fidbirq(struct saa7146* saa,
dvb->ttbp=dmapos;
}
} else {
- if (dvb->ttbp) {
- if (dvb->feeding)
- DvbDmxSWFilterPackets(&dvb->demux,
- mem+dvb->ttbp,
- 1024- dvb->ttbp / 188);
- }
+ if (dvb->ttbp &&
+ dvb->feeding)
+ DvbDmxSWFilterPackets(&dvb->demux,
+ mem+dvb->ttbp,
+ 1024- dvb->ttbp / 188);
num=dmapos/188;
dvb->ttbp=dmapos;
}
dvb->tsf^=1;
- saa7146_write(dvb->saa_mem, DD1_INIT, 0x02000600|(dvb->tsf ? 0x40:0x80));
+ saa7146_write(dvb->saa_mem, DD1_INIT, 0x07000600|(dvb->tsf ? 0x40:0x80));
saa7146_write(dvb->saa_mem, MC2,
(MASK_09 | MASK_25 | MASK_10 | MASK_26));
@@ -994,6 +1002,45 @@ static void fidbirq(struct saa7146* saa,
if (dvb->feeding && mem[0]==0x47)
DvbDmxSWFilterPackets(&dvb->demux, mem, num);
}
+#else
+static void fidbirq(struct saa7146* saa, void *data)
+{
+ struct dvb_struct *dvb=(struct dvb_struct *) data;
+ u8 *mem=dvb->ttb_virt;
+ int num;
+ u32 dmapos;
+ int field=0x80&saa7146_read(dvb->saa_mem, PSR);
+
+ dmapos=saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus;
+ dmapos-=(dmapos%188);
+
+ if (dmapos>=TS_BUFLEN)
+ return;
+
+ if (field) {
+ if (dvb->ttbp>TS_BUFLEN/2)
+ dvb->ttbp=TS_BUFLEN/2;
+ mem+=dvb->ttbp;
+ if (dmapos<0x20000) {
+ num=1024-dvb->ttbp/188;
+ dvb->ttbp=0;
+ } else {
+ num=(dmapos - dvb->ttbp)/188;
+ dvb->ttbp=dmapos;
+ }
+ } else {
+ if (dvb->ttbp<TS_BUFLEN/2)
+ dvb->ttbp=0;
+ if (dvb->ttbp && dvb->feeding)
+ DvbDmxSWFilterPackets(&dvb->demux,
+ mem+dvb->ttbp,
+ 1024- dvb->ttbp / 188);
+ num=dmapos/188;
+ dvb->ttbp=dmapos;
+ }
+ if (dvb->feeding && mem[0]==0x47)
+ DvbDmxSWFilterPackets(&dvb->demux, mem, num);
+}
#endif
//#define DEBUG_TIMING
@@ -1471,7 +1518,8 @@ SOutCommand(struct dvb_struct *dvb, u16*
if (!dvb->arm_ready)
return -1;
- down_interruptible(&dvb->dcomlock);
+ if (down_interruptible(&dvb->dcomlock))
+ return -ERESTARTSYS;
ret=OutCommand(dvb, buf, length);
up(&dvb->dcomlock);
return ret;
@@ -1522,7 +1570,8 @@ static int CommandRequest(struct dvb_str
if (!dvb->arm_ready)
return -1;
- down_interruptible(&dvb->dcomlock);
+ if (down_interruptible(&dvb->dcomlock))
+ return -ERESTARTSYS;
OutCommand(dvb, Buff, length);
start = jiffies;
@@ -1653,7 +1702,8 @@ static int FlushText(struct dvb_struct *
{
u32 start;
- down_interruptible(&dvb->dcomlock);
+ if (down_interruptible(&dvb->dcomlock))
+ return -ERESTARTSYS;
start = jiffies;
while ( rdebi(dvb, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
ddelay(1);
@@ -1675,7 +1725,8 @@ static int WriteText(struct dvb_struct *
int length=strlen(buf)+1;
u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y };
- down_interruptible(&dvb->dcomlock);
+ if (down_interruptible(&dvb->dcomlock))
+ return -ERESTARTSYS;
start = jiffies;
while ( rdebi(dvb, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
ddelay(1);
@@ -2365,13 +2416,25 @@ audcom(struct dvb_struct *dvb, u32 com)
(com>>16), (com&0xffff));
}
+
+static inline void demod_writereg(struct dvb_struct *dvb, u8 adr, u8 val);
+static inline u8 demod_readreg(struct dvb_struct *dvb, u8 adr);
+
inline static void
Set22K(struct dvb_struct *dvb, int state)
{
- if (dvb->card_type==DVB_CARD_TT_SIEMENS)
+ switch (dvb->card_type) {
+ case DVB_CARD_TT_SIEMENS:
outcom(dvb, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0);
- if (dvb->card_type==DVB_CARD_TT_BUDGET)
+ break;
+ case DVB_CARD_TT_BUDGET:
setgpio(dvb, 3, (state ? GPIO_OUTHI : GPIO_OUTLO));
+ break;
+ case DVB_CARD_KNC1:
+ case DVB_CARD_TT_BUDGET_CI:
+ demod_writereg(dvb, 0x08, (demod_readreg(dvb, 0x08)&0xfc)|(state ? 0x03 : 0x00));
+ break;
+ }
}
@@ -2450,6 +2513,45 @@ SetDiSEqC(struct dvb_struct *dvb, int in
}
}
+static inline int
+stv0299_wait_free(struct dvb_struct *dvb)
+{
+ int i;
+
+ for (i=0; i<200; i++)
+ if (!(demod_readreg(dvb, 0x0a)&1))
+ return 0;
+ else
+ ddelay(1);
+ printk("stv0299 fifo full timeout!\n");
+
+ return -1;
+}
+
+static inline int
+stv0299_wait_idle(struct dvb_struct *dvb)
+{
+ int i;
+
+ for (i=0; i<200; i++)
+ if ((demod_readreg(dvb, 0x0a)&3)==2)
+ return 0;
+ else
+ ddelay(1);
+ printk("stv0299 fifo not idle timeout!\n");
+
+ return -1;
+}
+
+static inline int
+DiseqcSendByteStv0299(struct dvb_struct *dvb, u8 data)
+{
+ if (stv0299_wait_free(dvb))
+ return -1;
+ demod_writereg(dvb, 0x09, data);
+ return 0;
+}
+
inline static int
SendDiSEqCMsg(struct dvb_struct *dvb, int len, u8 *msg, int burst)
{
@@ -2487,6 +2589,7 @@ SendDiSEqCMsg(struct dvb_struct *dvb, in
DiseqcSendByte(dvb, msg[i]);
mdelay(16);
+
if (burst!=-1) {
if (burst)
@@ -2500,7 +2603,27 @@ SendDiSEqCMsg(struct dvb_struct *dvb, in
ddelay(2);
}
Set22K(dvb, dvb->sec.ttk);
+ break;
+
+ case DVB_CARD_TT_BUDGET_CI:
+ case DVB_CARD_KNC1:
+ stv0299_wait_idle(dvb);
+ demod_writereg(dvb, 0x08, 0x06);
+ mdelay(16);
+
+ for (i=0; i<len; i++)
+ DiseqcSendByteStv0299(dvb, msg[i]);
+ stv0299_wait_idle(dvb);
+ mdelay(16);
+
+ if (burst!=-1) {
+ demod_writereg(dvb, 0x08, 0x02);
+ DiseqcSendByteStv0299(dvb, burst ? 0xff : 0x00);
+ stv0299_wait_idle(dvb);
+ mdelay(16);
+ }
+ Set22K(dvb, dvb->sec.ttk);
break;
default:
@@ -2595,9 +2718,16 @@ SetVoltage(struct dvb_struct *dvb, int p
switch (dvb->frontend.demod_type) {
case DVB_DEMOD_STV0299:
- demod_writereg(dvb, 0x0c,
- (demod_readreg(dvb, 0x0c)&0x0f)|
- (power ? 0x40 : 0)|(voltage ? 0x10 : 0));
+ if (dvb->card_type==DVB_CARD_KNC1)
+ demod_writereg(dvb, 0x0c,
+ (demod_readreg(dvb, 0x0c)&0x0f)
+ |(power ? 0x10 : 0)
+ |(voltage ? 0x40 : 0)
+ );
+ else
+ demod_writereg(dvb, 0x0c,
+ (demod_readreg(dvb, 0x0c)&0x0f)|
+ (power ? 0x40 : 0)|(voltage ? 0x10 : 0));
break;
case DVB_DEMOD_VES1893:
demod_writereg(dvb, 0x1f, (power ? 0x20 : 0)|(voltage ? 0x10 : 0));
@@ -2702,6 +2832,7 @@ InitFront(struct dvb_struct *dvb)
secSetTone(dvb, SEC_TONE_ON);
secSetVoltage(dvb, SEC_VOLTAGE_13);
para.Frequency=12669500-10600000;
+ para.Inversion=INVERSION_OFF;
para.u.qpsk.SymbolRate=22000000;
para.u.qpsk.FEC_inner=0;
} else {
@@ -2710,6 +2841,7 @@ InitFront(struct dvb_struct *dvb)
secSetTone(dvb, SEC_TONE_ON);
secSetVoltage(dvb, SEC_VOLTAGE_13);
para.Frequency=12480000-10600000;
+ para.Inversion=INVERSION_OFF;
para.u.qpsk.SymbolRate=27500000;
para.u.qpsk.FEC_inner=0;
}
@@ -2720,6 +2852,7 @@ InitFront(struct dvb_struct *dvb)
break;
ChangePIDs(dvb, 0x0262, 0x026c, 0, 0, 0x0262);
para.Frequency=394000000;
+ para.Inversion=INVERSION_OFF;
para.u.qam.SymbolRate=6900000;
para.u.qam.FEC_inner=0;
para.u.qam.QAM=QAM_64;
@@ -2729,6 +2862,7 @@ InitFront(struct dvb_struct *dvb)
// break;
ChangePIDs(dvb, 110, 120, 0, 0, 0);
para.Frequency=730000000;
+ para.Inversion=INVERSION_OFF;
para.u.ofdm.bandWidth=BANDWIDTH_8_MHZ;
para.u.ofdm.HP_CodeRate=FEC_2_3;
para.u.ofdm.LP_CodeRate=FEC_1_2;
@@ -2747,6 +2881,10 @@ InitFront(struct dvb_struct *dvb)
//iwdebi(dvb, DEBINOSWAP, TX_BUFF, 0, 2);
//ARM_ResetMailBox(dvb);
}
+ if (dvb->card_type==DVB_CARD_KNC1) {
+ demod_writereg(dvb, 0x05, 0x00);
+ demod_writereg(dvb, 0x0f, 0x92);
+ }
}
@@ -2888,7 +3026,7 @@ void init_p2t(p2t_t *p, dvb_demux_feed_t
void clear_p2t(p2t_t *p)
{
memset(p->pes,0,TS_SIZE);
- p->counter = 0;
+// p->counter = 0;
p->pos = 0;
p->frags = 0;
}
@@ -3494,17 +3632,6 @@ static int dvb_mmap(struct video_device
return 0;
}
-static int dvb_open(struct video_device *dev, int flags)
-{
- MOD_INC_USE_COUNT;
- return 0;
-}
-
-static void dvb_close(struct video_device *dev)
-{
- fprintk(KERN_ERR "dvb: dvb_close called\n");
- MOD_DEC_USE_COUNT;
-}
static unsigned int dvb_poll(struct dvb_struct *dvb, struct file *file,
poll_table *wait)
@@ -3546,6 +3673,7 @@ static unsigned int dvb_apoll(struct dvb
/* template for video_device-structure */
static struct video_device dvb_template = {
+owner: THIS_MODULE,
name: "DVB Board",
type: VID_TYPE_TUNER |
VID_TYPE_CAPTURE |
@@ -3554,8 +3682,6 @@ type: VID_TYPE_TUNER |
VID_TYPE_FRAMERAM |
VID_TYPE_SCALES,
hardware: VID_HARDWARE_SAA7146,
-open: dvb_open,
-close: dvb_close,
read: NULL,
write: NULL,
poll: NULL,
@@ -3563,7 +3689,6 @@ ioctl: dvb_ioctl,
mmap: dvb_mmap,
initialize: dvb_init_done,
priv: NULL,
-busy: 0,
minor: 0
};
@@ -3809,7 +3934,9 @@ dvb_start_feed(dvb_demux_feed_t *dvbdmxf
if (!dvbdmx->dmx.frontend)
return -EINVAL;
- if (dvb->card_type==DVB_CARD_TT_BUDGET)
+ if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+ dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+ dvb->card_type==DVB_CARD_KNC1)
return TTBStart(dvb);
if (dvbdmxfeed->pid>0x1fff)
@@ -3888,7 +4015,9 @@ dvb_stop_feed(dvb_demux_feed_t *dvbdmxfe
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
struct dvb_struct *dvb=(struct dvb_struct *) dvbdmx->priv;
- if (dvb->card_type==DVB_CARD_TT_BUDGET)
+ if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+ dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+ dvb->card_type==DVB_CARD_KNC1)
return TTBStop(dvb);
if (dvbdmxfeed->type==DMX_TYPE_TS) {
@@ -4062,7 +4191,8 @@ void ci_ll_release(ring_buffer_t *cirbuf
}
-int ci_ll_reset(ring_buffer_t *cibuf, struct file *file, int slots, ca_slot_info_t *slot)
+static int
+ci_ll_reset(ring_buffer_t *cibuf, struct file *file, int slots, ca_slot_info_t *slot)
{
int i;
@@ -5382,7 +5512,9 @@ dvb_register(struct dvb_struct *dvb)
DmxDevInit(&dvb->dmxdev);
}
- if (dvb->card_type==DVB_CARD_TT_BUDGET) {
+ if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+ dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+ dvb->card_type==DVB_CARD_KNC1) {
dvbdemux->filternum=256;
dvbdemux->feednum=256;
dvbdemux->start_feed=dvb_start_feed;
@@ -5462,7 +5594,9 @@ dvb_register(struct dvb_struct *dvb)
if (dvb->frontend.type==DVB_C || dvb->frontend.type==DVB_T)
dvb->dvb_devs=&dvbc_devs;
}
- if (dvb->card_type==DVB_CARD_TT_BUDGET) {
+ if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+ dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+ dvb->card_type==DVB_CARD_KNC1) {
if (dvb->frontend.type==DVB_S)
dvb->dvb_devs=&ttbs_devs;
if (dvb->frontend.type==DVB_C || dvb->frontend.type==DVB_T)
@@ -5507,6 +5641,14 @@ get_card_type(struct pci_dev *dev)
type=DVB_CARD_TT_SIEMENS;
break;
+ case 0x1131:
+ switch (dev->subsystem_device) {
+ case 0x4f56:
+ type=DVB_CARD_KNC1;
+ break;
+ }
+ break;
+
case 0x13c2:
switch (dev->subsystem_device) {
@@ -5516,6 +5658,9 @@ get_card_type(struct pci_dev *dev)
case 0x1005: /* WinTV-NOVA-T */
type=DVB_CARD_TT_BUDGET;
break;
+ case 0x100c: /* WinTV-NOVA-CI */
+ type=DVB_CARD_TT_BUDGET_CI;
+ break;
case 0x0000: /* Siemens cable and sat card (maybe older version?) */
case 0x0001: /* Technotrend, Hauppauge (maybe retail version ?) */
@@ -5535,6 +5680,52 @@ get_card_type(struct pci_dev *dev)
return type;
}
+static const u8 saa7113_tab[] = {
+ 0x01, 0x08,
+ 0x02, 0xc0,
+ 0x03, 0x33,
+ 0x04, 0x00,
+ 0x05, 0x00,
+ 0x06, 0xeb,
+ 0x07, 0xe0,
+ 0x08, 0x28,
+ 0x09, 0x00,
+ 0x0a, 0x80,
+ 0x0b, 0x47,
+ 0x0c, 0x40,
+ 0x0d, 0x00,
+ 0x0e, 0x01,
+ 0x0f, 0x44,
+
+ 0x10, 0x08,
+ 0x11, 0x0c,
+ 0x12, 0x7b,
+ 0x13, 0x00,
+ 0x15, 0x00, 0x16, 0x00, 0x17, 0x00,
+
+ 0x57, 0xff,
+ 0x40, 0x82, 0x58, 0x00, 0x59, 0x54, 0x5a, 0x07,
+ 0x5b, 0x83, 0x5e, 0x00,
+ 0xff
+};
+
+
+
+static void
+init_saa7113(struct dvb_struct *dvb)
+{
+ const u8 *data=saa7113_tab;
+
+ if (i2c_writereg(dvb, 0x4a, 0x01, 0x08)!=1)
+ return;
+ printk("dvb%d: SAA7113 detected and initializing\n", dvb->num);
+ while (*data!=0xff) {
+ i2c_writereg(dvb, 0x4a, *data, *(data+1));
+ data+=2;
+ }
+ printk("saa7113: status=%02x\n", i2c_readreg(dvb, 0x4a, 0x1f));
+}
+
__init static int
init_card(struct dvb_struct *dvb, int num,
@@ -5612,18 +5803,41 @@ init_card(struct dvb_struct *dvb, int nu
kernel_thread(arm_thread, (void *)dvb, 0);
}
- if (dvb->card_type==DVB_CARD_TT_BUDGET) {
- saa7146_write(dvb->saa_mem, DD1_INIT, 0x02000600);
+ if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+ dvb->card_type==DVB_CARD_TT_BUDGET_CI||
+ dvb->card_type==DVB_CARD_KNC1) {
+ dvb->ttb_virt=pci_alloc_consistent(dvb->pdev, 188*1024,
+ &dvb->ttb_bus);
+ if (!dvb->ttb_virt)
+ return -1;
+ }
+
+ if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+ dvb->card_type==DVB_CARD_TT_BUDGET_CI) {
+ saa7146_write(dvb->saa_mem, DD1_INIT, 0x06000600);
saa7146_write(dvb->saa_mem, MC2,
(MASK_09 | MASK_25 | MASK_10 | MASK_26));
setgpio(dvb, 2, GPIO_OUTHI); /* frontend power on */
}
+ if (dvb->card_type==DVB_CARD_KNC1) {
+ saa7146_write(dvb->saa_mem, DD1_INIT, 0x07000600);
+ saa7146_write(dvb->saa_mem, MC2,
+ (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+ setgpio(dvb, 0, GPIO_OUTLO);
+ ddelay(10);
+ setgpio(dvb, 0, GPIO_OUTHI); /* set analog in on, CI off */
+ init_saa7113(dvb);
+ if(vid_register(dvb) < 0)
+ return -1;
+ }
+
/* figure out and init frontend */
InitFront(dvb);
/* remaining inits according to card and frontend type */
+
if (dvb->card_type==DVB_CARD_TT_SIEMENS) {
/* register video4linux device */
@@ -5837,13 +6051,21 @@ exit_dvb(void)
free_ipack(&dvbs[i].ipack[0]);
free_ipack(&dvbs[i].ipack[1]);
vfree(dvbs[i].iobuf);
+ if (dvbs[i].card_type==DVB_CARD_TT_BUDGET ||
+ dvbs[i].card_type==DVB_CARD_TT_BUDGET_CI||
+ dvbs[i].card_type==DVB_CARD_KNC1)
+ pci_free_consistent(dvbs[i].pdev, 188*1024,
+ dvbs[i].ttb_virt,
+ dvbs[i].ttb_bus);
+
pci_free_consistent(dvbs[i].pdev, 8192,
dvbs[i].debi_virt,
dvbs[i].debi_bus);
- if (dvbs[i].card_type==DVB_CARD_TT_SIEMENS) {
+ if (dvbs[i].card_type==DVB_CARD_TT_SIEMENS||
+ dvbs[i].card_type==DVB_CARD_KNC1)
vid_unregister(&dvbs[i]);
- }
+
dvb_unregister(&dvbs[i]);
}
if ( saa7146_del_extension(&dvb_extension))
Index: dvb.h
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/dvb.h,v
retrieving revision 1.59
retrieving revision 1.61
diff -p -u -r1.59 -r1.61
--- dvb.h 22 Apr 2002 00:04:12 -0000 1.59
+++ dvb.h 9 Jul 2002 13:01:46 -0000 1.61
@@ -520,6 +520,8 @@ struct dvb_struct {
int card_type; /* basic card type */
#define DVB_CARD_TT_SIEMENS 0
#define DVB_CARD_TT_BUDGET 1
+#define DVB_CARD_TT_BUDGET_CI 2
+#define DVB_CARD_KNC1 3
int adac_type; /* audio DAC type */
#define DVB_ADAC_TI 0
@@ -647,6 +649,9 @@ struct dvb_struct {
void *saa_mem;
void *debi_virt;
dma_addr_t debi_bus;
+
+ void *ttb_virt;
+ dma_addr_t ttb_bus;
dvb_front_t frontend;
sec_t sec;
Index: dvb_demux.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dvb_demux.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -p -u -r1.30 -r1.31
--- dvb_demux.c 3 May 2002 14:16:14 -0000 1.30
+++ dvb_demux.c 1 Aug 2002 17:46:11 -0000 1.31
@@ -500,7 +500,9 @@ dmx_ts_feed_set_type(dmx_ts_feed_t *feed
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
dvbdmxfeed->ts_type=type;
dvbdmxfeed->pes_type=pes_type;
@@ -559,7 +561,9 @@ dmx_ts_feed_set(struct dmx_ts_feed_s* fe
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
int ret;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
ret=dmx_pid_set(pid, dvbdmxfeed);
if (ret<0) {
up(&dvbdmx->mutex);
@@ -599,7 +603,9 @@ dmx_ts_feed_start_filtering(struct dmx_t
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
int ret;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (dvbdmxfeed->state!=DMX_STATE_READY ||
dvbdmxfeed->type!=DMX_TYPE_TS) {
up(&dvbdmx->mutex);
@@ -629,7 +635,9 @@ dmx_ts_feed_stop_filtering(struct dmx_ts
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
int ret;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (dvbdmxfeed->state<DMX_STATE_GO) {
up(&dvbdmx->mutex);
return -EINVAL;
@@ -655,7 +663,9 @@ static int dvbdmx_allocate_ts_feed(dmx_d
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
dvb_demux_feed_t *dvbdmxfeed;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) {
up(&dvbdmx->mutex);
return -EBUSY;
@@ -696,7 +706,9 @@ static int dvbdmx_release_ts_feed(dmx_de
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (dvbdmxfeed->state==DMX_STATE_FREE) {
up(&dvbdmx->mutex);
return -EINVAL;
@@ -773,7 +785,9 @@ dmx_section_feed_allocate_filter(struct
dvb_demux_t *dvbdemux=dvbdmxfeed->demux;
dvb_demux_filter_t *dvbdmxfilter;
- down(&dvbdemux->mutex);
+ if (down_interruptible(&dvbdemux->mutex))
+ return -ERESTARTSYS;
+
dvbdmxfilter=DvbDmxFilterAlloc(dvbdemux);
if (!dvbdmxfilter) {
up(&dvbdemux->mutex);
@@ -805,7 +819,10 @@ dmx_section_feed_set(struct dmx_section_
if (pid>0x1fff)
return -EINVAL;
- down(&dvbdmx->mutex);
+
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (dvbdmxfeed->pid!=0xffff) {
dvbdmx->pid2feed[dvbdmxfeed->pid]=0;
dvbdmxfeed->pid=0xffff;
@@ -846,7 +863,9 @@ dmx_section_feed_start_filtering(dmx_sec
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
int ret;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (feed->is_filtering) {
up(&dvbdmx->mutex);
return -EBUSY;
@@ -882,7 +901,9 @@ dmx_section_feed_stop_filtering(struct d
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
int ret;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (!dvbdmx->stop_feed) {
up(&dvbdmx->mutex);
return -1;
@@ -904,7 +925,9 @@ dmx_section_feed_release_filter(dmx_sect
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (dvbdmxfilter->feed!=dvbdmxfeed) {
up(&dvbdmx->mutex);
return -EINVAL;
@@ -934,7 +957,9 @@ static int dvbdmx_allocate_section_feed(
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
dvb_demux_feed_t *dvbdmxfeed;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) {
up(&dvbdmx->mutex);
return -EBUSY;
@@ -967,7 +992,9 @@ static int dvbdmx_release_section_feed(d
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
- down(&dvbdmx->mutex);
+ if (down_interruptible(&dvbdmx->mutex))
+ return -ERESTARTSYS;
+
if (dvbdmxfeed->state==DMX_STATE_FREE) {
up(&dvbdmx->mutex);
return -EINVAL;
@@ -1020,7 +1047,9 @@ static int dvbdmx_write(dmx_demux_t *dem
(demux->frontend->source!=DMX_MEMORY_FE))
return -EINVAL;
- down(&dvbdemux->mutex);
+ if (down_interruptible(&dvbdemux->mutex))
+ return -ERESTARTSYS;
+
DvbDmxSWFilter(dvbdemux, buf, count);
up(&dvbdemux->mutex);
return count;
@@ -1083,7 +1112,9 @@ static int dvbdmx_connect_frontend(dmx_d
if (demux->frontend)
return -EINVAL;
- down(&dvbdemux->mutex);
+ if (down_interruptible(&dvbdemux->mutex))
+ return -ERESTARTSYS;
+
demux->frontend=frontend;
up(&dvbdemux->mutex);
return 0;
@@ -1093,7 +1124,9 @@ static int dvbdmx_disconnect_frontend(dm
{
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux;
- down(&dvbdemux->mutex);
+ if (down_interruptible(&dvbdemux->mutex))
+ return -ERESTARTSYS;
+
demux->frontend=NULL;
up(&dvbdemux->mutex);
return 0;
Index: dvb_frontend.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dvb_frontend.c,v
retrieving revision 1.8
retrieving revision 1.10
diff -p -u -r1.8 -r1.10
--- dvb_frontend.c 18 Apr 2002 23:36:25 -0000 1.8
+++ dvb_frontend.c 1 Aug 2002 17:46:11 -0000 1.10
@@ -192,7 +192,7 @@ tuner_command(dvb_front_t *fe, unsigned
if (cmd == TUNER_SET_TVFREQ &&
fe->demod &&
fe->demod_type==DVB_DEMOD_STV0299) {
- u8 msg[2]={ 0x05, 0x85 };
+ u8 msg[2]={ 0x05, 0xb5 };
dvb_frontend_demod_command(fe, FE_WRITEREG, msg);
fe->tuner->driver->command(fe->tuner, cmd, arg);
@@ -466,7 +466,9 @@ fe_thread(void *data)
if (fe->exit || signal_pending(current))
break;
- down_interruptible(&fe->sem);
+ if (down_interruptible(&fe->sem))
+ break;
+
switch (fe->tuning) {
case FE_STATE_TUNE:
fe_tune(fe);
@@ -492,7 +494,10 @@ dvb_frontend_stop(dvb_front_t *fe)
{
if (fe->tuning==FE_STATE_IDLE)
return;
- down_interruptible(&fe->sem);
+
+ if (down_interruptible(&fe->sem))
+ return;
+
fe->tuning=FE_STATE_IDLE;
wake_up_interruptible(&fe->wait);
up(&fe->sem);
@@ -512,8 +517,11 @@ dvb_frontend_tune(dvb_front_t *fe, Front
return -EINVAL;
memcpy(&fe->new_param, new_param, sizeof(FrontendParameters));
- down_interruptible(&fe->sem);
- fe->tuning=FE_STATE_TUNE;
+
+ if (down_interruptible(&fe->sem))
+ return -ERESTARTSYS;
+
+ fe->tuning=FE_STATE_TUNE;
wake_up_interruptible(&fe->wait);
up(&fe->sem);
return 0;
Index: dvbdev.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dvbdev.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -p -u -r1.11 -r1.12
--- dvbdev.c 9 Jan 2002 12:57:33 -0000 1.11
+++ dvbdev.c 11 Jun 2002 16:30:51 -0000 1.12
@@ -41,7 +41,7 @@
MODULE_DESCRIPTION("Device registrar for DVB drivers");
MODULE_AUTHOR("Marcus Metzler, Ralph Metzler");
#ifdef MODULE_LICENSE
-MODULE_LICENSE("LGPL");
+MODULE_LICENSE("GPL and additional rights");
#endif
#endif
Index: modules.conf
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/modules.conf,v
retrieving revision 1.1
retrieving revision 1.2
diff -p -u -r1.1 -r1.2
--- modules.conf 9 Jan 2002 13:00:42 -0000 1.1
+++ modules.conf 15 May 2002 00:26:52 -0000 1.2
@@ -1,4 +1,5 @@
alias char-major-250 dvb
+alias /dev/ost/* dvb
options dvb init_chan=2 pids_off=0
below saa7146_core VES1893 VES1820 L64781 stv0299 tuner
below dvb saa7146_v4l
Index: saa7146_core.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/saa7146_core.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -p -u -r1.17 -r1.18
--- saa7146_core.c 15 Apr 2002 00:49:12 -0000 1.17
+++ saa7146_core.c 11 Jun 2002 16:30:51 -0000 1.18
@@ -30,6 +30,7 @@
#endif
#include <asm/io.h> /* for accessing the pci-device */
#include <linux/vmalloc.h> /* for module-version */
+#include <linux/highmem.h>
#include "saa7146_defs.h"
#include "saa7146_core.h"
@@ -820,10 +821,10 @@ int saa7146_add_extension(struct saa7146
for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) {
if (NULL == saa7146_ext[i])
break;
- if (SAA7146_MAX_EXTENSIONS == i) {
- printk(KERN_WARNING "saa7146.o: attach_extension(%s) - enlarge SAA7146_MAX_EXTENSIONS.\n",ext->name);
- return -ENOMEM;
- }
+ }
+ if (SAA7146_MAX_EXTENSIONS == i) {
+ printk(KERN_WARNING "saa7146.o: attach_extension(%s) - enlarge SAA7146_MAX_EXTENSIONS.\n",ext->name);
+ return -ENOMEM;
}
saa7146_ext[i] = ext;
saa7146_extension_count++;
Index: stv0299.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/stv0299.c,v
retrieving revision 1.15
retrieving revision 1.18
diff -p -u -r1.15 -r1.18
--- stv0299.c 18 Apr 2002 23:36:25 -0000 1.15
+++ stv0299.c 9 Jul 2002 13:01:46 -0000 1.18
@@ -55,11 +55,11 @@ init_tab[] = {
0x02, 0x30, // P: 0 SERCLK: 0 VCO:ON STDBY:0
0x03, 0x00,
- 0x04, 0x88, // F22FR, F22=
- 0x05, 0x0f, // SDAT:0 SCLT:0 I2CT:0
+ 0x04, 0x7d, // F22FR, F22=352MHz/128/125
+ 0x05, 0x35, // SDAT:0 SCLT:0 I2CT:0
0x06, 0x00, // DAC mode and MSB
0x07, 0x00, // DAC LSB
- 0x08, 0x40, // DiSEqC
+ 0x08, 0x43, // DiSEqC
0x09, 0x00,
0x0a, 0x42,
0x0c, 0x51, // QPSK reverse:1 Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 con:1
@@ -204,6 +204,10 @@ static int SetInversion(struct i2c_clien
val=0x00;
break;
}
+ /* MAJOR HACK ALERT */
+ if (readreg(client, 0x0f)==0x92)
+ val^=1;
+
writereg(client, 0x0c,
(readreg(client, 0x0c)&0xfe)|val);
return 0;
@@ -319,7 +323,7 @@ static int attach_adapter(struct i2c_ada
dprintk("stv0299: attaching stv0299 at 0x%02x ", (client->addr)<<1);
dprintk("to adapter %s\n", adap->name);
- writereg(client, 0x05, 0x80);
+ writereg(client, 0x05, 0xb5);
MOD_INC_USE_COUNT;
return 0;
}
@@ -367,19 +371,35 @@ static int dvb_command(struct i2c_client
case FE_READ_BER:
{
u32 *ber=(u32 *) arg;
- *ber=0;
+
+ writereg(client,0x24,0x13);
+ *ber = readreg(client,0x1d);
+ *ber|=(readreg(client,0x1e)<<8);
+ *ber*=38147;
+ *ber/=10;
break;
}
case FE_READ_SIGNAL_STRENGTH:
{
s32 *signal=(s32 *) arg;
- *signal=0;
+
+ #warning FIXME! the value must be scaled properly
+ u32 s;
+ s = readreg(client,0x19);
+ s|=(readreg(client,0x18)<<8);
+ *signal=-70000000+(0xffff-s)*1000;
break;
}
case FE_READ_SNR:
{
s32 *snr=(s32 *) arg;
- *snr=0;
+ u32 nir;
+ nir = readreg(client,0x25);
+ nir|=(readreg(client,0x24)<<8);
+ if (nir>11188)
+ *snr=0;
+ else
+ *snr=19020000-1700*nir;
break;
}
case FE_READ_UNCORRECTED_BLOCKS:
Index: tuner.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/tuner.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -p -u -r1.16 -r1.17
--- tuner.c 4 Mar 2002 10:44:34 -0000 1.16
+++ tuner.c 9 Jul 2002 13:01:46 -0000 1.17
@@ -215,7 +215,7 @@ static struct tunertype tuners[] = {
174000000UL, 454000000UL, 0xa1, 0x92, 0x34, 0x8e},
{"TSA5059", Philips, DVBS,
100000000UL, 2700000000UL, 125000, 1, 0,
- 0xffffffffUL, 0xffffffffUL, 0x30, 0x30, 0x30, 0x95},
+ 0xffffffffUL, 0xffffffffUL, 0x20, 0x20, 0x20, 0x84},
{"TSA5522", Philips, DVBS,
100000000UL, 2700000000UL, 125000, 1, 0,
0xffffffffUL, 0xffffffffUL, 0x00, 0x00, 0x00, 0x8e},
Home |
Main Index |
Thread Index