Terratec T6

From LinuxTVWiki
Revision as of 15:29, 13 August 2011 by Haefvogt (talk | contribs) (New Device Entry for TerraTec T6 Dual DVB-T Stick)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

TerraTec T6 Dual DVB-T stick

It consists of

  • Afatech AF9035B-N2 USB Interface with included AF9033 Demodulator
  • Afatech AF9033B-N2 second Demodulator
  • Fitipower FC0012 Tuner (2 off)

This device is currently not officially supported by Linux, however it is possible to get this device working using a slightly patched version of the AF9035 driver as used in EzCap_DVB_T_Stick.

Instructions how to get the stick working

Follow the instruction to get the AF903x source code archive AF903x.tar.gz in EzCap_DVB_T_Stick.

I run kernel 3.0.1 and therefore I needed a few patched just to get the source code compiled (you may not need all of them, but they shouldn't hurt either).

--- a/src/af903x.h      2009-08-14 16:17:10.000000000 +0200
+++ b/src/af903x.h      2011-08-13 16:49:49.799506005 +0200
@@ -9,7 +9,6 @@
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/kref.h>
-#include <linux/smp_lock.h>
 #include <linux/usb.h>
 #include <asm/uaccess.h>
 #include "dvb-usb.h"
--- a/src/userdef.h     2009-08-14 16:17:10.000000000 +0200
+++ b/src/userdef.h     2011-08-01 22:56:02.626583791 +0200
@@ -8,7 +8,9 @@
 typedef     int             INT;       // 4 bytes
 //typedef     void *          HANDLE; 

+#ifndef NULL
 #define NULL    0
+#endif

 #ifdef IN
 #undef IN
--- a/api/type.h        2009-08-14 16:17:10.000000000 +0200
+++ b/api/type.h        2011-08-01 22:54:38.197342415 +0200
@@ -3,6 +3,15 @@

 #include "userdef.h"// for Linux

+#ifdef IN
+#undef IN
+#endif
+#ifdef OUT
+#undef OUT
+#endif
+#ifdef INOUT
+#undef INOUT
+#endif
 #define IN
 #define OUT
 #define INOUT
--- a/api/usb2impl.c    2011-02-15 11:12:59.000000000 +0100
+++ b/api/usb2impl.c    2011-08-01 21:59:17.635389432 +0200
@@ -6,7 +6,6 @@
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/kref.h>
-#include <linux/smp_lock.h>
 #include <linux/usb.h>
 #include <asm/uaccess.h>
 #include <linux/device.h>

Then, here are some bug fixes to prevent deadlocks of the mutexes:

--- a/src/af903x-drv.c  2009-08-14 16:17:10.000000000 +0200
+++ b/src/af903x-drv.c  2011-08-12 21:26:10.610770606 +0200
@@ -1075,7 +1075,7 @@ DWORD DL_ApCtrl (

     if(PDC->architecture != Architecture_PIP)
     {
-       if ( PDC->Demodulator.chipNumber == 2 && bOn) dwError = DL_NIMSuspend(PDC, false);
+       if ( PDC->Demodulator.chipNumber == 2 && bOn) dwError = DRV_NIMSuspend(PDC, false);

        for (i=0; i<PDC->Demodulator.chipNumber; i++)
        {
@@ -1091,7 +1091,7 @@ DWORD DL_ApCtrl (
            }
        }

-       if(PDC->Demodulator.chipNumber == 2 && !bOn) dwError = DL_NIMSuspend(PDC, true);
+       if(PDC->Demodulator.chipNumber == 2 && !bOn) dwError = DRV_NIMSuspend(PDC, true);
     }
     else
     {
@@ -1100,7 +1100,7 @@ DWORD DL_ApCtrl (
            PDC->fc[ucSlaveDemod].GraphBuilt = 1;

            if (PDC->fc[0].GraphBuilt == 0 ||  PDC->fc[1].GraphBuilt == 0)
-               dwError = DL_NIMSuspend(PDC, false);
+               dwError = DRV_NIMSuspend(PDC, false);

            dwError = DRV_ApCtrl (PDC, ucSlaveDemod, bOn);
        }
@@ -1112,7 +1112,7 @@ DWORD DL_ApCtrl (
            if (PDC->bTunerPowerOff != true) dwError = DRV_ApCtrl (PDC, ucSlaveDemod, bOn);

            if (PDC->fc[0].GraphBuilt == 0 && PDC->fc[1].GraphBuilt == 0 && PDC->bTunerPowerOff == true)
-               dwError = DL_NIMSuspend(PDC, true);
+               dwError = DRV_NIMSuspend(PDC, true);
        }
     }

And finally, the patches to support the TerraTec T6 Dual DVB-T stick:

--- a/src/af903x-devices.c      2009-08-14 16:17:10.000000000 +0200
+++ b/src/af903x-devices.c      2011-08-01 22:06:08.118919600 +0200
@@ -127,6 +127,7 @@ struct usb_device_id af903x_usb_id_table
                { USB_DEVICE(0x15A4,0x1002) },
                { USB_DEVICE(0x15A4,0x1003) },
                { USB_DEVICE(0x15A4,0x9035) },
+               { USB_DEVICE(0x0ccd,0x10b3) },  /* Terratec T6 */
                { 0},           /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, af903x_usb_id_table);
@@ -156,7 +157,7 @@ struct dvb_usb_device_properties af903x_
                        }
                },
 #else
-               .num_adapters = 1,
+               .num_adapters = 2,
                .adapter = {
                        {
                                .caps = DVB_USB_ADAP_HAS_PID_FILTER | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
@@ -198,13 +199,17 @@ struct dvb_usb_device_properties af903x_
                        },
                },
 #endif
-               .num_device_descs =1,
+               .num_device_descs =2,
                .devices =  {
                         {      "ITEtech USB2.0 DVB-T Recevier",
                                { &af903x_usb_id_table[0], &af903x_usb_id_table[1],&af903x_usb_id_table[2],
                                &af903x_usb_id_table[3], &af903x_usb_id_table[4], NULL},
                                { NULL },
                         },
+                        {      "Terratec T6",
+                               { &af903x_usb_id_table[5], NULL},
+                               { NULL },
+                        },
                        {NULL},

                }
--- a/api/Fitipower_FC0012.c    2009-08-14 16:17:10.000000000 +0200
+++ b/api/Fitipower_FC0012.c    2011-08-11 22:54:23.390763425 +0200
@@ -35,6 +35,12 @@ Dword FC0012_open (
        IN  Byte                        chip
 ) {
     Dword error = Error_NO_ERROR;
+    int i;
+    Byte reg[] = {
+       0x05, 0x10, 0x00, 0x00, 0x0a, 0x00, 0x0f, 0xff,
+       0x6e, 0xb8, 0x83, 0xfe, 0x02, 0x00, 0x00, 0x0d,
+       0x00, 0x1f, 0x90, 0x00, 0x04,
+       };

     /** Control tuner enable */
        error = Standard_writeRegisterBits (demodulator, chip, Processor_LINK, p_reg_top_gpiot2_o, reg_top_gpiot2_o_pos, reg_top_gpiot2_o_len, 1);
@@ -47,11 +53,16 @@ Dword FC0012_open (
        if (error) goto exit;

        /** Control pin diode **/
-    error = Standard_writeRegister (demodulator, chip, Processor_LINK, p_reg_top_gpioh8_on, 1);
+    error = Standard_writeRegister (demodulator, chip, Processor_LINK, p_reg_top_gpioh8_en, 1);
     if (error) goto exit;

-    error = Standard_writeRegister (demodulator, chip, Processor_LINK, p_reg_top_gpioh8_en, 1);
+    error = Standard_writeRegister (demodulator, chip, Processor_LINK, p_reg_top_gpioh8_on, 1);
     if (error) goto exit;
+
+    for (i=0; i<sizeof(reg)/sizeof(reg[0]); i++) {
+       error = Standard_writeTunerRegisters (demodulator, chip, i+1, 1, &reg[i]);
+       if (error) goto exit;
+    }
 exit:
     return (error);
 }
--- a/api/Fitipower_FC0012_Script.h     2009-08-14 16:17:10.000000000 +0200
+++ b/api/Fitipower_FC0012_Script.h     2011-08-13 16:53:41.984092888 +0200
@@ -15,7 +15,7 @@
 #define VERSION4 0


-#define FC0012_ADDRESS 0xC0
+#define FC0012_ADDRESS 0xC6
 #define FC0012_SCRIPTSETLENGTH 0x00000001

 Word FC0012_scriptSets[] = {
--- a/api/user.h        2009-08-14 16:17:10.000000000 +0200
+++ b/api/user.h        2011-08-10 22:21:31.192856393 +0200
@@ -22,7 +22,7 @@
 #define User_I2C_SPEED              0x07

 /** Define I2C address of secondary chip when Diversity mode or PIP mode is active. */
-#define User_I2C_ADDRESS            0x38
+#define User_I2C_ADDRESS            0x3a

 /** Define USB frame size */
 #define User_USB20_MAX_PACKET_SIZE      512

After that, continue with the instructions in EzCap_DVB_T_Stick.