Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] vpeirq() instead of fidbirq()



Hi all,


   after all the experiments with fidbirq() I've tried a completely
different approach. The 7146 chip has the availability to generate
VPE interrupts based on DMAposition. I've set up the registers to
generate 4 interrupts per buffer cycle (at start of half-buffers, 0x10000
and 0x20000). This is very safe also in case of lost interrupt, since
the DMA has no chance to overwrite the before-last buffer. With this 
approach, reading DMApos is safe even in multicast environment.

   Please find the patch against DVB tree below. I'll be glad if you can
test it and report results.


	With kind regards,


		M. 


--------------------------------------------------------------------------
----                                                                  ----
----   Marian Durkovic                       network  manager         ----
----                                                                  ----
----   Slovak Technical University           Tel: +421 2 524 51 301   ----
----   Computer Centre, Nam. Slobody 17      Fax: +421 2 524 94 351   ----
----   812 43 Bratislava, Slovak Republic    E-mail: md@bts.sk        ----
----                                                                  ----
--------------------------------------------------------------------------
? patch
Index: av7110.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/av7110.c,v
retrieving revision 1.17
diff -p -u -r1.17 av7110.c
--- av7110.c	21 Jan 2003 11:27:11 -0000	1.17
+++ av7110.c	4 Feb 2003 08:44:34 -0000
@@ -713,9 +713,8 @@ TTBStart(av7110_t *av7110)
 
         saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000);
 
-        av7110->tsf=0xFF;
         av7110->ttbp=0;
-        saa7146_write(saa->mem, DD1_INIT, 0x020006c0);
+        saa7146_write(saa->mem, DD1_INIT, 0x02000600);
         saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
         saa7146_write(saa->mem, BRS_CTRL, 0x60000000);	
@@ -725,7 +724,7 @@ TTBStart(av7110_t *av7110)
         saa7146_write(saa->mem, BASE_ODD3, 0);
         saa7146_write(saa->mem, BASE_EVEN3, TS_BUFLEN/2);
         saa7146_write(saa->mem, PROT_ADDR3, TS_BUFLEN);	
-        saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0xb0);
+        saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0x90);
         saa7146_write(saa->mem, PITCH3, TS_WIDTH);	
 
         saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH);
@@ -885,34 +884,40 @@ u8 pshead[0x26] = {
 
 static void vpeirq (unsigned long data)
 {
-        //printk("vpeirq %08x\n", saa7146_read(av7110->saa_mem, PCI_VDP3));
-}
+        struct av7110_s *av7110 = (struct av7110_s*) data;
+        u8 *mem=(u8 *)(av7110->saa->grabbing);
+        int num;
+        u32 dmapos;
 
+        dmapos=saa7146_read(av7110->saa_mem, PCI_VDP3);
+        dmapos-=(dmapos%188);
 
-static
-void fidbirq (unsigned long data)
-{
-	struct av7110_s *av7110 = (struct av7110_s*) data;
-        u8 *mem=(u8 *)(av7110->saa->grabbing);
-        int num=512;
-        int field=0x80&saa7146_read(av7110->saa_mem, PSR);
+        if (dmapos >= TS_BUFLEN)
+                return;
 
-        if (field) {
-             if(field==av7110->tsf) {
-                   num=1024;
-             } else {
-                   mem+=TS_BUFLEN/2;
-             }
+
+        if (dmapos > av7110->ttbp) {
+               mem+=av7110->ttbp;
+               num=(dmapos-av7110->ttbp)/188;
         } else {
-             if(field==av7110->tsf) {
-                   if (av7110->feeding && mem[TS_BUFLEN/2]==0x47)
-                        dvb_dmx_swfilter_packets(&av7110->demux, 
-                                                 mem+TS_BUFLEN/2, 512 );
-              } 
+               if (av7110->feeding && mem[av7110->ttbp]==0x47)
+                         dvb_dmx_swfilter_packets(&av7110->demux,
+                                 mem+av7110->ttbp, 1024-av7110->ttbp/188);
+
+               num=dmapos/188;
         }
-        av7110->tsf=field;
+
+        av7110->ttbp=dmapos;
+
         if (av7110->feeding && mem[0]==0x47)
                 dvb_dmx_swfilter_packets(&av7110->demux, mem, num);
+    
+}
+
+
+static
+void fidbirq (unsigned long data)
+{
 }
 
 

Home | Main Index | Thread Index