Linux and DVB: Failing with a Sin Hon TDH 601 / HD809 USB dongle
General
These are my jots as I attempted to use an DVB USB dongle to receive digital TV in Haifa, Israel. Spoiler: I never managed to get my dongle working properly. Maybe because it was faulty to begin with, and maybe because I missed something. It seems more like the former.
It says “HD809″ and has Vendor/Product IDs 3344/24a0 (see below). 0x3344 = Leaguer Microelectronics (Shenzhen, China), 24a0 is unknown.
Here’s what it looks like:
Probably a Sin Hon TDH601. According to the manufacturer, it should run with Android 4.1 with OTG on the USB plug, which according to this page means any kernel after 3.0.31. And my phone should detect the dongle, which it doesn’t. As a matter of fact, looking into Android’s kernel v4.4 (which is pretty much a plain Linux kernel) there is nothing matching the “24a0″ string under drivers/. So no.
A look inside:
and
Can you see the little short-circuit on LME2510C two pins to the upper left? And the two of Si2168′s, at the right? I don’t know if they should be there, but I know I messed up completely trying to separate them.
Back to Linux and drivers: Found the device mentioned, leading to this patch, which outlines the devices: LME2510C USB interface (a.k.a. LM04 or QQBOX, not QBOX, with drivers for Windows), Si2168-B40 demodulator, Si2157-A30 tuner. The Windows driver for non-C LME2510 appears to be the same one.
Apparently, LME2510C is a USB front-end for a tuner and a demodulator, each controller by I2C. Calling the driver by the front end surely causes some confusion. It may be useful to know, that the same pair of tuner and demodulator is used in the PCTV tripleStick (292e), so except for the LME2510C USB front end, all that applies to the 292e probably goes for the Sin Hon dongle.
Antti Palosaari’s Linux repo obtained with
$ git clone git://git.linuxtv.org/anttip/media_tree.git/
where the lme2510c_tdh601branch contains the commit from June 2016, adding the drivers/media/usb/dvb-usb-v2/lme2510.c file (not to be confused with rc-lme2510.c, which contains key maps for a remote control it seems). It requires dvb-usb-lme2510c-0.fw as a firmware file.
Not to be confused with drivers/media/usb/dvb-usb-v2/lmedm04.c, which relates to the same USB interface, but with different devices behind it.
Found 0x3344/0x1122 supported in the 3.12 kernel of Zedboard (LME’s remote control?)
Incorporation in Linux Mint 18.1
Grabbed the Linux Kernel git:
$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-xenial.git
and checked out the Ubuntu-4.4.0-53.74 tag
Copied configuration file:
$ cp /boot/config-4.4.0-53-generic .config
And on the machine itself:
$ sudo apt-get install libssl-dev $ make modules_prepare
libssl-dev is required for one of the kernel scripts (sign-file). And running this on my own computer failed with
CC kernel/bounds.s gcc: unrecognized option '-no-pie' cc1: error: unrecognized command line option "-fstack-protector-strong" make[1]: *** [kernel/bounds.s] Error 1 make: *** [prepare0] Error 2
(so much for a vintage distribution and compiler)
Tried to compile the directory in question:
$ make M=drivers/media/usb/dvb-usb-v2
That went through nice, however there was a complaint about missing Module.symvers, and hence the module didn’t get into the kernel with insmod.
So after patching the kernel with commit f92f72c1138e33e3a2976724e8b4bc6775b53ee8 from Antti Palosaari’s repo (creating a text patch and applying it with git am on Ubuntu’s kernel) I compiled the kernel and modules completely on the target machine
$ make -j 6 bzImage modules
And that took some time, of course. It seems like this is the only way to obtain Module.symvers.
Eventually, I went down the entire way from the lme2510c_tdh601branch in the media-tree git repo to some common point with the kernel I used (4.4.0-53-generic) and cherry-picked whatever was in the middle. This required some manual adjustments. In particular, this enabled the UCB and BER statistics collection.
Finally, the module was put in place:
# cp drivers/media/usb/dvb-usb-v2/lme2510c.ko /lib/modules/4.4.0-53-generic/kernel/drivers/media/usb/dvb-usb-v2/ # depmod -a
and plugging in the dongle was enough:
[12200.242253] usb 1-2: new high-speed USB device number 6 using xhci_hcd [12200.371223] usb 1-2: config 1 interface 0 altsetting 1 bulk endpoint 0x81 has invalid maxpacket 64 [12200.371235] usb 1-2: config 1 interface 0 altsetting 1 bulk endpoint 0x1 has invalid maxpacket 64 [12200.371241] usb 1-2: config 1 interface 0 altsetting 1 bulk endpoint 0x2 has invalid maxpacket 64 [12200.371248] usb 1-2: config 1 interface 0 altsetting 1 bulk endpoint 0x8A has invalid maxpacket 64 [12200.371681] usb 1-2: New USB device found, idVendor=3344, idProduct=24a0 [12200.371691] usb 1-2: New USB device strings: Mfr=0, Product=0, SerialNumber=3 [12200.371697] usb 1-2: SerialNumber: 䥈児 [12201.486687] usb 1-2: dvb_usb_v2: found a 'Sin Hon TDH601' in cold state [12201.489636] usb 1-2: dvb_usb_v2: downloading firmware from file 'dvb-usb-lme2510c-0.fw' [12201.516925] usbcore: registered new interface driver lme2510c [12201.549778] usb 1-2: USB disconnect, device number 6 [12201.549992] usb 1-2: dvb_usb_v2: 'Sin Hon TDH601' successfully deinitialized and disconnected [12201.826659] usb 1-2: new high-speed USB device number 7 using xhci_hcd [12201.955630] usb 1-2: New USB device found, idVendor=3344, idProduct=24a0 [12201.955642] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [12201.955648] usb 1-2: Product: 䝇䝇 [12201.955656] usb 1-2: Manufacturer: Leaguerme [12201.955661] usb 1-2: SerialNumber: LMEUSBSN0001 [12201.957020] usb 1-2: dvb_usb_v2: found a 'Sin Hon TDH601' in warm state [12201.957302] usb 1-2: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer [12201.957324] DVB: registering new adapter (Sin Hon TDH601) [12201.972436] i2c i2c-9: Added multiplexed i2c bus 10 [12201.972444] si2168 9-0064: Silicon Labs Si2168 successfully attached [12201.979987] si2157 10-0060: Silicon Labs Si2147/2148/2157/2158 successfully attached [12201.980015] usb 1-2: DVB: registering adapter 0 frontend 0 (Silicon Labs Si2168)... [12201.980442] usb 1-2: dvb_usb_v2: 'Sin Hon TDH601' successfully initialized and connected
with lsmod’s relevant part going
Module Size Used by si2157 16384 1 si2168 20480 1 i2c_mux 16384 1 si2168 lme2510c 16384 0 dvb_usb_v2 36864 1 lme2510c dvb_core 122880 1 dvb_usb_v2 rc_core 28672 1 dvb_usb_v2
The relevant device files reside in /dev/dvb/adapter0. I made them R/W accessible to all manually to begin with.
And then, when attempting to scan, I got the following in dmesg:
[13200.818391] si2168 9-0064: found a 'Silicon Labs Si2168-B40' [13200.818461] si2168 9-0064: Direct firmware load for dvb-demod-si2168-b40-01.fw failed with error -2 [13200.818493] si2168 9-0064: Direct firmware load for dvb-demod-si2168-02.fw failed with error -2 [13200.818499] si2168 9-0064: firmware file 'dvb-demod-si2168-02.fw' not found [13200.823201] si2157 10-0060: found a 'Silicon Labs Si2157-A30' [13200.873313] si2157 10-0060: firmware version: 3.0.5
So I grabbed the two files from the dvb-firmware Github repo.
The firmware for the driver itself (dvb-usb-lme2510c-0.fw) was downloaded from Palosaari’s site.
Firmware for the si2168 (dvb-demod-si2168-b40-01.fw) was downloaded from here (version 4.0.25). Doesn’t seem like there’s a major difference between the revisions (in the sense that none worked for me. I tried several).
dvb-demod-si2168-02.fw is the fallback firmware for all si2168 demodulators. There’s no point using it when a specific firmware file is available.
The si2157 tuner doesn’t require any firmware file.
All firmware files were copied to /lib/firmware on the target machine.
Missing firmware symptoms
When both dvb-demod-si2168-02.fw and dvb-demod-si2168-b40-01.fw are missing or have not been loaded properly:
[ 1089.192756] si2168 9-0064: Direct firmware load for dvb-demod-si2168-b40-01.fw failed with error -2 [ 1089.193730] si2168 9-0064: please install firmware file 'dvb-demod-si2168-b40-01.fw' [ 1089.193753] si2168 9-0064: downloading firmware from file 'dvb-demod-si2168-02.fw' [ 1089.509845] si2168 9-0064: firmware version: B 4.0.4
And this results with something like this:
$ dvbv5-scan /usr/share/dvb/dvb-t/il-All Cannot calc frequency shift. Either bandwidth/symbol-rate is unavailable (yet). Scanning frequency #1 514000000 (0x00) Signal= 0.00dBm Scanning frequency #2 538000000 (0x00) Signal= 0.00dBm
But with dvb-demod-si2168-02.fw loaded (and dvb-demod-si2168-b40-01.fw not present):
$ dvbv5-scan /usr/share/dvb/dvb-t/il-All
Cannot calc frequency shift. Either bandwidth/symbol-rate is unavailable (yet).
Scanning frequency #1 514000000
(0x00) Signal= -85.00dBm
Scanning frequency #2 538000000
Lock (0x1f) Signal= -85.00dBm C/N= 20.25dB UCB= 0 postBER= 1.00
Service Ch 1, provider Idan +: digital television
Service Ch 2, provider Idan +: digital television
[... etc ...]
The important lesson is that channels are detected without dvb-demod-si2168-b40-01.fw, only no data can be obtained (the BER is horribly high). Explained why above.
Final status
I destroyed the hardware completely when trying to fix what seemed to be a short circuit between two pins of the LME2510C chip. Unfortunately, I messed things up (fine-pitch soldering is a skill, too bad I don’t possess it), and the device isn’t detected on the USB bus properly. Or more precisely, one gets
[12135.429658] usb 1-4: new full-speed USB device number 13 using xhci_hcd [12135.541697] usb 1-4: device descriptor read/64, error -71 [12135.757589] usb 1-4: device descriptor read/64, error -71 [12135.973634] usb 1-4: new full-speed USB device number 14 using xhci_hcd [12136.085569] usb 1-4: device descriptor read/64, error -71 [12136.301560] usb 1-4: device descriptor read/64, error -71 [12136.517668] usb 1-4: new full-speed USB device number 15 using xhci_hcd [12136.517909] usb 1-4: Device not responding to setup address. [12136.721700] usb 1-4: Device not responding to setup address. [12136.925512] usb 1-4: device not accepting address 15, error -71 [12137.037492] usb 1-4: new full-speed USB device number 16 using xhci_hcd [12137.037709] usb 1-4: Device not responding to setup address. [12137.241728] usb 1-4: Device not responding to setup address. [12137.445494] usb 1-4: device not accepting address 16, error -71 [12137.445653] usb usb1-port4: unable to enumerate USB device
Raw session
A proper plug-in syslog (device is OK, and drivers and firmware in place):
[ 1175.580411] usb 1-4: new high-speed USB device number 7 using xhci_hcd [ 1175.708790] usb 1-4: config 1 interface 0 altsetting 1 bulk endpoint 0x81 has invalid maxpacket 64 [ 1175.708803] usb 1-4: config 1 interface 0 altsetting 1 bulk endpoint 0x1 has invalid maxpacket 64 [ 1175.708810] usb 1-4: config 1 interface 0 altsetting 1 bulk endpoint 0x2 has invalid maxpacket 64 [ 1175.708817] usb 1-4: config 1 interface 0 altsetting 1 bulk endpoint 0x8A has invalid maxpacket 64 [ 1175.709033] usb 1-4: New USB device found, idVendor=3344, idProduct=24a0 [ 1175.709041] usb 1-4: New USB device strings: Mfr=0, Product=0, SerialNumber=3 [ 1175.709048] usb 1-4: SerialNumber: 䥈児 [ 1175.711681] usb 1-4: dvb_usb_v2: found a 'Sin Hon TDH601' in cold state [ 1175.711789] usb 1-4: dvb_usb_v2: downloading firmware from file 'dvb-usb-lme2510c-0.fw' [ 1175.775782] usb 1-4: USB disconnect, device number 7 [ 1175.775955] usb 1-4: dvb_usb_v2: 'Sin Hon TDH601' successfully deinitialized and disconnected [ 1176.052434] usb 1-4: new high-speed USB device number 8 using xhci_hcd [ 1176.181496] usb 1-4: New USB device found, idVendor=3344, idProduct=24a0 [ 1176.181510] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1176.181519] usb 1-4: Product: 䝇䝇 [ 1176.181527] usb 1-4: Manufacturer: Leaguerme [ 1176.181534] usb 1-4: SerialNumber: LMEUSBSN0001 [ 1176.183341] usb 1-4: dvb_usb_v2: found a 'Sin Hon TDH601' in warm state [ 1176.183804] usb 1-4: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer [ 1176.183833] DVB: registering new adapter (Sin Hon TDH601) [ 1176.192171] i2c i2c-9: Added multiplexed i2c bus 10 [ 1176.192182] si2168 9-0064: Silicon Labs Si2168-B40 successfully identified [ 1176.192188] si2168 9-0064: firmware version: B 4.0.2 [ 1176.197203] si2157 10-0060: Silicon Labs Si2147/2148/2157/2158 successfully attached [ 1176.197228] usb 1-4: DVB: registering adapter 0 frontend 0 (Silicon Labs Si2168)... [ 1176.197483] usb 1-4: dvb_usb_v2: 'Sin Hon TDH601' successfully initialized and connected
And when running e.g. dvbv5-zap:
[ 1320.568204] si2168 9-0064: downloading firmware from file 'dvb-demod-si2168-b40-01.fw' [ 1321.527006] si2168 9-0064: firmware version: B 4.0.25 [ 1321.538051] si2157 10-0060: found a 'Silicon Labs Si2157-A30' [ 1321.588369] si2157 10-0060: firmware version: 3.0.5
And lsusb:
# lsusb -v Bus 001 Device 003: ID 3344:24a0 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x3344 idProduct 0x24a0 bcdDevice 0.00 iManufacturer 0 iProduct 0 iSerial 3 ??? bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 76 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 0 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 1 bNumEndpoints 7 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x86 EP 6 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x87 EP 7 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x03fc 1x 1020 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x0a EP 10 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x8a EP 10 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Device Qualifier (for other device speed): bLength 10 bDescriptorType 6 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 bNumConfigurations 1 Device Status: 0x0000 (Bus Powered)
The lsusb was made on another computer, but that shouldn’t matter.