summaryrefslogtreecommitdiffstats
path: root/sys/dev/bktr
diff options
context:
space:
mode:
authoreivind <eivind@FreeBSD.org>1997-10-30 18:20:26 +0000
committereivind <eivind@FreeBSD.org>1997-10-30 18:20:26 +0000
commitdbc432c0d0e52f23deeeeb87b034157418933c0c (patch)
treee7424aa20a0b3389e4834a196be7df2b2c859496 /sys/dev/bktr
parent44b39f89cb976b0fc9ca1befc794847428044cd6 (diff)
downloadFreeBSD-src-dbc432c0d0e52f23deeeeb87b034157418933c0c.zip
FreeBSD-src-dbc432c0d0e52f23deeeeb87b034157418933c0c.tar.gz
Improve PAL support and fix mux selector values.
This make the Miro PCTV work for me, including audio, and should hopefully fix the other audio problems some people have been having. Reviewed by: ahasty & Luigi Rizzo (freebsd-multimedia)
Diffstat (limited to 'sys/dev/bktr')
-rw-r--r--sys/dev/bktr/bktr_core.c129
-rw-r--r--sys/dev/bktr/bktr_reg.h7
2 files changed, 104 insertions, 32 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index a56572d..aa61218 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -406,10 +406,23 @@ struct devsw bktrsw = {
*/
static struct format_params format_params[] = {
-#define FORMAT_PARAMS_NTSC525 0
- { 525, 22, 480, 910, 135, 754, 640, 780, 30 },
-#define FORMAT_PARAMS_PAL625 1
- { 625, 32, 576, 1135, 186, 922, 768, 944, 25 }
+/* # define BT848_IFORM_F_AUTO (0x0) - don't matter. */
+ { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, 0 },
+/* # define BT848_IFORM_F_NTSCM (0x1) */
+ { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 },
+/* # define BT848_IFORM_F_NTSCJ (0x2) */
+ { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 },
+/* # define BT848_IFORM_F_PALBDGHI (0x3) */
+ { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1 },
+/* # define BT848_IFORM_F_PALM (0x4) */
+ { 525, 22, 480, 910, 135, 754, 640, 780, 30, 0x68, 0x5d, BT848_IFORM_X_XT0 },
+/*{ 625, 32, 576, 910, 186, 922, 640, 780, 25, 0x68, 0x5d, BT848_IFORM_X_XT0 }, */
+/* # define BT848_IFORM_F_PALN (0x5) */
+ { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT1 },
+/* # define BT848_IFORM_F_SECAM (0x6) */
+ { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x00, BT848_IFORM_X_XT1 },
+/* # define BT848_IFORM_F_RSVD (0x7) - ???? */
+ { 625, 32, 576, 1135, 186, 922, 768, 944, 25, 0x7f, 0x72, BT848_IFORM_X_XT0 },
};
/*
@@ -520,6 +533,10 @@ static struct {
#define TDA9850_WADDR 0xb6
#define TDA9850_RADDR 0xb7
+/* address of MSP3400C chip */
+#define MSP3400C_WADDR 0x80
+#define MSP3400C_RADDR 0x81
+
/* EEProm (128 * 8) on an STB card */
#define X24C01_WADDR 0xae
@@ -562,7 +579,7 @@ static struct {
/* the GPIO bits that control the audio MUXes */
-#define GPIO_AUDIOMUX_BITS 0x07
+#define GPIO_AUDIOMUX_BITS 0x0f
/* debug utility for holding previous INT_STAT contents */
@@ -1070,7 +1087,7 @@ video_open( bktr_ptr_t bktr )
BT848_IFORM_X_XT0 |
BT848_IFORM_F_NTSCM;
bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0;
- bktr->format_params = FORMAT_PARAMS_NTSC525;
+ bktr->format_params = BT848_IFORM_F_NTSCM;
bktr->max_clip_node = 0;
@@ -1130,7 +1147,7 @@ tuner_open( bktr_ptr_t bktr )
/* enable drivers on the GPIO port that control the MUXes */
bktr->base->gpio_out_en = GPIO_AUDIOMUX_BITS;
- /* unmure the audio stream */
+ /* unmute the audio stream */
set_audio( bktr, AUDIO_UNMUTE );
/* enable stereo if appropriate */
@@ -1399,7 +1416,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
case BT848SFMT: /* set input format */
temp = *(unsigned long*)arg & BT848_IFORM_FORMAT;
bt848->iform &= ~BT848_IFORM_FORMAT;
- bt848->iform |= temp;
+ bt848->iform |= (temp | format_params[temp].iform_xtsel);
switch( temp ) {
case BT848_IFORM_F_AUTO:
bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
@@ -1408,23 +1425,25 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
case BT848_IFORM_F_NTSCM:
case BT848_IFORM_F_NTSCJ:
- case BT848_IFORM_F_PALM:
bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
- METEOR_NTSC;
- bt848->adelay = 0x68;
- bt848->bdelay = 0x5d;
- bktr->format_params = FORMAT_PARAMS_NTSC525;
+ METEOR_NTSC;
+ bt848->adelay = format_params[temp].adelay;
+ bt848->bdelay = format_params[temp].bdelay;
+ bktr->format_params = temp;
break;
case BT848_IFORM_F_PALBDGHI:
case BT848_IFORM_F_PALN:
case BT848_IFORM_F_SECAM:
case BT848_IFORM_F_RSVD:
+ case BT848_IFORM_F_PALM:
bktr->flags = (bktr->flags & ~METEOR_FORM_MASK) |
METEOR_PAL;
- bt848->adelay = 0x7f;
- bt848->bdelay = 0x72;
- bktr->format_params = FORMAT_PARAMS_PAL625;
+ bt848->adelay = format_params[temp].adelay;
+ bt848->bdelay = format_params[temp].bdelay;
+ bktr->format_params = temp;
+ break;
+
}
break;
@@ -1438,7 +1457,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
bt848->iform |= BT848_IFORM_F_NTSCM;
bt848->adelay = 0x68;
bt848->bdelay = 0x5d;
- bktr->format_params = FORMAT_PARAMS_NTSC525;
+ bktr->format_params = BT848_IFORM_F_NTSCM;
break;
case METEOR_FMT_PAL:
@@ -1448,7 +1467,7 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
bt848->iform |= BT848_IFORM_F_PALBDGHI;
bt848->adelay = 0x7f;
bt848->bdelay = 0x72;
- bktr->format_params = FORMAT_PARAMS_PAL625;
+ bktr->format_params = BT848_IFORM_F_PALBDGHI;
break;
case METEOR_FMT_AUTOMODE:
@@ -1868,7 +1887,6 @@ video_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr )
return( 0 );
}
-
/*
* tuner ioctls
*/
@@ -3353,6 +3371,7 @@ const struct CARDTYPE cards[] = {
{ "Unknown", /* the 'name' */
NULL, /* the tuner */
0, /* dbx unknown */
+ 0,
0, /* EEProm unknown */
0, /* EEProm unknown */
{ 0, 0, 0, 0, 0 } },
@@ -3361,14 +3380,16 @@ const struct CARDTYPE cards[] = {
{ "Miro TV", /* the 'name' */
NULL, /* the tuner */
0, /* dbx unknown */
+ 0,
0, /* EEProm unknown */
0, /* size unknown */
- { 0x02, 0x01, 0x00, 0x00, 1 } }, /* XXX ??? */
+ { 0x02, 0x01, 0x00, 0x0a, 1 } }, /* XXX ??? */
/* CARD_HAUPPAUGE */
{ "Hauppauge WinCast/TV", /* the 'name' */
NULL, /* the tuner */
0, /* dbx is optional */
+ 0,
PFC8582_WADDR, /* EEProm type */
(u_char)(256 / EEPROMBLOCKSIZE), /* 256 bytes */
{ 0x00, 0x02, 0x01, 0x01, 1 } }, /* audio MUX values */
@@ -3377,6 +3398,7 @@ const struct CARDTYPE cards[] = {
{ "STB TV/PCI", /* the 'name' */
NULL, /* the tuner */
0, /* dbx is optional */
+ 0,
X24C01_WADDR, /* EEProm type */
(u_char)(128 / EEPROMBLOCKSIZE), /* 128 bytes */
{ 0x00, 0x01, 0x02, 0x02, 1 } }, /* audio MUX values */
@@ -3387,6 +3409,7 @@ const struct CARDTYPE cards[] = {
0,
0,
0,
+ 0,
{ 0, 0, 0, 0, 0 } }
};
@@ -3410,6 +3433,8 @@ const struct CARDTYPE cards[] = {
#define PHILIPS_NTSC 4
#define PHILIPS_PAL 5
#define PHILIPS_SECAM 6
+#define TEMIC_PALI 7
+#define PHILIPS_PALI 8
/* XXX FIXME: this list is incomplete */
/* input types */
@@ -3487,7 +3512,23 @@ const struct TUNER tuners[] = {
0x00, /* PLL write address */
TSA552x_SCONTROL, /* control byte for PLL */
{ 0x00, 0x00 }, /* band-switch crosspoints */
- { 0xa0, 0x90, 0x30 } } /* the band-switch values */
+ { 0xa0, 0x90, 0x30 } }, /* the band-switch values */
+
+ /* TEMIC_PAL I */
+ { "Temic PAL I", /* the 'name' */
+ TTYPE_PAL, /* input type */
+ TEMIC_PALI_WADDR, /* PLL write address */
+ TSA552x_SCONTROL, /* control byte for PLL */
+ { 0x00, 0x00 }, /* band-switch crosspoints */
+ { 0x02, 0x04, 0x01 } }, /* the band-switch values */
+
+ /* PHILIPS_PAL */
+ { "Philips PAL I", /* the 'name' */
+ TTYPE_PAL, /* input type */
+ 0x00, /* PLL write address */
+ TSA552x_SCONTROL, /* control byte for PLL */
+ { 0x00, 0x00 }, /* band-switch crosspoints */
+ { 0xa0, 0x90, 0x30 } }, /* the band-switch values */
};
@@ -3527,12 +3568,19 @@ probeCard( bktr_ptr_t bktr, int verbose )
{
int card;
int status;
+ bt848_ptr_t bt848;
+
+ bt848 = bktr->base;
#if defined( OVERRIDE_CARD )
bktr->card = cards[ (card = OVERRIDE_CARD) ];
goto checkTuner;
#endif
+ bt848->gpio_out_en = 0;
+ if (bootverbose)
+ printf("bktr: GPIO is 0x%08x\n", bt848->gpio_data);
+
/* look for a tuner */
if ( i2cRead( bktr, TSA552x_RADDR ) == ABSENT ) {
bktr->card = cards[ (card = CARD_INTEL) ];
@@ -3562,26 +3610,40 @@ checkTuner:
#endif
/* differentiate type of tuner */
- if ( i2cRead( bktr, TEMIC_NTSC_RADDR ) != ABSENT ) {
+ switch (card) {
+ case CARD_MIRO:
+ switch (((bt848->gpio_data >> 10)-1)&7) {
+ case 0: bktr->card.tuner = &tuners[ TEMIC_PAL ]; break;
+ case 1: bktr->card.tuner = &tuners[ PHILIPS_PAL ]; break;
+ case 2: bktr->card.tuner = &tuners[ PHILIPS_NTSC ]; break;
+ case 3: bktr->card.tuner = &tuners[ PHILIPS_SECAM ]; break;
+ case 4: bktr->card.tuner = &tuners[ NO_TUNER ]; break;
+ case 5: bktr->card.tuner = &tuners[ PHILIPS_PALI ]; break;
+ case 6: bktr->card.tuner = &tuners[ TEMIC_NTSC ]; break;
+ case 7: bktr->card.tuner = &tuners[ TEMIC_PALI ]; break;
+ }
+ break;
+ default:
+ if ( i2cRead( bktr, TEMIC_NTSC_RADDR ) != ABSENT ) {
bktr->card.tuner = &tuners[ TEMIC_NTSC ];
goto checkDBX;
- }
+ }
- if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) {
+ if ( i2cRead( bktr, PHILIPS_NTSC_RADDR ) != ABSENT ) {
bktr->card.tuner = &tuners[ PHILIPS_NTSC ];
goto checkDBX;
- }
+ }
- if ( card == CARD_HAUPPAUGE ) {
+ if ( card == CARD_HAUPPAUGE ) {
if ( i2cRead( bktr, TEMIC_PALI_RADDR ) != ABSENT ) {
- bktr->card.tuner = &tuners[ TEMIC_PAL ];
- goto checkDBX;
+ 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:
#if defined( OVERRIDE_DBX )
bktr->card.dbx = OVERRIDE_DBX;
@@ -3590,6 +3652,8 @@ checkDBX:
/* probe for BTSC (dbx) chips */
if ( i2cRead( bktr, TDA9850_RADDR ) != ABSENT )
bktr->card.dbx = 1;
+ if ( i2cRead( bktr, MSP3400C_RADDR ) != ABSENT )
+ bktr->card.msp3400c = 1;
if ( verbose ) {
printf( "%s", bktr->card.name );
@@ -3597,6 +3661,8 @@ checkDBX:
printf( ", %s tuner", bktr->card.tuner->name );
if ( bktr->card.dbx )
printf( ", dbx stereo" );
+ if ( bktr->card.msp3400c )
+ printf( ", msp3400c stereo" );
printf( ".\n" );
}
}
@@ -4230,4 +4296,5 @@ SYSINIT(bktrdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,bktr_drvinit,NULL)
/* c-label-offset: -8 */
/* c-continued-statement-offset: 8 */
/* c-tab-always-indent: nil */
+/* tab-width: 8 */
/* End: */
diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h
index 2fb8b3d..d0b4a58 100644
--- a/sys/dev/bktr/bktr_reg.h
+++ b/sys/dev/bktr/bktr_reg.h
@@ -321,7 +321,8 @@ struct TUNER {
struct CARDTYPE {
char* name;
const struct TUNER* tuner;
- u_char dbx;
+ u_char dbx; /* Has DBX chip? */
+ u_char msp3400c; /* Has msp3400c chip? */
u_char eepromAddr;
u_char eepromSize; /* bytes / EEPROMBLOCKSIZE */
u_char audiomuxs[ 5 ]; /* tuner, ext, int/unused,
@@ -337,6 +338,10 @@ struct format_params {
int horizontal, vertical;
/* frame rate . for ntsc is 30 frames per second */
int frame_rate;
+/* A-delay and B-delay */
+ u_char adelay, bdelay;
+/* Iform XTSEL value */
+ int iform_xtsel;
};
OpenPOWER on IntegriCloud