Tuesday, May 26, 2009

Sabrent TV-DGUSB

Woot recently sold the Sabrent TV-DGUSB USB HDTV (ATSC) Tuner for $30. This card/dongle has horrible support. A Google for it turns up almost no pages and I couldn't even find it on Sabrent's own website. Here's the information I do have on it:

Product: Sabrent TV-DGUSB
ID: 05e1:0480
lsusb says: Syntek Semiconductor
Chips: Auvitek au0828
Chips: Auvitek au8524

A similar card with id 05e1:0400 is supported with code from LinuxTV.org. The cards differ in that this one has the au8524 and the driver supported one has a au8522. It turns out that the difference is minimal enough that we can use the driver from one for the other.

Steps to get it working in openSUSE 11.1:

1. Add the Packman repositories.
2. Get the kernel-source, dvb, and vlc packages.
3. Get http://linuxtv.org/hg/~mkrufky/teledongle/archive/tip.tar.bz2.
4. Unbzip it.
5. Change line 222 of linux/drivers/media/video/au0828/au0828-cards.c from 0x0400 to 0x0480. Build it with "make" and "make install" as root.
6. Reboot (yes, its necessary).
7. Plug in the card. You can verify everything is working by making sure the blue light on the unit is on, the au0828 module is installed ("lsmod | grep au0828"), or "dmesg | tail" should read:


usb 2-6: new high speed USB device using ehci_hcd and address 9
usb 2-6: configuration #1 chosen from 1 choice
Manufacturer ID= 0xff, Chip ID = ffff. It is not a TEA5761
tuner' 9-0042: chip found @ 0x84 (au0828)
tda9887 9-0042: creating new instance
tda9887 9-0042: tda988[5/6/7] found
tuner' 9-0043: chip found @ 0x86 (au0828)
tda9887 9-0043: creating new instance
tda9887 9-0043: tda988[5/6/7] found
tuner' 9-004a: chip found @ 0x94 (au0828)
tda9887 9-004a: creating new instance
tda9887 9-004a: tda988[5/6/7] found
tuner' 9-004b: chip found @ 0x96 (au0828)
tda9887 9-004b: creating new instance
tda9887 9-004b: tda988[5/6/7] found
Chip ID is not zero. It is not a TEA5767
tuner' 9-0060: chip found @ 0xc0 (au0828)
tuner' 9-0061: chip found @ 0xc2 (au0828)
tuner' 9-0062: chip found @ 0xc4 (au0828)
tuner' 9-0063: chip found @ 0xc6 (au0828)
tuner' 9-0064: chip found @ 0xc8 (au0828)
tuner' 9-0065: chip found @ 0xca (au0828)
tuner' 9-0066: chip found @ 0xcc (au0828)
tuner' 9-0067: chip found @ 0xce (au0828)
tuner' 9-0068: chip found @ 0xd0 (au0828)
tuner' 9-0069: chip found @ 0xd2 (au0828)
tuner' 9-006a: chip found @ 0xd4 (au0828)
tuner' 9-006b: chip found @ 0xd6 (au0828)
tuner' 9-006c: chip found @ 0xd8 (au0828)
tuner' 9-006d: chip found @ 0xda (au0828)
tuner' 9-006e: chip found @ 0xdc (au0828)
tuner' 9-006f: chip found @ 0xde (au0828)
au0828: i2c bus registered
tda18271 9-0060: creating new instance
TDA18271HD/C2 detected @ 9-0060
DVB: registering new adapter (au0828)
DVB: registering adapter 1 frontend 0 (Auvitek AU8522 QAM/8VSB Frontend)...
Registered device AU0828 [Syntek Teledongle [EXPERIMENTAL]]
usb 2-6: New USB device found, idVendor=05e1, idProduct=0480
usb 2-6: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-6: Product: USB 2.0 Video Capture Controller
usb 2-6: Manufacturer: Syntek Semiconductor

8. You'll need a list of valid channels to use. In the USA, use (not as root):

scan /usr/share/dvb/atsc/us-NTSC-center-frequencies-8VSB -o zap -a 0 | tee ~/channels.conf

You will get a lot of messages about "tuning failed". Ignore these. It just means that there is no station on that channel. If you have multiple TV tuners in your system (I did), then you'll need to tell the scan command which one to use using the "-a" switch. 0 is the first tuner, 1 is the second and so on.

When this is done, channels.conf should have a few (or many) lines, each one corresponding to a local TV channel.

9. Start VLC:

vlc --color --ttl 12 --dvb-adapter=0 channels.conf

Again, if you have multiple adapters, tell vlc which one to use with the "dvb-adapter" switch. The next and previous buttons change the channels.



If all went well, then you're watching live high definition TV. If the video is blocky or cutting out then either your processor is too slow (more on this in a moment) or your signal is not sufficient. The antenna that comes with the tuner is pretty small. I found that sometimes putting the antenna on its side improves the reception significantly.

On my 2.2GHz 4-year-old processor, watching the broadcast full screen took 25% of the processor time (using top). This is pretty good and better than BlazeVideo (the Windows software that comes with the card) that took closer to 50%. This means HDTV should be doable on just about every recent computer, maybe even netbooks. I'll try that next and report back.

I should note that some channels use more processing power than others. On my laptop (a five-year-old Sempron at 1.8GHz), the processor usage per channel is constant, but from channel to channel to varies from 15% to 80%.

Here are some websites that I found helpful. The device pictured in the first link is the previous chip version of this one, the au8522:

http://www.linuxtv.org/wiki/index.php/Sabrent_TV-USBHD
http://linuxtv.org/hg/~mkrufky/teledongle
http://forum.videolan.org/viewtopic.php?f=13&t=38890
http://forums.opensuse.org/applications/multimedia/405117-sabrent-digital-hdtv-atsc-analog-usb.html
http://linuxtv.org/wiki/index.php/ATSC_USB_Devices

17 comments:

  1. I am using Ubuntu and fallowed the steps, tough my card id is 0x400 so did not modify the source. I try to scan but frontend0 is not in /dev/dvb/adaptor0. It might be a problem with udev... Any clues as to how I can set this up properlly on Ubuntu?

    ReplyDelete
  2. I have the same problem as bon, though my card is the 0x0480. My dmesg output is nearly identical.

    ReplyDelete
  3. I tried it on the EEE PC 4G Xandros and was having problems with the make. Would like to get it to work. Hadn't realized Xandros was so far out and had to install make to begin with... Sad, maybe it is time to install another OS.

    ReplyDelete
  4. I cant compile this at all on ubuntu karmic. had the same udev issue on previous release

    ReplyDelete
  5. These instructions work like a charm on debian lenny, but no luck on any ubuntu.

    ubuntu udev keeps creating it under /dev/dvb/adapter0/0

    ReplyDelete
  6. This comment has been removed by the author.

    ReplyDelete
  7. This post was very helpful for me. I succeeded in working on my netbook using URN 10.04

    But, As you wrote in other post, realtime playback is not possible in Netbook because of performance issue.

    Is there any way to change resolution producing out of tv tuner? That is, Is there any point to change the setting in AU8522 chip?

    ReplyDelete
  8. Hi Yunho,

    Digital TV is broadcast in what I believe is a MPEG2 stream. All the TV tuner does is capture this stream. As a result, there is no processing being done by the tuner and therefore no way to change the resolution.

    Different stations will broadcast at different resolutions (I believe that they have the choice of 480, 720, and 1080). I have found that on another laptop (not a netbook), I can watch the low resolution streams live, but have to record and then playback the high resolution ones.

    However, for now netbooks are just too underpowered. This will change soon with release of the Intel Atom N550, which is the first dual-core netbook processor.

    ReplyDelete
  9. thank you for your kind reply :)

    ReplyDelete
  10. This comment has been removed by the author.

    ReplyDelete
  11. I'd like to mention here after much struggle with this I was able to get it to work by adding two simple lines to a file (in Ubuntu 10.10).

    Get the current release as described on this site (the easy way):

    http://linuxtv.org/wiki/index.php/How_to_Obtain,_Build_and_Install_V4L-DVB_Device_Drivers

    run the following commands:
    make -C linux/ download
    make -C linux/ untar

    the edit ~/media_build/linux/drivers/media/video/au0828/au0828-cards.c

    At the very end of the file you will see
    { USB_DEVICE(0x2040, 0x8200),
    .driver_info = AU0828_BOARD_HAUPPAUGE_WOODBURY },

    Add this to the line immediately following:

    { USB_DEVICE(0x05e1, 0x0400),
    .driver_info = AU0828_BOARD_HAUPPAUGE_WOODBURY },
    { },

    then type make.

    Note, this only works on the Sabrent card with the tda18271 chipset but it works now flawlessly after messing around for 2 years.

    ReplyDelete
  12. These instructions will not work on Linux kernel versions of 2.6.30 or greater, as linux/autoconf.h was removed, which is required in order for the drivers to compile.

    ReplyDelete
  13. Correction, version 2.6.33.

    However, I'm working on a possible fix, with the help of a friend.

    ReplyDelete
  14. Zauber, if you get it working on later kernel versions, let me know and I'll update the blog post.

    ReplyDelete
  15. Unfortunately, I was unable to. I was applying fixes to multiple source files, and eventually found that the identifiers that the sources depended on was removed from the current kernel.

    That, and the level of knowledge required to get this working is way over my head, so unfortunately I had to give up.

    I did, however, attempt to get it running under a Windows XP guest in VirtualBox. That didn't work out too well, though, because the audio input component of the device wouldn't register. I later tried getting it running on my brother's windows XP laptop, but the video player software just crashed while scanning channels.

    Currently, I'm trying to get a refund on it so that I can buy one that I can confirm works under Linux.

    ReplyDelete
  16. Zauber, the ATI TV Wonder 600 that I posted about here:

    http://linuxhacksandfixes.blogspot.com/2009/11/watch-tv-with-ati-tv-wonder-600-usb.html

    works very well, as all it needs is a small firmware file (the link is in my post). I watch TV every night using it. It also has RCA in, although it has a 1-2 second delay on that input which makes it unsuitable for gaming (I was hoping to use it to connect my Wii to my PC).

    ReplyDelete
  17. Some research turned up a solution for the missing autoconf.h on ubuntu with newer kernels:

    ln -s /usr/src/linux-headers-`uname -r`/include/generated/autoconf.h /usr/src/linux-headers-`uname -r`/include/linux/autoconf.h

    ReplyDelete