summaryrefslogtreecommitdiffstats
path: root/sys/dev/bktr
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/bktr')
-rw-r--r--sys/dev/bktr/bktr_core.c223
-rw-r--r--sys/dev/bktr/bktr_reg.h3
2 files changed, 182 insertions, 44 deletions
diff --git a/sys/dev/bktr/bktr_core.c b/sys/dev/bktr/bktr_core.c
index c482b66..2135d77 100644
--- a/sys/dev/bktr/bktr_core.c
+++ b/sys/dev/bktr/bktr_core.c
@@ -14,7 +14,6 @@
Enjoy,
Amancio
- $Id$
*/
/*
@@ -104,10 +103,16 @@
and last but not least with the Intel Smart
Video Recorder.
-1.4 3/9/97 Merged code to support tuners on STB and WinCast
+1.4 3/9/97 fsmp@freefall.org
+ Merged code to support tuners on STB and WinCast
cards.
Modifications to the contrast and chroma ioctls.
Textual cleanup.
+
+1.5 3/15/97 fsmp@freefall.org
+ new bt848 specific versions of hue/bright/
+ contrast/satu/satv.
+ Amancio's patch to fix "screen freeze" problem.
*/
#include "bktr.h"
@@ -199,6 +204,7 @@ options DEFAULT_TUNERTYPE=2 # TUNERTYPE_CABLEIRC
* tuner specific functions
*/
static int tv_channel __P(( bktr_reg_t* bktr, int channel ));
+static int tv_freq __P(( bktr_reg_t* bktr, int frequency ));
static int tuner_status __P(( bktr_reg_t* bktr ));
@@ -327,7 +333,7 @@ bktr_intr( void *arg )
}
/* if risc was disabled re-start process again */
- if (!(bktr_status & (1 << 27)) || ((bktr_status & 0xfe000) != 0) ) {
+ if (!(bktr_status & (1 << 27)) || ((bktr_status & 0xff000) != 0) ) {
btl_reg = (u_long *) &bt848[BKTR_INT_STAT];
*btl_reg = *btl_reg;
@@ -347,6 +353,7 @@ bktr_intr( void *arg )
btl_reg = (u_long *) &bt848[BKTR_INT_MASK];
*btl_reg = 1 << 23 | 1 << 11 | 2 | 1;
+ bt848[BKTR_CAP_CTL] = bktr->bktr_cap_ctl;
return;
}
@@ -900,19 +907,22 @@ build_dma_prog( bktr_reg_t * bktr, char i_flag)
/* capture control */
switch (i_flag) {
case 1:
+ bktr->bktr_cap_ctl = 0x11;
bt848[BKTR_CAP_CTL] = 0x11;
bt848[BKTR_E_VSCALE_HI] &= ~0x20;
bt848[BKTR_O_VSCALE_HI] &= ~0x20;
interlace = 1;
break;
case 2:
+ bktr->bktr_cap_ctl = 0x12;
bt848[BKTR_CAP_CTL] = 0x12;
bt848[BKTR_E_VSCALE_HI] &= ~0x20;
bt848[BKTR_O_VSCALE_HI] &= ~0x20;
interlace = 1;
break;
default:
- bt848[0xdc] = 0x13;
+ bktr->bktr_cap_ctl = 0x13;
+ bt848[BKTR_CAP_CTL] = 0x13;
bt848[BKTR_E_VSCALE_HI] |= 0x20;
bt848[BKTR_O_VSCALE_HI] |= 0x20;
interlace = 2;
@@ -1439,6 +1449,16 @@ bktr_ioctl( dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr )
*(unsigned long *)arg = temp & 0xff;
break;
+ case TVTUNER_SETFREQ:
+ temp = tv_freq( bktr, (int)*(unsigned long *)arg );
+ if ( temp < 0 ) return EIO;
+ *(unsigned long *)arg = temp;
+ break;
+
+ case TVTUNER_GETFREQ:
+ *(unsigned long *)arg = bktr->tuner.frequency;
+ break;
+
case METEORSTATUS: /* get 7196 status */
c_temp = bt848[0];
temp = 0;
@@ -1571,7 +1591,7 @@ bktr_ioctl( dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr )
break;
case METEORSBRIG: /* set brightness */
- bt848[BKTR_BRIGHT] = *(u_char *)arg & 0xff;
+ bt848[BKTR_BRIGHT] = *(u_char *)arg & 0xff;
break;
case METEORGBRIG: /* get brightness */
@@ -1579,39 +1599,21 @@ bktr_ioctl( dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr )
break;
case METEORSCSAT: /* set chroma saturation */
-#if defined( OLD_METEORSCSAT )
- s_temp = *(u_short *)arg ;
- s_temp = s_temp << 1;
-
- bt848[BKTR_SAT_U_LO] = s_temp;
- bt848[BKTR_SAT_V_LO] = s_temp;
- s_temp = s_temp >> 8;
-
- bt848[BKTR_E_CONTROL] &= ~0x3;
- bt848[BKTR_O_CONTROL] &= ~0x3;
- bt848[BKTR_E_CONTROL] |= s_temp & 0x3;
- bt848[BKTR_O_CONTROL] |= s_temp & 0x3;
- break;
-#endif /* OLD_METEORSCSAT */
temp = (int)*(u_char *)arg;
bt848[BKTR_SAT_U_LO] = bt848[BKTR_SAT_V_LO] =
(temp << 1) & 0xff;
- bt848[BKTR_E_CONTROL] &= ~0x3; /* clear U/V MSBs */
- bt848[BKTR_O_CONTROL] &= ~0x3; /* clear U/V MSBs */
+ bt848[BKTR_E_CONTROL] &= ~0x3; /* clear U/V MSBs */
+ bt848[BKTR_O_CONTROL] &= ~0x3; /* clear U/V MSBs */
if ( temp & 0x80 ) {
- bt848[BKTR_E_CONTROL] |= 0x3; /* */
- bt848[BKTR_O_CONTROL] |= 0x3;
+ bt848[BKTR_E_CONTROL] |= 0x3;
+ bt848[BKTR_O_CONTROL] |= 0x3;
}
break;
case METEORGCSAT: /* get chroma saturation */
-#if defined( OLD_METEORGCSAT )
- *(u_short *)arg = (bt848[BKTR_E_CONTROL] << 8) & 0x10 | bt848[BKTR_SAT_U_LO];
- break;
-#endif /* OLD_METEORGCSAT */
temp = (bt848[BKTR_SAT_V_LO] >> 1) & 0xff;
if ( bt848[BKTR_E_CONTROL] & 0x01 )
temp |= 0x80;
@@ -1629,15 +1631,122 @@ bktr_ioctl( dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr )
break;
case METEORGCONT: /* get contrast */
-#if defined( OLD_METEORGCONT )
- *(u_short *)arg = bt848[BKTR_CONTRAST_LO] | ((bt848[BKTR_O_CONTROL] & 4) << 2);
- break;
-#endif /* OLD_METEORGCONT */
temp = (int)bt848[BKTR_CONTRAST_LO] & 0xff;
temp |= ((int)bt848[BKTR_O_CONTROL] & 0x04) << 6;
*(u_char *)arg = (u_char)((temp >> 1) & 0xff);
break;
+ /* hue is a 2's compliment number, -90' to +89.3' in 0.7' steps */
+ case BT848_SHUE: /* set hue */
+ bt848[BKTR_HUE] = (u_char)(*(int*)arg & 0xff);
+ break;
+
+ case BT848_GHUE: /* get hue */
+ *(int*)arg = bt848[BKTR_HUE] & 0xff;
+ break;
+
+ /* brightness is a 2's compliment #, -50 to +%49.6% in 0.39% steps */
+ case BT848_SBRIG: /* set brightness */
+ bt848[BKTR_BRIGHT] = (u_char)(*(int *)arg & 0xff);
+ break;
+
+ case BT848_GBRIG: /* get brightness */
+ *(int *)arg = bt848[BKTR_BRIGHT] & 0xff;
+ break;
+
+ /* */
+ case BT848_SCSAT: /* set chroma saturation */
+ tmp_int = *(int*)arg;
+
+ temp = bt848[BKTR_E_CONTROL] & 0xfc;
+ temp1 = bt848[BKTR_O_CONTROL] & 0xfc;
+ if ( tmp_int & 0x100 ) {
+ temp |= 0x03;
+ temp1 |= 0x03;
+ }
+
+ bt848[BKTR_SAT_U_LO] = (u_char)(tmp_int & 0xff);
+ bt848[BKTR_SAT_V_LO] = (u_char)(tmp_int & 0xff);
+ bt848[BKTR_E_CONTROL] = temp;
+ bt848[BKTR_O_CONTROL] = temp1;
+ break;
+
+ case BT848_GCSAT: /* get chroma saturation */
+ tmp_int = (int)bt848[BKTR_SAT_V_LO] & 0xff;
+ if ( bt848[BKTR_E_CONTROL] & 0x01 )
+ tmp_int |= 0x0100;
+ *(int*)arg = tmp_int;
+ break;
+
+ /* */
+ case BT848_SVSAT: /* set chroma V saturation */
+ tmp_int = *(int*)arg;
+
+ temp = bt848[BKTR_E_CONTROL] & 0xfe;
+ temp1 = bt848[BKTR_O_CONTROL] & 0xfe;
+ if ( tmp_int & 0x100 ) {
+ temp |= 0x01;
+ temp1 |= 0x01;
+ }
+
+ bt848[BKTR_SAT_V_LO] = (u_char)(tmp_int & 0xff);
+ bt848[BKTR_E_CONTROL] = temp;
+ bt848[BKTR_O_CONTROL] = temp1;
+ break;
+
+ case BT848_GVSAT: /* get chroma V saturation */
+ tmp_int = (int)bt848[BKTR_SAT_V_LO] & 0xff;
+ if ( bt848[BKTR_E_CONTROL] & 0x01 )
+ tmp_int |= 0x0100;
+ *(int*)arg = tmp_int;
+ break;
+
+ /* */
+ case BT848_SUSAT: /* set chroma U saturation */
+ tmp_int = *(int*)arg;
+
+ temp = bt848[BKTR_E_CONTROL] & 0xfd;
+ temp1 = bt848[BKTR_O_CONTROL] & 0xfd;
+ if ( tmp_int & 0x100 ) {
+ temp |= 0x02;
+ temp1 |= 0x02;
+ }
+
+ bt848[BKTR_SAT_U_LO] = (u_char)(tmp_int & 0xff);
+ bt848[BKTR_E_CONTROL] = temp;
+ bt848[BKTR_O_CONTROL] = temp1;
+ break;
+
+ case BT848_GUSAT: /* get chroma U saturation */
+ tmp_int = (int)bt848[BKTR_SAT_U_LO] & 0xff;
+ if ( bt848[BKTR_E_CONTROL] & 0x02 )
+ tmp_int |= 0x0100;
+ *(int*)arg = tmp_int;
+ break;
+
+ /* */
+ case BT848_SCONT: /* set contrast */
+ tmp_int = *(int*)arg;
+
+ temp = bt848[BKTR_E_CONTROL] & 0xfb;
+ temp1 = bt848[BKTR_O_CONTROL] & 0xfb;
+ if ( tmp_int & 0x100 ) {
+ temp |= 0x04;
+ temp1 |= 0x04;
+ }
+
+ bt848[BKTR_CONTRAST_LO] = (u_char)(tmp_int & 0xff);
+ bt848[BKTR_E_CONTROL] = temp;
+ bt848[BKTR_O_CONTROL] = temp1;
+ break;
+
+ case BT848_GCONT: /* get contrast */
+ tmp_int = (int)bt848[BKTR_CONTRAST_LO] & 0xff;
+ if ( bt848[BKTR_E_CONTROL] & 0x04 )
+ tmp_int |= 0x0100;
+ *(int*)arg = tmp_int;
+ break;
+
case METEORSSIGNAL:
bktr->signal = *(int *) arg;
bktr->proc = pr;
@@ -1974,7 +2083,11 @@ bktr_mmap( dev_t dev, int offset, int nprot )
* bit 1: RSB = 1 62.5kHz
* bit 0: OS = 0 normal operation
*/
+#if defined( TEMIC_TUNER )
+#define TSA5522_CONTROL 0xce
+#else
#define TSA5522_CONTROL 0x8e
+#endif
#if defined( TEMIC_TUNER )
@@ -1995,7 +2108,13 @@ bktr_mmap( dev_t dev, int offset, int nprot )
#endif /* XXXXXX_TUNER */
/* scaling factor for frequencies expressed as ints */
+#define TEST_A
+
+#if defined( TEST_A )
+#define FREQFACTOR 16
+#else
#define FREQFACTOR 100
+#endif
/******************************* i2c primitives ******************************/
@@ -2143,7 +2262,7 @@ i2cAck( i2c_regptr_t bti2c )
* read a byte from the I2C bus
*/
static int
-i2cRead( i2c_regptr_t bti2c )
+i2cRead( i2c_regptr_t bti2c, int ack )
{
int x;
int byte;
@@ -2159,7 +2278,8 @@ i2cRead( i2c_regptr_t bti2c )
DataHi_ClockLo( bti2c, SDELAY ); /* release clock */
}
- i2cGrantAck( bti2c ); /* Grant ACK */
+ if ( ack )
+ i2cGrantAck( bti2c ); /* Grant ACK */
return byte;
}
@@ -2212,12 +2332,18 @@ tv_freq( bktr_reg_t* bktr, int frequency )
* N = 16 * { fRF(pc) + fIF(pc) }
* where:
* pc is picture carrier, fRF & fIF are in mHz
- *
+ */
+#if defined( TEST_A )
+ /*
+ * frequency is mHz * 16, eg. 55.25 mHz * 16 == 884
+ */
+ N = (frequency + 732 /* 45.75 * 16 */);
+#else
+ /*
* frequency is mHz to 2 decimal places, ie. 5525 == 55.25 mHz,
- * dont want to do float in a driver!
*/
N = 16 * ((frequency + IF_FREQUENCY) / FREQFACTOR);
-
+#endif
/* get the i2c register address */
bti2c = I2C_REGADDR();
@@ -2242,6 +2368,8 @@ tv_freq( bktr_reg_t* bktr, int frequency )
i2cStop( bti2c );
enable_intr();
+ bktr->tuner.frequency = frequency;
+
return 0;
}
@@ -2274,20 +2402,32 @@ frequency_nabcst( int channel )
/* channels 14 thru 83 */
if ( channel >= 14 )
+#if defined( TEST_A )
+ return 7540 + ((channel-14) * 96 );
+#else
return 47125 + ((channel-14) * 600 );
-
+#endif
/* channels 7 thru 13 */
if ( channel >= 7 )
+#if defined( TEST_A )
+ return 2804 + ((channel-7) * 96 );
+#else
return 17525 + ((channel-7) * 600 );
-
+#endif
/* channels 5 thru 6 */
if ( channel >= 5 )
+#if defined( TEST_A )
+ return 1236 + ((channel-5) * 96 );
+#else
return 7725 + ((channel-5) * 600 );
-
+#endif
/* channels 2 thru 4 */
if ( channel >= 2 )
+#if defined( TEST_A )
+ return 884 + ((channel-2) * 96 );
+#else
return 5525 + ((channel-2) * 600 );
-
+#endif
/* legal channels are 2 thru 83 */
return -1;
}
@@ -2388,7 +2528,6 @@ tv_channel( bktr_reg_t* bktr, int channel )
return -1;
/* OK to update records */
- bktr->tuner.frequency = frequency;
bktr->tuner.channel = channel;
return channel;
@@ -2411,7 +2550,7 @@ tuner_status( bktr_reg_t* bktr )
disable_intr();
i2cStart( bti2c, TSA5522_RADDR );
- status = i2cRead( bti2c );
+ status = i2cRead( bti2c, 0 ); /* no ACK */
i2cStop( bti2c );
enable_intr();
diff --git a/sys/dev/bktr/bktr_reg.h b/sys/dev/bktr/bktr_reg.h
index b3b19c0..281577f 100644
--- a/sys/dev/bktr/bktr_reg.h
+++ b/sys/dev/bktr/bktr_reg.h
@@ -27,8 +27,6 @@
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- *
- * $Id$
*/
#ifndef PCI_LATENCY_TIMER
#define PCI_LATENCY_TIMER 0x0c /* pci timer register */
@@ -140,6 +138,7 @@ typedef struct bktr_softc {
u_long odd_fields_captured; /* number of odd fields captured */
u_long range_enable; /* enable range checking ?? */
u_short capcontrol; /* reg 0xdc capture control */
+ u_short bktr_cap_ctl;
unsigned flags;
#define METEOR_INITALIZED 0x00000001
#define METEOR_OPEN 0x00000002
OpenPOWER on IntegriCloud