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