HI

Better results are obtained in new fidbirq when triggering only
on falling 0x*0680 (or rising) edge of the hsync (tested on tt13+budget 
patch).

Triggering on both edges (0x*06c0) tends to loose some packets
and are visible as sporadic artefacts when viewing with ts2ps|mplayer.

As my stv0299 still isn't working, I tested that only for patched
card.

Therefore, in case of patched cards, I used falling edge triggering,
and in all other cases (normal budget cards), I left triggering on
both edges, as it was in the original vesion.

Also, I added minimum debi commands for diseqc to work on
patched cards.

Think these chages can be submitted to CVS
diff -pur orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c 
dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c
--- orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c  Thu Jan 23 
20:00:03 2003
+++ dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c       Sun Jan 26 
+02:09:32 2003
@@ -81,7 +81,10 @@ TTBStart(struct budget_s *budget)
 
         budget->tsf=0xff;
         budget->ttbp=0;
-        saa7146_write(dev, DD1_INIT, 0x020006c0);
+       if (budget->card->type == BUDGET_PATCH)
+               saa7146_write(dev, DD1_INIT, 0x02000680);
+       else
+               saa7146_write(dev, DD1_INIT, 0x020006c0);
         saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
         saa7146_write(dev, BRS_CTRL, 0x60000000);      
diff -pur orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c 
dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c
--- orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c  Thu Jan 23 
20:00:03 2003
+++ dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c       Fri Jan 24 
+00:33:39 2003
@@ -492,9 +492,8 @@ int budget_attach (struct saa7146_dev* d
        slen = pci_map_sg(dev->pci,slist,pages,PCI_DMA_FROMDEVICE);
        saa7146_pgtable_build_single(dev->pci, &budget->pt, slist, slen);
 
-       saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
+       saa7146_write(dev, PCI_BT_V1, 0x001c0000);
        /* upload all */
-       saa7146_write(dev, MC2, 0x077c077c);
         saa7146_write(dev, GPIO_CTRL, 0x000000);
 
        tasklet_init (&budget->fidb_tasklet, fidbirq, (unsigned long) budget);
diff -pur orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c 
dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c
--- orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c  Thu Jan 23 
20:00:03 2003
+++ dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c       Sun Jan 26 
+00:50:21 2003
@@ -277,6 +277,167 @@ int budget_diseqc_ioctl (struct dvb_fron
        return 0;
 }
 
+/* Start of budget patch diseqc commands (EMARD)
+*/
+#define COMMAND (DPRAM_BASE + 0x0FC)
+#define DPRAM_BASE 0x4000
+#define DEBINOSWAP 0x000e0000
+
+typedef enum  { 
+       AudioDAC,
+       CabADAC,
+       ON22K,
+       OFF22K,
+       MainSwitch,
+       ADSwitch,
+       SendDiSEqC,
+       SetRegister
+} AUDCOM;
+
+typedef enum  { 
+       COMTYPE_NOCOM,
+       COMTYPE_PIDFILTER,
+       COMTYPE_MPEGDECODER,
+       COMTYPE_OSD,
+       COMTYPE_BMP,
+       COMTYPE_ENCODER,
+       COMTYPE_AUDIODAC,
+       COMTYPE_REQUEST,
+       COMTYPE_SYSTEM,
+       COMTYPE_REC_PLAY,
+       COMTYPE_COMMON_IF,
+       COMTYPE_PID_FILTER,
+       COMTYPE_PES,
+       COMTYPE_TS,
+       COMTYPE_VIDEO,
+       COMTYPE_AUDIO,
+       COMTYPE_CI_LL,
+} COMTYPE;
+
+static int wdebi(struct budget_s *budget, 
+       u32 config, int addr, u32 val, int count)
+{
+        struct saa7146_dev *dev=budget->dev;
+
+       DEB_EE(("budget: %p\n", budget));
+
+       if (count <= 0 || count > 4)
+               return -1;
+
+       saa7146_write(dev, DEBI_CONFIG, config);
+
+       saa7146_write(dev, DEBI_AD, val );
+       saa7146_write(dev, DEBI_COMMAND, (count << 17) | (addr & 0xffff));
+       saa7146_write(dev, MC2, (2 << 16) | 2);
+        mdelay(5);
+
+       return 0;
+}
+
+static int SOutCommand(struct budget_s *budget, u16* buf, int length)
+{
+        int i;
+
+       DEB_EE(("budget: %p\n",budget));
+
+        for (i = 2; i < length; i++)
+                wdebi(budget, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
+
+        if (length)
+                wdebi(budget, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
+        else
+                wdebi(budget, DEBINOSWAP, COMMAND + 2, 0, 2);
+
+        wdebi(budget, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
+        return 0;
+}
+
+static int outcom(struct budget_s *budget, int type, int com)
+{
+        u16 buf[2] = {( type << 8 ) | com, 0};
+
+       DEB_EE(("budget: %p\n", budget));
+
+        return SOutCommand(budget, buf, 2);
+}
+
+static void 
+av7110_Set22K(struct budget_s *budget, int state)
+{
+       DEB_EE(("budget: %p\n", budget));
+       outcom(budget, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K));
+}
+
+static int
+av7110_SendDiSEqCMsg(struct budget_s *budget, int len, u8 *msg, int burst)
+{
+       int i;
+       u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC),
+               16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+       DEB_EE(("budget: %p\n", budget));
+
+        if (len>10)
+               len=10;
+
+       buf[1] = len+2;
+       buf[2] = len;
+
+       if (burst != -1)
+               buf[3]=burst ? 0x01 : 0x00;
+        else
+               buf[3]=0xffff;
+                
+       for (i=0; i<len; i++)
+               buf[i+4]=msg[i];
+
+       SOutCommand(budget, buf, 18);
+       return 0;
+}
+
+static
+int av7110_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+       struct budget_s *budget = fe->before_after_data;
+
+       DEB_EE(("budget: %p\n", budget));
+
+       switch (cmd) {
+       case FE_SET_TONE:
+               switch ((fe_sec_tone_mode_t) arg) {
+               case SEC_TONE_ON:
+                       av7110_Set22K (budget, 1);
+                       break;
+               case SEC_TONE_OFF:
+                       av7110_Set22K (budget, 0);
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
+
+       case FE_DISEQC_SEND_MASTER_CMD:
+       {
+               struct dvb_diseqc_master_cmd *cmd = arg;
+
+               av7110_SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0);
+               break;
+       }
+
+        case FE_DISEQC_SEND_BURST:
+               av7110_SendDiSEqCMsg (budget, 0, NULL, (int) arg);
+               break;
+
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       return 0;
+}
+/* End of budget patch diseqc commands (EMARD)
+*/
+
+
 int budget_register(struct budget_s *budget)
 {
         int ret;
@@ -293,6 +454,9 @@ int budget_register(struct budget_s *bud
        /* init DiSEqC stuff if necessary */
        if(budget->card->type == BUDGET_TT)
                dvb_add_frontend_ioctls (budget->dvb_adapter, budget_diseqc_ioctl, 
NULL, budget);
+
+       if(budget->card->type == BUDGET_PATCH)
+               dvb_add_frontend_ioctls (budget->dvb_adapter, av7110_diseqc_ioctl, 
+NULL, budget);
 
         memcpy(budget->demux_id, "demux0_0", 9);
         budget->demux_id[5] = budget->dvb_adapter->num + '0';
Only in dvb-kernel/linux/drivers/media/dvb/ttpci-budget: budget-core.c.orig

Reply via email to