The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/bktr/bktr_card.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * 1. Redistributions of source code must retain the
    3  * Copyright (c) 1997 Amancio Hasty, 1999 Roger Hardiman
    4  * All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  * 1. Redistributions of source code must retain the above copyright
   10  *    notice, this list of conditions and the following disclaimer.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  * 3. All advertising materials mentioning features or use of this software
   15  *    must display the following acknowledgement:
   16  *      This product includes software developed by Amancio Hasty and
   17  *      Roger Hardiman
   18  * 4. The name of the author may not be used to endorse or promote products
   19  *    derived from this software without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   24  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   31  * POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 
   34 #include <sys/cdefs.h>
   35 __FBSDID("$FreeBSD$");
   36 
   37 /*
   38  * This is part of the Driver for Video Capture Cards (Frame grabbers)
   39  * and TV Tuner cards using the Brooktree Bt848, Bt848A, Bt849A, Bt878, Bt879
   40  * chipset.
   41  * Copyright Roger Hardiman and Amancio Hasty.
   42  *
   43  * bktr_card : This deals with identifying TV cards.
   44  *               trying to find the card make and model of card.
   45  *               trying to find the type of tuner fitted.
   46  *               reading the configuration EEPROM.
   47  *               locating i2c devices.
   48  */
   49 
   50 #include "opt_bktr.h"           /* Include any kernel config options */
   51 
   52 #include <sys/param.h>
   53 #include <sys/systm.h>
   54 
   55 #ifdef __FreeBSD__
   56 
   57 #if (__FreeBSD_version < 500000)
   58 #include <machine/clock.h>              /* for DELAY */
   59 #include <pci/pcivar.h>
   60 #else
   61 #include <sys/lock.h>
   62 #include <sys/mutex.h>
   63 #include <sys/selinfo.h>
   64 #include <dev/pci/pcivar.h>
   65 #endif
   66 
   67 #include <machine/bus_memio.h>  /* for bus space */
   68 #include <machine/bus.h>
   69 #include <sys/bus.h>
   70 #endif
   71 
   72 #ifdef __NetBSD__
   73 #include <dev/ic/bt8xx.h>       /* NetBSD location for .h files */
   74 #include <dev/pci/bktr/bktr_reg.h>
   75 #include <dev/pci/bktr/bktr_core.h>
   76 #include <dev/pci/bktr/bktr_tuner.h>
   77 #include <dev/pci/bktr/bktr_card.h>
   78 #include <dev/pci/bktr/bktr_audio.h>
   79 #else
   80 #include <dev/bktr/ioctl_meteor.h>
   81 #include <dev/bktr/ioctl_bt848.h>       /* extensions to ioctl_meteor.h */
   82 #include <dev/bktr/bktr_reg.h>
   83 #include <dev/bktr/bktr_core.h>
   84 #include <dev/bktr/bktr_tuner.h>
   85 #include <dev/bktr/bktr_card.h>
   86 #include <dev/bktr/bktr_audio.h>
   87 #endif
   88 
   89 /* Include the PCI Vendor definitions */
   90 #ifdef __NetBSD__
   91 #include <dev/pci/pcidevs.h>
   92 #include <dev/pci/pcireg.h>
   93 #endif
   94 
   95 /* Various defines */
   96 #define HAUP_REMOTE_INT_WADDR   0x30
   97 #define HAUP_REMOTE_INT_RADDR   0x31
   98  
   99 #define HAUP_REMOTE_EXT_WADDR   0x34
  100 #define HAUP_REMOTE_EXT_RADDR   0x35
  101 
  102 /* address of BTSC/SAP decoder chip */
  103 #define TDA9850_WADDR           0xb6 
  104 #define TDA9850_RADDR           0xb7
  105  
  106 /* address of MSP3400C chip */
  107 #define MSP3400C_WADDR          0x80
  108 #define MSP3400C_RADDR          0x81
  109  
  110 /* address of DPL3518A chip */
  111 #define DPL3518A_WADDR          0x84
  112 #define DPL3518A_RADDR          0x85
  113  
  114 /* EEProm (128 * 8) on an STB card */
  115 #define X24C01_WADDR            0xae
  116 #define X24C01_RADDR            0xaf
  117  
  118  
  119 /* EEProm (256 * 8) on a Hauppauge card */
  120 /* and on most BT878s cards to store the sub-system vendor id */
  121 #define PFC8582_WADDR           0xa0
  122 #define PFC8582_RADDR           0xa1
  123 
  124 #if BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL
  125 #define DEFAULT_TUNER   PHILIPS_PALI
  126 #else
  127 #define DEFAULT_TUNER   PHILIPS_NTSC
  128 #endif
  129 
  130 
  131 
  132 
  133 /*
  134  * the data for each type of card
  135  *
  136  * Note:
  137  *   these entried MUST be kept in the order defined by the CARD_XXX defines!
  138  */
  139 static const struct CARDTYPE cards[] = {
  140 
  141         {  CARD_UNKNOWN,                        /* the card id */
  142           "Unknown",                            /* the 'name' */
  143            NULL,                                /* the tuner */
  144            0,                                   /* the tuner i2c address */
  145            0,                                   /* dbx unknown */
  146            0,
  147            0,
  148            0,                                   /* EEProm unknown */
  149            0,                                   /* EEProm unknown */
  150            { 0, 0, 0, 0, 0 },
  151            0 },                                 /* GPIO mask */
  152 
  153         {  CARD_MIRO,                           /* the card id */
  154           "Pinnacle/Miro TV",                   /* the 'name' */
  155            NULL,                                /* the tuner */
  156            0,                                   /* the tuner i2c address */
  157            0,                                   /* dbx unknown */
  158            0,
  159            0,
  160            0,                                   /* EEProm unknown */
  161            0,                                   /* size unknown */
  162            { 0x02, 0x01, 0x00, 0x0a, 1 },       /* audio MUX values */
  163            0x0f },                              /* GPIO mask */
  164 
  165         {  CARD_HAUPPAUGE,                      /* the card id */
  166           "Hauppauge WinCast/TV",               /* the 'name' */
  167            NULL,                                /* the tuner */
  168            0,                                   /* the tuner i2c address */
  169            0,                                   /* dbx is optional */
  170            0,
  171            0,
  172            PFC8582_WADDR,                       /* EEProm type */
  173            (u_char)(256 / EEPROMBLOCKSIZE),     /* 256 bytes */
  174            { 0x00, 0x02, 0x01, 0x04, 1 },       /* audio MUX values */
  175            0x0f },                              /* GPIO mask */
  176 
  177         {  CARD_STB,                            /* the card id */
  178           "STB TV/PCI",                         /* the 'name' */
  179            NULL,                                /* the tuner */
  180            0,                                   /* the tuner i2c address */
  181            0,                                   /* dbx is optional */
  182            0,
  183            0,
  184            X24C01_WADDR,                        /* EEProm type */
  185            (u_char)(128 / EEPROMBLOCKSIZE),     /* 128 bytes */
  186            { 0x00, 0x01, 0x02, 0x02, 1 },       /* audio MUX values */
  187            0x0f },                              /* GPIO mask */
  188 
  189         {  CARD_INTEL,                          /* the card id */
  190           "Intel Smart Video III/VideoLogic Captivator PCI", /* the 'name' */
  191            NULL,                                /* the tuner */
  192            0,                                   /* the tuner i2c address */
  193            0,
  194            0,
  195            0,
  196            0,
  197            0,
  198            { 0, 0, 0, 0, 0 },                   /* audio MUX values */
  199            0x00 },                              /* GPIO mask */
  200 
  201         {  CARD_IMS_TURBO,                      /* the card id */
  202           "IMS TV Turbo",                       /* the 'name' */
  203            NULL,                                /* the tuner */
  204            0,                                   /* the tuner i2c address */
  205            0,                                   /* dbx is optional */
  206            0,
  207            0,
  208            PFC8582_WADDR,                       /* EEProm type */
  209            (u_char)(256 / EEPROMBLOCKSIZE),     /* 256 bytes */
  210            { 0x01, 0x02, 0x01, 0x00, 1 },       /* audio MUX values */
  211            0x0f },                              /* GPIO mask */
  212 
  213         {  CARD_AVER_MEDIA,                     /* the card id */
  214           "AVer Media TV/FM",                   /* the 'name' */
  215            NULL,                                /* the tuner */
  216            0,                                   /* the tuner i2c address */
  217            0,                                   /* dbx is optional */
  218            0,
  219            0,
  220            0,                                   /* EEProm type */
  221            0,                                   /* EEProm size */
  222            { 0x0c, 0x08, 0x04, 0x00, 1 },       /* audio MUX values */
  223            0x1f },                              /* GPIO mask */
  224 
  225         {  CARD_OSPREY,                         /* the card id */
  226           "MMAC Osprey",                        /* the 'name' */
  227            NULL,                                /* the tuner */
  228            0,                                   /* the tuner i2c address */
  229            0,                                   /* dbx is optional */
  230            0,
  231            0,
  232            PFC8582_WADDR,                       /* EEProm type */
  233            (u_char)(256 / EEPROMBLOCKSIZE),     /* 256 bytes */
  234            { 0x00, 0x00, 0x00, 0x00, 0 },       /* audio MUX values */
  235            0 },                                 /* GPIO mask */
  236 
  237         {  CARD_NEC_PK,                         /* the card id */
  238           "NEC PK-UG-X017",                     /* the 'name' */
  239            NULL,                                /* the tuner */
  240            0,                                   /* the tuner i2c address */
  241            0,                                   /* dbx is optional */
  242            0,
  243            0,
  244            0,                                   /* EEProm type */
  245            0,                                   /* EEProm size */
  246            { 0x01, 0x02, 0x01, 0x00, 1 },       /* audio MUX values */
  247            0x0f },                              /* GPIO mask */
  248 
  249         {  CARD_IO_BCTV2,                       /* the card id */
  250           "I/O DATA GV-BCTV2/PCI",              /* the 'name' */
  251            NULL,                                /* the tuner */
  252            0,                                   /* the tuner i2c address */
  253            0,                                   /* dbx is optional */
  254            0,
  255            0,
  256            0,                                   /* EEProm type */
  257            0,                                   /* EEProm size */
  258            { 0x00, 0x00, 0x00, 0x00, 1 },       /* Has special MUX handler */
  259            0x0f },                              /* GPIO mask */
  260 
  261         {  CARD_FLYVIDEO,                       /* the card id */
  262           "FlyVideo",                           /* the 'name' */
  263            NULL,                                /* the tuner */
  264            0,                                   /* the tuner i2c address */
  265            0,                                   /* dbx is optional */
  266            0,                                   /* msp34xx is optional */
  267            0,                                   /* dpl3518a is optional */
  268            0xac,                                /* EEProm type */
  269            (u_char)(256 / EEPROMBLOCKSIZE),     /* 256 bytes */
  270            { 0x000, 0x800, 0x400, 0x8dff00, 1 },/* audio MUX values */
  271            0x8dff00 },                          /* GPIO mask */
  272 
  273         {  CARD_ZOLTRIX,                        /* the card id */
  274           "Zoltrix",                            /* the 'name' */
  275            NULL,                                /* the tuner */
  276            0,                                   /* the tuner i2c address */
  277            0,                                   /* dbx is optional */
  278            0,                                   /* msp34xx is optional */
  279            0,                                   /* dpl3518a is optional */
  280            0,                                   /* EEProm type */
  281            0,                                   /* EEProm size */
  282            { 0x04, 0x01, 0x00, 0x0a, 1 },       /* audio MUX values */
  283            0x0f },                              /* GPIO mask */
  284 
  285         {  CARD_KISS,                           /* the card id */
  286           "KISS TV/FM PCI",                     /* the 'name' */
  287            NULL,                                /* the tuner */
  288            0,                                   /* the tuner i2c address */
  289            0,                                   /* dbx is optional */
  290            0,                                   /* msp34xx is optional */
  291            0,                                   /* dpl3518a is optional */
  292            0,                                   /* EEProm type */
  293            0,                                   /* EEProm size */
  294            { 0x0c, 0x00, 0x0b, 0x0b, 1 },       /* audio MUX values */
  295            0x0f },                              /* GPIO mask */
  296 
  297         {  CARD_VIDEO_HIGHWAY_XTREME,           /* the card id */
  298           "Video Highway Xtreme",               /* the 'name' */
  299            NULL,                                /* the tuner */
  300            0,
  301            0,
  302            0,
  303            0,
  304            0,                                   /* EEProm type */
  305            0,                                   /* EEProm size */
  306            { 0x00, 0x02, 0x01, 0x04, 1 },       /* audio MUX values */
  307            0x0f },                              /* GPIO mask */
  308 
  309         {  CARD_ASKEY_DYNALINK_MAGIC_TVIEW,     /* the card id */
  310           "Askey/Dynalink Magic TView",         /* the 'name' */
  311            NULL,                                /* the tuner */
  312            0,
  313            0,
  314            0,
  315            0,
  316            0,                                   /* EEProm type */
  317            0,                                   /* EEProm size */
  318            { 0x400, 0xE00, 0x400, 0xC00, 1 },   /* audio MUX values */
  319            0xE00 },                             /* GPIO mask */
  320 
  321         {  CARD_LEADTEK,                        /* the card id */
  322           "Leadtek Winfast TV 2000",            /* the 'name' */
  323            NULL,                                /* the tuner */
  324            0,
  325            0,
  326            0,
  327            0,
  328            0,                                   /* EEProm type */
  329            0,                                   /* EEProm size */
  330            /* Tuner, Extern, Intern, Mute, Enabled */
  331            { 0x621000, 0x621000, 0x621000, 0xE21000, 1 }, /* audio MUX values */
  332            0xfff000 },                          /* GPIO mask */
  333 
  334         {  CARD_TERRATVPLUS,                    /* the card id */
  335           "TerraTVplus",                        /* the 'name' */
  336            NULL,                                /* the tuner */
  337            0,
  338            0,
  339            0,
  340            0,
  341            0,                                   /* EEProm type */
  342            0,                                   /* EEProm size */
  343            { 0x20000, 0x00000, 0x30000, 0x40000, 1 }, /* audio MUX values*/
  344            0x70000 },                           /* GPIO mask */
  345 
  346         {  CARD_IO_BCTV3,                       /* the card id */
  347           "I/O DATA GV-BCTV3/PCI",              /* the 'name' */
  348            NULL,                                /* the tuner */
  349            0,                                   /* the tuner i2c address */
  350            0,                                   /* dbx is optional */
  351            0,
  352            0,
  353            0,                                   /* EEProm type */
  354            0,                                   /* EEProm size */
  355            /* Tuner, Extern, Intern, Mute, Enabled */
  356            { 0x10000, 0, 0x10000, 0, 1 },       /* audio MUX values */
  357            0x10f00 },                           /* GPIO mask */
  358 
  359         {  CARD_AOPEN_VA1000,                   /* the card id */
  360           "AOpen VA1000",                       /* the 'name' */
  361            NULL,                                /* the tuner */
  362            0,                                   /* the tuner i2c address */
  363            0,                                   /* dbx is optional */
  364            0,
  365            0,
  366            0,                                   /* EEProm unknown */
  367            0,                                   /* size unknown */
  368            { 0x02, 0x00, 0x00, 0x00, 1 },       /* audio MUX values */
  369            0x18e0 },                            /* GPIO mask */
  370 
  371         {  CARD_PINNACLE_PCTV_RAVE,             /* the card id */
  372           "Pinnacle PCTV Rave",                 /* the 'name' */
  373            NULL,                                /* the tuner */
  374            0,                                   /* the tuner i2c address */
  375            0,                                   /* dbx unknown */
  376            0,
  377            0,
  378            0,                                   /* EEProm unknown */
  379            0,                                   /* size unknown */
  380            { 0x02, 0x01, 0x00, 0x0a, 1 },       /* audio MUX values */
  381            0x03000F },                          /* GPIO mask */
  382 
  383         {  CARD_PIXELVIEW_PLAYTV_PAK,       /* the card id */
  384            "PixelView PlayTV Pak",              /* the 'name' */
  385             NULL,                               /* the tuner */
  386             0,                                  /* the tuner i2c address */
  387             0,                                  /* dbx is optional */
  388             0,
  389             0,
  390             PFC8582_WADDR,                      /* EEProm type */
  391             (u_char)(256 / EEPROMBLOCKSIZE),    /* 256 bytes */
  392             { 0x20000, 0x80000, 0, 0xa8000, 1 },        /* audio MUX values */
  393             0xAA0000 },                         /* GPIO mask */
  394 
  395 };
  396 
  397 struct bt848_card_sig bt848_card_signature[1]= {
  398   /* IMS TURBO TV : card 5 */
  399     {  5,9, {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 02, 00, 00, 00}}
  400 
  401 
  402 };
  403 
  404 
  405 /*
  406  * Write to the configuration EEPROM on the card.
  407  * This is dangerous and will mess up your card. Therefore it is not
  408  * implemented.
  409  */
  410 int      
  411 writeEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data )
  412 {
  413         return( -1 );
  414 }
  415 
  416 /*
  417  * Read the contents of the configuration EEPROM on the card.
  418  * (This is not fitted to all makes of card. All Hauppauge cards have them
  419  * and so do newer Bt878 based cards.
  420  */
  421 int
  422 readEEProm( bktr_ptr_t bktr, int offset, int count, u_char *data )
  423 {
  424         int     x;
  425         int     addr;
  426         int     max;
  427         int     byte;
  428 
  429         /* get the address of the EEProm */
  430         addr = (int)(bktr->card.eepromAddr & 0xff);
  431         if ( addr == 0 )
  432                 return( -1 );
  433 
  434         max = (int)(bktr->card.eepromSize * EEPROMBLOCKSIZE);
  435         if ( (offset + count) > max )
  436                 return( -1 );
  437 
  438         /* set the start address */
  439         if ( i2cWrite( bktr, addr, offset, -1 ) == -1 )
  440                 return( -1 );
  441 
  442         /* the read cycle */
  443         for ( x = 0; x < count; ++x ) {
  444                 if ( (byte = i2cRead( bktr, (addr | 1) )) == -1 )
  445                         return( -1 );
  446                 data[ x ] = byte;
  447         }
  448 
  449         return( 0 );
  450 }
  451 
  452 
  453 #define ABSENT          (-1)
  454 
  455 /*
  456  * get a signature of the card
  457  * read all 128 possible i2c read addresses from 0x01 thru 0xff
  458  * build a bit array with a 1 bit for each i2c device that responds
  459  *
  460  * XXX FIXME: use offset & count args
  461  */
  462 int
  463 signCard( bktr_ptr_t bktr, int offset, int count, u_char* sig )
  464 {
  465         int     x;
  466 
  467         for ( x = 0; x < 16; ++x )
  468                 sig[ x ] = 0;
  469 
  470         for ( x = 0; x < count; ++x ) {
  471                 if ( i2cRead( bktr, (2 * x) + 1 ) != ABSENT ) {
  472                         sig[ x / 8 ] |= (1 << (x % 8) );
  473                 }
  474         }
  475 
  476         return( 0 );
  477 }
  478 
  479 
  480 /*
  481  * check_for_i2c_devices.
  482  * Some BT848 cards have no tuner and no additional i2c devices
  483  * eg stereo decoder. These are used for video conferencing or capture from
  484  * a video camera. (eg VideoLogic Captivator PCI, Intel SmartCapture card).
  485  *
  486  * Determine if there are any i2c devices present. There are none present if
  487  *  a) reading from all 128 devices returns ABSENT (-1) for each one
  488  *     (eg VideoLogic Captivator PCI with BT848)
  489  *  b) reading from all 128 devices returns 0 for each one
  490  *     (eg VideoLogic Captivator PCI rev. 2F with BT848A)
  491  */
  492 static int check_for_i2c_devices( bktr_ptr_t bktr ){
  493   int x, temp_read;
  494   int i2c_all_0 = 1;
  495   int i2c_all_absent = 1;
  496   for ( x = 0; x < 128; ++x ) {
  497     temp_read = i2cRead( bktr, (2 * x) + 1 );
  498     if (temp_read != 0)      i2c_all_0 = 0;
  499     if (temp_read != ABSENT) i2c_all_absent = 0;
  500   }
  501 
  502   if ((i2c_all_0) || (i2c_all_absent)) return 0;
  503   else return 1;
  504 }
  505 
  506 
  507 /*
  508  * Temic/Philips datasheets say tuners can be at i2c addresses 0xc0, 0xc2,
  509  * 0xc4 or 0xc6, settable by links on the tuner.
  510  * Determine the actual address used on the TV card by probing read addresses.
  511  */
  512 static int locate_tuner_address( bktr_ptr_t bktr) {
  513   if (i2cRead( bktr, 0xc1) != ABSENT) return 0xc0;
  514   if (i2cRead( bktr, 0xc3) != ABSENT) return 0xc2;
  515   if (i2cRead( bktr, 0xc5) != ABSENT) return 0xc4;
  516   if (i2cRead( bktr, 0xc7) != ABSENT) return 0xc6;
  517   return -1; /* no tuner found */
  518 }
  519 
  520  
  521 /*
  522  * Search for a configuration EEPROM on the i2c bus by looking at i2c addresses
  523  * where EEPROMs are usually found.
  524  * On some cards, the EEPROM appears in several locations, but all in the
  525  * range 0xa0 to 0xae.
  526  */
  527 static int locate_eeprom_address( bktr_ptr_t bktr) {
  528   if (i2cRead( bktr, 0xa0) != ABSENT) return 0xa0;
  529   if (i2cRead( bktr, 0xac) != ABSENT) return 0xac;
  530   if (i2cRead( bktr, 0xae) != ABSENT) return 0xae;
  531   return -1; /* no eeprom found */
  532 }
  533 
  534 
  535 /*
  536  * determine the card brand/model
  537  * BKTR_OVERRIDE_CARD, BKTR_OVERRIDE_TUNER, BKTR_OVERRIDE_DBX and
  538  * BKTR_OVERRIDE_MSP can be used to select a specific device,
  539  * regardless of the autodetection and i2c device checks.
  540  *
  541  * The scheme used for probing cards faces these problems:
  542  *  It is impossible to work out which type of tuner is actually fitted,
  543  *  (the driver cannot tell if the Tuner is PAL or NTSC, Temic or Philips)
  544  *  It is impossible to determine what audio-mux hardware is connected.
  545  *  It is impossible to determine if there is extra hardware connected to the
  546  *  GPIO pins  (eg radio chips or MSP34xx reset logic)
  547  *
  548  * However some makes of card (eg Hauppauge) come with a configuration eeprom
  549  * which tells us the make of the card. Most eeproms also tell us the
  550  * tuner type and other features of the the cards.
  551  *
  552  * The current probe code works as follows
  553  * A) If the card uses a Bt878/879:
  554  *   1) Read the sub-system vendor id from the configuration EEPROM.
  555  *      Select the required tuner, audio mux arrangement and any other
  556  *      onboard features. If this fails, move to step B.
  557  * B) If it card uses a Bt848, 848A, 849A or an unknown Bt878/879:
  558  *   1) Look for I2C devices. If there are none fitted, it is an Intel or
  559  *      VideoLogic cards.
  560  *   2) Look for a configuration EEPROM.
  561  *   2a) If there is one at I2C address 0xa0 it may be
  562  *       a Hauppauge or an Osprey. Check the EEPROM contents to determine which
  563  *       one it is. For Hauppauge, select the tuner type and audio hardware.
  564  *   2b) If there is an EEPROM at I2C address 0xa8 it will be an STB card.
  565  *       We still have to guess on the tuner type.
  566  *              
  567  * C) If we do not know the card type from (A) or (B), guess at the tuner
  568  *    type based on the I2C address of the tuner.
  569  *
  570  * D) After determining the Tuner Type, we probe the i2c bus for other
  571  *    devices at known locations, eg IR-Remote Control, MSP34xx and TDA
  572  *    stereo chips.
  573  */
  574 
  575 
  576 /*
  577  * These are the sub-system vendor ID codes stored in the
  578  * configuration EEPROM used on Bt878/879 cards. They should match the
  579  * number assigned to the company by the PCI Special Interest Group
  580  */
  581 #ifndef __NetBSD__
  582 #define PCI_VENDOR_HAUPPAUGE    0x0070
  583 #define PCI_VENDOR_AVERMEDIA    0x1461
  584 #define PCI_VENDOR_STB          0x10B4
  585 #define PCI_VENDOR_ASKEY        0x144F
  586 #endif
  587 /* Following not confirmed with http://members.hyperlink.net.au/~chart,
  588    so not added to NetBSD's pcidevs */
  589 #define PCI_VENDOR_LEADTEK_ALT  0x6606
  590 #define PCI_VENDOR_LEADTEK_ALT_2        0x6607
  591 #define PCI_VENDOR_LEADTEK_ALT_3        0x107d
  592 #define PCI_VENDOR_FLYVIDEO     0x1851
  593 #define PCI_VENDOR_FLYVIDEO_2   0x1852
  594 #define PCI_VENDOR_IODATA       0x10fc
  595 #define PCI_VENDOR_PINNACLE_ALT 0xBD11  /* They got their own ID backwards? */
  596 #define PCI_VENDOR_PINNACLE_NEW 0x11BD
  597 
  598 #define MODEL_IODATA_GV_BCTV3_PCI       0x4020
  599 
  600 void
  601 probeCard( bktr_ptr_t bktr, int verbose, int unit )
  602 {
  603         int             card, i,j, card_found;
  604         int             status;
  605         u_char          probe_signature[128], *probe_temp;
  606         int             any_i2c_devices;
  607         u_char          eeprom[256];
  608         int             tuner_i2c_address = -1;
  609         int             eeprom_i2c_address = -1;
  610 
  611         /* Select all GPIO bits as inputs */
  612         OUTL(bktr, BKTR_GPIO_OUT_EN, 0);
  613         if (bootverbose)
  614             printf("%s: GPIO is 0x%08x\n", bktr_name(bktr),
  615                    INL(bktr, BKTR_GPIO_DATA)); 
  616 
  617 #ifdef HAUPPAUGE_MSP_RESET
  618         /* Reset the MSP34xx audio chip. This resolves bootup card
  619          * detection problems with old Bt848 based Hauppauge cards with
  620          * MSP34xx stereo audio chips. This must be user enabled because
  621          * at this point the probe function does not know the card type. */
  622         OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | (1<<5));
  623         OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5));  /* write '1' */
  624         DELAY(2500); /* wait 2.5ms */
  625         OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) & ~(1<<5)); /* write '' */
  626         DELAY(2500); /* wait 2.5ms */
  627         OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5));  /* write '1' */
  628         DELAY(2500); /* wait 2.5ms */
  629 #endif
  630 
  631         /* Check for the presence of i2c devices */
  632         any_i2c_devices = check_for_i2c_devices( bktr );
  633 
  634 
  635         /* Check for a user specified override on the card selection */
  636 #if defined( BKTR_OVERRIDE_CARD )
  637         bktr->card = cards[ (card = BKTR_OVERRIDE_CARD) ];
  638         goto checkEEPROM;
  639 #endif
  640         if (bktr->bt848_card != -1 ) {
  641           bktr->card = cards[ (card = bktr->bt848_card) ];
  642           goto checkEEPROM;
  643         }
  644 
  645 
  646         /* No override, so try and determine the make of the card */
  647 
  648         /* On BT878/879 cards, read the sub-system vendor id */
  649         /* This identifies the manufacturer of the card and the model */
  650         /* In theory this can be read from PCI registers but this does not */
  651         /* appear to work on the FlyVideo 98. Hauppauge also warned that */
  652         /* the PCI registers are sometimes not loaded correctly. */
  653         /* Therefore, I will read the sub-system vendor ID from the EEPROM */
  654         /* (just like the Bt878 does during power up initialisation) */
  655 
  656         if ((bktr->id==BROOKTREE_878) || (bktr->id==BROOKTREE_879)) {
  657             /* Try and locate the EEPROM */
  658             eeprom_i2c_address = locate_eeprom_address( bktr );
  659             if (eeprom_i2c_address != -1) {
  660 
  661                 unsigned int subsystem_vendor_id; /* vendors PCI-SIG ID */
  662                 unsigned int subsystem_id;        /* board model number */
  663                 unsigned int byte_252, byte_253, byte_254, byte_255;
  664 
  665                 bktr->card = cards[ (card = CARD_UNKNOWN) ];
  666                 bktr->card.eepromAddr = eeprom_i2c_address;
  667                 bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  668 
  669                 readEEProm(bktr, 0, 256, (u_char *) &eeprom );
  670                 byte_252 = (unsigned int)eeprom[252];
  671                 byte_253 = (unsigned int)eeprom[253];
  672                 byte_254 = (unsigned int)eeprom[254];
  673                 byte_255 = (unsigned int)eeprom[255];
  674                 
  675                 subsystem_id        = (byte_252 << 8) | byte_253;
  676                 subsystem_vendor_id = (byte_254 << 8) | byte_255;
  677 
  678                 if ( bootverbose ) 
  679                     printf("%s: subsystem 0x%04x 0x%04x\n", bktr_name(bktr),
  680                            subsystem_vendor_id, subsystem_id);
  681 
  682                 if (subsystem_vendor_id == PCI_VENDOR_AVERMEDIA) {
  683                     bktr->card = cards[ (card = CARD_AVER_MEDIA) ];
  684                     bktr->card.eepromAddr = eeprom_i2c_address;
  685                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  686                     goto checkTuner;
  687                 }
  688 
  689                 if (subsystem_vendor_id == PCI_VENDOR_HAUPPAUGE) {
  690                     bktr->card = cards[ (card = CARD_HAUPPAUGE) ];
  691                     bktr->card.eepromAddr = eeprom_i2c_address;
  692                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  693                     goto checkTuner;
  694                 }
  695 
  696                 if ((subsystem_vendor_id == PCI_VENDOR_FLYVIDEO)
  697                  || (subsystem_vendor_id == PCI_VENDOR_FLYVIDEO_2) ) {
  698                     bktr->card = cards[ (card = CARD_FLYVIDEO) ];
  699                     bktr->card.eepromAddr = eeprom_i2c_address;
  700                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  701                     goto checkTuner;
  702                 }
  703 
  704                 if (subsystem_vendor_id == PCI_VENDOR_STB) {
  705                     bktr->card = cards[ (card = CARD_STB) ];
  706                     bktr->card.eepromAddr = eeprom_i2c_address;
  707                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  708                     goto checkTuner;
  709                 }
  710 
  711                 if (subsystem_vendor_id == PCI_VENDOR_ASKEY) {
  712                     bktr->card = cards[ (card = CARD_ASKEY_DYNALINK_MAGIC_TVIEW) ];
  713                     bktr->card.eepromAddr = eeprom_i2c_address;
  714                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  715                     goto checkTuner;
  716                 }
  717 
  718                 if ((subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT)
  719                  || (subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT_2)
  720                  || (subsystem_vendor_id == PCI_VENDOR_LEADTEK_ALT_3)) {
  721                     bktr->card = cards[ (card = CARD_LEADTEK) ];
  722                     bktr->card.eepromAddr = eeprom_i2c_address;
  723                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  724                     goto checkTuner;
  725                 }
  726 
  727                 if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_ALT ||
  728                     subsystem_vendor_id == PCI_VENDOR_PINNACLE_NEW) {
  729                     bktr->card = cards[ (card = CARD_MIRO) ];
  730                     bktr->card.eepromAddr = eeprom_i2c_address;
  731                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  732                     goto checkTuner;
  733                 }
  734 
  735                 if (subsystem_vendor_id == PCI_VENDOR_IODATA &&
  736                     subsystem_id == MODEL_IODATA_GV_BCTV3_PCI) {
  737                     bktr->card = cards[ (card = CARD_IO_BCTV3) ];
  738                     bktr->card.eepromAddr = eeprom_i2c_address;
  739                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  740                     goto checkTuner;
  741                 }
  742 
  743                 /* Vendor is unknown. We will use the standard probe code */
  744                 /* which may not give best results */
  745                 printf("%s: Warning - card vendor 0x%04x (model 0x%04x) unknown.\n",
  746                        bktr_name(bktr), subsystem_vendor_id, subsystem_id);
  747             }
  748             else
  749             {
  750                 printf("%s: Card has no configuration EEPROM. Cannot determine card make.\n",
  751                        bktr_name(bktr));
  752             }
  753         } /* end of bt878/bt879 card detection code */
  754 
  755         /* If we get to this point, we must have a Bt848/848A/849A card */
  756         /* or a Bt878/879 with an unknown subsystem vendor id */
  757         /* Try and determine the make of card by clever i2c probing */
  758 
  759         /* Check for i2c devices. If none, move on */
  760         if (!any_i2c_devices) {
  761                 bktr->card = cards[ (card = CARD_INTEL) ];
  762                 bktr->card.eepromAddr = 0;
  763                 bktr->card.eepromSize = 0;
  764                 goto checkTuner;
  765         }
  766 
  767         /* Look for Hauppauge, STB and Osprey cards by the presence */
  768         /* of an EEPROM */
  769         /* Note: Bt878 based cards also use EEPROMs so we can only do this */
  770         /* test on BT848/848A and 849A based cards. */
  771         if ((bktr->id==BROOKTREE_848)  ||
  772             (bktr->id==BROOKTREE_848A) ||
  773             (bktr->id==BROOKTREE_849A)) {
  774 
  775             /* At i2c address 0xa0, look for Hauppauge and Osprey cards */
  776             if ( (status = i2cRead( bktr, PFC8582_RADDR )) != ABSENT ) {
  777 
  778                     /* Read the eeprom contents */
  779                     bktr->card = cards[ (card = CARD_UNKNOWN) ];
  780                     bktr->card.eepromAddr = PFC8582_WADDR;
  781                     bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  782                     readEEProm(bktr, 0, 128, (u_char *) &eeprom );
  783 
  784                     /* For Hauppauge, check the EEPROM begins with 0x84 */
  785                     if (eeprom[0] == 0x84) {
  786                             bktr->card = cards[ (card = CARD_HAUPPAUGE) ];
  787                             bktr->card.eepromAddr = PFC8582_WADDR;
  788                             bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  789                             goto checkTuner;
  790                     }
  791 
  792                     /* For Osprey, check the EEPROM begins with "MMAC" */
  793                     if (  (eeprom[0] == 'M') &&(eeprom[1] == 'M')
  794                         &&(eeprom[2] == 'A') &&(eeprom[3] == 'C')) {
  795                             bktr->card = cards[ (card = CARD_OSPREY) ];
  796                             bktr->card.eepromAddr = PFC8582_WADDR;
  797                             bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  798                             goto checkTuner;
  799                     }
  800                     printf("%s: Warning: Unknown card type. EEPROM data not recognised\n",
  801                            bktr_name(bktr));
  802                     printf("%s: %x %x %x %x\n", bktr_name(bktr),
  803                            eeprom[0],eeprom[1],eeprom[2],eeprom[3]);
  804             }
  805 
  806             /* look for an STB card */
  807             if ( (status = i2cRead( bktr, X24C01_RADDR )) != ABSENT ) {
  808                     bktr->card = cards[ (card = CARD_STB) ];
  809                     bktr->card.eepromAddr = X24C01_WADDR;
  810                     bktr->card.eepromSize = (u_char)(128 / EEPROMBLOCKSIZE);
  811                     goto checkTuner;
  812             }
  813 
  814         }
  815 
  816         signCard( bktr, 1, 128, (u_char *)  &probe_signature );
  817 
  818         if (bootverbose) {
  819           printf("%s: card signature: ", bktr_name(bktr));
  820           for (j = 0; j < Bt848_MAX_SIGN; j++) {
  821             printf(" %02x ", probe_signature[j]);
  822           }
  823           printf("\n\n");
  824         }
  825         for (i = 0;
  826              i < (sizeof bt848_card_signature)/ sizeof (struct bt848_card_sig);
  827              i++ ) {
  828 
  829           card_found = 1;
  830           probe_temp = (u_char *) &bt848_card_signature[i].signature;
  831 
  832           for (j = 0; j < Bt848_MAX_SIGN; j++) {
  833             if ((probe_temp[j] & 0xf) != (probe_signature[j] & 0xf)) {
  834               card_found = 0;
  835               break;
  836             }
  837 
  838           }
  839           if (card_found) {
  840             bktr->card = cards[ card = bt848_card_signature[i].card];
  841             eeprom_i2c_address = locate_eeprom_address( bktr );
  842             if (eeprom_i2c_address != -1) {
  843                 bktr->card.eepromAddr = eeprom_i2c_address;
  844                 bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  845             } else {
  846                 bktr->card.eepromAddr = 0;
  847                 bktr->card.eepromSize = 0;
  848             }
  849             tuner_i2c_address = locate_tuner_address( bktr );   
  850             select_tuner( bktr, bt848_card_signature[i].tuner );
  851             goto checkDBX;
  852           }
  853         }
  854 
  855         /* We do not know the card type. Default to Miro */
  856         bktr->card = cards[ (card = CARD_MIRO) ];
  857 
  858 
  859 checkEEPROM:
  860         /* look for a configuration eeprom */
  861         eeprom_i2c_address = locate_eeprom_address( bktr );
  862         if (eeprom_i2c_address != -1) {
  863             bktr->card.eepromAddr = eeprom_i2c_address;
  864             bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
  865         } else {
  866             bktr->card.eepromAddr = 0;
  867             bktr->card.eepromSize = 0;
  868         }
  869 
  870 
  871 checkTuner:
  872 
  873         if (card == CARD_MIRO && mt2032_init(bktr) == 0) {
  874                 bktr->card = cards[ (card = CARD_PINNACLE_PCTV_RAVE) ];
  875                 select_tuner( bktr, TUNER_MT2032 );
  876                 goto checkDBX;
  877         }
  878 
  879         /* look for a tuner */
  880         tuner_i2c_address = locate_tuner_address( bktr );
  881         if ( tuner_i2c_address == -1 ) {
  882                 select_tuner( bktr, NO_TUNER );
  883                 goto checkDBX;
  884         }
  885 
  886 #if defined( BKTR_OVERRIDE_TUNER )
  887         select_tuner( bktr, BKTR_OVERRIDE_TUNER );
  888         goto checkDBX;
  889 #endif
  890         if (bktr->bt848_tuner != -1 ) {
  891           select_tuner( bktr, bktr->bt848_tuner & 0xff );
  892           goto checkDBX;
  893         }
  894 
  895         /* Check for i2c devices */
  896         if (!any_i2c_devices) {
  897                 select_tuner( bktr, NO_TUNER );
  898                 goto checkDBX;
  899         }
  900 
  901         /* differentiate type of tuner */
  902 
  903         switch (card) {
  904         case CARD_MIRO:
  905             switch (((INL(bktr, BKTR_GPIO_DATA) >> 10)-1)&7) {
  906             case 0: select_tuner( bktr, TEMIC_PAL ); break;
  907             case 1: select_tuner( bktr, PHILIPS_PAL ); break;
  908             case 2: select_tuner( bktr, PHILIPS_NTSC ); break;
  909             case 3: select_tuner( bktr, PHILIPS_SECAM ); break;
  910             case 4: select_tuner( bktr, NO_TUNER ); break;
  911             case 5: select_tuner( bktr, PHILIPS_PALI ); break;
  912             case 6: select_tuner( bktr, TEMIC_NTSC ); break;
  913             case 7: select_tuner( bktr, TEMIC_PALI ); break;
  914             }
  915             goto checkDBX;
  916             break;
  917 
  918         case CARD_HAUPPAUGE:
  919             /* Hauppauge kindly supplied the following Tuner Table */
  920             /* FIXME: I think the tuners the driver selects for types */
  921             /* 0x08 and 0x15 may be incorrect but no one has complained. */
  922             /* Old Temic tuners had their own API, but newer Temic tuners */
  923             /* have the same API as Philips tuners */
  924             /*
  925   ID  Tuner Model           Format                      We select Format
  926  0x00 NONE               
  927  0x01 EXTERNAL             
  928  0x02 OTHER                
  929  0x03 Philips FI1216        BG 
  930  0x04 Philips FI1216MF      BGLL'                       PHILIPS_SECAM
  931  0x05 Philips FI1236        MN                          PHILIPS_NTSC
  932  0x06 Philips FI1246        I                           PHILIPS_PALI
  933  0x07 Philips FI1256        DK 
  934  0x08 Philips FI1216 MK2    BG                          PHILIPS_PALI
  935  0x09 Philips FI1216MF MK2  BGLL'                       PHILIPS_SECAM
  936  0x0a Philips FI1236 MK2    MN                          PHILIPS_NTSC
  937  0x0b Philips FI1246 MK2    I                           PHILIPS_PALI
  938  0x0c Philips FI1256 MK2    DK 
  939  0x0d Temic 4032FY5         NTSC                        TEMIC_NTSC
  940  0x0e Temic 4002FH5         BG                          TEMIC_PAL
  941  0x0f Temic 4062FY5         I                           TEMIC_PALI
  942  0x10 Philips FR1216 MK2    BG 
  943  0x11 Philips FR1216MF MK2  BGLL'                       PHILIPS_FR1236_SECAM
  944  0x12 Philips FR1236 MK2    MN                          PHILIPS_FR1236_NTSC
  945  0x13 Philips FR1246 MK2    I 
  946  0x14 Philips FR1256 MK2    DK 
  947  0x15 Philips FM1216        BG                          PHILIPS_FR1216_PAL
  948  0x16 Philips FM1216MF      BGLL'                       PHILIPS_FR1236_SECAM
  949  0x17 Philips FM1236        MN                          PHILIPS_FR1236_NTSC
  950  0x18 Philips FM1246        I 
  951  0x19 Philips FM1256        DK 
  952  0x1a Temic 4036FY5         MN (FI1236 MK2 clone)       PHILIPS_NTSC
  953  0x1b Samsung TCPN9082D     MN 
  954  0x1c Samsung TCPM9092P     Pal BG/I/DK 
  955  0x1d Temic 4006FH5         BG                          PHILIPS_PALI
  956  0x1e Samsung TCPN9085D     MN/Radio 
  957  0x1f Samsung TCPB9085P     Pal BG/I/DK / Radio 
  958  0x20 Samsung TCPL9091P     Pal BG & Secam L/L' 
  959  0x21 Temic 4039FY5         NTSC Radio
  960  0x22 Philips FQ1216ME      Pal BGIDK & Secam L/L' 
  961  0x23 Temic 4066FY5         Pal I (FI1246 MK2 clone)    PHILIPS_PALI
  962  0x24 Philips TD1536        MN/ATSCDigital
  963  0x25 Philips TD1536D       MN/ATSCDigital DUAL INPUT
  964  0x26 Philips FMR1236       M/N FM(no demod)
  965  0x27 Philips FI1256MP      B/G, D/K
  966  0x28 Samsung TCPQ9091P     BG/I/DK, L/L'
  967  0x29 Temic 4006FN5         BG/I/DK
  968  0x2a Temic 4009FR5         BG FM                       PHILIPS_FR1216_PAL
  969  0x2b Temic 4046FM5         B/G, I, D/K, L/L'
  970  0x2c Temic 4009FN5         B/G, I, D/K, FM (no demod)
  971  0x2d Philips TD1536D_FH_44 MN/ATSCDigital DUAL INPUT
  972             */
  973 
  974 
  975             /* Determine the model number from the eeprom */
  976             if (bktr->card.eepromAddr != 0) {
  977                 /* eeprom data block structure */
  978                 unsigned char *block_1, *block_2, *block_3, *block_4;
  979                 int block_1_data_size,  block_2_data_size, block_3_data_size;
  980                 int block_1_total_size, block_2_total_size, block_3_total_size;
  981                 int block_4_header_size;
  982 
  983                 unsigned int model,revision;
  984                 unsigned char tuner_code;
  985                 unsigned char no_audio_mux;
  986 
  987                 readEEProm(bktr, 0, 128, (u_char *) &eeprom );
  988 
  989                 /* LOCATE THE EEPROM DATA BLOCKS */
  990                 block_1 = &eeprom[0];
  991                 block_1_data_size = (block_1[2] << 8 | block_1[1]);
  992                 block_1_total_size = block_1_data_size + 3; /* Header bytes */   
  993     
  994                 block_2 = &eeprom[block_1_total_size];
  995                 block_2_data_size = (block_2[2] << 8 | block_2[1]);
  996                 block_2_total_size = block_2_data_size + 3; /* Header bytes */
  997     
  998                 block_3 = &eeprom[block_1_total_size + block_2_total_size];
  999                 block_3_data_size = (block_3[0] &0x07);
 1000                 block_3_total_size = block_3_data_size + 1; /* Header size */
 1001 
 1002                 block_4 = &eeprom[block_1_total_size +block_2_total_size +block_3_total_size];
 1003                 block_4_header_size = 1;
 1004 
 1005                 model    = (block_1[12] << 8  | block_1[11]);
 1006                 revision = (block_1[15] << 16 | block_1[14] << 8 | block_1[13]);
 1007 
 1008                 tuner_code = block_1[9];
 1009 
 1010                 no_audio_mux = ((block_3[3] >> 7) &0x01);
 1011 
 1012                 if (no_audio_mux) bktr->audio_mux_present = 0;
 1013                
 1014                 if (verbose)
 1015                     printf("%s: Hauppauge Model %d %c%c%c%c\n",
 1016                            bktr_name(bktr),
 1017                            model,
 1018                            ((revision >> 18) & 0x3f) + 32,
 1019                            ((revision >> 12) & 0x3f) + 32,
 1020                            ((revision >>  6) & 0x3f) + 32,
 1021                            ((revision >>  0) & 0x3f) + 32 );
 1022 
 1023                 /* Determine the tuner type from the eeprom */
 1024 
 1025                 switch (tuner_code) {
 1026 
 1027                   case 0x5:
 1028                   case 0x0a:
 1029                   case 0x1a:
 1030                     select_tuner( bktr, PHILIPS_NTSC );
 1031                     goto checkDBX;
 1032 
 1033                   case 0x4:
 1034                   case 0x9:
 1035                     select_tuner( bktr, PHILIPS_SECAM );
 1036                     goto checkDBX;
 1037 
 1038                   case 0x11:
 1039                   case 0x16:
 1040                     select_tuner( bktr, PHILIPS_FR1236_SECAM );
 1041                     goto checkDBX;
 1042 
 1043                   case 0x12:
 1044                   case 0x17:
 1045                   case 0x21:
 1046                     select_tuner( bktr, PHILIPS_FR1236_NTSC );
 1047                     goto checkDBX;
 1048 
 1049                   case 0x6:
 1050                   case 0x8:
 1051                   case 0xb:
 1052                   case 0x1d:
 1053                   case 0x23:
 1054                     select_tuner( bktr, PHILIPS_PALI );
 1055                     goto checkDBX;
 1056 
 1057                   case 0xd:
 1058                     select_tuner( bktr, TEMIC_NTSC );
 1059                     goto checkDBX;
 1060 
 1061                   case 0xe:
 1062                     select_tuner( bktr, TEMIC_PAL );
 1063                     goto checkDBX;
 1064 
 1065                   case 0xf:
 1066                     select_tuner( bktr, TEMIC_PALI );
 1067                     goto checkDBX;
 1068 
 1069                   case 0x15:
 1070                     select_tuner( bktr, PHILIPS_FR1216_PAL );
 1071                     goto checkDBX;
 1072 
 1073                   case 0x2a:
 1074                     bktr->msp_use_mono_source = 1;
 1075                     select_tuner( bktr, PHILIPS_FR1216_PAL );
 1076                     goto checkDBX;
 1077 
 1078                   default :
 1079                     printf("%s: Warning - Unknown Hauppauge Tuner 0x%x\n",
 1080                            bktr_name(bktr), tuner_code);
 1081                 }
 1082             }
 1083             break;
 1084 
 1085 
 1086         case CARD_AVER_MEDIA:
 1087             /* AVerMedia kindly supplied some details of their EEPROM contents
 1088              * which allow us to auto select the Tuner Type.
 1089              * Only the newer AVerMedia cards actually have an EEPROM.
 1090              */
 1091             if (bktr->card.eepromAddr != 0) {
 1092 
 1093                 u_char tuner_make;   /* Eg Philips, Temic */
 1094                 u_char tuner_tv_fm;  /* TV or TV with FM Radio */
 1095                 u_char tuner_format; /* Eg NTSC, PAL, SECAM */
 1096                 int    tuner;
 1097 
 1098                 int tuner_0_table[] = {
 1099                         PHILIPS_NTSC,  PHILIPS_PAL,
 1100                         PHILIPS_PAL,   PHILIPS_PAL,
 1101                         PHILIPS_PAL,   PHILIPS_PAL,
 1102                         PHILIPS_SECAM, PHILIPS_SECAM,
 1103                         PHILIPS_SECAM, PHILIPS_PAL};
 1104 
 1105                 int tuner_0_fm_table[] = {
 1106                         PHILIPS_FR1236_NTSC,  PHILIPS_FR1216_PAL,
 1107                         PHILIPS_FR1216_PAL,   PHILIPS_FR1216_PAL,
 1108                         PHILIPS_FR1216_PAL,   PHILIPS_FR1216_PAL,
 1109                         PHILIPS_FR1236_SECAM, PHILIPS_FR1236_SECAM,
 1110                         PHILIPS_FR1236_SECAM, PHILIPS_FR1216_PAL};
 1111 
 1112                 int tuner_1_table[] = {
 1113                         TEMIC_NTSC,  TEMIC_PAL,   TEMIC_PAL,
 1114                         TEMIC_PAL,   TEMIC_PAL,   TEMIC_PAL,
 1115                         TEMIC_SECAM, TEMIC_SECAM, TEMIC_SECAM,
 1116                         TEMIC_PAL};
 1117 
 1118 
 1119                 /* Extract information from the EEPROM data */
 1120                 readEEProm(bktr, 0, 128, (u_char *) &eeprom );
 1121 
 1122                 tuner_make   = (eeprom[0x41] & 0x7);
 1123                 tuner_tv_fm  = (eeprom[0x41] & 0x18) >> 3;
 1124                 tuner_format = (eeprom[0x42] & 0xf0) >> 4;
 1125 
 1126                 /* Treat tuner make 0 (Philips) and make 2 (LG) the same */
 1127                 if ( ((tuner_make == 0) || (tuner_make == 2))
 1128                     && (tuner_format <= 9) && (tuner_tv_fm == 0) ) {
 1129                         tuner = tuner_0_table[tuner_format];
 1130                         select_tuner( bktr, tuner );
 1131                         goto checkDBX;
 1132                 }
 1133 
 1134                 if ( ((tuner_make == 0) || (tuner_make == 2))
 1135                     && (tuner_format <= 9) && (tuner_tv_fm == 1) ) {
 1136                         tuner = tuner_0_fm_table[tuner_format];
 1137                         select_tuner( bktr, tuner );
 1138                         goto checkDBX;
 1139                 }
 1140 
 1141                 if ( (tuner_make == 1) && (tuner_format <= 9) ) {
 1142                         tuner = tuner_1_table[tuner_format];
 1143                         select_tuner( bktr, tuner );
 1144                         goto checkDBX;
 1145                 }
 1146 
 1147                 printf("%s: Warning - Unknown AVerMedia Tuner Make %d Format %d\n",
 1148                         bktr_name(bktr), tuner_make, tuner_format);
 1149             }
 1150             break;
 1151 
 1152         case CARD_LEADTEK:
 1153 #if BKTR_SYSTEM_DEFAULT == BROOKTREE_PAL
 1154             select_tuner( bktr, PHILIPS_FR1216_PAL );
 1155 #else
 1156             select_tuner( bktr, PHILIPS_FR1236_NTSC );
 1157 #endif
 1158             goto checkDBX;
 1159             break;
 1160 
 1161         case CARD_IO_BCTV3:
 1162             select_tuner( bktr, ALPS_TSCH5 ); /* ALPS_TSCH6, in fact. */
 1163             goto checkDBX;
 1164             break;
 1165 
 1166         } /* end switch(card) */
 1167 
 1168 
 1169         /* At this point, a goto checkDBX has not occured */
 1170         /* We have not been able to select a Tuner */
 1171         /* Some cards make use of the tuner address to */
 1172         /* identify the make/model of tuner */
 1173 
 1174         /* At address 0xc0/0xc1 we often find a TEMIC NTSC */
 1175         if ( i2cRead( bktr, 0xc1 ) != ABSENT ) {
 1176             select_tuner( bktr, TEMIC_NTSC );
 1177             goto checkDBX;
 1178         }
 1179   
 1180         /* At address 0xc6/0xc7 we often find a PHILIPS NTSC Tuner */
 1181         if ( i2cRead( bktr, 0xc7 ) != ABSENT ) {
 1182             select_tuner( bktr, PHILIPS_NTSC );
 1183             goto checkDBX;
 1184         }
 1185 
 1186         /* Address 0xc2/0xc3 is default (or common address) for several */
 1187         /* tuners and we cannot tell which is which. */
 1188         /* And for all other tuner i2c addresses, select the default */
 1189         select_tuner( bktr, DEFAULT_TUNER );
 1190 
 1191 
 1192 checkDBX:
 1193 #if defined( BKTR_OVERRIDE_DBX )
 1194         bktr->card.dbx = BKTR_OVERRIDE_DBX;
 1195         goto checkMSP;
 1196 #endif
 1197    /* Check for i2c devices */
 1198         if (!any_i2c_devices) {
 1199                 goto checkMSP;
 1200         }
 1201 
 1202         /* probe for BTSC (dbx) chip */
 1203         if ( i2cRead( bktr, TDA9850_RADDR ) != ABSENT )
 1204                 bktr->card.dbx = 1;
 1205 
 1206 checkMSP:
 1207         /* If this is a Hauppauge Bt878 card, we need to enable the
 1208          * MSP 34xx audio chip. 
 1209          * If this is a Hauppauge Bt848 card, reset the MSP device.
 1210          * The MSP reset line is wired to GPIO pin 5. On Bt878 cards a pulldown
 1211          * resistor holds the device in reset until we set GPIO pin 5.
 1212          */
 1213 
 1214         /* Optionally skip the MSP reset. This is handy if you initialise the
 1215          * MSP audio in another operating system (eg Windows) first and then
 1216          * do a soft reboot.
 1217          */
 1218 
 1219 #ifndef BKTR_NO_MSP_RESET
 1220         if (card == CARD_HAUPPAUGE) {
 1221             OUTL(bktr, BKTR_GPIO_OUT_EN, INL(bktr, BKTR_GPIO_OUT_EN) | (1<<5));
 1222             OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5));  /* write '1' */
 1223             DELAY(2500); /* wait 2.5ms */
 1224             OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) & ~(1<<5)); /* write '' */
 1225             DELAY(2500); /* wait 2.5ms */
 1226             OUTL(bktr, BKTR_GPIO_DATA, INL(bktr, BKTR_GPIO_DATA) | (1<<5));  /* write '1' */
 1227             DELAY(2500); /* wait 2.5ms */
 1228         }
 1229 #endif
 1230 
 1231 #if defined( BKTR_OVERRIDE_MSP )
 1232         bktr->card.msp3400c = BKTR_OVERRIDE_MSP;
 1233         goto checkMSPEnd;
 1234 #endif
 1235 
 1236         /* Check for i2c devices */
 1237         if (!any_i2c_devices) {
 1238                 goto checkMSPEnd;
 1239         }
 1240 
 1241         if ( i2cRead( bktr, MSP3400C_RADDR ) != ABSENT ) {
 1242                 bktr->card.msp3400c = 1;
 1243         }
 1244 
 1245 checkMSPEnd:
 1246 
 1247         if (bktr->card.msp3400c) {
 1248                 bktr->msp_addr = MSP3400C_WADDR;
 1249                 msp_read_id( bktr );
 1250                 printf("%s: Detected a MSP%s at 0x%x\n", bktr_name(bktr),
 1251                        bktr->msp_version_string,
 1252                        bktr->msp_addr);
 1253 
 1254         }
 1255 
 1256 /* Check for Dolby Surround Sound DPL3518A sound chip */
 1257         if ( i2cRead( bktr, DPL3518A_RADDR ) != ABSENT ) {
 1258                 bktr->card.dpl3518a = 1;
 1259         }
 1260 
 1261         if (bktr->card.dpl3518a) {
 1262                 bktr->dpl_addr = DPL3518A_WADDR;
 1263                 dpl_read_id( bktr );
 1264                 printf("%s: Detected a DPL%s at 0x%x\n", bktr_name(bktr),
 1265                        bktr->dpl_version_string,
 1266                        bktr->dpl_addr);
 1267         }
 1268 
 1269 /* Start of Check Remote */
 1270         /* Check for the Hauppauge IR Remote Control */
 1271         /* If there is an external unit, the internal will be ignored */
 1272 
 1273         bktr->remote_control = 0; /* initial value */
 1274 
 1275         if (any_i2c_devices) {
 1276             if (i2cRead( bktr, HAUP_REMOTE_EXT_RADDR ) != ABSENT )
 1277                 {
 1278                 bktr->remote_control      = 1;
 1279                 bktr->remote_control_addr = HAUP_REMOTE_EXT_RADDR;
 1280                 }
 1281             else if (i2cRead( bktr, HAUP_REMOTE_INT_RADDR ) != ABSENT )
 1282                 {
 1283                 bktr->remote_control      = 1;
 1284                 bktr->remote_control_addr = HAUP_REMOTE_INT_RADDR;
 1285                 }
 1286 
 1287         }
 1288         /* If a remote control is found, poll it 5 times to turn off the LED */
 1289         if (bktr->remote_control) {
 1290                 int i;
 1291                 for (i=0; i<5; i++)
 1292                         i2cRead( bktr, bktr->remote_control_addr );
 1293         }
 1294 /* End of Check Remote */
 1295 
 1296 #if defined( BKTR_USE_PLL )
 1297         bktr->xtal_pll_mode = BT848_USE_PLL;
 1298         goto checkPLLEnd;
 1299 #endif
 1300         /* Default is to use XTALS and not PLL mode */
 1301         bktr->xtal_pll_mode = BT848_USE_XTALS;
 1302 
 1303         /* Enable PLL mode for OSPREY users */
 1304         if (card == CARD_OSPREY)
 1305                 bktr->xtal_pll_mode = BT848_USE_PLL;
 1306 
 1307         /* Enable PLL mode for Video Highway Xtreme users */
 1308         if (card == CARD_VIDEO_HIGHWAY_XTREME)
 1309                 bktr->xtal_pll_mode = BT848_USE_PLL;
 1310 
 1311 
 1312         /* Most (perhaps all) Bt878 cards need to be switched to PLL mode */
 1313         /* as they only fit the NTSC crystal to their cards */
 1314         /* Default to enabling PLL mode for all Bt878/879 cards */
 1315 
 1316         if ((bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) )
 1317                 bktr->xtal_pll_mode = BT848_USE_PLL;
 1318 
 1319 
 1320 #if defined( BKTR_USE_PLL )
 1321 checkPLLEnd:
 1322 #endif
 1323 
 1324 
 1325         bktr->card.tuner_pllAddr = tuner_i2c_address;
 1326 
 1327         if ( verbose ) {
 1328                 printf( "%s: %s", bktr_name(bktr), bktr->card.name );
 1329                 if ( bktr->card.tuner )
 1330                         printf( ", %s tuner", bktr->card.tuner->name );
 1331                 if ( bktr->card.dbx )
 1332                         printf( ", dbx stereo" );
 1333                 if ( bktr->card.msp3400c )
 1334                         printf( ", msp3400c stereo" );
 1335                 if ( bktr->card.dpl3518a )
 1336                         printf( ", dpl3518a dolby" );
 1337                 if ( bktr->remote_control )
 1338                         printf( ", remote control" );
 1339                 printf( ".\n" );
 1340         }
 1341 }
 1342 
 1343 #undef ABSENT

Cache object: 3955c5d19c036a18ad31f01680a76fc5


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.