2 3/* 4 * This is part of the Driver for Video Capture Cards (Frame grabbers) 5 * and TV Tuner cards using the Brooktree Bt848, Bt848A, Bt849A, Bt878, Bt879 6 * chipset. 7 * Copyright Roger Hardiman and Amancio Hasty. 8 * 9 * bktr_card : This deals with identifying TV cards. 10 * trying to find the card make and model of card. 11 * trying to find the type of tuner fitted. 12 * reading the configuration EEPROM. 13 * locating i2c devices. 14 * 15 */ 16 17/* 18 * 1. Redistributions of source code must retain the 19 * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman 20 * All rights reserved. 21 * 22 * Redistribution and use in source and binary forms, with or without 23 * modification, are permitted provided that the following conditions 24 * are met: 25 * 1. Redistributions of source code must retain the above copyright 26 * notice, this list of conditions and the following disclaimer. 27 * 2. Redistributions in binary form must reproduce the above copyright 28 * notice, this list of conditions and the following disclaimer in the 29 * documentation and/or other materials provided with the distribution. 30 * 3. All advertising materials mentioning features or use of this software 31 * must display the following acknowledgement: 32 * This product includes software developed by Amancio Hasty and 33 * Roger Hardiman 34 * 4. The name of the author may not be used to endorse or promote products 35 * derived from this software without specific prior written permission. 36 * 37 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 38 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 39 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 40 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 41 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 42 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 43 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 46 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 47 * POSSIBILITY OF SUCH DAMAGE. 48 */ 49 50#include "opt_bktr.h" /* Include any kernel config options */ 51 52#include <sys/param.h> 53#include <sys/systm.h> 54#include <sys/vnode.h> 55 56#ifdef __FreeBSD__ 57#include <machine/clock.h> /* for DELAY */ 58#include <pci/pcivar.h> 59 60#if (__FreeBSD_version >=300000) 61#include <machine/bus_memio.h> /* for bus space */ 62#include <machine/bus.h> 63#include <sys/bus.h> 64#endif 65#endif 66 67#ifdef __NetBSD__ 68#include <dev/ic/bt8xx.h> /* NetBSD location for .h files */ 69#include <dev/pci/bktr/bktr_reg.h> 70#include <dev/pci/bktr/bktr_core.h> 71#include <dev/pci/bktr/bktr_tuner.h> 72#include <dev/pci/bktr/bktr_card.h> 73#include <dev/pci/bktr/bktr_audio.h> 74#else 75#include <machine/ioctl_meteor.h> /* Traditional location for .h files */ 76#include <machine/ioctl_bt848.h> /* extensions to ioctl_meteor.h */ 77#include <dev/bktr/bktr_reg.h> 78#include <dev/bktr/bktr_core.h> 79#include <dev/bktr/bktr_tuner.h> 80#include <dev/bktr/bktr_card.h> 81#include <dev/bktr/bktr_audio.h> 82#endif 83 84/* Various defines */ 85#define HAUP_REMOTE_INT_WADDR 0x30 86#define HAUP_REMOTE_INT_RADDR 0x31 87 88#define HAUP_REMOTE_EXT_WADDR 0x34 89#define HAUP_REMOTE_EXT_RADDR 0x35 90 91/* address of BTSC/SAP decoder chip */ 92#define TDA9850_WADDR 0xb6 93#define TDA9850_RADDR 0xb7 94 95/* address of MSP3400C chip */ 96#define MSP3400C_WADDR 0x80 97#define MSP3400C_RADDR 0x81 98 99/* address of DPL3518A chip */ 100#define DPL3518A_WADDR 0x84 101#define DPL3518A_RADDR 0x85 102 103/* EEProm (128 * 8) on an STB card */ 104#define X24C01_WADDR 0xae 105#define X24C01_RADDR 0xaf 106 107 108/* EEProm (256 * 8) on a Hauppauge card */ 109/* and on most BT878s cards to store the sub-system vendor id */ 110#define PFC8582_WADDR 0xa0 111#define PFC8582_RADDR 0xa1 112 113#if BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL 114#define DEFAULT_TUNER PHILIPS_PALI 115#else 116#define DEFAULT_TUNER PHILIPS_NTSC 117#endif 118 119 120 121 122/* 123 * the data for each type of card 124 * 125 * Note: 126 * these entried MUST be kept in the order defined by the CARD_XXX defines! 127 */ 128static const struct CARDTYPE cards[] = { 129 130 { CARD_UNKNOWN, /* the card id */ 131 "Unknown", /* the 'name' */ 132 NULL, /* the tuner */ 133 0, /* the tuner i2c address */ 134 0, /* dbx unknown */ 135 0, 136 0, 137 0, /* EEProm unknown */ 138 0, /* EEProm unknown */ 139 { 0, 0, 0, 0, 0 }, 140 0 }, /* GPIO mask */ 141 142 { CARD_MIRO, /* the card id */ 143 "Miro TV", /* the 'name' */ 144 NULL, /* the tuner */ 145 0, /* the tuner i2c address */ 146 0, /* dbx unknown */ 147 0, 148 0, 149 0, /* EEProm unknown */ 150 0, /* size unknown */ 151 { 0x02, 0x01, 0x00, 0x0a, 1 }, /* audio MUX values */ 152 0x0f }, /* GPIO mask */ 153 154 { CARD_HAUPPAUGE, /* the card id */ 155 "Hauppauge WinCast/TV", /* the 'name' */ 156 NULL, /* the tuner */ 157 0, /* the tuner i2c address */ 158 0, /* dbx is optional */ 159 0, 160 0, 161 PFC8582_WADDR, /* EEProm type */ 162 (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ 163 { 0x00, 0x02, 0x01, 0x04, 1 }, /* audio MUX values */ 164 0x0f }, /* GPIO mask */ 165 166 { CARD_STB, /* the card id */ 167 "STB TV/PCI", /* the 'name' */ 168 NULL, /* the tuner */ 169 0, /* the tuner i2c address */ 170 0, /* dbx is optional */ 171 0, 172 0, 173 X24C01_WADDR, /* EEProm type */ 174 (u_char)(128 / EEPROMBLOCKSIZE), /* 128 bytes */ 175 { 0x00, 0x01, 0x02, 0x02, 1 }, /* audio MUX values */ 176 0x0f }, /* GPIO mask */ 177 178 { CARD_INTEL, /* the card id */ 179 "Intel Smart Video III/VideoLogic Captivator PCI", /* the 'name' */ 180 NULL, /* the tuner */ 181 0, /* the tuner i2c address */ 182 0, 183 0, 184 0, 185 0, 186 0, 187 { 0, 0, 0, 0, 0 }, /* audio MUX values */ 188 0x00 }, /* GPIO mask */ 189 190 { CARD_IMS_TURBO, /* the card id */ 191 "IMS TV Turbo", /* the 'name' */ 192 NULL, /* the tuner */ 193 0, /* the tuner i2c address */ 194 0, /* dbx is optional */ 195 0, 196 0, 197 PFC8582_WADDR, /* EEProm type */ 198 (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ 199 { 0x01, 0x02, 0x01, 0x00, 1 }, /* audio MUX values */ 200 0x0f }, /* GPIO mask */ 201 202 { CARD_AVER_MEDIA, /* the card id */ 203 "AVer Media TV/FM", /* the 'name' */ 204 NULL, /* the tuner */ 205 0, /* the tuner i2c address */ 206 0, /* dbx is optional */ 207 0, 208 0, 209 0, /* EEProm type */ 210 0, /* EEProm size */ 211 { 0x0c, 0x08, 0x04, 0x00, 1 }, /* audio MUX values */ 212 0x1f }, /* GPIO mask */ 213 214 { CARD_OSPREY, /* the card id */ 215 "MMAC Osprey", /* the 'name' */ 216 NULL, /* the tuner */ 217 0, /* the tuner i2c address */ 218 0, /* dbx is optional */ 219 0, 220 0, 221 PFC8582_WADDR, /* EEProm type */ 222 (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ 223 { 0x00, 0x00, 0x00, 0x00, 0 }, /* audio MUX values */ 224 0 }, /* GPIO mask */ 225 226 { CARD_NEC_PK, /* the card id */ 227 "NEC PK-UG-X017", /* the 'name' */ 228 NULL, /* the tuner */ 229 0, /* the tuner i2c address */ 230 0, /* dbx is optional */ 231 0, 232 0, 233 0, /* EEProm type */ 234 0, /* EEProm size */ 235 { 0x01, 0x02, 0x01, 0x00, 1 }, /* audio MUX values */ 236 0x0f }, /* GPIO mask */ 237 238 { CARD_IO_GV, /* the card id */ 239 "I/O DATA GV-BCTV2/PCI", /* the 'name' */ 240 NULL, /* the tuner */ 241 0, /* the tuner i2c address */ 242 0, /* dbx is optional */ 243 0, 244 0, 245 0, /* EEProm type */ 246 0, /* EEProm size */ 247 { 0x00, 0x00, 0x00, 0x00, 1 }, /* Has special MUX handler */ 248 0x0f }, /* GPIO mask */ 249 250 { CARD_FLYVIDEO, /* the card id */ 251 "FlyVideo", /* the 'name' */ 252 NULL, /* the tuner */ 253 0, /* the tuner i2c address */ 254 0, /* dbx is optional */ 255 0, /* msp34xx is optional */ 256 0, /* dpl3518a is optional */ 257 0xac, /* EEProm type */ 258 (u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */ 259 { 0x000, 0x800, 0x400, 0x8dff00, 1 },/* audio MUX values */ 260 0x8dff00 }, /* GPIO mask */ 261 262 { CARD_ZOLTRIX, /* the card id */ 263 "Zoltrix", /* the 'name' */ 264 NULL, /* the tuner */ 265 0, /* the tuner i2c address */ 266 0, /* dbx is optional */ 267 0, /* msp34xx is optional */ 268 0, /* dpl3518a is optional */ 269 0, /* EEProm type */ 270 0, /* EEProm size */ 271 { 0x04, 0x01, 0x00, 0x0a, 1 }, /* audio MUX values */ 272 0x0f }, /* GPIO mask */ 273 274 { CARD_KISS, /* the card id */ 275 "KISS TV/FM PCI", /* the 'name' */ 276 NULL, /* the tuner */ 277 0, /* the tuner i2c address */ 278 0, /* dbx is optional */ 279 0, /* msp34xx is optional */ 280 0, /* dpl3518a is optional */ 281 0, /* EEProm type */ 282 0, /* EEProm size */ 283 { 0x0c, 0x00, 0x0b, 0x0b, 1 }, /* audio MUX values */ 284 0x0f }, /* GPIO mask */ 285 286 { CARD_VIDEO_HIGHWAY_XTREME, /* the card id */ 287 "Video Highway Xtreme", /* the 'name' */ 288 NULL, /* the tuner */ 289 0, 290 0, 291 0, 292 0, 293 0, /* EEProm type */ 294 0, /* EEProm size */ 295 { 0x00, 0x02, 0x01, 0x04, 1 }, /* audio MUX values */ 296 0x0f }, /* GPIO mask */ 297 298 { CARD_ASKEY_DYNALINK_MAGIC_TVIEW, /* the card id */ 299 "Askey/Dynalink Magic TView", /* the 'name' */ 300 NULL, /* the tuner */ 301 0, 302 0, 303 0, 304 0, 305 0, /* EEProm type */ 306 0, /* EEProm size */ 307 { 0x400, 0xE00, 0x400, 0xC00, 1 }, /* audio MUX values */ 308 0xE00 }, /* GPIO mask */ 309 310 { CARD_LEADTEK, /* the card id */ 311 "Leadtek Winfast TV 2000", /* the 'name' */ 312 NULL, /* the tuner */ 313 0, 314 0, 315 0, 316 0, 317 0, /* EEProm type */ 318 0, /* EEProm size */ 319 /* Tuner, Extern, Intern, Mute, Enabled */ 320 { 0x621000, 0x621000, 0x621000, 0xE21000, 1 }, /* audio MUX values */ 321 0xfff000 }, /* GPIO mask */ 322 323 { CARD_TERRATVPLUS, /* the card id */ 324 "TerraTVplus", /* the 'name' */ 325 NULL, /* the tuner */ 326 0, 327 0, 328 0, 329 0, 330 0, /* EEProm type */ 331 0, /* EEProm size */ 332 { 0x20000, 0x00000, 0x30000, 0x40000, 1 }, /* audio MUX values*/ 333 0x70000 }, /* GPIO mask */ 334 335}; 336 337struct bt848_card_sig bt848_card_signature[1]= { 338 /* IMS TURBO TV : card 5 */ 339 { 5,9, {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 02, 00, 00, 00}} 340 341 342}; 343 344 345/* 346 * Write to the configuration EEPROM on the card. 347 * This is dangerous and will mess up your card. Therefore it is not 348 * implemented. 349 */ 350int 351writeEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data ) 352{ 353 return( -1 ); 354} 355 356/* 357 * Read the contents of the configuration EEPROM on the card. 358 * (This is not fitted to all makes of card. All Hauppuage cards have them 359 * and so do newer Bt878 based cards. 360 */ 361int 362readEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data ) 363{ 364 int x; 365 int addr; 366 int max; 367 int byte; 368 369 /* get the address of the EEProm */ 370 addr = (int)(bktr->card.eepromAddr & 0xff); 371 if ( addr == 0 ) 372 return( -1 ); 373 374 max = (int)(bktr->card.eepromSize * EEPROMBLOCKSIZE); 375 if ( (offset + count) > max ) 376 return( -1 ); 377 378 /* set the start address */ 379 if ( i2cWrite( bktr, addr, offset, -1 ) == -1 ) 380 return( -1 ); 381 382 /* the read cycle */ 383 for ( x = 0; x < count; ++x ) { 384 if ( (byte = i2cRead( bktr, (addr | 1) )) == -1 ) 385 return( -1 ); 386 data[ x ] = byte; 387 } 388 389 return( 0 ); 390} 391 392 393#define ABSENT (-1) 394 395/* 396 * get a signature of the card 397 * read all 128 possible i2c read addresses from 0x01 thru 0xff 398 * build a bit array with a 1 bit for each i2c device that responds 399 * 400 * XXX FIXME: use offset & count args 401 */ 402int 403signCard( bktr_ptr_t bktr, int offset, int count, u_char* sig ) 404{ 405 int x; 406 407 for ( x = 0; x < 16; ++x ) 408 sig[ x ] = 0; 409 410 for ( x = 0; x < count; ++x ) { 411 if ( i2cRead( bktr, (2 * x) + 1 ) != ABSENT ) { 412 sig[ x / 8 ] |= (1 << (x % 8) ); 413 } 414 } 415 416 return( 0 ); 417} 418 419 420/* 421 * check_for_i2c_devices. 422 * Some BT848 cards have no tuner and no additional i2c devices 423 * eg stereo decoder. These are used for video conferencing or capture from 424 * a video camera. (eg VideoLogic Captivator PCI, Intel SmartCapture card). 425 * 426 * Determine if there are any i2c devices present. There are none present if 427 * a) reading from all 128 devices returns ABSENT (-1) for each one 428 * (eg VideoLogic Captivator PCI with BT848) 429 * b) reading from all 128 devices returns 0 for each one 430 * (eg VideoLogic Captivator PCI rev. 2F with BT848A) 431 */ 432static int check_for_i2c_devices( bktr_ptr_t bktr ){ 433 int x, temp_read; 434 int i2c_all_0 = 1; 435 int i2c_all_absent = 1; 436 for ( x = 0; x < 128; ++x ) { 437 temp_read = i2cRead( bktr, (2 * x) + 1 ); 438 if (temp_read != 0) i2c_all_0 = 0; 439 if (temp_read != ABSENT) i2c_all_absent = 0; 440 } 441 442 if ((i2c_all_0) || (i2c_all_absent)) return 0; 443 else return 1; 444} 445 446 447/* 448 * Temic/Philips datasheets say tuners can be at i2c addresses 0xc0, 0xc2, 449 * 0xc4 or 0xc6, settable by links on the tuner. 450 * Determine the actual address used on the TV card by probing read addresses. 451 */ 452static int locate_tuner_address( bktr_ptr_t bktr) { 453 if (i2cRead( bktr, 0xc1) != ABSENT) return 0xc0; 454 if (i2cRead( bktr, 0xc3) != ABSENT) return 0xc2; 455 if (i2cRead( bktr, 0xc5) != ABSENT) return 0xc4; 456 if (i2cRead( bktr, 0xc7) != ABSENT) return 0xc6; 457 return -1; /* no tuner found */ 458} 459 460 461/* 462 * Search for a configuration EEPROM on the i2c bus by looking at i2c addresses 463 * where EEPROMs are usually found. 464 * On some cards, the EEPROM appears in several locations, but all in the 465 * range 0xa0 to 0xae. 466 */ 467static int locate_eeprom_address( bktr_ptr_t bktr) { 468 if (i2cRead( bktr, 0xa0) != ABSENT) return 0xa0; 469 if (i2cRead( bktr, 0xac) != ABSENT) return 0xac; 470 if (i2cRead( bktr, 0xae) != ABSENT) return 0xae; 471 return -1; /* no eeprom found */ 472} 473 474 475/* 476 * determine the card brand/model 477 * BKTR_OVERRIDE_CARD, BKTR_OVERRIDE_TUNER, BKTR_OVERRIDE_DBX and 478 * BKTR_OVERRIDE_MSP can be used to select a specific device, 479 * regardless of the autodetection and i2c device checks. 480 * 481 * The scheme used for probing cards faces these problems: 482 * It is impossible to work out which type of tuner is actually fitted, 483 * (the driver cannot tell if the Tuner is PAL or NTSC, Temic or Philips) 484 * It is impossible to determine what audio-mux hardware is connected. 485 * It is impossible to determine if there is extra hardware connected to the 486 * GPIO pins (eg radio chips or MSP34xx reset logic) 487 * 488 * However some makes of card (eg Hauppauge) come with a configuration eeprom 489 * which tells us the make of the card. Most eeproms also tell us the 490 * tuner type and other features of the the cards. 491 * 492 * The current probe code works as follows 493 * A) If the card uses a Bt878/879: 494 * 1) Read the sub-system vendor id from the configuration EEPROM. 495 * Select the required tuner, audio mux arrangement and any other 496 * onboard features. If this fails, move to step B. 497 * B) If it card uses a Bt848, 848A, 849A or an unknown Bt878/879: 498 * 1) Look for I2C devices. If there are none fitted, it is an Intel or 499 * VideoLogic cards. 500 * 2) Look for a configuration EEPROM. 501 * 2a) If there is one at I2C address 0xa0 it may be 502 * a Hauppauge or an Osprey. Check the EEPROM contents to determine which 503 * one it is. For Hauppauge, select the tuner type and audio hardware. 504 * 2b) If there is an EEPROM at I2C address 0xa8 it will be an STB card. 505 * We still have to guess on the tuner type. 506 * 507 * C) If we do not know the card type from (A) or (B), guess at the tuner 508 * type based on the I2C address of the tuner. 509 * 510 * D) After determining the Tuner Type, we probe the i2c bus for other 511 * devices at known locations, eg IR-Remote Control, MSP34xx and TDA 512 * stereo chips. 513 */ 514 515 516/* 517 * These are the sub-system vendor ID codes stored in the 518 * configuration EEPROM used on Bt878/879 cards. They should match the 519 * number assigned to the company by the PCI Special Interest Group 520 */ 521#define VENDOR_AVER_MEDIA 0x1461 522#define VENDOR_HAUPPAUGE 0x0070 523#define VENDOR_FLYVIDEO 0x1851
|
932 select_tuner( bktr, PHILIPS_PALI ); 933 goto checkDBX; 934 935 case 0xd: 936 select_tuner( bktr, TEMIC_NTSC ); 937 goto checkDBX; 938 939 case 0xe: 940 select_tuner( bktr, TEMIC_PAL ); 941 goto checkDBX; 942 943 case 0xf: 944 select_tuner( bktr, TEMIC_PALI ); 945 goto checkDBX; 946 947 case 0x15: 948 select_tuner( bktr, PHILIPS_FR1216_PAL ); 949 goto checkDBX; 950 951 default : 952 printf("%s: Warning - Unknown Hauppauge Tuner 0x%x\n", 953 bktr_name(bktr), tuner_code); 954 } 955 } 956 break; 957 958 959 case CARD_AVER_MEDIA: 960 /* AVerMedia kindly supplied some details of their EEPROM contents 961 * which allow us to auto select the Tuner Type. 962 * Only the newer AVerMedia cards actually have an EEPROM. 963 */ 964 if (bktr->card.eepromAddr != 0) { 965 966 u_char tuner_make; /* Eg Philips, Temic */ 967 u_char tuner_tv_fm; /* TV or TV with FM Radio */ 968 u_char tuner_format; /* Eg NTSC, PAL, SECAM */ 969 int tuner; 970 971 int tuner_0_table[] = { 972 PHILIPS_NTSC, PHILIPS_PAL, 973 PHILIPS_PAL, PHILIPS_PAL, 974 PHILIPS_PAL, PHILIPS_PAL, 975 PHILIPS_SECAM, PHILIPS_SECAM, 976 PHILIPS_SECAM, PHILIPS_PAL}; 977 978 int tuner_0_fm_table[] = { 979 PHILIPS_FR1236_NTSC, PHILIPS_FR1216_PAL, 980 PHILIPS_FR1216_PAL, PHILIPS_FR1216_PAL, 981 PHILIPS_FR1216_PAL, PHILIPS_FR1216_PAL, 982 PHILIPS_FR1236_SECAM, PHILIPS_FR1236_SECAM, 983 PHILIPS_FR1236_SECAM, PHILIPS_FR1216_PAL}; 984 985 int tuner_1_table[] = { 986 TEMIC_NTSC, TEMIC_PAL, TEMIC_PAL, 987 TEMIC_PAL, TEMIC_PAL, TEMIC_PAL, 988 TEMIC_SECAM, TEMIC_SECAM, TEMIC_SECAM, 989 TEMIC_PAL}; 990 991 992 /* Extract information from the EEPROM data */ 993 readEEProm(bktr, 0, 128, (u_char *) &eeprom ); 994 995 tuner_make = (eeprom[0x41] & 0x7); 996 tuner_tv_fm = (eeprom[0x41] & 0x18) >> 3; 997 tuner_format = (eeprom[0x42] & 0xf0) >> 4; 998 999 /* Treat tuner make 0 (Philips) and make 2 (LG) the same */ 1000 if ( ((tuner_make == 0) || (tuner_make == 2)) 1001 && (tuner_format <= 9) && (tuner_tv_fm == 0) ) { 1002 tuner = tuner_0_table[tuner_format]; 1003 select_tuner( bktr, tuner ); 1004 goto checkDBX; 1005 } 1006 1007 if ( ((tuner_make == 0) || (tuner_make == 2)) 1008 && (tuner_format <= 9) && (tuner_tv_fm == 1) ) { 1009 tuner = tuner_0_fm_table[tuner_format]; 1010 select_tuner( bktr, tuner ); 1011 goto checkDBX; 1012 } 1013 1014 if ( (tuner_make == 1) && (tuner_format <= 9) ) { 1015 tuner = tuner_1_table[tuner_format]; 1016 select_tuner( bktr, tuner ); 1017 goto checkDBX; 1018 } 1019 1020 printf("%s: Warning - Unknown AVerMedia Tuner Make %d Format %d\n", 1021 bktr_name(bktr), tuner_make, tuner_format); 1022 } 1023 break; 1024 1025 case CARD_LEADTEK: 1026#if BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL 1027 select_tuner( bktr, PHILIPS_FR1216_PAL ); 1028#else 1029 select_tuner( bktr, PHILIPS_FR1236_NTSC ); 1030#endif 1031 goto checkDBX; 1032 break; 1033 1034 } /* end switch(card) */ 1035 1036 1037 /* At this point, a goto checkDBX has not occured */ 1038 /* We have not been able to select a Tuner */ 1039 /* Some cards make use of the tuner address to */ 1040 /* identify the make/model of tuner */ 1041 1042 /* At address 0xc0/0xc1 we often find a TEMIC NTSC */ 1043 if ( i2cRead( bktr, 0xc1 ) != ABSENT ) { 1044 select_tuner( bktr, TEMIC_NTSC ); 1045 goto checkDBX; 1046 } 1047 1048 /* At address 0xc6/0xc7 we often find a PHILIPS NTSC Tuner */ 1049 if ( i2cRead( bktr, 0xc7 ) != ABSENT ) { 1050 select_tuner( bktr, PHILIPS_NTSC ); 1051 goto checkDBX; 1052 } 1053 1054 /* Address 0xc2/0xc3 is default (or common address) for several */ 1055 /* tuners and we cannot tell which is which. */ 1056 /* And for all other tuner i2c addresses, select the default */ 1057 select_tuner( bktr, DEFAULT_TUNER ); 1058 1059 1060checkDBX: 1061#if defined( BKTR_OVERRIDE_DBX ) 1062 bktr->card.dbx = BKTR_OVERRIDE_DBX; 1063 goto checkMSP; 1064#endif 1065 /* Check for i2c devices */ 1066 if (!any_i2c_devices) { 1067 goto checkMSP; 1068 } 1069 1070 /* probe for BTSC (dbx) chip */ 1071 if ( i2cRead( bktr, TDA9850_RADDR ) != ABSENT ) 1072 bktr->card.dbx = 1; 1073 1074checkMSP: 1075 /* If this is a Hauppauge Bt878 card, we need to enable the 1076 * MSP 34xx audio chip. 1077 * If this is a Hauppauge Bt848 card, reset the MSP device. 1078 * The MSP reset line is wired to GPIO pin 5. On Bt878 cards a pulldown 1079 * resistor holds the device in reset until we set GPIO pin 5. 1080 */ 1081 1082 /* Optionally skip the MSP reset. This is handy if you initialise the 1083 * MSP audio in another operating system (eg Windows) first and then 1084 * do a soft reboot. 1085 */ 1086 1087#ifndef BKTR_NO_MSP_RESET 1088 if (card == CARD_HAUPPAUGE) { 1089 OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | (1<<5)); 1090 OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5)); /* write '1' */ 1091 DELAY(2500); /* wait 2.5ms */ 1092 OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) & ~(1<<5)); /* write '0' */ 1093 DELAY(2500); /* wait 2.5ms */ 1094 OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5)); /* write '1' */ 1095 DELAY(2500); /* wait 2.5ms */ 1096 } 1097#endif 1098 1099#if defined( BKTR_OVERRIDE_MSP ) 1100 bktr->card.msp3400c = BKTR_OVERRIDE_MSP; 1101 goto checkMSPEnd; 1102#endif 1103 1104 /* Check for i2c devices */ 1105 if (!any_i2c_devices) { 1106 goto checkMSPEnd; 1107 } 1108 1109 if ( i2cRead( bktr, MSP3400C_RADDR ) != ABSENT ) { 1110 bktr->card.msp3400c = 1; 1111 } 1112 1113checkMSPEnd: 1114 1115 if (bktr->card.msp3400c) { 1116 bktr->msp_addr = MSP3400C_WADDR; 1117 msp_read_id( bktr ); 1118 printf("%s: Detected a MSP%s at 0x%x\n", bktr_name(bktr), 1119 bktr->msp_version_string, 1120 bktr->msp_addr); 1121 1122 } 1123 1124/* Check for Dolby Surround Sound DPL3518A sound chip */ 1125 if ( i2cRead( bktr, DPL3518A_RADDR ) != ABSENT ) { 1126 bktr->card.dpl3518a = 1; 1127 } 1128 1129 if (bktr->card.dpl3518a) { 1130 bktr->dpl_addr = DPL3518A_WADDR; 1131 dpl_read_id( bktr ); 1132 printf("%s: Detected a DPL%s at 0x%x\n", bktr_name(bktr), 1133 bktr->dpl_version_string, 1134 bktr->dpl_addr); 1135 } 1136 1137/* Start of Check Remote */ 1138 /* Check for the Hauppauge IR Remote Control */ 1139 /* If there is an external unit, the internal will be ignored */ 1140 1141 bktr->remote_control = 0; /* initial value */ 1142 1143 if (any_i2c_devices) { 1144 if (i2cRead( bktr, HAUP_REMOTE_EXT_RADDR ) != ABSENT ) 1145 { 1146 bktr->remote_control = 1; 1147 bktr->remote_control_addr = HAUP_REMOTE_EXT_RADDR; 1148 } 1149 else if (i2cRead( bktr, HAUP_REMOTE_INT_RADDR ) != ABSENT ) 1150 { 1151 bktr->remote_control = 1; 1152 bktr->remote_control_addr = HAUP_REMOTE_INT_RADDR; 1153 } 1154 1155 } 1156 /* If a remote control is found, poll it 5 times to turn off the LED */ 1157 if (bktr->remote_control) { 1158 int i; 1159 for (i=0; i<5; i++) 1160 i2cRead( bktr, bktr->remote_control_addr ); 1161 } 1162/* End of Check Remote */ 1163 1164#if defined( BKTR_USE_PLL ) 1165 bktr->xtal_pll_mode = BT848_USE_PLL; 1166 goto checkPLLEnd; 1167#endif 1168 /* Default is to use XTALS and not PLL mode */ 1169 bktr->xtal_pll_mode = BT848_USE_XTALS; 1170 1171 /* Enable PLL mode for OSPREY users */ 1172 if (card == CARD_OSPREY) 1173 bktr->xtal_pll_mode = BT848_USE_PLL; 1174 1175 /* Enable PLL mode for Video Highway Xtreme users */ 1176 if (card == CARD_VIDEO_HIGHWAY_XTREME) 1177 bktr->xtal_pll_mode = BT848_USE_PLL; 1178 1179 1180 /* Most (perhaps all) Bt878 cards need to be switched to PLL mode */ 1181 /* as they only fit the NTSC crystal to their cards */ 1182 /* Default to enabling PLL mode for all Bt878/879 cards */ 1183 1184 if ((bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) ) 1185 bktr->xtal_pll_mode = BT848_USE_PLL; 1186 1187 1188#if defined( BKTR_USE_PLL ) 1189checkPLLEnd: 1190#endif 1191 1192 1193 bktr->card.tuner_pllAddr = tuner_i2c_address; 1194 1195 if ( verbose ) { 1196 printf( "%s: %s", bktr_name(bktr), bktr->card.name ); 1197 if ( bktr->card.tuner ) 1198 printf( ", %s tuner", bktr->card.tuner->name ); 1199 if ( bktr->card.dbx ) 1200 printf( ", dbx stereo" ); 1201 if ( bktr->card.msp3400c ) 1202 printf( ", msp3400c stereo" ); 1203 if ( bktr->card.dpl3518a ) 1204 printf( ", dpl3518a dolby" ); 1205 if ( bktr->remote_control ) 1206 printf( ", remote control" ); 1207 printf( ".\n" ); 1208 } 1209} 1210 1211#undef ABSENT
|