TerraTec T6 Dual DVB-T Stick
Jump to navigation
Jump to search
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 it 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, ®[i]); + if (error) goto exit; + } exit: return (error); } --- 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 --- a/api/Fitipower_FC0012_Script.h 2009-08-14 16:17:10.000000000 +0200 +++ b/api/Fitipower_FC0012_Script.h 2011-08-13 18:19:10.430567920 +0200 @@ -15,62 +15,50 @@ #define VERSION4 0 -#define FC0012_ADDRESS 0xC0 +#define FC0012_ADDRESS 0xC6 #define FC0012_SCRIPTSETLENGTH 0x00000001 Word FC0012_scriptSets[] = { -0x32 +0x26 }; ValueSet FC0012_scripts[] = { {0x0046, 0x2E}, {0x0057, 0x00}, {0x0058, 0x01}, + {0x0059, 0x01}, {0x005f, 0x00}, {0x0060, 0x00}, - {0x006e, 0x01}, - {0x0071, 0x0A}, + {0x006d, 0x00}, + {0x0071, 0x05}, {0x0072, 0x02}, {0x0074, 0x01}, - {0x0079, 0x01}, + {0x0075, 0x03}, + {0x0076, 0x02}, + {0x0077, 0x01}, + {0x0078, 0x00}, + {0x0079, 0x00}, + {0x007a, 0x90}, + {0x007b, 0x90}, {0x0093, 0x00}, - {0x0094, 0x00}, - {0x0095, 0x00}, - {0x0096, 0x00}, - {0x009b, 0x2D}, - {0x009c, 0x60}, - {0x009d, 0x23}, - {0x00b3, 0x01}, - {0x00c3, 0x01}, - {0x00c4, 0x00}, + {0x0094, 0x01}, + {0x0095, 0x02}, + {0x0096, 0x01}, + {0x0098, 0x0a}, + {0x009b, 0x05}, + {0x009c, 0x80}, + {0x00b3, 0x00}, + {0x00c5, 0x01}, + {0x00c6, 0x00}, + {0x00c9, 0x5d}, {0xF007, 0x00}, - {0xF00A, 0x1B}, - {0xF00B, 0x1B}, - {0xF00C, 0x1B}, - {0xF00D, 0x1B}, - {0xF00E, 0xFF}, - {0xF00F, 0x01}, - {0xF010, 0x00}, - {0xF011, 0x02}, - {0xF012, 0xFF}, - {0xF013, 0x01}, - {0xF014, 0x00}, - {0xF015, 0x02}, - {0xF01B, 0xEF}, - {0xF01C, 0x01}, - {0xF01D, 0x0f}, - {0xF01E, 0x02}, - {0xF01F, 0x6E}, + {0xF01F, 0xa0}, {0xF020, 0x00}, - {0xF025, 0xDE}, - {0xF026, 0x00}, - {0xF027, 0x0A}, - {0xF028, 0x03}, - {0xF029, 0x6E}, + {0xF029, 0x82}, {0xF02A, 0x00}, {0xF047, 0x00}, - {0xF054, 0x0}, - {0xF055, 0x0}, + {0xF054, 0x00}, + {0xF055, 0x00}, {0xF077, 0x01}, {0xF1E6, 0x00},
After that, continue with the instructions in EzCap_DVB_T_Stick.