patch-2.3.99-pre4 linux/drivers/char/bttv.c
Next file: linux/drivers/char/bttv.h
Previous file: linux/drivers/char/applicom.c
Back to the patch index
Back to the overall index
- Lines: 401
- Date:
Sun Apr 2 15:32:49 2000
- Orig file:
v2.3.99-pre3/linux/drivers/char/bttv.c
- Orig date:
Mon Mar 27 08:08:23 2000
diff -u --recursive --new-file v2.3.99-pre3/linux/drivers/char/bttv.c linux/drivers/char/bttv.c
@@ -490,7 +490,8 @@
bttv_bit_setscl(btv,1);
bttv_bit_setsda(btv,1);
- return i2c_bit_add_bus(&btv->i2c_adap);
+ btv->i2c_ok = i2c_bit_add_bus(&btv->i2c_adap);
+ return btv->i2c_ok;
}
/* read I2C */
@@ -498,6 +499,8 @@
{
unsigned char buffer = 0;
+ if (0 != btv->i2c_ok)
+ return -1;
if (verbose && NULL != probe_for)
printk(KERN_INFO "bttv%d: i2c: checking for %s @ 0x%02x... ",
btv->nr,probe_for,addr);
@@ -523,11 +526,13 @@
unsigned char buffer[2];
int bytes = both ? 2 : 1;
+ if (0 != btv->i2c_ok)
+ return -1;
btv->i2c_client.addr = addr >> 1;
buffer[0] = b1;
buffer[1] = b2;
if (bytes != i2c_master_send(&btv->i2c_client, buffer, bytes))
- return -1;
+ return -1;
return 0;
}
@@ -702,42 +707,25 @@
/* ----------------------------------------------------------------------- */
-/* for some vendors it is just the PCI ID */
-static struct VENDOR {
- int id;
- char *name;
-} vendors[] = {
- { 0x0001, "ATI Technologies Inc" },
- { 0x10b4, "STB Systems Inc" },
- { 0x1118, "Terratec" },
- { 0x13eb, "Hauppauge Computer Works Inc" },
- { 0x1461, "Avermedia" },
- { 0x1850, "Chronos" },
- { 0x1852, "Typhoon" },
- { 0x3000, "Askey" },
- { 0x3002, "Askey" },
- { 0x6606, "Leadtek" },
- { -1, NULL }
-};
-
static struct CARD {
- int vid;
- int id;
+ unsigned id;
int cardnr;
char *name;
} cards[] = {
- { 0x0001, 0x1002, BTTV_HAUPPAUGE878, "TV Wonder" },
- { 0x10b4, 0x2636, BTTV_HAUPPAUGE878, "???" },
- { 0x1118, 0x153b, BTTV_TERRATVALUE, "TV Value" },
- { 0x13eb, 0x0070, BTTV_HAUPPAUGE878, "WinTV" },
- { 0x1461, 0x0002, BTTV_AVERMEDIA98, "TVCapture 98" },
- { 0x1850, 0x1851, BTTV_CHRONOS_VS2, "Video Shuttle II" },
- { 0x1852, 0x1852, BTTV_TYPHOON_TVIEW, "TView TV/FM Tuner" },
- { 0x3000, 0x14ff, BTTV_MAGICTVIEW061, "TView 99" },
- { 0x3002, 0x144f, BTTV_MAGICTVIEW061, "Magic TView" },
- { 0x3002, 0x14ff, BTTV_PHOEBE_TVMAS, "TV Master" },
- { 0x6606, 0x217d, BTTV_WINFAST2000, "WinFast TV 2000" },
- { -1, -1, -1, NULL }
+ { 0x00011002, BTTV_HAUPPAUGE878, "ATI TV Wonder" },
+ { 0x00031461, BTTV_AVERMEDIA98, "AVerMedia TVPhone98" },
+ { 0x10b42636, BTTV_HAUPPAUGE878, "STB ???" },
+ { 0x1118153b, BTTV_TERRATVALUE, "Terratec TV Value" },
+ { 0x13eb0070, BTTV_HAUPPAUGE878, "Hauppauge WinTV" },
+ { 0x14610002, BTTV_AVERMEDIA98, "Avermedia TVCapture 98" },
+ { 0x18501851, BTTV_CHRONOS_VS2, "Chronos Video Shuttle II" },
+ { 0x18521852, BTTV_TYPHOON_TVIEW, "Typhoon TView TV/FM Tuner" },
+ { 0x3000144f, BTTV_MAGICTVIEW063, "TView 99 (CPH063)" },
+ { 0x300014ff, BTTV_MAGICTVIEW061, "TView 99 (CPH061)" },
+ { 0x3002144f, BTTV_MAGICTVIEW061, "Askey Magic TView" },
+ { 0x300214ff, BTTV_PHOEBE_TVMAS, "Phoebe TV Master" },
+ { 0x6606217d, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" },
+ { 0, -1, NULL }
};
struct tvcard
@@ -869,7 +857,7 @@
1,1,1,1,0 },
{ "FlyVideo 98",
3, 1, 0, 2, 0x8dff00, {2, 3, 1, 1},
- { 0, 0x8dff00, 0x800, 0x400, 0x8dff00, 0 },0,
+ { 0, 0x8dff00, 0x8df700, 0x8de700, 0x8dff00, 0 },0,
1,1,1,1,0 },
{ "iProTV",
3, 1, 0, 2, 1, { 2, 3, 1, 1}, { 1, 0, 0, 0, 0 },0,
@@ -893,9 +881,12 @@
{ "Typhoon TView TV/FM Tuner",
3, 3, 0, 2, 0x1800, { 2, 3, 1, 1}, { 0, 0x800, 0, 0, 0x1800, 0 },0,
1,1,1,1,0 },
- { "PixelView PlayTV pro",
- 3, 1, 0, 2, 0xff, { 2, 3, 1, 1 },
- { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 }, 0 }
+ { "PixelView PlayTV pro",
+ 3, 1, 0, 2, 0xff, { 2, 3, 1, 1 },
+ { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 }, 0 },
+ { "TView99 CPH063",
+ 3, 1, 0, 2, 0x551e00, { 2, 0, 1, 1},
+ { 0x551400, 0x551200, 0, 0, 0x551200 }, 0,1,1,1,1,0 },
};
#define TVCARDS (sizeof(tvcards)/sizeof(struct tvcard))
@@ -920,39 +911,35 @@
static int
idcard_eeprom(struct bttv *btv)
{
- int i,id1,id2,n1,n2;
+ unsigned id;
+ int i,n;
- id1 = (eeprom_data[254] << 8) | (eeprom_data[255]);
- id2 = (eeprom_data[252] << 8) | (eeprom_data[253]);
- if (id1 == 0 || id1 == 0xffff ||
- id2 == 0 || id2 == 0xffff)
- return -1;
+ id = (eeprom_data[252] << 24) |
+ (eeprom_data[253] << 16) |
+ (eeprom_data[254] << 8) |
+ (eeprom_data[255]);
+ if (id == 0 || id == 0xffffffff)
+ return -1;
/* look for the card */
- n1 = -1; n2 = -1;
- for (i = 0; vendors[i].id != -1; i++)
- if (vendors[i].id == id2)
- n2 = i;
- for (i = 0; cards[i].id != -1; i++)
- if (cards[i].id == id1 &&
- cards[i].vid == id2)
- n1 = i;
+ for (n = -1, i = 0; cards[i].id != 0; i++)
+ if (cards[i].id == id)
+ n = i;
- if (n1 != -1 && n2 != -1) {
+ if (n != -1) {
/* found it */
- printk(KERN_INFO "bttv%d: id: %s (0x%04x), vendor: %s (0x%04x)\n",
- btv->nr,cards[n1].name,id1,vendors[n2].name,id2);
+ printk(KERN_INFO "bttv%d: id: %s (0x%08x)\n",
+ btv->nr,cards[n].name,id);
if (verbose)
printk(KERN_INFO "bttv%d: => card=%d (%s)\n",
- btv->nr,cards[n1].cardnr,
- tvcards[cards[n1].cardnr].name);
- return cards[n1].cardnr;
+ btv->nr,cards[n].cardnr,
+ tvcards[cards[n].cardnr].name);
+ return cards[n].cardnr;
} else {
/* 404 */
- printk(KERN_INFO "bttv%d: id: %s (0x%04x), vendor: %s (0x%04x)\n",
- btv->nr, "unknown", id1,
- (n2 != -1) ? vendors[n2].name : "unknown", id2);
- printk(KERN_INFO "please mail id + vendor, board name and "
+ printk(KERN_INFO "bttv%d: id: unknown (0x%08x)\n",
+ btv->nr, id);
+ printk(KERN_INFO "please mail id, board name and "
"the correct card= insmod option to "
"kraxel@goldbach.in-berlin.de\n");
return -1;
@@ -1670,30 +1657,48 @@
* www.brooktree.com - nicely done those folks.
*/
-/* set geometry for even/odd frames
- just if you are wondering:
- handling of even and odd frames will be separated, e.g. for grabbing
- the even ones as RGB into videomem and the others as YUV in main memory for
- compressing and sending to the video conferencing partner.
-
-*/
-static inline void bt848_set_eogeo(struct bttv *btv, int odd, u8 vtc,
- u16 hscale, u16 vscale,
- u16 hactive, u16 vactive,
- u16 hdelay, u16 vdelay,
- u8 crop)
+static inline void bt848_set_eogeo(struct bttv *btv, struct tvnorm *tvn,
+ int odd, int width, int height)
{
+ u16 vscale, hscale;
+ u32 xsf, sr;
+ u16 hdelay;
+ u8 crop, vtc;
+ int inter = (height>tvn->sheight/2) ? 0 : 1;
int off = odd ? 0x80 : 0x00;
-
+
+ xsf = (width*tvn->scaledtwidth)/tvn->swidth;
+ hscale = ((tvn->totalwidth*4096UL)/xsf-4096);
+ hdelay = tvn->hdelayx1;
+ hdelay = (hdelay*width)/tvn->swidth;
+ hdelay &= 0x3fe;
+ sr=((tvn->sheight>>inter)*512)/height-512;
+ vscale=(0x10000UL-sr)&0x1fff;
+ crop=((width>>8)&0x03)|((hdelay>>6)&0x0c)|
+ ((tvn->sheight>>4)&0x30)|((tvn->vdelay>>2)&0xc0);
+ vscale |= inter ? (BT848_VSCALE_INT<<8) : 0;
+
+#if 0
+ /* Some people say interpolation looks bad ... */
+ vtc = (width < 193) ? 2 : ((width < 385) ? 1 : 0);
+ if (width < 767)
+ btor(BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off);
+ else
+ btand(~BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off);
+#else
+ vtc = 0;
+ btand(~BT848_VSCALE_COMB, BT848_E_VSCALE_HI+off);
+#endif
+
btwrite(vtc, BT848_E_VTC+off);
btwrite(hscale>>8, BT848_E_HSCALE_HI+off);
btwrite(hscale&0xff, BT848_E_HSCALE_LO+off);
btaor((vscale>>8), 0xe0, BT848_E_VSCALE_HI+off);
btwrite(vscale&0xff, BT848_E_VSCALE_LO+off);
- btwrite(hactive&0xff, BT848_E_HACTIVE_LO+off);
+ btwrite(width&0xff, BT848_E_HACTIVE_LO+off);
btwrite(hdelay&0xff, BT848_E_HDELAY_LO+off);
- btwrite(vactive&0xff, BT848_E_VACTIVE_LO+off);
- btwrite(vdelay&0xff, BT848_E_VDELAY_LO+off);
+ btwrite(tvn->sheight&0xff, BT848_E_VACTIVE_LO+off);
+ btwrite(tvn->vdelay&0xff, BT848_E_VDELAY_LO+off);
btwrite(crop, BT848_E_CROP+off);
}
@@ -1701,14 +1706,8 @@
static void bt848_set_geo(struct bttv *btv,
int no_irq_context)
{
- u16 vscale, hscale;
- u32 xsf, sr;
u16 ewidth, eheight, owidth, oheight;
u16 format, bswap;
- u16 hdelay;
- u16 hactive;
- u16 inter;
- u8 crop, vtc;
struct tvnorm *tvn;
unsigned long flags;
@@ -1727,10 +1726,6 @@
if (no_irq_context)
set_pll(btv);
- vtc=0;
- /* Some people say interpolation looks bad ... */
- /* vtc = (hactive < 193) ? 2 : ((hactive < 385) ? 1 : 0); */
-
btv->win.interlace = (btv->win.height>tvn->sheight/2) ? 1 : 0;
if (0 == btv->risc_cap_odd &&
@@ -1762,40 +1757,11 @@
eheight = btv->gbuf[btv->gq_grab].height;
format = btv->gbuf[btv->gq_grab].fmt;
bswap = 0;
- inter = (btv->win.height>tvn->sheight/2) ? 0 : 1;
}
- inter = (oheight>tvn->sheight/2) ? 0 : 1;
-
- /* odd field */
- hactive=owidth;
- xsf = (hactive*tvn->scaledtwidth)/tvn->swidth;
- hscale = ((tvn->totalwidth*4096UL)/xsf-4096);
- hdelay = tvn->hdelayx1;
- hdelay = (hdelay*hactive)/tvn->swidth;
- hdelay &= 0x3fe;
- sr=((tvn->sheight>>inter)*512)/oheight-512;
- vscale=(0x10000UL-sr)&0x1fff;
- crop=((hactive>>8)&0x03)|((hdelay>>6)&0x0c)|
- ((tvn->sheight>>4)&0x30)|((tvn->vdelay>>2)&0xc0);
- vscale |= btv->win.interlace ? (BT848_VSCALE_INT<<8) : 0;
- bt848_set_eogeo(btv, 1, vtc, hscale, vscale, hactive, tvn->sheight,
- hdelay, tvn->vdelay, crop);
-
- /* even field */
- hactive=ewidth;
- xsf = (hactive*tvn->scaledtwidth)/tvn->swidth;
- hscale = ((tvn->totalwidth*4096UL)/xsf-4096);
- hdelay = tvn->hdelayx1;
- hdelay = (hdelay*hactive)/tvn->swidth;
- hdelay &= 0x3fe;
- sr=((tvn->sheight>>inter)*512)/eheight-512;
- vscale=(0x10000UL-sr)&0x1fff;
- crop=((hactive>>8)&0x03)|((hdelay>>6)&0x0c)|
- ((tvn->sheight>>4)&0x30)|((tvn->vdelay>>2)&0xc0);
- vscale |= btv->win.interlace ? (BT848_VSCALE_INT<<8) : 0;
- bt848_set_eogeo(btv, 0, vtc, hscale, vscale, hactive, tvn->sheight,
- hdelay, tvn->vdelay, crop);
+ /* program odd + even fields */
+ bt848_set_eogeo(btv, tvn, 1, owidth, oheight);
+ bt848_set_eogeo(btv, tvn, 0, ewidth, eheight);
btwrite(format, BT848_COLOR_FMT);
btwrite(bswap | BT848_COLOR_CTL_GAMMA, BT848_COLOR_CTL);
@@ -1897,8 +1863,8 @@
make_vrisctab(btv, ro, re, vbuf, mp->width, mp->height, mp->format);
if (debug)
- printk("bttv%d: cap vgrab: queue %d (%dx%d)\n",
- btv->nr,mp->frame,mp->width,mp->height);
+ printk("bttv%d: cap vgrab: queue %d (%d:%dx%d)\n",
+ btv->nr,mp->frame,mp->format,mp->width,mp->height);
cli();
btv->gbuf[mp->frame].stat = GBUFFER_GRABBING;
btv->gbuf[mp->frame].fmt = palette2fmt[mp->format];
@@ -1914,10 +1880,6 @@
#endif
if (btv->gq_in == btv->gq_out) {
- if(mp->format>=VIDEO_PALETTE_COMPONENT) {
- btor(BT848_VSCALE_COMB, BT848_E_VSCALE_HI);
- btor(BT848_VSCALE_COMB, BT848_O_VSCALE_HI);
- }
btv->risc_jmp[12]=cpu_to_le32(BT848_RISC_JUMP|(0x8<<16)|BT848_RISC_IRQ);
}
btv->gqueue[btv->gq_in++] = mp->frame;
@@ -2317,7 +2279,7 @@
btv->win.height=vw.height;
bt848_set_risc_jmps(btv,0);
-
+
bt848_set_winsize(btv);
up(&btv->lock);
@@ -2573,10 +2535,8 @@
if (debug)
printk("bttv%d: cap sync: sleep on %d\n",btv->nr,i);
interruptible_sleep_on(&btv->capq);
- if(signal_pending(current)) {
- ret = -EINTR;
- break;
- }
+ if(signal_pending(current))
+ return -EINTR;
}
/* fall throuth */
case GBUFFER_DONE:
@@ -2649,9 +2609,6 @@
else
vu.radio=VIDEO_NO_UNIT;
vu.audio=VIDEO_NO_UNIT;
-#if 0
- AUDIO(AUDC_GET_UNIT, &vu.audio);
-#endif
vu.teletext=VIDEO_NO_UNIT;
if(copy_to_user((void *)arg, (void *)&vu, sizeof(vu)))
return -EFAULT;
@@ -3054,17 +3011,6 @@
}
}
-#if 0
-#warning please use tda8425.c instead
-static void init_tda8425(struct bttv *btv)
-{
- I2CWrite(btv, I2C_TDA8425, TDA8425_VL, 0xFC, 1); /* volume left 0dB */
- I2CWrite(btv, I2C_TDA8425, TDA8425_VR, 0xFC, 1); /* volume right 0dB */
- I2CWrite(btv, I2C_TDA8425, TDA8425_BA, 0xF6, 1); /* bass 0dB */
- I2CWrite(btv, I2C_TDA8425, TDA8425_TR, 0xF6, 1); /* treble 0dB */
- I2CWrite(btv, I2C_TDA8425, TDA8425_S1, 0xCE, 1); /* mute off */
-}
-#endif
/* can tda9855.c handle this too maybe? */
static void init_tda9840(struct bttv *btv)
@@ -3164,6 +3110,7 @@
btv->type == BTTV_PIXVIEWPLAYTV ||
btv->type == BTTV_AVERMEDIA98 ||
btv->type == BTTV_MAGICTVIEW061 ||
+ btv->type == BTTV_MAGICTVIEW063 ||
btv->type == BTTV_CHRONOS_VS2 ||
btv->type == BTTV_TYPHOON_TVIEW ||
btv->type == BTTV_PXELVWPLTVPRO ||
@@ -3600,8 +3547,6 @@
btv->risc_cap_odd = 0;
btv->risc_cap_even = 0;
bt848_set_risc_jmps(btv,-1);
- btand(~BT848_VSCALE_COMB, BT848_E_VSCALE_HI);
- btand(~BT848_VSCALE_COMB, BT848_O_VSCALE_HI);
bt848_set_geo(btv,0);
btwrite(btv->fb_color_ctl | BT848_COLOR_CTL_GAMMA,
BT848_COLOR_CTL);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)