| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | bttv and sound mini howto | 
					
						
							|  |  |  | ========================= | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 22:57:33 -03:00
										 |  |  | There are a lot of different bt848/849/878/879 based boards available. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2011-04-04 15:04:46 -07:00
										 |  |  | bttv-cards.c, which holds the information required for each board. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 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 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	[ ... ] | 
					
						
							| 
									
										
										
										
											2005-11-08 21:37:43 -08:00
										 |  |  | 	u32 gpiomask; | 
					
						
							|  |  |  | 	u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							| 
									
										
										
										
											2012-08-22 19:11:26 +09:00
										 |  |  | Another one with bt878 support is available from | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2005-11-08 21:37:43 -08:00
										 |  |  | 		  module loaded to work properly. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | has_radio	- whenever this TV card has a radio tuner. | 
					
						
							|  |  |  | no_msp34xx	- "1" disables loading of msp3400.o module | 
					
						
							| 
									
										
										
										
											2005-11-08 21:37:28 -08:00
										 |  |  | no_tda9875	- "1" disables loading of tda9875.o module | 
					
						
							|  |  |  | needs_tvaudio	- set to "1" to load tvaudio.o module | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-08 21:37:28 -08:00
										 |  |  | -- | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | Gerd Knorr <kraxel@bytesex.org> |