kern/75831: [bktr] [patch] incorrect autodetection of Pinnacle cards
branko at euro.net
branko at euro.net
Wed Jan 5 00:20:25 GMT 2005
>Number: 75831
>Category: kern
>Synopsis: [bktr] [patch] incorrect autodetection of Pinnacle cards
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Wed Jan 05 00:20:25 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator: Branko Lankester <branko at euro.net>
>Release: FreeBSD 5.3-STABLE i386
>Organization:
>Environment:
Described in message sent to freebsd-stable mailing list:
From: Michael Nottebrock <michaelnottebrock at gmx.net>
To: stable at freebsd.org
Date: Sun, 2 Jan 2005 12:18:55 +0100
Message-Id: <200501021219.00028.michaelnottebrock at gmx.net>
Subject: bktr now broken for me
System: slash.euronet.nl 4.10-STABLE FreeBSD 4.10-STABLE #3: Tue Oct 5 18:59:20 CEST 2004 branko at snatch.wanadoo.nl:/d0/obj/d0/src/sys/SLASH i386
>Description:
Pinnacle cards without MT2032 tuner are autodetected as PCTV Rave
>How-To-Repeat:
>Fix:
The following patch detects the MT2032 tuner by reading its
registers instead of looking at the PCI ID.
--- pctv_rave_53.diff begins here ---
diff -c /home/branko/bktr-org/bktr_card.c ./bktr_card.c
*** /home/branko/bktr-org/bktr_card.c Fri Dec 31 09:33:52 2004
--- ./bktr_card.c Tue Jan 4 17:47:08 2005
***************
*** 727,747 ****
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",
--- 727,732 ----
***************
*** 871,876 ****
--- 856,867 ----
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 );
diff -c /home/branko/bktr-org/bktr_tuner.c ./bktr_tuner.c
*** /home/branko/bktr-org/bktr_tuner.c Fri Dec 31 09:33:52 2004
--- ./bktr_tuner.c Tue Jan 4 21:38:27 2005
***************
*** 137,143 ****
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[] = {
--- 137,142 ----
***************
*** 726,734 ****
} else {
bktr->card.tuner = NULL;
}
- if (tuner_type == TUNER_MT2032) {
- mt2032_init(bktr);
- }
}
/*
--- 725,730 ----
***************
*** 1044,1072 ****
#define TDA9887_ADDR 0x86
! 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;
! if (i2cWriteBuf(bktr, addr, 4, buf) == -1) {
! printf("%s: TDA9887 write failed\n", bktr_name(bktr));
! return -1;
! }
#else
- i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0);
- i2cWrite(bktr, addr, 1, 0x6e);
i2cWrite(bktr, addr, 2, 0x09);
#endif
return 0;
--- 1040,1057 ----
#define TDA9887_ADDR 0x86
! static int
TDA9887_init(bktr_ptr_t bktr, int output2_enable)
{
u_char addr = TDA9887_ADDR;
! i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0);
! i2cWrite(bktr, addr, 1, 0x6e); /* takeover point / de-emphasis */
! /* PAL BG: 0x09 PAL I: 0x0a NTSC: 0x04 */
! #ifdef MT2032_NTSC
! i2cWrite(bktr, addr, 2, 0x04);
#else
i2cWrite(bktr, addr, 2, 0x09);
#endif
return 0;
***************
*** 1086,1104 ****
#define MT2032_ADDR (bktr->card.tuner_pllAddr)
#endif
! static u_char
_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 ((ch = i2cRead(bktr, MT2032_ADDR + 1)) == -1) {
! printf("%s: MT2032 get register %d failed\n",
! bktr_name(bktr), regNum);
! return 0;
}
return ch;
}
--- 1071,1092 ----
#define MT2032_ADDR (bktr->card.tuner_pllAddr)
#endif
! static int
_MT2032_GetRegister(bktr_ptr_t bktr, u_char regNum)
{
int ch;
if (i2cWrite(bktr, MT2032_ADDR, regNum, -1) == -1) {
! 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) {
! if (bootverbose)
! printf("%s: MT2032 get register %d failed\n",
! bktr_name(bktr), regNum);
! return -1;
}
return ch;
}
***************
*** 1113,1133 ****
#define MT2032_SetRegister(r,d) _MT2032_SetRegister(bktr,r,d)
! static int
mt2032_init(bktr_ptr_t bktr)
{
u_char rdbuf[22];
int xogc, xok = 0;
int i;
TDA9887_init(bktr, 0);
! for (i = 0; i < 21; i++)
! rdbuf[i] = MT2032_GetRegister(i);
printf("%s: MT2032: Companycode=%02x%02x Part=%02x Revision=%02x\n",
bktr_name(bktr),
rdbuf[0x11], rdbuf[0x12], rdbuf[0x13], rdbuf[0x14]);
/* Initialize Registers per spec. */
MT2032_SetRegister(2, 0xff);
--- 1101,1131 ----
#define MT2032_SetRegister(r,d) _MT2032_SetRegister(bktr,r,d)
! 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++) {
! 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,1364 ****
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]);
--- 1353,1358 ----
***************
*** 1399,1410 ****
mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq)
{
int if2,from,to;
from=32900*1000;
to=39900*1000;
if2=38900*1000;
! 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);
}
--- 1393,1417 ----
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
! 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 -c /home/branko/bktr-org/bktr_tuner.h ./bktr_tuner.h
*** /home/branko/bktr-org/bktr_tuner.h Fri Dec 31 09:33:52 2004
--- ./bktr_tuner.h Tue Jan 4 17:47:08 2005
***************
*** 92,98 ****
int do_afc( bktr_ptr_t bktr, int addr, int frequency );
#endif /* TUNER_AFC */
! int TDA9887_init(bktr_ptr_t bktr, int output2_enable);
/*
* This is for start-up convenience only, NOT mandatory.
--- 92,98 ----
int do_afc( bktr_ptr_t bktr, int addr, int frequency );
#endif /* TUNER_AFC */
! int mt2032_init(bktr_ptr_t bktr);
/*
* This is for start-up convenience only, NOT mandatory.
--- pctv_rave_53.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list