Improved Hauppauge's tuner detection and bt878 support

Amancio
This commit is contained in:
Amancio Hasty 1998-07-13 02:16:34 +00:00
parent 44bcb03a54
commit 63ca8cabf9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=37611
4 changed files with 292 additions and 74 deletions

View File

@ -1,4 +1,4 @@
/* BT848 1.35 Driver for Brooktree's Bt848 based cards. /* BT848 1.36 Driver for Brooktree's Bt848 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The Jim Lowe's driver for the Matrox Meteor PCI card . The
Philips SAA 7116 and SAA 7196 are very different chipsets than Philips SAA 7116 and SAA 7196 are very different chipsets than
@ -259,6 +259,8 @@
which I previously added. (Unless someone else which I previously added. (Unless someone else
wanted the 0.25 second tsleep). wanted the 0.25 second tsleep).
1.36 added bt848.format sysctl variable.
1 denotes NTSC , 0 denotes PAL
*/ */
@ -302,11 +304,13 @@
static int bt848_card = -1; static int bt848_card = -1;
static int bt848_tuner = -1; static int bt848_tuner = -1;
static int bt848_reverse_mute = -1; static int bt848_reverse_mute = -1;
static int bt848_format = -1;
SYSCTL_NODE(_hw, OID_AUTO, bt848, CTLFLAG_RW, 0, "Bt848 Driver mgmt"); SYSCTL_NODE(_hw, OID_AUTO, bt848, CTLFLAG_RW, 0, "Bt848 Driver mgmt");
SYSCTL_INT(_hw_bt848, OID_AUTO, card, CTLFLAG_RW, &bt848_card, -1, ""); SYSCTL_INT(_hw_bt848, OID_AUTO, card, CTLFLAG_RW, &bt848_card, -1, "");
SYSCTL_INT(_hw_bt848, OID_AUTO, tuner, CTLFLAG_RW, &bt848_tuner, -1, ""); SYSCTL_INT(_hw_bt848, OID_AUTO, tuner, CTLFLAG_RW, &bt848_tuner, -1, "");
SYSCTL_INT(_hw_bt848, OID_AUTO, reverse_mute, CTLFLAG_RW, &bt848_reverse_mute, -1, ""); SYSCTL_INT(_hw_bt848, OID_AUTO, reverse_mute, CTLFLAG_RW, &bt848_reverse_mute, -1, "");
SYSCTL_INT(_hw_bt848, OID_AUTO, format, CTLFLAG_RW, &bt848_format, -1, "");
typedef u_long ioctl_cmd_t; typedef u_long ioctl_cmd_t;
#endif /* __FreeBSD__ */ #endif /* __FreeBSD__ */
@ -429,8 +433,12 @@ bktr_pci_match(pci_devaddr_t *pa)
id = pci_inl(pa, PCI_VENDOR_ID); id = pci_inl(pa, PCI_VENDOR_ID);
if (id == BROOKTREE_848_ID || id == BROOKTREE_849_ID ) { switch (id) {
return 1; BROOKTREE_848_ID:
BROOKTREE_849_ID:
BROOKTREE_878_ID:
BROOKTREE_879_ID:
return 1;
} }
aprint_debug("bktr_pci_match got %x\n", id); aprint_debug("bktr_pci_match got %x\n", id);
return 0; return 0;
@ -845,12 +853,12 @@ static const struct TUNER tuners[] = {
{ TSA552x_SCONTROL, /* control byte for PLL */ { TSA552x_SCONTROL, /* control byte for PLL */
TSA552x_SCONTROL, TSA552x_SCONTROL,
TSA552x_SCONTROL, TSA552x_SCONTROL,
0x00}, TSA552x_RADIO },
{ 0x00, 0x00 }, /* band-switch crosspoints */ { 0x00, 0x00 }, /* band-switch crosspoints */
{ 0xa0, 0x90, 0x30,0x00 } }, /* the band-switch values */ { 0xa0, 0x90, 0x30,0xa4 } }, /* the band-switch values */
/* PHILIPS_FR1216_PAL */ /* PHILIPS_FR1216_PAL */
{ "Philips FR1216 PAL FM", /* the 'name' */ { "Philips FR1216 PAL" , /* the 'name' */
TTYPE_PAL, /* input type */ TTYPE_PAL, /* input type */
PHILIPS_FR1216_PAL_WADDR, /* PLL write address */ PHILIPS_FR1216_PAL_WADDR, /* PLL write address */
{ TSA552x_FCONTROL, /* control byte for PLL */ { TSA552x_FCONTROL, /* control byte for PLL */
@ -1076,7 +1084,11 @@ bktr_probe( pcici_t tag, pcidi_t type )
case BROOKTREE_848_ID: case BROOKTREE_848_ID:
return("BrookTree 848"); return("BrookTree 848");
case BROOKTREE_849_ID: case BROOKTREE_849_ID:
return("BrookTree 849"); return("BrookTree 849");
case BROOKTREE_878_ID:
return("BrookTree 878");
case BROOKTREE_879_ID:
return("BrookTree 879");
}; };
return ((char *)0); return ((char *)0);
@ -1115,6 +1127,8 @@ bktr_attach( ATTACH_ARGS )
bktr->tag = tag; bktr->tag = tag;
pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base, pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base,
&bktr->phys_base ); &bktr->phys_base );
fun = pci_conf_read(tag, 0x40);
pci_conf_write(tag, 0x40, fun | 1);
#ifdef BROOKTREE_IRQ /* from the configuration file */ #ifdef BROOKTREE_IRQ /* from the configuration file */
@ -1183,6 +1197,10 @@ bktr_attach( ATTACH_ARGS )
bktr->bigbuf = buf; bktr->bigbuf = buf;
bktr->alloc_pages = BROOKTREE_ALLOC_PAGES; bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 2);
if ( buf != 0 ) { if ( buf != 0 ) {
bzero((caddr_t) buf, BROOKTREE_ALLOC); bzero((caddr_t) buf, BROOKTREE_ALLOC);
buf = vtophys(buf); buf = vtophys(buf);
@ -1200,6 +1218,12 @@ bktr_attach( ATTACH_ARGS )
bt848->gpio_dma_ctl = FIFO_RISC_DISABLED; bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
} }
/* save pci id */
fun = pci_conf_read(tag, PCI_ID_REG);
bktr->id = fun;
bktr->clr_on_start = FALSE; bktr->clr_on_start = FALSE;
/* defaults for the tuner section of the card */ /* defaults for the tuner section of the card */
bktr->tflags = TUNER_INITALIZED; bktr->tflags = TUNER_INITALIZED;
@ -1545,7 +1569,7 @@ static int
video_open( bktr_ptr_t bktr ) video_open( bktr_ptr_t bktr )
{ {
bt848_ptr_t bt848; bt848_ptr_t bt848;
int frame_rate; int frame_rate, video_format=0;
if (bktr->flags & METEOR_OPEN) /* device is busy */ if (bktr->flags & METEOR_OPEN) /* device is busy */
return( EBUSY ); return( EBUSY );
@ -1565,21 +1589,37 @@ video_open( bktr_ptr_t bktr )
bt848->adc = SYNC_LEVEL; bt848->adc = SYNC_LEVEL;
#if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL #if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL
bt848->iform = BT848_IFORM_M_MUX1 | video_format = 0;
BT848_IFORM_X_XT1 |
BT848_IFORM_F_PALBDGHI;
bt848->adelay = format_params[BT848_IFORM_F_PALBDGHI].adelay;
bt848->bdelay = format_params[BT848_IFORM_F_PALBDGHI].bdelay;
bktr->format_params = BT848_IFORM_F_PALBDGHI;
frame_rate = 25;
#else #else
bt848->iform = BT848_IFORM_M_MUX1 | video_format = 1;
BT848_IFORM_X_XT0 |
BT848_IFORM_F_NTSCM;
bktr->format_params = BT848_IFORM_F_NTSCM;
frame_rate = 30;
#endif #endif
if (bt848_format == 0 )
video_format = 0;
if (bt848_format == 1 )
video_format = 1;
if (video_format == 1 ) {
bt848->iform = BT848_IFORM_M_MUX1 |
BT848_IFORM_X_XT0 |
BT848_IFORM_F_NTSCM;
bktr->format_params = BT848_IFORM_F_NTSCM;
frame_rate = 30;
} else {
bt848->iform = BT848_IFORM_M_MUX1 |
BT848_IFORM_X_XT1 |
BT848_IFORM_F_PALBDGHI;
bt848->adelay = format_params[BT848_IFORM_F_PALBDGHI].adelay;
bt848->bdelay = format_params[BT848_IFORM_F_PALBDGHI].bdelay;
bktr->format_params = BT848_IFORM_F_PALBDGHI;
frame_rate = 25;
}
bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0; bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0;
bktr->max_clip_node = 0; bktr->max_clip_node = 0;
@ -1616,8 +1656,9 @@ video_open( bktr_ptr_t bktr )
bktr->format = METEOR_GEO_RGB16; bktr->format = METEOR_GEO_RGB16;
bktr->pixfmt = oformat_meteor_to_bt( bktr->format ); bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
bt848->int_mask = BT848_INT_MYSTERYBIT; /* if you take this out triton
bt848->int_mask = BT848_INT_MYSTERYBIT; /* what does this bit do ??? */ based motherboards will
operate unreliably */
return( 0 ); return( 0 );
} }
@ -2754,6 +2795,20 @@ common_ioctl( bktr_ptr_t bktr, bt848_ptr_t bt848, int cmd, caddr_t arg )
set_audio( bktr, AUDIO_EXTERN ); set_audio( bktr, AUDIO_EXTERN );
break; break;
case METEOR_INPUT_DEV3:
if (bktr->id == BROOKTREE_878_ID ||
bktr->id == BROOKTREE_879_ID ) {
bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
| METEOR_DEV3;
bt848->iform &= ~BT848_IFORM_MUXSEL;
bt848->iform |= BT848_IFORM_M_MUX3;
bt848->e_control &= ~BT848_E_CONTROL_COMP;
bt848->o_control &= ~BT848_O_CONTROL_COMP;
set_audio( bktr, AUDIO_EXTERN );
break;
}
default: default:
return( EINVAL ); return( EINVAL );
} }
@ -3926,11 +3981,17 @@ static int oformat_meteor_to_bt( u_long format )
/* */ /* */
#define I2CBITTIME (0x5<<4) /* 5 * 0.48uS */ #define I2CBITTIME (0x5<<4) /* 5 * 0.48uS */
#define I2CBITTIME_878 (1 << 7)
#define I2C_READ 0x01 #define I2C_READ 0x01
#define I2C_COMMAND (I2CBITTIME | \ #define I2C_COMMAND (I2CBITTIME | \
BT848_DATA_CTL_I2CSCL | \ BT848_DATA_CTL_I2CSCL | \
BT848_DATA_CTL_I2CSDA) BT848_DATA_CTL_I2CSDA)
#define I2C_COMMAND_878 (I2CBITTIME_878 | \
BT848_DATA_CTL_I2CSCL | \
BT848_DATA_CTL_I2CSDA)
/* /*
* *
*/ */
@ -3947,7 +4008,12 @@ i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 )
bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE); bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE);
/* build the command datum */ /* build the command datum */
data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND; if (bktr->id == BROOKTREE_848_ID ||
bktr->id == BROOKTREE_849_ID) {
data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND;
} else {
data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND_878;
}
if ( byte2 != -1 ) { if ( byte2 != -1 ) {
data |= ((byte2 & 0xff) << 8); data |= ((byte2 & 0xff) << 8);
data |= BT848_DATA_CTL_I2CW3B; data |= BT848_DATA_CTL_I2CW3B;
@ -3986,7 +4052,14 @@ i2cRead( bktr_ptr_t bktr, int addr )
bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE); bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE);
/* write the READ address */ /* write the READ address */
bt848->i2c_data_ctl = ((addr & 0xff) << 24) | I2C_COMMAND; /* The Bt878 and Bt879 differed on the treatment of i2c commands */
if (bktr->id == BROOKTREE_848_ID ||
bktr->id == BROOKTREE_849_ID) {
bt848->i2c_data_ctl = ((addr & 0xff) << 24) | I2C_COMMAND;
} else {
bt848->i2c_data_ctl = ((addr & 0xff) << 24) | I2C_COMMAND_878;
}
/* wait for completion */ /* wait for completion */
for ( x = 0x7fffffff; x; --x ) { /* safety valve */ for ( x = 0x7fffffff; x; --x ) { /* safety valve */
@ -4184,11 +4257,12 @@ static void
probeCard( bktr_ptr_t bktr, int verbose ) probeCard( bktr_ptr_t bktr, int verbose )
{ {
int card, i,j, card_found; int card, i,j, card_found;
int status; int status, *test;
bt848_ptr_t bt848; bt848_ptr_t bt848;
u_char probe_signature[128], *probe_temp; u_char probe_signature[128], *probe_temp;
int any_i2c_devices; int any_i2c_devices;
u_char probe_eeprom[128];
u_long code = 0;
any_i2c_devices = check_for_i2c_devices( bktr ); any_i2c_devices = check_for_i2c_devices( bktr );
bt848 = bktr->base; bt848 = bktr->base;
@ -4281,6 +4355,7 @@ probeCard( bktr_ptr_t bktr, int verbose )
} }
/* differentiate type of tuner */ /* differentiate type of tuner */
switch (card) { switch (card) {
case CARD_MIRO: case CARD_MIRO:
switch (((bt848->gpio_data >> 10)-1)&7) { switch (((bt848->gpio_data >> 10)-1)&7) {
@ -4300,20 +4375,50 @@ probeCard( bktr_ptr_t bktr, int verbose )
goto checkDBX; goto checkDBX;
} }
if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) { }
bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; if ( card == CARD_HAUPPAUGE ) {
goto checkDBX; bktr->card.tuner = &tuners[ TEMIC_PAL ];
readEEProm(bktr, 0, 128, (u_char *) &probe_eeprom );
if (probe_eeprom[0] == 0x84) {
if (probe_eeprom[8] == 0x8) {
code = 1; /* NTSC */
} else if (probe_eeprom[8] == 0x4) {
code = 2; /* PAL */
}
if (probe_eeprom[1] == 0x11 ||
probe_eeprom[1] == 0x12 ) {
if (probe_eeprom[probe_eeprom[1]] == 1) {
code |= 1 << 8;
}
}
switch (code) {
case 0x1:
bktr->card.tuner = &tuners[ PHILIPS_NTSC ];
goto checkDBX;
case 0x11:
bktr->card.tuner = &tuners[ PHILIPS_FR1236_NTSC ];
goto checkDBX;
case 0x2:
bktr->card.tuner = &tuners[ TEMIC_PAL ];
goto checkDBX;
case 0x22:
bktr->card.tuner = &tuners[ PHILIPS_FR1216_PAL];
goto checkDBX;
} }
if ( card == CARD_HAUPPAUGE ) {
if ( i2cRead( bktr, TEMIC_PALI_RADDR ) != ABSENT ) { }
bktr->card.tuner = &tuners[ TEMIC_PAL ];
goto checkDBX;
}
}
/* no tuner found */
bktr->card.tuner = &tuners[ NO_TUNER ];
} }
/* no tuner found */
bktr->card.tuner = &tuners[ NO_TUNER ];
checkDBX: checkDBX:
#if defined( OVERRIDE_DBX ) #if defined( OVERRIDE_DBX )

View File

@ -37,6 +37,8 @@
*/ */
#define BROOKTREE_848_ID 0x0350109E #define BROOKTREE_848_ID 0x0350109E
#define BROOKTREE_849_ID 0x0351109E #define BROOKTREE_849_ID 0x0351109E
#define BROOKTREE_878_ID 0x036E109E
#define BROOKTREE_879_ID 0x036F109E
typedef volatile u_int bregister_t; typedef volatile u_int bregister_t;
/* /*
@ -62,6 +64,7 @@ struct bt848_registers {
# define BT848_IFORM_M_MUX1 (0x03<<5) # define BT848_IFORM_M_MUX1 (0x03<<5)
# define BT848_IFORM_M_MUX0 (0x02<<5) # define BT848_IFORM_M_MUX0 (0x02<<5)
# define BT848_IFORM_M_MUX2 (0x01<<5) # define BT848_IFORM_M_MUX2 (0x01<<5)
# define BT848_IFORM_M_MUX3 (0x0)
# define BT848_IFORM_M_RSVD (0x00<<5) # define BT848_IFORM_M_RSVD (0x00<<5)
#define BT848_IFORM_XTSEL (0x3<<3) #define BT848_IFORM_XTSEL (0x3<<3)
# define BT848_IFORM_X_AUTO (0x03<<3) # define BT848_IFORM_X_AUTO (0x03<<3)
@ -455,6 +458,7 @@ struct bktr_softc {
int reverse_mute; int reverse_mute;
int bt848_tuner; int bt848_tuner;
int bt848_card; int bt848_card;
u_long id;
}; };
typedef struct bktr_softc bktr_reg_t; typedef struct bktr_softc bktr_reg_t;

View File

@ -37,6 +37,8 @@
*/ */
#define BROOKTREE_848_ID 0x0350109E #define BROOKTREE_848_ID 0x0350109E
#define BROOKTREE_849_ID 0x0351109E #define BROOKTREE_849_ID 0x0351109E
#define BROOKTREE_878_ID 0x036E109E
#define BROOKTREE_879_ID 0x036F109E
typedef volatile u_int bregister_t; typedef volatile u_int bregister_t;
/* /*
@ -62,6 +64,7 @@ struct bt848_registers {
# define BT848_IFORM_M_MUX1 (0x03<<5) # define BT848_IFORM_M_MUX1 (0x03<<5)
# define BT848_IFORM_M_MUX0 (0x02<<5) # define BT848_IFORM_M_MUX0 (0x02<<5)
# define BT848_IFORM_M_MUX2 (0x01<<5) # define BT848_IFORM_M_MUX2 (0x01<<5)
# define BT848_IFORM_M_MUX3 (0x0)
# define BT848_IFORM_M_RSVD (0x00<<5) # define BT848_IFORM_M_RSVD (0x00<<5)
#define BT848_IFORM_XTSEL (0x3<<3) #define BT848_IFORM_XTSEL (0x3<<3)
# define BT848_IFORM_X_AUTO (0x03<<3) # define BT848_IFORM_X_AUTO (0x03<<3)
@ -455,6 +458,7 @@ struct bktr_softc {
int reverse_mute; int reverse_mute;
int bt848_tuner; int bt848_tuner;
int bt848_card; int bt848_card;
u_long id;
}; };
typedef struct bktr_softc bktr_reg_t; typedef struct bktr_softc bktr_reg_t;

View File

@ -1,4 +1,4 @@
/* BT848 1.35 Driver for Brooktree's Bt848 based cards. /* BT848 1.36 Driver for Brooktree's Bt848 based cards.
The Brooktree BT848 Driver driver is based upon Mark Tinguely and The Brooktree BT848 Driver driver is based upon Mark Tinguely and
Jim Lowe's driver for the Matrox Meteor PCI card . The Jim Lowe's driver for the Matrox Meteor PCI card . The
Philips SAA 7116 and SAA 7196 are very different chipsets than Philips SAA 7116 and SAA 7196 are very different chipsets than
@ -259,6 +259,8 @@
which I previously added. (Unless someone else which I previously added. (Unless someone else
wanted the 0.25 second tsleep). wanted the 0.25 second tsleep).
1.36 added bt848.format sysctl variable.
1 denotes NTSC , 0 denotes PAL
*/ */
@ -302,11 +304,13 @@
static int bt848_card = -1; static int bt848_card = -1;
static int bt848_tuner = -1; static int bt848_tuner = -1;
static int bt848_reverse_mute = -1; static int bt848_reverse_mute = -1;
static int bt848_format = -1;
SYSCTL_NODE(_hw, OID_AUTO, bt848, CTLFLAG_RW, 0, "Bt848 Driver mgmt"); SYSCTL_NODE(_hw, OID_AUTO, bt848, CTLFLAG_RW, 0, "Bt848 Driver mgmt");
SYSCTL_INT(_hw_bt848, OID_AUTO, card, CTLFLAG_RW, &bt848_card, -1, ""); SYSCTL_INT(_hw_bt848, OID_AUTO, card, CTLFLAG_RW, &bt848_card, -1, "");
SYSCTL_INT(_hw_bt848, OID_AUTO, tuner, CTLFLAG_RW, &bt848_tuner, -1, ""); SYSCTL_INT(_hw_bt848, OID_AUTO, tuner, CTLFLAG_RW, &bt848_tuner, -1, "");
SYSCTL_INT(_hw_bt848, OID_AUTO, reverse_mute, CTLFLAG_RW, &bt848_reverse_mute, -1, ""); SYSCTL_INT(_hw_bt848, OID_AUTO, reverse_mute, CTLFLAG_RW, &bt848_reverse_mute, -1, "");
SYSCTL_INT(_hw_bt848, OID_AUTO, format, CTLFLAG_RW, &bt848_format, -1, "");
typedef u_long ioctl_cmd_t; typedef u_long ioctl_cmd_t;
#endif /* __FreeBSD__ */ #endif /* __FreeBSD__ */
@ -429,8 +433,12 @@ bktr_pci_match(pci_devaddr_t *pa)
id = pci_inl(pa, PCI_VENDOR_ID); id = pci_inl(pa, PCI_VENDOR_ID);
if (id == BROOKTREE_848_ID || id == BROOKTREE_849_ID ) { switch (id) {
return 1; BROOKTREE_848_ID:
BROOKTREE_849_ID:
BROOKTREE_878_ID:
BROOKTREE_879_ID:
return 1;
} }
aprint_debug("bktr_pci_match got %x\n", id); aprint_debug("bktr_pci_match got %x\n", id);
return 0; return 0;
@ -845,12 +853,12 @@ static const struct TUNER tuners[] = {
{ TSA552x_SCONTROL, /* control byte for PLL */ { TSA552x_SCONTROL, /* control byte for PLL */
TSA552x_SCONTROL, TSA552x_SCONTROL,
TSA552x_SCONTROL, TSA552x_SCONTROL,
0x00}, TSA552x_RADIO },
{ 0x00, 0x00 }, /* band-switch crosspoints */ { 0x00, 0x00 }, /* band-switch crosspoints */
{ 0xa0, 0x90, 0x30,0x00 } }, /* the band-switch values */ { 0xa0, 0x90, 0x30,0xa4 } }, /* the band-switch values */
/* PHILIPS_FR1216_PAL */ /* PHILIPS_FR1216_PAL */
{ "Philips FR1216 PAL FM", /* the 'name' */ { "Philips FR1216 PAL" , /* the 'name' */
TTYPE_PAL, /* input type */ TTYPE_PAL, /* input type */
PHILIPS_FR1216_PAL_WADDR, /* PLL write address */ PHILIPS_FR1216_PAL_WADDR, /* PLL write address */
{ TSA552x_FCONTROL, /* control byte for PLL */ { TSA552x_FCONTROL, /* control byte for PLL */
@ -1076,7 +1084,11 @@ bktr_probe( pcici_t tag, pcidi_t type )
case BROOKTREE_848_ID: case BROOKTREE_848_ID:
return("BrookTree 848"); return("BrookTree 848");
case BROOKTREE_849_ID: case BROOKTREE_849_ID:
return("BrookTree 849"); return("BrookTree 849");
case BROOKTREE_878_ID:
return("BrookTree 878");
case BROOKTREE_879_ID:
return("BrookTree 879");
}; };
return ((char *)0); return ((char *)0);
@ -1115,6 +1127,8 @@ bktr_attach( ATTACH_ARGS )
bktr->tag = tag; bktr->tag = tag;
pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base, pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base,
&bktr->phys_base ); &bktr->phys_base );
fun = pci_conf_read(tag, 0x40);
pci_conf_write(tag, 0x40, fun | 1);
#ifdef BROOKTREE_IRQ /* from the configuration file */ #ifdef BROOKTREE_IRQ /* from the configuration file */
@ -1183,6 +1197,10 @@ bktr_attach( ATTACH_ARGS )
bktr->bigbuf = buf; bktr->bigbuf = buf;
bktr->alloc_pages = BROOKTREE_ALLOC_PAGES; bktr->alloc_pages = BROOKTREE_ALLOC_PAGES;
fun = pci_conf_read(tag, PCI_COMMAND_STATUS_REG);
pci_conf_write(tag, PCI_COMMAND_STATUS_REG, fun | 2);
if ( buf != 0 ) { if ( buf != 0 ) {
bzero((caddr_t) buf, BROOKTREE_ALLOC); bzero((caddr_t) buf, BROOKTREE_ALLOC);
buf = vtophys(buf); buf = vtophys(buf);
@ -1200,6 +1218,12 @@ bktr_attach( ATTACH_ARGS )
bt848->gpio_dma_ctl = FIFO_RISC_DISABLED; bt848->gpio_dma_ctl = FIFO_RISC_DISABLED;
} }
/* save pci id */
fun = pci_conf_read(tag, PCI_ID_REG);
bktr->id = fun;
bktr->clr_on_start = FALSE; bktr->clr_on_start = FALSE;
/* defaults for the tuner section of the card */ /* defaults for the tuner section of the card */
bktr->tflags = TUNER_INITALIZED; bktr->tflags = TUNER_INITALIZED;
@ -1545,7 +1569,7 @@ static int
video_open( bktr_ptr_t bktr ) video_open( bktr_ptr_t bktr )
{ {
bt848_ptr_t bt848; bt848_ptr_t bt848;
int frame_rate; int frame_rate, video_format=0;
if (bktr->flags & METEOR_OPEN) /* device is busy */ if (bktr->flags & METEOR_OPEN) /* device is busy */
return( EBUSY ); return( EBUSY );
@ -1565,21 +1589,37 @@ video_open( bktr_ptr_t bktr )
bt848->adc = SYNC_LEVEL; bt848->adc = SYNC_LEVEL;
#if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL #if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL
bt848->iform = BT848_IFORM_M_MUX1 | video_format = 0;
BT848_IFORM_X_XT1 |
BT848_IFORM_F_PALBDGHI;
bt848->adelay = format_params[BT848_IFORM_F_PALBDGHI].adelay;
bt848->bdelay = format_params[BT848_IFORM_F_PALBDGHI].bdelay;
bktr->format_params = BT848_IFORM_F_PALBDGHI;
frame_rate = 25;
#else #else
bt848->iform = BT848_IFORM_M_MUX1 | video_format = 1;
BT848_IFORM_X_XT0 |
BT848_IFORM_F_NTSCM;
bktr->format_params = BT848_IFORM_F_NTSCM;
frame_rate = 30;
#endif #endif
if (bt848_format == 0 )
video_format = 0;
if (bt848_format == 1 )
video_format = 1;
if (video_format == 1 ) {
bt848->iform = BT848_IFORM_M_MUX1 |
BT848_IFORM_X_XT0 |
BT848_IFORM_F_NTSCM;
bktr->format_params = BT848_IFORM_F_NTSCM;
frame_rate = 30;
} else {
bt848->iform = BT848_IFORM_M_MUX1 |
BT848_IFORM_X_XT1 |
BT848_IFORM_F_PALBDGHI;
bt848->adelay = format_params[BT848_IFORM_F_PALBDGHI].adelay;
bt848->bdelay = format_params[BT848_IFORM_F_PALBDGHI].bdelay;
bktr->format_params = BT848_IFORM_F_PALBDGHI;
frame_rate = 25;
}
bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0; bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0;
bktr->max_clip_node = 0; bktr->max_clip_node = 0;
@ -1616,8 +1656,9 @@ video_open( bktr_ptr_t bktr )
bktr->format = METEOR_GEO_RGB16; bktr->format = METEOR_GEO_RGB16;
bktr->pixfmt = oformat_meteor_to_bt( bktr->format ); bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
bt848->int_mask = BT848_INT_MYSTERYBIT; /* if you take this out triton
bt848->int_mask = BT848_INT_MYSTERYBIT; /* what does this bit do ??? */ based motherboards will
operate unreliably */
return( 0 ); return( 0 );
} }
@ -2754,6 +2795,20 @@ common_ioctl( bktr_ptr_t bktr, bt848_ptr_t bt848, int cmd, caddr_t arg )
set_audio( bktr, AUDIO_EXTERN ); set_audio( bktr, AUDIO_EXTERN );
break; break;
case METEOR_INPUT_DEV3:
if (bktr->id == BROOKTREE_878_ID ||
bktr->id == BROOKTREE_879_ID ) {
bktr->flags = (bktr->flags & ~METEOR_DEV_MASK)
| METEOR_DEV3;
bt848->iform &= ~BT848_IFORM_MUXSEL;
bt848->iform |= BT848_IFORM_M_MUX3;
bt848->e_control &= ~BT848_E_CONTROL_COMP;
bt848->o_control &= ~BT848_O_CONTROL_COMP;
set_audio( bktr, AUDIO_EXTERN );
break;
}
default: default:
return( EINVAL ); return( EINVAL );
} }
@ -3926,11 +3981,17 @@ static int oformat_meteor_to_bt( u_long format )
/* */ /* */
#define I2CBITTIME (0x5<<4) /* 5 * 0.48uS */ #define I2CBITTIME (0x5<<4) /* 5 * 0.48uS */
#define I2CBITTIME_878 (1 << 7)
#define I2C_READ 0x01 #define I2C_READ 0x01
#define I2C_COMMAND (I2CBITTIME | \ #define I2C_COMMAND (I2CBITTIME | \
BT848_DATA_CTL_I2CSCL | \ BT848_DATA_CTL_I2CSCL | \
BT848_DATA_CTL_I2CSDA) BT848_DATA_CTL_I2CSDA)
#define I2C_COMMAND_878 (I2CBITTIME_878 | \
BT848_DATA_CTL_I2CSCL | \
BT848_DATA_CTL_I2CSDA)
/* /*
* *
*/ */
@ -3947,7 +4008,12 @@ i2cWrite( bktr_ptr_t bktr, int addr, int byte1, int byte2 )
bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE); bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE);
/* build the command datum */ /* build the command datum */
data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND; if (bktr->id == BROOKTREE_848_ID ||
bktr->id == BROOKTREE_849_ID) {
data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND;
} else {
data = ((addr & 0xff) << 24) | ((byte1 & 0xff) << 16) | I2C_COMMAND_878;
}
if ( byte2 != -1 ) { if ( byte2 != -1 ) {
data |= ((byte2 & 0xff) << 8); data |= ((byte2 & 0xff) << 8);
data |= BT848_DATA_CTL_I2CW3B; data |= BT848_DATA_CTL_I2CW3B;
@ -3986,7 +4052,14 @@ i2cRead( bktr_ptr_t bktr, int addr )
bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE); bt848->int_stat = (BT848_INT_RACK | BT848_INT_I2CDONE);
/* write the READ address */ /* write the READ address */
bt848->i2c_data_ctl = ((addr & 0xff) << 24) | I2C_COMMAND; /* The Bt878 and Bt879 differed on the treatment of i2c commands */
if (bktr->id == BROOKTREE_848_ID ||
bktr->id == BROOKTREE_849_ID) {
bt848->i2c_data_ctl = ((addr & 0xff) << 24) | I2C_COMMAND;
} else {
bt848->i2c_data_ctl = ((addr & 0xff) << 24) | I2C_COMMAND_878;
}
/* wait for completion */ /* wait for completion */
for ( x = 0x7fffffff; x; --x ) { /* safety valve */ for ( x = 0x7fffffff; x; --x ) { /* safety valve */
@ -4184,11 +4257,12 @@ static void
probeCard( bktr_ptr_t bktr, int verbose ) probeCard( bktr_ptr_t bktr, int verbose )
{ {
int card, i,j, card_found; int card, i,j, card_found;
int status; int status, *test;
bt848_ptr_t bt848; bt848_ptr_t bt848;
u_char probe_signature[128], *probe_temp; u_char probe_signature[128], *probe_temp;
int any_i2c_devices; int any_i2c_devices;
u_char probe_eeprom[128];
u_long code = 0;
any_i2c_devices = check_for_i2c_devices( bktr ); any_i2c_devices = check_for_i2c_devices( bktr );
bt848 = bktr->base; bt848 = bktr->base;
@ -4281,6 +4355,7 @@ probeCard( bktr_ptr_t bktr, int verbose )
} }
/* differentiate type of tuner */ /* differentiate type of tuner */
switch (card) { switch (card) {
case CARD_MIRO: case CARD_MIRO:
switch (((bt848->gpio_data >> 10)-1)&7) { switch (((bt848->gpio_data >> 10)-1)&7) {
@ -4300,20 +4375,50 @@ probeCard( bktr_ptr_t bktr, int verbose )
goto checkDBX; goto checkDBX;
} }
if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) { }
bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; if ( card == CARD_HAUPPAUGE ) {
goto checkDBX; bktr->card.tuner = &tuners[ TEMIC_PAL ];
readEEProm(bktr, 0, 128, (u_char *) &probe_eeprom );
if (probe_eeprom[0] == 0x84) {
if (probe_eeprom[8] == 0x8) {
code = 1; /* NTSC */
} else if (probe_eeprom[8] == 0x4) {
code = 2; /* PAL */
}
if (probe_eeprom[1] == 0x11 ||
probe_eeprom[1] == 0x12 ) {
if (probe_eeprom[probe_eeprom[1]] == 1) {
code |= 1 << 8;
}
}
switch (code) {
case 0x1:
bktr->card.tuner = &tuners[ PHILIPS_NTSC ];
goto checkDBX;
case 0x11:
bktr->card.tuner = &tuners[ PHILIPS_FR1236_NTSC ];
goto checkDBX;
case 0x2:
bktr->card.tuner = &tuners[ TEMIC_PAL ];
goto checkDBX;
case 0x22:
bktr->card.tuner = &tuners[ PHILIPS_FR1216_PAL];
goto checkDBX;
} }
if ( card == CARD_HAUPPAUGE ) {
if ( i2cRead( bktr, TEMIC_PALI_RADDR ) != ABSENT ) { }
bktr->card.tuner = &tuners[ TEMIC_PAL ];
goto checkDBX;
}
}
/* no tuner found */
bktr->card.tuner = &tuners[ NO_TUNER ];
} }
/* no tuner found */
bktr->card.tuner = &tuners[ NO_TUNER ];
checkDBX: checkDBX:
#if defined( OVERRIDE_DBX ) #if defined( OVERRIDE_DBX )