
bttv and sound mini howto
=========================

There are alot of different bt848/849/878/879 based boards available.
Making video work often is not a big deal, because this is handled
completely by the bt8xx chip, which is common on all boards.  But
sound is handled in slightly different ways on each board.

To handle the grabber boards correctly, there is a array tvcards[] in
bttv.c, which holds the informations required for each board.  Sound
will work only, if the correct entry is used (for video it often makes
no difference).  The bttv driver prints a line to the kernel log,
telling which card type is used.  Like this one:

	bttv0: model: BT848(Hauppauge old)

You should verify this is correct.  If it is'nt, you have to pass the
correct board type as insmod argument, "insmod bttv card=2" for
example.  The file CARDLIST has a list of valid arguments for card.
If your card is'nt listed there, you might check the source code for
new entries which are not listed yet.  If there is'nt one for your
card, you can check if one of the existing entries does work for you
(just trial and error...).

Some boards have an extra processor for sound to do stereo decoding
and other nice features.  The msp34xx chips are used by Hauppauge for
example.  If your board has one, you might have to load a helper
module like msp3400.o to make sound work.  If there is'nt one for the
chip used on your board:  Bad luck.  Start writing a new one.  Well,
you might want to check the video4linux mailing list archive first...

Of course you need a correctly installed soundcard unless you have the
speakers connected directly to the grabber board.  Hint: check the
mixer settings too...


How sound works in detail
=========================

Still doesn't work?  Looks like some driver hacking is required.
Below is a do-it-yourself description for you.

The bt8xx chips have 32 general purpose pins, and registers to control
these pins.  One register is the output enable register
(BT848_GPIO_OUT_EN), it says which pins are actively driven by the
bt848 chip.  Another one is the data register (BT848_GPIO_DATA), where
you can get/set the status if these pins.  They can be used for input
and output.

All grabber board vendors use these pins to control an external chip
which does the sound routing.  But every board is a little different.
These pins are also used by some companies to drive remote control
receiver chips.

As mentioned above, there is a array which holds the required
informations for each known board.  You basically have to create a new
line for your board.  What is in there:

struct tvcard
{
        char *name;
        int inputs;       /* number of video inputs */
        int tuner;        /*   which of them is the tuner */
        int svhs;         /*   which of them is the svhs input */
        u32 gpiomask;
        u32 muxsel[8];    /* video mux */
        u32 audiomux[6];  /* audio mux: Tuner, Radio, external, internal, mute, stereo */
        u32 gpiomask2;    /* GPIO MUX mask (this is video) */
};

gpiomask has all bits set which are used to control the audio mux.
This value basically goes to the gpio output enable register.  It is
also used to mask bits when switching the audio mux (which is done by
read-modify-write on the gpio data register).

What you have to do is figure out the correct values for gpiomask and
the audiomux array.  If you have Windows and the drivers four your
card installed, you might to check out if you can read these registers
values used by the windows driver.  A tool to do this is available
from ftp://telepresence.dmem.strath.ac.uk/pub/bt848/winutil.  There is
some #ifdef'ed code in bttv.c (search for "new card") which prints
these values before board initialization, this might help too: boot
win, start tv app, softboot (loadlin) into linux and load bttv with
this enabled.  If you hav'nt Windows installed, this is a trial and
error game...

Good luck,

  Gerd


PS: If you have a new working entry, mail it to me.

-- 
Gerd Knorr <kraxel@goldbach.in-berlin.de>
