diff options
author | Florian Schirmer <devnull@localhost> | 2003-01-25 16:25:48 +0000 |
---|---|---|
committer | Florian Schirmer <devnull@localhost> | 2003-01-25 16:25:48 +0000 |
commit | 20f38ee4089ddef8a057920c8ded5b67fd24bd60 (patch) | |
tree | ae376aa3626c959aa6d64d1d74dfc1a1db366116 /linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c | |
parent | 79dbc09e09d48ebb4a087f003789a8bf22d2cc13 (diff) | |
download | mediapointer-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.c | 179 |
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); |