EVGA inDtube

From LinuxTVWiki
Jump to: navigation, search


A hybrid ATSC USB 2.0 device by Evga.


Overview/Features

This device supports ATSC (i.e. OTA Digital TV) and analog NTSC. The package includes a small telescoping monopole antenna and a short USB extension cable, a remote control, and a connector to svideo or composite video inputs.

Components used:

  • Samsung S5H1409 QAM/8VSB Frontend

Xceive XC3028L

  • (digital demodulator)
  • (video decoder)
  • Empiatech em2883 (USB bridge and analog audio)

Identification

The device identifies itself as a "eMPIA Technology, Inc" and the subsystem information provided by lsusb -v is ebla:2883.

Making it Work

This tuner is very difficult to get to find channels when scanning OTA ATSC. There is a thread about getting it to work which assuming you are familiar with the concept of frequency lists, as defined in /usr/share/dvb/atsc is very helpful at http://www.digitalhome.ca/forum/showthread.php?t=134023

You will need to modify the standard ATSC frequency list which has the wrong center frequencies for this tuner. Using vim or your favorite text editor modify the center frequencies in the intial-tuning-data contained in the text file /usr/share/dvb/us-ATSC-center-frequencies-8VSB and save it in /usr/share/dvb/atsc as my-ATSC. You need to subtract roughly 400 Khz from each center frequency. I subtracted 403615 Hz from each frequency so it falls in the exact center of what the InDtube Tuner can lock. From then on be sure to specify this file when scanning for channels with scan:

Scanning for channels.

scan -a 1 /usr/share/dvb/atsc/my-ATSC -o zap mychannels.conf

example initial-tuning-data modificaton

from:
/usr/share/dvb/atsc$ head us-ATSC-center-frequencies-8VSB
# US ATSC center frequencies, use if in doubt
A  57028615 8VSB
A  63028615 8VSB
A  69028615 8VSB
A  79028615 8VSB
A  85028615 8VSB
A 177028615 8VSB
A 183028615 8VSB
A 189028615 8VSB

to:
/usr/share/dvb/atsc$ head my-ATSC
# MY ATSC center frequencies, use for inDtube ATSC Tuner
A 56625000 8VSB
A 62625000 8VSB
A 68625000 8VSB
A 78625000 8VSB
A 84625000 8VSB
A 176625000 8VSB
A 182625000 8VSB
A 188625000 8VSB
A 194625000 8VSB


Firmware

type: xc2028 firmware, ver 3.6

xc3028L-v36.fw

Drivers

Analog Audio Issue

Sample kernel output

After you plug-in the device on a USB port, you should see something like this on dmesg:

usb 1-3: new high speed USB device using ehci_hcd and address 3
em28xx: New device EVGA inDtube @ 480 Mbps (eb1a:2883, interface 0, class 0)
em28xx #0: chip ID is em2882/em2883
em28xx #0: i2c eeprom 00: 1a eb 67 95 1a eb 83 28 d0 12 65 03 6a 1c 86 10
em28xx #0: i2c eeprom 10: 00 00 24 57 4e 07 01 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom 20: 46 00 01 00 f0 10 01 00 b8 00 00 00 5b 32 00 00
em28xx #0: i2c eeprom 30: 00 00 20 40 20 80 02 20 01 01 00 00 00 00 00 00
em28xx #0: i2c eeprom 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom 60: 00 00 00 00 00 00 00 00 00 00 1c 03 45 00 56 00
em28xx #0: i2c eeprom 70: 47 00 41 00 20 00 69 00 6e 00 44 00 74 00 75 00
em28xx #0: i2c eeprom 80: 62 00 65 00 00 00 10 03 44 00 54 00 30 00 30 00
em28xx #0: i2c eeprom 90: 30 00 31 00 00 00 00 00 00 00 00 00 38 00 39 00
em28xx #0: i2c eeprom a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: i2c eeprom f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
em28xx #0: EEPROM ID= 0x9567eb1a, EEPROM hash = 0xcee44a99
em28xx #0: EEPROM info:
em28xx #0:       AC97 audio (5 sample rates)
em28xx #0:       500mA max power
em28xx #0:       Table at 0x24, strings=0x1c6a, 0x1086, 0x0000
em28xx #0: Identified as Unknown EM2750/28xx video grabber (card=1)
em28xx #0: Your board has no unique USB ID.
em28xx #0: A hint were successfully done, based on eeprom hash.
em28xx #0: This method is not 100% failproof.
em28xx #0: If the board were missdetected, please email this log to:
em28xx #0:       V4L Mailing List  <linux-media@vger.kernel.org>
em28xx #0: Board detected as Evga inDtube
tvp5150 0-005c: chip found @ 0xb8 (em28xx #0)
tuner 0-0061: chip found @ 0xc2 (em28xx #0)
xc2028 0-0061: creating new instance
xc2028 0-0061: type set to XCeive xc2028/xc3028 tuner
xc2028 0-0061: Loading 81 firmware images from xc3028L-v36.fw, type: xc2028 firmware, ver 3.6
xc2028 0-0061: Loading firmware for type=BASE MTS (5), id 0000000000000000.
xc2028 0-0061: Loading firmware for type=MTS (4), id 000000000000b700.
xc2028 0-0061: Loading SCODE for type=MTS LCD NOGD MONO IF SCODE HAS_IF_4500 (6002b004), id 000000000000b700.
Registered IR keymap rc-evga-indtube
input: em28xx IR (em28xx #0) as /devices/pci0000:00/0000:00:1a.7/usb1/1-3/rc/rc0/input9
 rc0: em28xx IR (em28xx #0) as /devices/pci0000:00/0000:00:1a.7/usb1/1-3/rc/rc0
em28xx #0: Config register raw data: 0xd0
em28xx #0: AC97 vendor ID = 0xffffffff
em28xx #0: AC97 features = 0x6a90
em28xx #0: Empia 202 AC97 audio processor detected
tvp5150 0-005c: tvp5150am1 detected.
em28xx #0: v4l2 driver version 0.1.2
em28xx #0: V4L2 video device registered as video0
em28xx #0: V4L2 VBI device registered as vbi0
em28xx-audio.c: probing for em28x1 non standard usbaudio
em28xx-audio.c: Copyright (C) 2006 Markus Rechberger

Remote Control Support

Managed to create this lirc.conf for the indtube. http://pastebin.com/PUC5H1PM

MythTV Recognition

No issues noted in MythTV so far recognising the device, however you may wish to apply the below modifications to MythTV source prior to compiling in order to use the built in channel scanning function within MythTV, and to printout the correct values for the signal quality or SNR in the OSD.

//modification to frequencytables.cpp to allow the InDtube tuner to lock during channel scan

#else // if !DEBUG_DVB_OFFSETS
    // USA Terrestrial (center frequency, subtract 1.75 MHz for visual carrier)
    // VHF 2-4
    fmap["atsc_vsb8_us0"] = new FrequencyTable(
    //  "ATSC Channel %1",  2,  57000000,  69000000, 6000000,
        "ATSC Channel %1",  2,  56625000,  68625000, 6000000,
        DTVModulation::kModulation8VSB);
    // VHF 5-6
    fmap["atsc_vsb8_us1"] = new FrequencyTable(
    //  "ATSC Channel %1",  5,  79000000,  85000000, 6000000,
	"ATSC Channel %1",  5,  78625000,  84625000, 6000000,
        DTVModulation::kModulation8VSB);
    // VHF 7-13
    fmap["atsc_vsb8_us2"] = new FrequencyTable(
     // "ATSC Channel %1",  7, 177000000, 213000000, 6000000,
	"ATSC Channel %1",  7, 176625000, 212625000, 6000000,
        DTVModulation::kModulation8VSB);
    // UHF 14-69
    fmap["atsc_vsb8_us3"] = new FrequencyTable(
    //  "ATSC Channel %1", 14, 473000000, 803000000, 6000000,
        "ATSC Channel %1", 14, 472625000, 802625000, 6000000,	
        DTVModulation::kModulation8VSB);
#endif // !DEBUG_DVB_OFFSETS
//modification to tvplay.cpp to printout the signal quality or SNR correctly

QString sigMsg  = allGood ? tr("Lock") : lockMsg;

    QString sigDesc = tr("Signal %1\%").arg(sig,2);
    
// 		Begin hack 		//    
//    if (snr > 0.0f)
//        sigDesc += " | " + tr("S/N %1dB").arg(log10f(snr), 3, 'f', 1);
    if (snr > 0.0f)
        sigDesc += " | " + tr("S/N %1dB").arg((snr / 10 + .1), 3, 'f', 1);
// 		End Hack 		//
    if (ber != 0xffffffff)
        sigDesc += " | " + tr("BE %1", "Bit Errors").arg(ber, 2);

Alternatively, we can modify Samsung Frontend s5h1409.c code prior to compiling kernel to do the frequency shift for us in kernel instead of in user land.

patched code for s5h1409.c

/* Talk to the demod, set the FEC, GUARD, QAM settings etc */
static int s5h1409_set_frontend(struct dvb_frontend *fe)
{
        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
        struct s5h1409_state *state = fe->demodulator_priv;

        /* Evga inDtube center freq hack, subtract 403615 Hz from center freq */
        p->frequency = p->frequency - 403615;
        /* end hack */
        dprintk("%s(frequency=%d)\n", __func__, p->frequency);

        s5h1409_softreset(fe);
        state->current_frequency = p->frequency;
        s5h1409_enable_modulation(fe, p->modulation);

        if (fe->ops.tuner_ops.set_params) {
                if (fe->ops.i2c_gate_ctrl)
                        fe->ops.i2c_gate_ctrl(fe, 1);
                fe->ops.tuner_ops.set_params(fe);
                if (fe->ops.i2c_gate_ctrl)
                        fe->ops.i2c_gate_ctrl(fe, 0);
        }

        /* Issue a reset to the demod so it knows to resync against the
           newly tuned frequency */
        s5h1409_softreset(fe);

External Links

ATSC USB Devices