149 lines
		
	
	
	
		
			5.8 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			149 lines
		
	
	
	
		
			5.8 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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-cards.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) [autodetected]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You should verify this is correct.  If it isn't, 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 isn't listed there, you might check the source code for
							 | 
						||
| 
								 | 
							
								new entries which are not listed yet.  If there isn't 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 isn't 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.  ALSA for example has everything muted by default.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Most 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.  Some boards use the i2c bus instead of the gpio pins
							 | 
						||
| 
								 | 
							
								to connect the mux chip.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.  The important fields are these two:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct tvcard
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									[ ... ]
							 | 
						||
| 
								 | 
							
								        u32 gpiomask;
							 | 
						||
| 
								 | 
							
								        u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								gpiomask specifies which pins are used to control the audio mux chip.
							 | 
						||
| 
								 | 
							
								The corresponding bits in the output enable register
							 | 
						||
| 
								 | 
							
								(BT848_GPIO_OUT_EN) will be set as these pins must be driven by the
							 | 
						||
| 
								 | 
							
								bt848 chip.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The audiomux[] array holds the data values for the different inputs
							 | 
						||
| 
								 | 
							
								(i.e. which pins must be high/low for tuner/mute/...).  This will be
							 | 
						||
| 
								 | 
							
								written to the data register (BT848_GPIO_DATA) to switch the audio
							 | 
						||
| 
								 | 
							
								mux.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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, but it
							 | 
						||
| 
								 | 
							
								does'nt work with bt878 boards according to some reports I received.
							 | 
						||
| 
								 | 
							
								Another one with bt878 suport is available from
							 | 
						||
| 
								 | 
							
								http://btwincap.sourceforge.net/Files/btspy2.00.zip
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You might also dig around in the *.ini files of the Windows applications.
							 | 
						||
| 
								 | 
							
								You can have a look at the board to see which of the gpio pins are
							 | 
						||
| 
								 | 
							
								connected at all and then start trial-and-error ...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Starting with release 0.7.41 bttv has a number of insmod options to
							 | 
						||
| 
								 | 
							
								make the gpio debugging easier:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								bttv_gpio=0/1		enable/disable gpio debug messages
							 | 
						||
| 
								 | 
							
								gpiomask=n		set the gpiomask value
							 | 
						||
| 
								 | 
							
								audiomux=i,j,...	set the values of the audiomux array
							 | 
						||
| 
								 | 
							
								audioall=a		set the values of the audiomux array (one
							 | 
						||
| 
								 | 
							
											value for all array elements, useful to check
							 | 
						||
| 
								 | 
							
											out which effect the particular value has).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The messages printed with bttv_gpio=1 look like this:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bttv0: gpio: en=00000027, out=00000024 in=00ffffd8 [audio: off]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								en  =	output _en_able register (BT848_GPIO_OUT_EN)
							 | 
						||
| 
								 | 
							
								out =	_out_put bits of the data register (BT848_GPIO_DATA),
							 | 
						||
| 
								 | 
							
									i.e. BT848_GPIO_DATA & BT848_GPIO_OUT_EN
							 | 
						||
| 
								 | 
							
								in  = 	_in_put bits of the data register,
							 | 
						||
| 
								 | 
							
									i.e. BT848_GPIO_DATA & ~BT848_GPIO_OUT_EN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Other elements of the tvcards array
							 | 
						||
| 
								 | 
							
								===================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you are trying to make a new card work you might find it useful to
							 | 
						||
| 
								 | 
							
								know what the other elements in the tvcards array are good for:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								video_inputs    - # of video inputs the card has
							 | 
						||
| 
								 | 
							
								audio_inputs    - historical cruft, not used any more.
							 | 
						||
| 
								 | 
							
								tuner           - which input is the tuner
							 | 
						||
| 
								 | 
							
								svhs            - which input is svhs (all others are labeled composite)
							 | 
						||
| 
								 | 
							
								muxsel          - video mux, input->registervalue mapping
							 | 
						||
| 
								 | 
							
								pll             - same as pll= insmod option
							 | 
						||
| 
								 | 
							
								tuner_type      - same as tuner= insmod option
							 | 
						||
| 
								 | 
							
								*_modulename    - hint whenever some card needs this or that audio
							 | 
						||
| 
								 | 
							
								                  module loaded to work properly.
							 | 
						||
| 
								 | 
							
								has_radio	- whenever this TV card has a radio tuner.
							 | 
						||
| 
								 | 
							
								no_msp34xx	- "1" disables loading of msp3400.o module
							 | 
						||
| 
								 | 
							
								no_tda9875	- "1" disables loading of tda9875.o module 
							 | 
						||
| 
								 | 
							
								needs_tvaudio	- set to "1" to load tvaudio.o module 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If some config item is specified both from the tvcards array and as
							 | 
						||
| 
								 | 
							
								insmod option, the insmod option takes precedence.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Good luck,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Gerd
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PS: If you have a new working entry, mail it to me.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								-- 
							 | 
						||
| 
								 | 
							
								Gerd Knorr <kraxel@bytesex.org>
							 |