summaryrefslogtreecommitdiffstats
path: root/sys/dev/bktr
diff options
context:
space:
mode:
authorahasty <ahasty@FreeBSD.org>1998-07-13 02:16:34 +0000
committerahasty <ahasty@FreeBSD.org>1998-07-13 02:16:34 +0000
commit560c0322cfdcc39b97aa546dee205641ddcfef6b (patch)
tree02982ea0edf8f6f081c1a0646709035895c1e54b /sys/dev/bktr
parent42566affcdbdfd7ca43cd848e0318167c58fc584 (diff)
downloadFreeBSD-src-560c0322cfdcc39b97aa546dee205641ddcfef6b.zip
FreeBSD-src-560c0322cfdcc39b97aa546dee205641ddcfef6b.tar.gz
Improved Hauppauge's tuner detection and bt878 support
Amancio
Diffstat (limited to 'sys/dev/bktr')
-rw-r--r--sys/dev/bktr/bktr_core.c179
-rw-r--r--sys/dev/bktr/bktr_reg.h4
2 files changed, 146 insertions, 37 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index c2d8e2d..c156a74 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -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
Jim Lowe's driver for the Matrox Meteor PCI card . The
Philips SAA 7116 and SAA 7196 are very different chipsets than
@@ -259,6 +259,8 @@
which I previously added. (Unless someone else
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_tuner = -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_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, 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;
#endif /* __FreeBSD__ */
@@ -429,8 +433,12 @@ bktr_pci_match(pci_devaddr_t *pa)
id = pci_inl(pa, PCI_VENDOR_ID);
- if (id == BROOKTREE_848_ID || id == BROOKTREE_849_ID ) {
- return 1;
+ switch (id) {
+ BROOKTREE_848_ID:
+ BROOKTREE_849_ID:
+ BROOKTREE_878_ID:
+ BROOKTREE_879_ID:
+ return 1;
}
aprint_debug("bktr_pci_match got %x\n", id);
return 0;
@@ -845,12 +853,12 @@ static const struct TUNER tuners[] = {
{ TSA552x_SCONTROL, /* control byte for PLL */
TSA552x_SCONTROL,
TSA552x_SCONTROL,
- 0x00},
+ TSA552x_RADIO },
{ 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 FM", /* the 'name' */
+ { "Philips FR1216 PAL" , /* the 'name' */
TTYPE_PAL, /* input type */
PHILIPS_FR1216_PAL_WADDR, /* PLL write address */
{ TSA552x_FCONTROL, /* control byte for PLL */
@@ -1076,7 +1084,11 @@ bktr_probe( pcici_t tag, pcidi_t type )
case BROOKTREE_848_ID:
return("BrookTree 848");
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);
@@ -1115,6 +1127,8 @@ bktr_attach( ATTACH_ARGS )
bktr->tag = tag;
pci_map_mem( tag, PCI_MAP_REG_START, (vm_offset_t *) &bktr->base,
&bktr->phys_base );
+ fun = pci_conf_read(tag, 0x40);
+ pci_conf_write(tag, 0x40, fun | 1);
#ifdef BROOKTREE_IRQ /* from the configuration file */
@@ -1183,6 +1197,10 @@ bktr_attach( ATTACH_ARGS )
bktr->bigbuf = buf;
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 ) {
bzero((caddr_t) buf, BROOKTREE_ALLOC);
buf = vtophys(buf);
@@ -1200,6 +1218,12 @@ bktr_attach( ATTACH_ARGS )
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;
/* defaults for the tuner section of the card */
bktr->tflags = TUNER_INITALIZED;
@@ -1545,7 +1569,7 @@ static int
video_open( bktr_ptr_t bktr )
{
bt848_ptr_t bt848;
- int frame_rate;
+ int frame_rate, video_format=0;
if (bktr->flags & METEOR_OPEN) /* device is busy */
return( EBUSY );
@@ -1565,21 +1589,37 @@ video_open( bktr_ptr_t bktr )
bt848->adc = SYNC_LEVEL;
#if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL
- 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;
+ video_format = 0;
#else
- bt848->iform = BT848_IFORM_M_MUX1 |
- BT848_IFORM_X_XT0 |
- BT848_IFORM_F_NTSCM;
- bktr->format_params = BT848_IFORM_F_NTSCM;
- frame_rate = 30;
+ video_format = 1;
#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->max_clip_node = 0;
@@ -1616,8 +1656,9 @@ video_open( bktr_ptr_t bktr )
bktr->format = METEOR_GEO_RGB16;
bktr->pixfmt = oformat_meteor_to_bt( bktr->format );
-
- bt848->int_mask = BT848_INT_MYSTERYBIT; /* what does this bit do ??? */
+ bt848->int_mask = BT848_INT_MYSTERYBIT; /* if you take this out triton
+ based motherboards will
+ operate unreliably */
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 );
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:
return( EINVAL );
}
@@ -3926,11 +3981,17 @@ static int oformat_meteor_to_bt( u_long format )
/* */
#define I2CBITTIME (0x5<<4) /* 5 * 0.48uS */
+#define I2CBITTIME_878 (1 << 7)
#define I2C_READ 0x01
#define I2C_COMMAND (I2CBITTIME | \
BT848_DATA_CTL_I2CSCL | \
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);
/* 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 ) {
data |= ((byte2 & 0xff) << 8);
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);
/* 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 */
for ( x = 0x7fffffff; x; --x ) { /* safety valve */
@@ -4184,11 +4257,12 @@ static void
probeCard( bktr_ptr_t bktr, int verbose )
{
int card, i,j, card_found;
- int status;
+ int status, *test;
bt848_ptr_t bt848;
u_char probe_signature[128], *probe_temp;
int any_i2c_devices;
-
+ u_char probe_eeprom[128];
+ u_long code = 0;
any_i2c_devices = check_for_i2c_devices( bktr );
bt848 = bktr->base;
@@ -4281,6 +4355,7 @@ checkTuner:
}
/* differentiate type of tuner */
+
switch (card) {
case CARD_MIRO:
switch (((bt848->gpio_data >> 10)-1)&7) {
@@ -4300,20 +4375,50 @@ checkTuner:
goto checkDBX;
}
- if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) {
- bktr->card.tuner = &tuners[ PHILIPS_NTSC ];
- goto checkDBX;
- }
+ }
+ if ( card == CARD_HAUPPAUGE ) {
+ bktr->card.tuner = &tuners[ TEMIC_PAL ];
+ readEEProm(bktr, 0, 128, (u_char *) &probe_eeprom );
- if ( card == CARD_HAUPPAUGE ) {
- if ( i2cRead( bktr, TEMIC_PALI_RADDR ) != ABSENT ) {
- bktr->card.tuner = &tuners[ TEMIC_PAL ];
- goto checkDBX;
- }
+
+ if (probe_eeprom[0] == 0x84) {
+ if (probe_eeprom[8] == 0x8) {
+ code = 1; /* NTSC */
+ } else if (probe_eeprom[8] == 0x4) {
+ code = 2; /* PAL */
}
- /* no tuner found */
- bktr->card.tuner = &tuners[ NO_TUNER ];
+ 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;
+ }
+
+
+ }
+
}
+ /* no tuner found */
+ bktr->card.tuner = &tuners[ NO_TUNER ];
+
checkDBX:
#if defined( OVERRIDE_DBX )
diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h
index 44a6858..61a10d7 100644
--- a/sys/dev/bktr/bktr_reg.h
+++ b/sys/dev/bktr/bktr_reg.h
@@ -37,6 +37,8 @@
*/
#define BROOKTREE_848_ID 0x0350109E
#define BROOKTREE_849_ID 0x0351109E
+#define BROOKTREE_878_ID 0x036E109E
+#define BROOKTREE_879_ID 0x036F109E
typedef volatile u_int bregister_t;
/*
@@ -62,6 +64,7 @@ struct bt848_registers {
# define BT848_IFORM_M_MUX1 (0x03<<5)
# define BT848_IFORM_M_MUX0 (0x02<<5)
# define BT848_IFORM_M_MUX2 (0x01<<5)
+# define BT848_IFORM_M_MUX3 (0x0)
# define BT848_IFORM_M_RSVD (0x00<<5)
#define BT848_IFORM_XTSEL (0x3<<3)
# define BT848_IFORM_X_AUTO (0x03<<3)
@@ -455,6 +458,7 @@ struct bktr_softc {
int reverse_mute;
int bt848_tuner;
int bt848_card;
+ u_long id;
};
typedef struct bktr_softc bktr_reg_t;
OpenPOWER on IntegriCloud