summaryrefslogtreecommitdiffstats
path: root/sys/dev/bktr
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2005-01-23 07:13:09 +0000
committerjulian <julian@FreeBSD.org>2005-01-23 07:13:09 +0000
commit5a11e75d6b948480809bf9e62f8e2527ddea6af9 (patch)
tree518e7323080979d2f83085af6219f83a43c8fc42 /sys/dev/bktr
parent4d31882fdd195f1f300b8d5f403f57e8194485ee (diff)
downloadFreeBSD-src-5a11e75d6b948480809bf9e62f8e2527ddea6af9.zip
FreeBSD-src-5a11e75d6b948480809bf9e62f8e2527ddea6af9.tar.gz
Add code to do better auto detection of tuner types etc.
PR: kern/75831 Submitted by: Branko Lankester <branko@euro.net> MFC after: 1 week
Diffstat (limited to 'sys/dev/bktr')
-rw-r--r--sys/dev/bktr/bktr_card.c21
-rw-r--r--sys/dev/bktr/bktr_tuner.c81
-rw-r--r--sys/dev/bktr/bktr_tuner.h2
3 files changed, 51 insertions, 53 deletions
diff --git a/sys/dev/bktr/bktr_card.c b/sys/dev/bktr/bktr_card.c
index 79f142d..8d9a681 100644
--- a/sys/dev/bktr/bktr_card.c
+++ b/sys/dev/bktr/bktr_card.c
@@ -739,21 +739,6 @@ probeCard( bktr_ptr_t bktr, int verbose, int unit )
goto checkTuner;
}
- if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_NEW) {
- bktr->card = cards[ (card = CARD_PINNACLE_PCTV_RAVE) ];
- bktr->card.eepromAddr = eeprom_i2c_address;
- bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE);
-
- TDA9887_init(bktr, 0);
-
- /* look for a tuner */
- tuner_i2c_address = locate_tuner_address( bktr );
- printf( "%s: tuner @ %#x\n", bktr_name(bktr), tuner_i2c_address );
- select_tuner( bktr, TUNER_MT2032 );
-
- goto checkDBX;
- }
-
/* Vendor is unknown. We will use the standard probe code */
/* which may not give best results */
printf("%s: Warning - card vendor 0x%04x (model 0x%04x) unknown.\n",
@@ -884,6 +869,12 @@ checkEEPROM:
checkTuner:
+ if (card == CARD_MIRO && mt2032_init(bktr) == 0) {
+ bktr->card = cards[ (card = CARD_PINNACLE_PCTV_RAVE) ];
+ select_tuner( bktr, TUNER_MT2032 );
+ goto checkDBX;
+ }
+
/* look for a tuner */
tuner_i2c_address = locate_tuner_address( bktr );
if ( tuner_i2c_address == -1 ) {
diff --git a/sys/dev/bktr/bktr_tuner.c b/sys/dev/bktr/bktr_tuner.c
index d149db1..a9b42ad 100644
--- a/sys/dev/bktr/bktr_tuner.c
+++ b/sys/dev/bktr/bktr_tuner.c
@@ -137,7 +137,6 @@ __FBSDID("$FreeBSD$");
static void mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq);
-static int mt2032_init(bktr_ptr_t bktr);
static const struct TUNER tuners[] = {
@@ -726,9 +725,6 @@ void select_tuner( bktr_ptr_t bktr, int tuner_type ) {
} else {
bktr->card.tuner = NULL;
}
- if (tuner_type == TUNER_MT2032) {
- mt2032_init(bktr);
- }
}
/*
@@ -1044,29 +1040,18 @@ tuner_getchnlset(struct bktr_chnlset *chnlset)
#define TDA9887_ADDR 0x86
-int
+static int
TDA9887_init(bktr_ptr_t bktr, int output2_enable)
{
u_char addr = TDA9887_ADDR;
-#if 0
- char buf[8];
- /* NOTE: these are PAL values */
- buf[0] = 0; /* sub address */
- buf[1] = 0x50; /* output port1 inactive */
- buf[2] = 0x6e; /* tuner takeover point / de-emphasis */
- buf[3] = 0x09; /* fVIF = 38.9 MHz, fFM = 5.5 MHz */
-
- if (!output2_enable)
- buf[1] |= 0x80;
+ i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0);
+ i2cWrite(bktr, addr, 1, 0x6e); /* takeover point / de-emphasis */
- if (i2cWriteBuf(bktr, addr, 4, buf) == -1) {
- printf("%s: TDA9887 write failed\n", bktr_name(bktr));
- return -1;
- }
+ /* PAL BG: 0x09 PAL I: 0x0a NTSC: 0x04 */
+#ifdef MT2032_NTSC
+ i2cWrite(bktr, addr, 2, 0x04);
#else
- i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0);
- i2cWrite(bktr, addr, 1, 0x6e);
i2cWrite(bktr, addr, 2, 0x09);
#endif
return 0;
@@ -1086,19 +1071,22 @@ static int MT2032_XOGC = 4;
#define MT2032_ADDR (bktr->card.tuner_pllAddr)
#endif
-static u_char
+static int
_MT2032_GetRegister(bktr_ptr_t bktr, u_char regNum)
{
int ch;
if (i2cWrite(bktr, MT2032_ADDR, regNum, -1) == -1) {
- printf("%s: MT2032 write failed (i2c addr %#x)\n",
- bktr_name(bktr), MT2032_ADDR);
+ if (bootverbose)
+ printf("%s: MT2032 write failed (i2c addr %#x)\n",
+ bktr_name(bktr), MT2032_ADDR);
+ return -1;
}
if ((ch = i2cRead(bktr, MT2032_ADDR + 1)) == -1) {
- printf("%s: MT2032 get register %d failed\n",
- bktr_name(bktr), regNum);
- return 0;
+ if (bootverbose)
+ printf("%s: MT2032 get register %d failed\n",
+ bktr_name(bktr), regNum);
+ return -1;
}
return ch;
}
@@ -1113,21 +1101,31 @@ _MT2032_SetRegister(bktr_ptr_t bktr, u_char regNum, u_char data)
#define MT2032_SetRegister(r,d) _MT2032_SetRegister(bktr,r,d)
-static int
+int
mt2032_init(bktr_ptr_t bktr)
{
u_char rdbuf[22];
int xogc, xok = 0;
int i;
+ int x;
TDA9887_init(bktr, 0);
- for (i = 0; i < 21; i++)
- rdbuf[i] = MT2032_GetRegister(i);
+ for (i = 0; i < 21; i++) {
+ if ((x = MT2032_GetRegister(i)) == -1)
+ break;
+ rdbuf[i] = x;
+ }
+ if (i < 21)
+ return -1;
printf("%s: MT2032: Companycode=%02x%02x Part=%02x Revision=%02x\n",
bktr_name(bktr),
rdbuf[0x11], rdbuf[0x12], rdbuf[0x13], rdbuf[0x14]);
+ if (rdbuf[0x13] != 4) {
+ printf("%s: MT2032 not found or unknown type\n", bktr_name(bktr));
+ return -1;
+ }
/* Initialize Registers per spec. */
MT2032_SetRegister(2, 0xff);
@@ -1355,10 +1353,6 @@ MT2032_SetIFFreq(bktr_ptr_t bktr, int rfin, int if1, int if2, int from, int to)
TDA9887_init(bktr, 0);
- printf("%s: MT2032-SetIFFreq: 0x%02X%02X%02X%02X...\n",
- bktr_name(bktr),
- buf[0x00], buf[0x01], buf[0x02], buf[0x03]);
-
/* send only the relevant registers per Rev. 1.2 */
MT2032_SetRegister(0, buf[0x00]);
MT2032_SetRegister(1, buf[0x01]);
@@ -1399,12 +1393,25 @@ static void
mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq)
{
int if2,from,to;
+ int stat, tad;
+#ifdef MT2032_NTSC
+ from=40750*1000;
+ to=46750*1000;
+ if2=45750*1000;
+#else
from=32900*1000;
to=39900*1000;
if2=38900*1000;
+#endif
- printf("%s: setting frequency to %d\n", bktr_name(bktr), freq*62500);
- MT2032_SetIFFreq(bktr, freq*62500 /* freq*1000*1000/16 */,
- 1090*1000*1000, if2, from, to);
+ if (MT2032_SetIFFreq(bktr, freq*62500 /* freq*1000*1000/16 */,
+ 1090*1000*1000, if2, from, to) == 0) {
+ bktr->tuner.frequency = freq;
+ stat = MT2032_GetRegister(0x0e);
+ tad = MT2032_GetRegister(0x0f);
+ if (bootverbose)
+ printf("%s: frequency set to %d, st = %#x, tad = %#x\n",
+ bktr_name(bktr), freq*62500, stat, tad);
+ }
}
diff --git a/sys/dev/bktr/bktr_tuner.h b/sys/dev/bktr/bktr_tuner.h
index a1aa64a..1d6986b 100644
--- a/sys/dev/bktr/bktr_tuner.h
+++ b/sys/dev/bktr/bktr_tuner.h
@@ -92,7 +92,7 @@ int get_tuner_status( bktr_ptr_t bktr );
int do_afc( bktr_ptr_t bktr, int addr, int frequency );
#endif /* TUNER_AFC */
-int TDA9887_init(bktr_ptr_t bktr, int output2_enable);
+int mt2032_init(bktr_ptr_t bktr);
/*
* This is for start-up convenience only, NOT mandatory.
OpenPOWER on IntegriCloud