summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
diff options
context:
space:
mode:
authorFlorian Schirmer <devnull@localhost>2003-01-25 16:25:48 +0000
committerFlorian Schirmer <devnull@localhost>2003-01-25 16:25:48 +0000
commit20f38ee4089ddef8a057920c8ded5b67fd24bd60 (patch)
treeae376aa3626c959aa6d64d1d74dfc1a1db366116 /linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
parent79dbc09e09d48ebb4a087f003789a8bf22d2cc13 (diff)
downloadmediapointer-dvb-s2-20f38ee4089ddef8a057920c8ded5b67fd24bd60.tar.gz
mediapointer-dvb-s2-20f38ee4089ddef8a057920c8ded5b67fd24bd60.tar.bz2
- Rewritten RISC programm
- Push sync handling down to DVB API - Major fixes
Diffstat (limited to 'linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c')
-rw-r--r--linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c179
1 files changed, 23 insertions, 156 deletions
diff --git a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
index 1f137f3c6..5f09988ac 100644
--- a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+++ b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c
@@ -2,9 +2,6 @@
* Bt8xx based DVB adapter driver
*
* Copyright (C) 2002,2003 Florian Schirmer <schirmer@taytron.net>
- * Copyright (C) 2002 Peter Hettkamp <peter.hettkamp@t-online.de>
- * Copyright (C) 1999-2001 Ralph Metzler & Marcus Metzler for convergence integrated media GmbH
- * Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
*
* 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
@@ -45,157 +42,24 @@ extern struct i2c_adapter *bttv_get_i2c_adap(unsigned int card);
static LIST_HEAD(card_list);
static int debug = 0;
-#define TS_SIZE 188
-
static void dvb_bt8xx_task(unsigned long data)
{
- struct bt878 *bt = &bt878[0];
- struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *)data;
- int rb;
- u8 *rp1=0, *rp2=0;
- int count=0, count2=0, tp=0;
- int i, ii;
- int sync;
- u8 tsbuf[TS_SIZE]; /* a buffer to make a single TS packet crossing the wraparound */
- /* point of the circular buffer contiguous in memory again */
-
- if (!card->active)
- return;
-
- dprintk("pctv debug: tasklet called, data=0x%8.8lx\n",data);
-// bt=dvb->bt;
-
-// if(!dvb->feeding) return;
-
- spin_lock_irq(&bt->s_lock);
-
- /* the dma overtook us, or we overtook the dma? */
- if(bt->readbuf==bt->writebuf||
- bt->readbuf==(bt->writebuf+1)%bt->nbuffers) {
- spin_unlock_irq(&bt->s_lock);
- dprintk("pctv debug: tasklet: no do r=%d, w=%d\n",bt->readbuf, bt->writebuf);
- return;
- }
-
- /* are we frame synced? */
- if(((unsigned char *)bt->buffer)[bt->readbuf*bt->framesize+bt->readptr]!=0x47) {
- dprintk("pctv debug: tasklet: searching for sync\n");
- sync=TS_SIZE*2;
- do {
- if(sync--<=0) break;
- if(++bt->readptr>=bt->framesize) {
- bt->readptr=0;
- if(++bt->readbuf>=bt->nbuffers) bt->readbuf=0;
- if(bt->readbuf==bt->writebuf||
- bt->readbuf==(bt->writebuf+1)%bt->nbuffers) {
- spin_unlock_irq(&bt->s_lock);
- printk("pctv debug: tasklet: dma overtook us. r=%d, w=%d\n",bt->readbuf,bt->writebuf);
- return;
- }
- }
- if(((u8 *)bt->buffer)[bt->readbuf*bt->framesize+bt->readptr]!=0x47) continue;
- /* ok, we have found a 0x47. See whether at TS_SIZE there is another 0x47 */
- if(bt->readptr+TS_SIZE<bt->framesize&&((u8 *)bt->buffer)[bt->readbuf*bt->framesize+bt->readptr+TS_SIZE]==0x47) {
- sync=0;
- break;
- }
- if(bt->readptr+TS_SIZE>=bt->framesize) {
- /* the payload area of a TS packet may contain a 0x47. To be sure we
- are not looking at such a 0x47, check if there is another one exactly
- TS_SIZE further. But if this crosses a frame boundary, check if the
- frame is free to access, and handle buffer wraparound. I did not yet
- have the patience to do this :-(
- */
- printk("pctv: panic, less than 188 Bytes left and no sync. Program me!\n");
- bt->readptr++;
- spin_unlock_irq(&bt->s_lock);
- return;
- }
- } while(sync);
- dprintk("pctv tasklet: end of sync search @%d[%x]=%x\n",
- bt->readbuf,bt->readptr,
- ((u8 *)bt->buffer)[bt->readbuf*bt->framesize+bt->readptr]);
- }
-
- /* now find out how many TS frames are available in the buffer */
- rp1=(u8 *)bt->buffer+(bt->readbuf*bt->framesize+bt->readptr);
- if(*rp1!=0x47) {
- spin_unlock_irq(&bt->s_lock);
- return;
- }
-
- count=bt->writebuf-bt->readbuf;
- if(count<0) {
- count=bt->nbuffers-bt->readbuf;
- count2=bt->writebuf;
- }
- count=count*bt->framesize-bt->readptr;
- count/=TS_SIZE;
- if(count2) {
- rb=bt->readbuf*bt->framesize+bt->readptr+count*TS_SIZE;
- while(rb<bt->buffersize&&tp<TS_SIZE) {
- tsbuf[tp++]=((u8 *)bt->buffer)[rb++];
- }
- rb=0;
- while(tp<TS_SIZE) {
- tsbuf[tp++]=((u8 *)bt->buffer)[rb++];
- }
- count2=count2*bt->framesize-rb;
- count2/=TS_SIZE;
- rp2=(u8 *)bt->buffer+rb;
- }
-
- i=bt->readbuf*bt->framesize+bt->readptr+TS_SIZE*(count+count2+(tp!=0));
- dprintk("pctv debug: tasklet: i=%d (%d ts frames)\n",i,(i-bt->readbuf*bt->framesize-bt->readptr)/TS_SIZE);
- if(i>=bt->buffersize) i-=bt->buffersize;
-
- /* update the bt878 read pointers, release the lock */
- ii=bt->readbuf;
- bt->readbuf=(i/bt->framesize);
- if(bt->readbuf>=bt->nbuffers) {
- /* this should not happen any more */
- printk("pctv tasklet: i miscomputed bt->readbuf=0x%x>nbuffers=0x%x\n",
- bt->readbuf,bt->nbuffers);
- printk("pctv tasklet: readbuf %x frsize %x readptr %x count %x count2 %x\n",ii,bt->framesize,bt->readptr,count,count2);
- printk("pctv tasklet: TS_SZ %x span %x i %x res readbuf %x\n",TS_SIZE,(tp!=0),i,bt->readbuf);
- bt->readbuf-=bt->nbuffers;
- }
- bt->readptr=(i%bt->framesize);
- if(bt->readptr>=bt->framesize) {
- /* this should not happen at all... */
- printk("pctv tasklet: i miscomputed bt->readptr=0x%x>framesize=0x%x\n",
- bt->readptr,bt->framesize);
- bt->readptr-=bt->framesize;
- }
-
- spin_unlock_irq(&bt->s_lock);
-
- dprintk("pctv tasklet: count1=%d, count2=%d, %sr=%d[%x]\n",count,count2,tp?"span, ":"",bt->readbuf,bt->readptr);
-
- /* send the first (or only) part of the buffer */
- if(count>0&&count<bt->buffersize/TS_SIZE&&*rp1==0x47)
- dvb_dmx_swfilter_packets(&card->demux,rp2,count2);
- else {
- if(count>0)dprintk("pctv debug: tasklet: error calling demux, c=%d, *buf=0x%x\n",count,*rp1);
- }
-
- /* if the buffer crosses the buffer-wrap, copy the one TS into a local buffer,
- then send it. Copy has been done above. */
- if(tp&&tsbuf[0]==0x47) {
- dvb_dmx_swfilter_packets(&card->demux,rp2,count2);
- tp=0;
- } else {
- if(tp)dprintk("pctv debug: tasklet: error calling demux1, tsbuf[0]=0x%x\n",tsbuf[0]);
- }
-
- /* send the third and last part of the buffer */
- if(count2>0&&count2<bt->buffersize/TS_SIZE&&*rp2==0x47)
- dvb_dmx_swfilter_packets(&card->demux,rp2,count2);
- else {
- if(count2>0)dprintk("pctv debug: tasklet: error calling demux2, c=%d, *buf=0x%x\n",count2,*rp2);
- }
+ struct dvb_bt8xx_card *card = (struct dvb_bt8xx_card *)data;
+ u8 finished_block = card->bt->finished_block;
+
+ //printk("%d ", finished_block);
+
+ while (card->bt->last_block != finished_block) {
+
+ //printk("dvb_bt8xx: missed irq (%d/%d)\n", card->bt->last_block, finished_block);
+
+ dvb_dmx_swfilter(&card->demux, &card->bt->buf_cpu[card->bt->last_block * card->bt->block_bytes], card->bt->block_bytes);
+ card->bt->last_block = (card->bt->last_block + 1) % card->bt->block_count;
+
+ }
+
}
static DECLARE_TASKLET_DISABLED(dvb_bt8xx_tasklet, dvb_bt8xx_task, 0);
@@ -225,7 +89,7 @@ static int dvb_bt8xx_start_feed(struct dvb_demux_feed *dvbdmxfeed)
card->active = 1;
- bt878_start(&bt878[0], card->gpio_mode);
+// bt878_start(card->bt, card->gpio_mode);
return 0;
@@ -245,7 +109,7 @@ static int dvb_bt8xx_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
if (!card->active)
return 0;
- bt878_stop(&bt878[0]);
+// bt878_stop(card->bt);
card->active = 0;
@@ -259,11 +123,12 @@ static int __init dvb_bt8xx_load(unsigned int bttv_nr, char *card_name, u32 gpio
struct dvb_bt8xx_card *card;
int result;
- dprintk("dvb_bt8xx: identified card%d as Nebula DigiTV DVB-T card\n", bttv_nr);
+ dprintk("dvb_bt8xx: identified card%d as %s\n", bttv_nr, card_name);
if (!(card = kmalloc(sizeof(struct dvb_bt8xx_card), GFP_KERNEL)))
return -ENOMEM;
-
+
+ card->bt = &bt878[0];
card->bttv_nr = bttv_nr;
card->gpio_mode = gpio_mode;
@@ -393,9 +258,9 @@ static int __init dvb_bt8xx_load(unsigned int bttv_nr, char *card_name, u32 gpio
}
dvb_bt8xx_tasklet.data = (long)card;
- bt878[0].tasklet = &dvb_bt8xx_tasklet;
+ card->bt->tasklet = &dvb_bt8xx_tasklet;
- bt878_get_buffers(&bt878[0], 0xC00, 8, 4, 0);
+ bt878_start(card->bt, card->gpio_mode);
list_add_tail(&card->list, &card_list);
@@ -415,6 +280,8 @@ static void dvb_bt8xx_close(void)
dprintk("dvb_bt8xx: unloading card%d\n", card->bttv_nr);
+ bt878_stop(card->bt);
+
card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_mem);
card->demux.dmx.remove_frontend(&card->demux.dmx, &card->fe_hw);
dvb_dmxdev_release(&card->dmxdev);