This source file includes following definitions.
- init_audio_devices
- set_audio
- temp_mute
- init_BTSC
- set_BTSC
- set_bctv_audio
- bctv_gpio_write
- msp_read_id
- msp_autodetect
- dpl_read_id
- dpl_autodetect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 #include <sys/param.h>
51 #include <sys/systm.h>
52 #include <sys/kernel.h>
53 #include <sys/vnode.h>
54 #include <sys/proc.h>
55
56 #include <dev/ic/bt8xx.h>
57 #include <dev/pci/bktr/bktr_reg.h>
58 #include <dev/pci/bktr/bktr_core.h>
59 #include <dev/pci/bktr/bktr_tuner.h>
60 #include <dev/pci/bktr/bktr_card.h>
61 #include <dev/pci/bktr/bktr_audio.h>
62
63
64
65
66 void set_bctv_audio( bktr_ptr_t bktr );
67 void bctv_gpio_write( bktr_ptr_t bktr, int port, int val );
68
69
70
71
72
73
74
75
76 void init_audio_devices( bktr_ptr_t bktr ) {
77
78
79 if ( bktr->card.dbx )
80 init_BTSC( bktr );
81
82
83 if ( bktr->card.msp3400c )
84 msp_dpl_reset( bktr, bktr->msp_addr );
85
86
87 if ( bktr->card.dpl3518a )
88 msp_dpl_reset( bktr, bktr->dpl_addr );
89
90 }
91
92
93
94
95
96 #define AUDIOMUX_DISCOVER_NOT
97 int
98 set_audio( bktr_ptr_t bktr, int cmd )
99 {
100 u_int temp;
101 volatile u_char idx;
102
103 #if defined( AUDIOMUX_DISCOVER )
104 if ( cmd >= 200 )
105 cmd -= 200;
106 else
107 #endif
108
109
110 if ( !bktr->card.audiomuxs[ 4 ] )
111 return( -1 );
112
113 switch (cmd) {
114 case AUDIO_TUNER:
115 #ifdef BKTR_REVERSEMUTE
116 bktr->audio_mux_select = 3;
117 #else
118 bktr->audio_mux_select = 0;
119 #endif
120
121 if (bktr->reverse_mute )
122 bktr->audio_mux_select = 0;
123 else
124 bktr->audio_mux_select = 3;
125
126 break;
127 case AUDIO_EXTERN:
128 bktr->audio_mux_select = 1;
129 break;
130 case AUDIO_INTERN:
131 bktr->audio_mux_select = 2;
132 break;
133 case AUDIO_MUTE:
134 bktr->audio_mute_state = TRUE;
135 break;
136 case AUDIO_UNMUTE:
137 bktr->audio_mute_state = FALSE;
138 break;
139 default:
140 printf("%s: audio cmd error %02x\n", bktr_name(bktr),
141 cmd);
142 return( -1 );
143 }
144
145
146
147
148
149
150 if ( bktr->bt848_card == CARD_IO_GV ) {
151 set_bctv_audio( bktr );
152 return( 0 );
153 }
154
155
156
157
158
159
160
161
162
163
164
165 if ( bktr->audio_mute_state == TRUE ) {
166 #ifdef BKTR_REVERSEMUTE
167 idx = 0;
168 #else
169 idx = 3;
170 #endif
171
172 if (bktr->reverse_mute )
173 idx = 3;
174 else
175 idx = 0;
176
177 }
178 else
179 idx = bktr->audio_mux_select;
180
181
182 temp = INL(bktr, BKTR_GPIO_DATA) & ~bktr->card.gpio_mux_bits;
183 #if defined( AUDIOMUX_DISCOVER )
184 OUTL(bktr, BKTR_GPIO_DATA, temp | (cmd & 0xff));
185 printf("%s: cmd: %d audio mux %x temp %x \n", bktr_name(bktr),
186 cmd, bktr->card.audiomuxs[ idx ], temp );
187 #else
188 OUTL(bktr, BKTR_GPIO_DATA, temp | bktr->card.audiomuxs[ idx ]);
189 #endif
190
191
192
193
194
195
196
197
198
199
200
201 if ((bktr->card.msp3400c) && (bktr->audio_mux_present == 0)) {
202
203 if (bktr->audio_mute_state == TRUE ) {
204 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x0000);
205 } else {
206 if(bktr->audio_mux_select == 0) {
207 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300);
208 if (bktr->msp_source_selected != 0) msp_autodetect(bktr);
209 bktr->msp_source_selected = 0;
210 }
211 if(bktr->audio_mux_select == 1) {
212 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300);
213 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000d, 0x1900);
214 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008, 0x0220);
215 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0013, 0x0000);
216 bktr->msp_source_selected = 1;
217 }
218
219 if(bktr->audio_mux_select == 2) {
220 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300);
221 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000d, 0x1900);
222 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008, 0x0220);
223 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0013, 0x0200);
224 bktr->msp_source_selected = 2;
225 }
226 }
227 }
228
229
230 return( 0 );
231 }
232
233
234
235
236
237 void
238 temp_mute( bktr_ptr_t bktr, int flag )
239 {
240 static int muteState = FALSE;
241
242 if ( flag == TRUE ) {
243 muteState = bktr->audio_mute_state;
244 set_audio( bktr, AUDIO_MUTE );
245 }
246 else {
247 tsleep( BKTR_SLEEP, PZERO, "tuning", hz/8 );
248 if ( muteState == FALSE )
249 set_audio( bktr, AUDIO_UNMUTE );
250 }
251 }
252
253
254 #define TDA9850_WADDR 0xb6
255 #define TDA9850_RADDR 0xb7
256
257
258
259 #define CON1ADDR 0x04
260 #define CON2ADDR 0x05
261 #define CON3ADDR 0x06
262 #define CON4ADDR 0x07
263 #define ALI1ADDR 0x08
264 #define ALI2ADDR 0x09
265 #define ALI3ADDR 0x0a
266
267
268
269
270
271 void
272 init_BTSC( bktr_ptr_t bktr )
273 {
274 i2cWrite(bktr, TDA9850_WADDR, CON1ADDR, 0x08);
275 i2cWrite(bktr, TDA9850_WADDR, CON2ADDR, 0x08);
276 i2cWrite(bktr, TDA9850_WADDR, CON3ADDR, 0x40);
277 i2cWrite(bktr, TDA9850_WADDR, CON4ADDR, 0x07);
278 i2cWrite(bktr, TDA9850_WADDR, ALI1ADDR, 0x10);
279 i2cWrite(bktr, TDA9850_WADDR, ALI2ADDR, 0x10);
280 i2cWrite(bktr, TDA9850_WADDR, ALI3ADDR, 0x03);
281 }
282
283
284
285
286
287 int
288 set_BTSC( bktr_ptr_t bktr, int control )
289 {
290 return( i2cWrite( bktr, TDA9850_WADDR, CON3ADDR, control ) );
291 }
292
293
294
295
296
297 #define BCTV_AUDIO_MAIN 0x10
298 #define BCTV_AUDIO_SUB 0x20
299 #define BCTV_AUDIO_BOTH 0x30
300
301 #define BCTV_GPIO_REG0 1
302 #define BCTV_GPIO_REG1 3
303
304 #define BCTV_GR0_AUDIO_MODE 3
305 #define BCTV_GR0_AUDIO_MAIN 0
306 #define BCTV_GR0_AUDIO_SUB 3
307 #define BCTV_GR0_AUDIO_BOTH 1
308 #define BCTV_GR0_AUDIO_MUTE 4
309 #define BCTV_GR0_AUDIO_MONO 8
310
311 void
312 set_bctv_audio( bktr_ptr_t bktr )
313 {
314 int data;
315
316 switch (bktr->audio_mux_select) {
317 case 1:
318 case 2:
319 bctv_gpio_write(bktr, BCTV_GPIO_REG1, 0);
320 break;
321 default:
322 bctv_gpio_write(bktr, BCTV_GPIO_REG1, 1);
323 break;
324 }
325
326 switch (BCTV_AUDIO_BOTH) {
327 case BCTV_AUDIO_SUB:
328 data = BCTV_GR0_AUDIO_SUB;
329 break;
330 case BCTV_AUDIO_BOTH:
331 data = BCTV_GR0_AUDIO_BOTH;
332 break;
333 case BCTV_AUDIO_MAIN:
334 default:
335 data = BCTV_GR0_AUDIO_MAIN;
336 break;
337 }
338 if (bktr->audio_mute_state == TRUE)
339 data |= BCTV_GR0_AUDIO_MUTE;
340
341 bctv_gpio_write(bktr, BCTV_GPIO_REG0, data);
342
343 return;
344 }
345
346
347 #define BCTV_GPIO_ADDR_MASK 0x000300
348 #define BCTV_GPIO_WE 0x000400
349 #define BCTV_GPIO_OE 0x000800
350 #define BCTV_GPIO_VAL_MASK 0x00f000
351
352 #define BCTV_GPIO_PORT_MASK 3
353 #define BCTV_GPIO_ADDR_SHIFT 8
354 #define BCTV_GPIO_VAL_SHIFT 12
355
356
357 #define BCTV_GPIO_OUT_RMASK 0x000f00
358 #define BCTV_GPIO_OUT_WMASK 0x00ff00
359
360 #define BCTV_BITS 100
361
362 void
363 bctv_gpio_write( bktr_ptr_t bktr, int port, int val )
364 {
365 u_int data, outbits;
366
367 port &= BCTV_GPIO_PORT_MASK;
368 switch (port) {
369 case 1:
370 case 3:
371 data = ((val << BCTV_GPIO_VAL_SHIFT) & BCTV_GPIO_VAL_MASK) |
372 ((port << BCTV_GPIO_ADDR_SHIFT) & BCTV_GPIO_ADDR_MASK) |
373 BCTV_GPIO_WE | BCTV_GPIO_OE;
374 outbits = BCTV_GPIO_OUT_WMASK;
375 break;
376 default:
377 return;
378 }
379 OUTL(bktr, BKTR_GPIO_OUT_EN, 0);
380 OUTL(bktr, BKTR_GPIO_DATA, data);
381 OUTL(bktr, BKTR_GPIO_OUT_EN, outbits);
382 DELAY(BCTV_BITS);
383 OUTL(bktr, BKTR_GPIO_DATA, data & ~BCTV_GPIO_WE);
384 DELAY(BCTV_BITS);
385 OUTL(bktr, BKTR_GPIO_DATA, data);
386 DELAY(BCTV_BITS);
387 OUTL(bktr, BKTR_GPIO_DATA, ~0);
388 OUTL(bktr, BKTR_GPIO_OUT_EN, 0);
389 }
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433 void msp_read_id( bktr_ptr_t bktr ){
434 int rev1=0, rev2=0;
435 rev1 = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x001e);
436 rev2 = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x001f);
437
438 snprintf(bktr->msp_version_string, sizeof bktr->msp_version_string,
439 "34%02d%c-%c%d", (rev2>>8)&0xff, (rev1&0xff)+'@', ((rev1>>8)&0xff)+'@',
440 rev2&0x1f);
441
442 }
443
444
445
446
447
448
449
450
451
452
453 void msp_autodetect( bktr_ptr_t bktr ) {
454 int auto_detect, loops;
455 int stereo;
456
457
458 if (strncmp("3430G", bktr->msp_version_string, 5) == 0 ||
459 strncmp("3435G", bktr->msp_version_string, 5) == 0) {
460
461 msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0030,0x2003);
462 msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0020,0x0020);
463 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000E,0x2403);
464 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0320);
465
466 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000,0x7300);
467 }
468
469
470
471
472 else if ( ( (strncmp("3415D", bktr->msp_version_string, 5) == 0)
473 &&(bktr->msp_use_mono_source == 1)
474 )
475 || (bktr->slow_msp_audio == 2) ){
476 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000, 0x7300);
477 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000d, 0x1900);
478 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008, 0x0220);
479 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0013, 0x0100);
480 }
481
482
483
484
485 else if (bktr->slow_msp_audio == 0) {
486 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000,0x7300);
487 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0000);
488 msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0020,0x0001);
489 msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0021,0x0001);
490 }
491
492
493
494
495 else if ( bktr->slow_msp_audio == 1) {
496 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0000,0x7300);
497 msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0020,0x0001);
498
499
500 loops = 10;
501 do {
502 DELAY(100000);
503 auto_detect = msp_dpl_read(bktr, bktr->msp_addr, 0x10, 0x007e);
504 loops++;
505 } while (auto_detect > 0xff && loops < 50);
506 if (bootverbose)printf ("%s: Result of autodetect after %dms: %d\n",
507 bktr_name(bktr), loops*10, auto_detect);
508
509
510 switch (auto_detect) {
511 case 0:
512 break;
513 case 2:
514 break;
515 case 3:
516
517 DELAY(20000);
518 stereo = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x0018);
519 if (bootverbose)printf ("%s: Stereo reg 0x18 a: %d\n",
520 bktr_name(bktr), stereo);
521 DELAY(20000);
522 stereo = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x0018);
523 if (bootverbose)printf ("%s: Stereo reg 0x18 b: %d\n",
524 bktr_name(bktr), stereo);
525 DELAY(20000);
526 stereo = msp_dpl_read(bktr, bktr->msp_addr, 0x12, 0x0018);
527 if (bootverbose)printf ("%s: Stereo reg 0x18 c: %d\n",
528 bktr_name(bktr), stereo);
529 if (stereo > 0x0100 && stereo < 0x8000) {
530 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0020);
531
532
533
534
535 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0005,0x3f28);
536 } else if (stereo > 0x8000) {
537 if (bootverbose) printf ("%s: Bilingual mode detected\n",
538 bktr_name(bktr));
539 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0000);
540 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0005,0x0000);
541 } else {
542 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0030);
543
544
545
546
547
548 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0005,0x3f08);
549 }
550 #if 0
551
552
553 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0008,0x0020);
554 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0009,0x0020);
555 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000a,0x0020);
556 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x0041,0x0020);
557 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000b,0x0020);
558 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000c,0x0020);
559 msp_dpl_write(bktr, bktr->msp_addr, 0x12, 0x000e,0x0001);
560 #endif
561 break;
562 case 8:
563 msp_dpl_write(bktr, bktr->msp_addr, 0x10, 0x0021,0x0001);
564 break;
565 case 9:
566 case 10:
567 break;
568 default:
569 if (bootverbose) printf ("%s: Unknown autodetection result value: %d\n",
570 bktr_name(bktr), auto_detect);
571 }
572
573 }
574
575
576
577
578
579 }
580
581
582 void dpl_read_id( bktr_ptr_t bktr ){
583 int rev1=0, rev2=0;
584 rev1 = msp_dpl_read(bktr, bktr->dpl_addr, 0x12, 0x001e);
585 rev2 = msp_dpl_read(bktr, bktr->dpl_addr, 0x12, 0x001f);
586
587 snprintf(bktr->dpl_version_string, sizeof bktr->dpl_version_string,
588 "34%02d%c-%c%d", ((rev2>>8)&0xff)-1, (rev1&0xff)+'@',
589 ((rev1>>8)&0xff)+'@', rev2&0x1f);
590 }
591
592
593 void dpl_autodetect( bktr_ptr_t bktr ) {
594
595
596 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x000c,0x0320);
597
598
599 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0040,0x0060);
600
601
602
603 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0041,0x0620);
604 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0042,0x1F00);
605 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0043,0x0000);
606 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0044,0x4000);
607
608 msp_dpl_write(bktr, bktr->dpl_addr, 0x12, 0x0045,0x5400);
609
610
611 }
612