This source file includes following definitions.
- frequency_lookup
- select_tuner
- tv_freq
- do_afc
- get_tuner_status
- tv_channel
- tuner_getchnlset
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 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/kernel.h>
52 #include <sys/vnode.h>
53 #include <sys/proc.h>
54
55 #include <dev/ic/bt8xx.h>
56 #include <dev/pci/bktr/bktr_reg.h>
57 #include <dev/pci/bktr/bktr_tuner.h>
58 #include <dev/pci/bktr/bktr_card.h>
59 #include <dev/pci/bktr/bktr_core.h>
60
61 #if defined( TUNER_AFC )
62 #define AFC_DELAY 10000
63 #define AFC_BITS 0x07
64 #define AFC_FREQ_MINUS_125 0x00
65 #define AFC_FREQ_MINUS_62 0x01
66 #define AFC_FREQ_CENTERED 0x02
67 #define AFC_FREQ_PLUS_62 0x03
68 #define AFC_FREQ_PLUS_125 0x04
69 #define AFC_MAX_STEP (5 * FREQFACTOR)
70 #endif
71
72
73 #define TTYPE_XXX 0
74 #define TTYPE_NTSC 1
75 #define TTYPE_NTSC_J 2
76 #define TTYPE_PAL 3
77 #define TTYPE_PAL_M 4
78 #define TTYPE_PAL_N 5
79 #define TTYPE_SECAM 6
80
81 #define TSA552x_CB_MSB (0x80)
82 #define TSA552x_CB_CP (1<<6)
83 #define TSA552x_CB_T2 (1<<5)
84 #define TSA552x_CB_T1 (1<<4)
85 #define TSA552x_CB_T0 (1<<3)
86 #define TSA552x_CB_RSA (1<<2)
87 #define TSA552x_CB_RSB (1<<1)
88 #define TSA552x_CB_OS (1<<0)
89
90 #define TSA552x_RADIO (TSA552x_CB_MSB | \
91 TSA552x_CB_T0)
92
93
94 #define TSA552x_FCONTROL (TSA552x_CB_MSB | \
95 TSA552x_CB_CP | \
96 TSA552x_CB_T0 | \
97 TSA552x_CB_RSA | \
98 TSA552x_CB_RSB)
99
100
101 #define TSA552x_SCONTROL (TSA552x_CB_MSB | \
102 TSA552x_CB_T0 | \
103 TSA552x_CB_RSA | \
104 TSA552x_CB_RSB)
105
106
107 #define TSCH5_FCONTROL 0x82
108 #define TSCH5_RADIO 0x86
109
110
111 #define TSBH1_FCONTROL 0xce
112
113
114 static const struct TUNER tuners[] = {
115
116
117 { "<no>",
118 TTYPE_XXX,
119 { 0x00,
120 0x00,
121 0x00,
122 0x00 },
123 { 0x00, 0x00 },
124 { 0x00, 0x00, 0x00,0x00} },
125
126
127 { "Temic NTSC",
128 TTYPE_NTSC,
129 { TSA552x_SCONTROL,
130 TSA552x_SCONTROL,
131 TSA552x_SCONTROL,
132 0x00 },
133 { 0x00, 0x00},
134 { 0x02, 0x04, 0x01, 0x00 } },
135
136
137 { "Temic PAL",
138 TTYPE_PAL,
139 { TSA552x_SCONTROL,
140 TSA552x_SCONTROL,
141 TSA552x_SCONTROL,
142 0x00 },
143 { 0x00, 0x00 },
144 { 0x02, 0x04, 0x01, 0x00 } },
145
146
147 { "Temic SECAM",
148 TTYPE_SECAM,
149 { TSA552x_SCONTROL,
150 TSA552x_SCONTROL,
151 TSA552x_SCONTROL,
152 0x00 },
153 { 0x00, 0x00 },
154 { 0x02, 0x04, 0x01,0x00 } },
155
156
157 { "Philips NTSC",
158 TTYPE_NTSC,
159 { TSA552x_SCONTROL,
160 TSA552x_SCONTROL,
161 TSA552x_SCONTROL,
162 0x00 },
163 { 0x00, 0x00 },
164 { 0xa0, 0x90, 0x30, 0x00 } },
165
166
167 { "Philips PAL",
168 TTYPE_PAL,
169 { TSA552x_SCONTROL,
170 TSA552x_SCONTROL,
171 TSA552x_SCONTROL,
172 0x00 },
173 { 0x00, 0x00 },
174 { 0xa0, 0x90, 0x30, 0x00 } },
175
176
177 { "Philips SECAM",
178 TTYPE_SECAM,
179 { TSA552x_SCONTROL,
180 TSA552x_SCONTROL,
181 TSA552x_SCONTROL,
182 0x00 },
183 { 0x00, 0x00 },
184 { 0xa7, 0x97, 0x37, 0x00 } },
185
186
187 { "Temic PAL I",
188 TTYPE_PAL,
189 { TSA552x_SCONTROL,
190 TSA552x_SCONTROL,
191 TSA552x_SCONTROL,
192 0x00 },
193 { 0x00, 0x00 },
194 { 0x02, 0x04, 0x01,0x00 } },
195
196
197 { "Philips PAL I",
198 TTYPE_PAL,
199 { TSA552x_SCONTROL,
200 TSA552x_SCONTROL,
201 TSA552x_SCONTROL,
202 0x00 },
203 { 0x00, 0x00 },
204 { 0xa0, 0x90, 0x30,0x00 } },
205
206
207 { "Philips FR1236 NTSC FM",
208 TTYPE_NTSC,
209 { TSA552x_FCONTROL,
210 TSA552x_FCONTROL,
211 TSA552x_FCONTROL,
212 TSA552x_RADIO },
213 { 0x00, 0x00 },
214 { 0xa0, 0x90, 0x30,0xa4 } },
215
216
217 { "Philips FR1216 PAL FM" ,
218 TTYPE_PAL,
219 { TSA552x_FCONTROL,
220 TSA552x_FCONTROL,
221 TSA552x_FCONTROL,
222 TSA552x_RADIO },
223 { 0x00, 0x00 },
224 { 0xa0, 0x90, 0x30, 0xa4 } },
225
226
227 { "Philips FR1236 SECAM FM",
228 TTYPE_SECAM,
229 { TSA552x_FCONTROL,
230 TSA552x_FCONTROL,
231 TSA552x_FCONTROL,
232 TSA552x_RADIO },
233 { 0x00, 0x00 },
234 { 0xa7, 0x97, 0x37, 0xa4 } },
235
236
237 { "ALPS TSCH5 NTSC FM",
238 TTYPE_NTSC,
239 { TSCH5_FCONTROL,
240 TSCH5_FCONTROL,
241 TSCH5_FCONTROL,
242 TSCH5_RADIO },
243 { 0x00, 0x00 },
244 { 0x14, 0x12, 0x11, 0x04 } },
245
246
247 { "ALPS TSBH1 NTSC",
248 TTYPE_NTSC,
249 { TSBH1_FCONTROL,
250 TSBH1_FCONTROL,
251 TSBH1_FCONTROL,
252 0x00 },
253 { 0x00, 0x00 },
254 { 0x01, 0x02, 0x08, 0x00 } },
255
256
257 { "Tivision TVF5533-MF NTSC",
258 TTYPE_NTSC,
259 { TSBH1_FCONTROL,
260 TSBH1_FCONTROL,
261 TSBH1_FCONTROL,
262 0x00 },
263 { 0x00, 0x00 },
264 { 0x01, 0x02, 0x04, 0x00 } },
265 };
266
267
268
269 #define FREQFACTOR 16
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300 #define OFFSET 6.00
301 static const int nabcst[] = {
302 83, (int)( 45.75 * FREQFACTOR), 0,
303 14, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
304 7, (int)(175.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
305 5, (int)( 77.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
306 2, (int)( 55.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
307 0
308 };
309 #undef OFFSET
310
311
312
313
314
315
316
317
318
319
320
321
322
323 #define OFFSET 6.00
324 static const int irccable[] = {
325 116, (int)( 45.75 * FREQFACTOR), 0,
326 100, (int)(649.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
327 95, (int)( 91.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
328 23, (int)(217.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
329 14, (int)(121.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
330 7, (int)(175.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
331 5, (int)( 77.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
332 2, (int)( 55.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
333 0
334 };
335 #undef OFFSET
336
337
338
339
340
341
342
343
344
345
346
347
348
349 #define OFFSET 6.00
350 static const int hrccable[] = {
351 116, (int)( 45.75 * FREQFACTOR), 0,
352 100, (int)(648.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
353 95, (int)( 90.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
354 23, (int)(216.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
355 14, (int)(120.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
356 7, (int)(174.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
357 5, (int)( 78.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
358 2, (int)( 54.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
359 0
360 };
361 #undef OFFSET
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
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
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506 static const int weurope[] = {
507 121, (int)( 38.90 * FREQFACTOR), 0,
508 100, (int)(303.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
509 90, (int)(231.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
510 80, (int)(105.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
511 74, (int)( 69.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
512 21, (int)(471.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
513 17, (int)(183.25 * FREQFACTOR), (int)(9.00 * FREQFACTOR),
514 16, (int)(175.25 * FREQFACTOR), (int)(9.00 * FREQFACTOR),
515 15, (int)(82.25 * FREQFACTOR), (int)(8.50 * FREQFACTOR),
516 13, (int)(53.75 * FREQFACTOR), (int)(8.50 * FREQFACTOR),
517 5, (int)(175.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
518 2, (int)(48.25 * FREQFACTOR), (int)(7.00 * FREQFACTOR),
519 0
520 };
521
522
523
524
525
526
527
528
529
530
531
532
533
534 #define OFFSET 6.00
535 #define IF_FREQ 45.75
536 static const int jpnbcst[] = {
537 62, (int)(IF_FREQ * FREQFACTOR), 0,
538 13, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
539 8, (int)(193.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
540 4, (int)(171.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
541 1, (int)( 91.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
542 0
543 };
544 #undef IF_FREQ
545 #undef OFFSET
546
547
548
549
550
551
552
553
554
555
556
557
558
559 #define OFFSET 6.00
560 #define IF_FREQ 45.75
561 static const int jpncable[] = {
562 63, (int)(IF_FREQ * FREQFACTOR), 0,
563 23, (int)(223.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
564 22, (int)(165.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
565 13, (int)(109.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
566 8, (int)(193.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
567 4, (int)(171.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
568 1, (int)( 91.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
569 0
570 };
571 #undef IF_FREQ
572 #undef OFFSET
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591 #define IF_FREQ 38.90
592 static const int xussr[] = {
593 107, (int)(IF_FREQ * FREQFACTOR), 0,
594 78, (int)(231.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
595 70, (int)(111.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
596 35, (int)(583.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
597 21, (int)(471.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
598 6, (int)(175.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
599 3, (int)( 77.25 * FREQFACTOR), (int)(8.00 * FREQFACTOR),
600 1, (int)( 49.75 * FREQFACTOR), (int)(9.50 * FREQFACTOR),
601 0
602 };
603 #undef IF_FREQ
604
605
606
607
608 #define OFFSET 7.00
609 #define IF_FREQ 38.90
610 static const int australia[] = {
611 83, (int)(IF_FREQ * FREQFACTOR), 0,
612 28, (int)(527.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
613 10, (int)(209.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
614 6, (int)(175.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
615 4, (int)( 95.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
616 3, (int)( 86.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
617 1, (int)( 57.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
618 0
619 };
620 #undef OFFSET
621 #undef IF_FREQ
622
623
624
625
626 #define OFFSET 8.00
627 #define IF_FREQ 38.90
628 static const int france[] = {
629 69, (int)(IF_FREQ * FREQFACTOR), 0,
630 21, (int)(471.25 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
631 5, (int)(176.00 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
632 4, (int)( 63.75 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
633 3, (int)( 60.50 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
634 1, (int)( 47.75 * FREQFACTOR), (int)(OFFSET * FREQFACTOR),
635 0
636 };
637 #undef OFFSET
638 #undef IF_FREQ
639
640 static const struct {
641 const int *ptr;
642 char name[BT848_MAX_CHNLSET_NAME_LEN];
643 } freqTable[] = {
644 {NULL, ""},
645 {nabcst, "nabcst"},
646 {irccable, "cableirc"},
647 {hrccable, "cablehrc"},
648 {weurope, "weurope"},
649 {jpnbcst, "jpnbcst"},
650 {jpncable, "jpncable"},
651 {xussr, "xussr"},
652 {australia, "australia"},
653 {france, "france"},
654
655 };
656
657 #define TBL_CHNL freqTable[ bktr->tuner.chnlset ].ptr[ x ]
658 #define TBL_BASE_FREQ freqTable[ bktr->tuner.chnlset ].ptr[ x + 1 ]
659 #define TBL_OFFSET freqTable[ bktr->tuner.chnlset ].ptr[ x + 2 ]
660 static int
661 frequency_lookup( bktr_ptr_t bktr, int channel )
662 {
663 int x;
664
665
666 x = 0;
667 if ( channel > TBL_CHNL )
668 return( -1 );
669
670
671 for ( x = 3; TBL_CHNL; x += 3 ) {
672 if ( channel >= TBL_CHNL ) {
673 return( TBL_BASE_FREQ +
674 ((channel - TBL_CHNL) * TBL_OFFSET) );
675 }
676 }
677
678
679 return( -1 );
680 }
681 #undef TBL_OFFSET
682 #undef TBL_BASE_FREQ
683 #undef TBL_CHNL
684
685
686 #define TBL_IF freqTable[ bktr->tuner.chnlset ].ptr[ 1 ]
687
688
689
690
691
692 void select_tuner( bktr_ptr_t bktr, int tuner_type ) {
693 if (tuner_type < Bt848_MAX_TUNER) {
694 bktr->card.tuner = &tuners[ tuner_type ];
695 } else {
696 bktr->card.tuner = NULL;
697 }
698 }
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738 #define LOW_BAND 0
739 #define MID_BAND 1
740 #define HIGH_BAND 2
741 #define FM_RADIO_BAND 3
742
743
744
745 #define STATUSBIT_COLD 0x80
746 #define STATUSBIT_LOCK 0x40
747 #define STATUSBIT_TV 0x20
748 #define STATUSBIT_STEREO 0x10
749 #define STATUSBIT_ADC 0x07
750
751
752
753
754
755
756
757
758 int
759 tv_freq( bktr_ptr_t bktr, int frequency, int type )
760 {
761 const struct TUNER* tuner;
762 u_char addr;
763 u_char control;
764 u_char band;
765 int N;
766 int band_select = 0;
767 #if defined( TEST_TUNER_AFC )
768 int oldFrequency, afcDelta;
769 #endif
770
771 tuner = bktr->card.tuner;
772 if ( tuner == NULL )
773 return( -1 );
774
775 if (type == TV_FREQUENCY) {
776
777
778
779
780 if ( frequency < (160 * FREQFACTOR ) )
781 band_select = LOW_BAND;
782 else if ( frequency < (454 * FREQFACTOR ) )
783 band_select = MID_BAND;
784 else
785 band_select = HIGH_BAND;
786
787 bktr->tuner.tuner_mode = BT848_TUNER_MODE_TV;
788
789 #if defined( TEST_TUNER_AFC )
790 if ( bktr->tuner.afc )
791 frequency -= 4;
792 #endif
793
794
795
796
797
798
799
800
801
802 N = frequency + TBL_IF;
803
804
805 addr = bktr->card.tuner_pllAddr;
806 control = tuner->pllControl[ band_select ];
807 band = tuner->bandAddrs[ band_select ];
808
809 if(!(band && control))
810 return(-1);
811
812 if ( frequency > bktr->tuner.frequency ) {
813 i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
814 i2cWrite( bktr, addr, control, band );
815 }
816 else {
817 i2cWrite( bktr, addr, control, band );
818 i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
819 }
820
821 #if defined( TUNER_AFC )
822 if ( bktr->tuner.afc == TRUE ) {
823 #if defined( TEST_TUNER_AFC )
824 oldFrequency = frequency;
825 #endif
826 if ( (N = do_afc( bktr, addr, N )) < 0 ) {
827
828 N = frequency + TBL_IF;
829 #if defined( TEST_TUNER_AFC )
830 printf("%s: do_afc: failed to lock\n",
831 bktr_name(bktr));
832 #endif
833 i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
834 }
835 else
836 frequency = N - TBL_IF;
837 #if defined( TEST_TUNER_AFC )
838 printf("%s: do_afc: returned freq %d (%d %% %d)\n", bktr_name(bktr), frequency, frequency / 16, frequency % 16);
839 afcDelta = frequency - oldFrequency;
840 printf("%s: changed by: %d clicks (%d mod %d)\n", bktr_name(bktr), afcDelta, afcDelta / 16, afcDelta % 16);
841 #endif
842 }
843 #endif
844
845 bktr->tuner.frequency = frequency;
846 }
847
848 if ( type == FM_RADIO_FREQUENCY ) {
849 band_select = FM_RADIO_BAND;
850
851 bktr->tuner.tuner_mode = BT848_TUNER_MODE_RADIO;
852
853
854
855
856
857
858
859
860
861
862
863 N = (frequency + 1070)/5;
864
865
866 addr = bktr->card.tuner_pllAddr;
867 control = tuner->pllControl[ band_select ];
868 band = tuner->bandAddrs[ band_select ];
869
870 if(!(band && control))
871 return(-1);
872
873 band |= bktr->tuner.radio_mode;
874
875
876
877 i2cWrite( bktr, addr, control, band );
878 i2cWrite( bktr, addr, (N>>8) & 0x7f, N & 0xff );
879
880 bktr->tuner.frequency = (N * 5) - 1070;
881
882
883 }
884
885
886 return( 0 );
887 }
888
889
890
891 #if defined( TUNER_AFC )
892
893
894
895 int
896 do_afc( bktr_ptr_t bktr, int addr, int frequency )
897 {
898 int step;
899 int status;
900 int origFrequency;
901
902 origFrequency = frequency;
903
904
905 tsleep( BKTR_SLEEP, PZERO, "tuning", hz/8 );
906
907 if ( (status = i2cRead( bktr, addr + 1 )) < 0 )
908 return( -1 );
909
910 #if defined( TEST_TUNER_AFC )
911 printf( "%s: Original freq: %d, status: 0x%02x\n", bktr_name(bktr), frequency, status );
912 #endif
913 for ( step = 0; step < AFC_MAX_STEP; ++step ) {
914 if ( (status = i2cRead( bktr, addr + 1 )) < 0 )
915 goto fubar;
916 if ( !(status & 0x40) ) {
917 #if defined( TEST_TUNER_AFC )
918 printf( "%s: no lock!\n", bktr_name(bktr) );
919 #endif
920 goto fubar;
921 }
922
923 switch( status & AFC_BITS ) {
924 case AFC_FREQ_CENTERED:
925 #if defined( TEST_TUNER_AFC )
926 printf( "%s: Centered, freq: %d, status: 0x%02x\n", bktr_name(bktr), frequency, status );
927 #endif
928 return( frequency );
929
930 case AFC_FREQ_MINUS_125:
931 case AFC_FREQ_MINUS_62:
932 #if defined( TEST_TUNER_AFC )
933 printf( "%s: Low, freq: %d, status: 0x%02x\n", bktr_name(bktr), frequency, status );
934 #endif
935 --frequency;
936 break;
937
938 case AFC_FREQ_PLUS_62:
939 case AFC_FREQ_PLUS_125:
940 #if defined( TEST_TUNER_AFC )
941 printf( "%s: Hi, freq: %d, status: 0x%02x\n", bktr_name(bktr), frequency, status );
942 #endif
943 ++frequency;
944 break;
945 }
946
947 i2cWrite( bktr, addr,
948 (frequency>>8) & 0x7f, frequency & 0xff );
949 DELAY( AFC_DELAY );
950 }
951
952 fubar:
953 i2cWrite( bktr, addr,
954 (origFrequency>>8) & 0x7f, origFrequency & 0xff );
955
956 return( -1 );
957 }
958 #endif
959 #undef TBL_IF
960
961
962
963
964
965 int get_tuner_status( bktr_ptr_t bktr ) {
966 return i2cRead( bktr, bktr->card.tuner_pllAddr + 1 );
967 }
968
969
970
971
972 int
973 tv_channel( bktr_ptr_t bktr, int channel )
974 {
975 int frequency;
976
977
978 if ( (frequency = frequency_lookup( bktr, channel )) < 0 )
979 return( -1 );
980
981
982 if ( tv_freq( bktr, frequency, TV_FREQUENCY ) < 0 )
983 return( -1 );
984
985
986 return( (bktr->tuner.channel = channel) );
987 }
988
989
990
991
992 int
993 tuner_getchnlset(struct bktr_chnlset *chnlset)
994 {
995 if (( chnlset->index < CHNLSET_MIN ) ||
996 ( chnlset->index > CHNLSET_MAX ))
997 return( EINVAL );
998
999 memcpy(&chnlset->name, &freqTable[chnlset->index].name,
1000 BT848_MAX_CHNLSET_NAME_LEN);
1001
1002 chnlset->max_channel=freqTable[chnlset->index].ptr[0];
1003 return( 0 );
1004 }