mirror of
https://github.com/freebsd/freebsd-src
synced 2024-11-05 18:22:52 +00:00
Hopefully, this will fix the problems that some people have been having with
the S-Video input. It also has code in the driver for the meteor RGB support and some other bug fixes. I don't have a meteor RGB but I have been told that it works. Submitted by: Jim Lowe <james@miller.cs.uwm.edu>
This commit is contained in:
parent
6538dda3dc
commit
6380fb9d12
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=14320
5 changed files with 598 additions and 187 deletions
|
@ -89,6 +89,18 @@ struct meteor_video {
|
|||
#define METEORGSIGNAL _IOR('x', 12, unsigned int) /* get signal */
|
||||
#define METEORSVIDEO _IOW('x', 13, struct meteor_video) /* set video */
|
||||
#define METEORGVIDEO _IOR('x', 13, struct meteor_video) /* get video */
|
||||
#define METEORSBRIG _IOW('x', 14, unsigned char) /* set brightness */
|
||||
#define METEORGBRIG _IOR('x', 14, unsigned char) /* get brightness */
|
||||
#define METEORSCSAT _IOW('x', 15, unsigned char) /* set chroma sat */
|
||||
#define METEORGCSAT _IOR('x', 15, unsigned char) /* get uv saturation */
|
||||
#define METEORSCONT _IOW('x', 16, unsigned char) /* set contrast */
|
||||
#define METEORGCONT _IOR('x', 16, unsigned char) /* get contrast */
|
||||
#define METEORSBT254 _IOW('x', 17, unsigned short) /* set Bt254 reg */
|
||||
#define METEORGBT254 _IOR('x', 17, unsigned short) /* get Bt254 reg */
|
||||
#define METEORSHWS _IOW('x', 18, unsigned char) /* set hor start reg */
|
||||
#define METEORGHWS _IOR('x', 18, unsigned char) /* get hor start reg */
|
||||
#define METEORSVWS _IOW('x', 19, unsigned char) /* set vert start reg */
|
||||
#define METEORGVWS _IOR('x', 19, unsigned char) /* get vert start reg */
|
||||
|
||||
#define METEOR_STATUS_ID_MASK 0xf000 /* ID of 7196 */
|
||||
#define METEOR_STATUS_DIR 0x0800 /* Direction of Expansion port YUV */
|
||||
|
@ -121,7 +133,8 @@ struct meteor_video {
|
|||
#define METEOR_INPUT_DEV1 0x02000 /* camera input 1 */
|
||||
#define METEOR_INPUT_DEV2 0x04000 /* camera input 2 */
|
||||
#define METEOR_INPUT_DEV3 0x08000 /* camera input 3 */
|
||||
#define METEOR_INPUT_DEV_SVIDEO METEOR_GEO_DEV3
|
||||
#define METEOR_INPUT_DEV_RGB 0x0a000 /* for rgb version of meteor */
|
||||
#define METEOR_INPUT_DEV_SVIDEO 0x06000 /* S-video input port */
|
||||
|
||||
/* valid video output formats: */
|
||||
#define METEOR_GEO_RGB16 0x0010000 /* packed -- initialized default */
|
||||
|
|
|
@ -89,6 +89,18 @@ struct meteor_video {
|
|||
#define METEORGSIGNAL _IOR('x', 12, unsigned int) /* get signal */
|
||||
#define METEORSVIDEO _IOW('x', 13, struct meteor_video) /* set video */
|
||||
#define METEORGVIDEO _IOR('x', 13, struct meteor_video) /* get video */
|
||||
#define METEORSBRIG _IOW('x', 14, unsigned char) /* set brightness */
|
||||
#define METEORGBRIG _IOR('x', 14, unsigned char) /* get brightness */
|
||||
#define METEORSCSAT _IOW('x', 15, unsigned char) /* set chroma sat */
|
||||
#define METEORGCSAT _IOR('x', 15, unsigned char) /* get uv saturation */
|
||||
#define METEORSCONT _IOW('x', 16, unsigned char) /* set contrast */
|
||||
#define METEORGCONT _IOR('x', 16, unsigned char) /* get contrast */
|
||||
#define METEORSBT254 _IOW('x', 17, unsigned short) /* set Bt254 reg */
|
||||
#define METEORGBT254 _IOR('x', 17, unsigned short) /* get Bt254 reg */
|
||||
#define METEORSHWS _IOW('x', 18, unsigned char) /* set hor start reg */
|
||||
#define METEORGHWS _IOR('x', 18, unsigned char) /* get hor start reg */
|
||||
#define METEORSVWS _IOW('x', 19, unsigned char) /* set vert start reg */
|
||||
#define METEORGVWS _IOR('x', 19, unsigned char) /* get vert start reg */
|
||||
|
||||
#define METEOR_STATUS_ID_MASK 0xf000 /* ID of 7196 */
|
||||
#define METEOR_STATUS_DIR 0x0800 /* Direction of Expansion port YUV */
|
||||
|
@ -121,7 +133,8 @@ struct meteor_video {
|
|||
#define METEOR_INPUT_DEV1 0x02000 /* camera input 1 */
|
||||
#define METEOR_INPUT_DEV2 0x04000 /* camera input 2 */
|
||||
#define METEOR_INPUT_DEV3 0x08000 /* camera input 3 */
|
||||
#define METEOR_INPUT_DEV_SVIDEO METEOR_GEO_DEV3
|
||||
#define METEOR_INPUT_DEV_RGB 0x0a000 /* for rgb version of meteor */
|
||||
#define METEOR_INPUT_DEV_SVIDEO 0x06000 /* S-video input port */
|
||||
|
||||
/* valid video output formats: */
|
||||
#define METEOR_GEO_RGB16 0x0010000 /* packed -- initialized default */
|
||||
|
|
495
sys/pci/meteor.c
495
sys/pci/meteor.c
|
@ -96,7 +96,20 @@
|
|||
with METEOR_DIRECT_VIDEO. This is very dangerous to
|
||||
use at present since we don't check the address that
|
||||
is passed by the user!!!!!
|
||||
|
||||
2/26/96 Added special SVIDEO input device type.
|
||||
2/27/96 Added meteor_reg.h file and associate types Converted
|
||||
meteor.c over to using meteor.h file. Prompted by
|
||||
Lars Jonas Olsson <ljo@po.cwru.edu>.
|
||||
2/28/96 Added meteor RGB code from Lars Jonas Olsson
|
||||
<ljo@po.cwru.edu>. I make some mods to this code, so
|
||||
I hope it still works as I don't have an rgb card to
|
||||
test with.
|
||||
2/29/96 <ljo@po.cwru.edu> tested the meteor RGB and supplied
|
||||
me with diffs. Thanks, we now have a working RGB
|
||||
version of the driver. Still need to clean up this
|
||||
code and add the 4:1:1, 8:1:1 planer modes.
|
||||
3/1/96 Fixed a nasty little bug that was clearing the VTR
|
||||
mode bit when the 7116 status was requested.
|
||||
*/
|
||||
|
||||
#include "meteor.h"
|
||||
|
@ -135,6 +148,7 @@
|
|||
#include <pci/pcireg.h>
|
||||
#endif
|
||||
#include <machine/ioctl_meteor.h>
|
||||
#include <pci/meteor_reg.h>
|
||||
|
||||
|
||||
static void meteor_intr __P((void *arg));
|
||||
|
@ -151,88 +165,11 @@ static void meteor_intr __P((void *arg));
|
|||
#endif
|
||||
#define METEOR_ALLOC (METEOR_ALLOC_PAGES * PAGE_SIZE)
|
||||
|
||||
#define NUM_SAA7116_PCI_REGS 37
|
||||
#define NUM_SAA7196_I2C_REGS 49
|
||||
|
||||
typedef struct {
|
||||
vm_offset_t virt_baseaddr; /* saa7116 register virtual address */
|
||||
vm_offset_t phys_baseaddr; /* saa7116 register physical address */
|
||||
vm_offset_t capt_cntrl; /* capture control register offset 0x40 */
|
||||
vm_offset_t stat_reg; /* status register offset 0x60 */
|
||||
vm_offset_t iic_virt_addr; /* ICC bus register offset 0x64 */
|
||||
pcici_t tag; /* PCI tag, for doing PCI commands */
|
||||
vm_offset_t bigbuf; /* buffer that holds the captured image */
|
||||
int alloc_pages; /* number of pages in bigbuf */
|
||||
struct proc *proc; /* process to receive raised signal */
|
||||
int signal; /* signal to send to process */
|
||||
struct meteor_mem *mem; /* used to control sync. multi-frame output */
|
||||
u_long synch_wait; /* wait for free buffer before continuing */
|
||||
short current; /* frame number in buffer (1-frames) */
|
||||
short rows; /* number of rows in a frame */
|
||||
short cols; /* number of columns in a frame */
|
||||
short depth; /* number of byte per pixel */
|
||||
short frames; /* number of frames allocated */
|
||||
int frame_size; /* number of bytes in a frame */
|
||||
u_long fifo_errors; /* number of fifo capture errors since open */
|
||||
u_long dma_errors; /* number of DMA capture errors since open */
|
||||
u_long frames_captured;/* number of frames captured since open */
|
||||
u_long even_fields_captured; /* number of even fields captured */
|
||||
u_long odd_fields_captured; /* number of odd fields captured */
|
||||
u_long range_enable; /* enable range checking ?? */
|
||||
unsigned flags;
|
||||
#define METEOR_INITALIZED 0x00000001
|
||||
#define METEOR_OPEN 0x00000002
|
||||
#define METEOR_MMAP 0x00000004
|
||||
#define METEOR_INTR 0x00000008
|
||||
#define METEOR_READ 0x00000010 /* XXX never gets referenced */
|
||||
#define METEOR_SINGLE 0x00000020 /* get single frame */
|
||||
#define METEOR_CONTIN 0x00000040 /* continuously get frames */
|
||||
#define METEOR_SYNCAP 0x00000080 /* synchronously get frames */
|
||||
#define METEOR_CAP_MASK 0x000000f0
|
||||
#define METEOR_NTSC 0x00000100
|
||||
#define METEOR_PAL 0x00000200
|
||||
#define METEOR_SECAM 0x00000400
|
||||
#define METEOR_AUTOMODE 0x00000800
|
||||
#define METEOR_FORM_MASK 0x00000f00
|
||||
#define METEOR_DEV0 0x00001000
|
||||
#define METEOR_DEV1 0x00002000
|
||||
#define METEOR_DEV2 0x00004000
|
||||
#define METEOR_DEV3 0x00008000
|
||||
#define METEOR_DEV_MASK 0x0000f000
|
||||
#define METEOR_RGB16 0x00010000
|
||||
#define METEOR_RGB24 0x00020000
|
||||
#define METEOR_YUV_PACKED 0x00040000
|
||||
#define METEOR_YUV_PLANER 0x00080000
|
||||
#define METEOR_WANT_EVEN 0x00100000 /* want even frame */
|
||||
#define METEOR_WANT_ODD 0x00200000 /* want odd frame */
|
||||
#define METEOR_WANT_MASK 0x00300000
|
||||
#define METEOR_ONLY_EVEN_FIELDS 0x01000000
|
||||
#define METEOR_ONLY_ODD_FIELDS 0x02000000
|
||||
#define METEOR_ONLY_FIELDS_MASK 0x03000000
|
||||
#define METEOR_YUV_422 0x04000000
|
||||
#define METEOR_OUTPUT_FMT_MASK 0x040f0000
|
||||
u_char saa7196_i2c[NUM_SAA7196_I2C_REGS]; /* saa7196 register values */
|
||||
u_short fps; /* frames per second */
|
||||
#ifdef DEVFS
|
||||
void *devfs_token;
|
||||
#endif
|
||||
#ifdef METEOR_TEST_VIDEO
|
||||
struct meteor_video video;
|
||||
#endif
|
||||
} meteor_reg_t;
|
||||
|
||||
static meteor_reg_t meteor[NMETEOR];
|
||||
#define METEOR_NUM(mtr) ((mtr - &meteor[0])/sizeof(meteor_reg_t))
|
||||
|
||||
#define METPRI (PZERO+8)|PCATCH
|
||||
|
||||
/*---------------------------------------------------------
|
||||
**
|
||||
** Meteor PCI probe and initialization routines
|
||||
**
|
||||
**---------------------------------------------------------
|
||||
*/
|
||||
|
||||
static char* met_probe (pcici_t tag, pcidi_t type);
|
||||
static void met_attach(pcici_t tag, int unit);
|
||||
static u_long met_count;
|
||||
|
@ -264,11 +201,11 @@ static d_mmap_t meteor_mmap;
|
|||
#define CDEV_MAJOR 67
|
||||
static struct cdevsw meteor_cdevsw =
|
||||
{ meteor_open, meteor_close, meteor_read, meteor_write, /*67*/
|
||||
meteor_ioctl, nostop, nullreset, nodevtotty,/* Meteor */
|
||||
meteor_ioctl, nostop, nullreset, nodevtotty,/* Meteor */
|
||||
seltrue, meteor_mmap, NULL, "meteor", NULL, -1 };
|
||||
#endif
|
||||
|
||||
static u_long saa7116_pci_default[NUM_SAA7116_PCI_REGS] = {
|
||||
static mreg_t saa7116_pci_default[sizeof(struct saa7116_regs)/sizeof(mreg_t)]={
|
||||
/* PCI Memory registers */
|
||||
/* BITS Type Description */
|
||||
/* 0x00 */ 0x00000000, /* 31:1 e*RW DMA 1 (Even)
|
||||
|
@ -488,31 +425,30 @@ static u_char saa7196_i2c_default[NUM_SAA7196_I2C_REGS] = {
|
|||
0 Extended formats enable bit */
|
||||
};
|
||||
|
||||
static u_char bt254_default[NUM_BT254_REGS] = {
|
||||
0x00, /* 24 bpp */
|
||||
0xa0,
|
||||
0xa0,
|
||||
0xa0,
|
||||
0x50,
|
||||
0x50,
|
||||
0x50,
|
||||
} ;
|
||||
|
||||
/*
|
||||
* i2c_write:
|
||||
* Returns 0 Succesful completion.
|
||||
* Returns 1 If transfer aborted or timeout occured.
|
||||
*
|
||||
*/
|
||||
#define SAA7196_I2C_ADDR 0x40
|
||||
#define I2C_WRITE 0x00
|
||||
#define I2C_READ 0x01
|
||||
#define SAA7116_IIC_NEW_CYCLE 0x1000000L
|
||||
#define IIC_DIRECT_TRANSFER_ABORTED 0x0000200L
|
||||
|
||||
#define SAA7196_WRITE(mtr, reg, data) \
|
||||
i2c_write(mtr, SAA7196_I2C_ADDR, I2C_WRITE, reg, data), \
|
||||
mtr->saa7196_i2c[reg] = data
|
||||
#define SAA7196_REG(mtr, reg) mtr->saa7196_i2c[reg]
|
||||
#define SAA7196_READ(mtr) \
|
||||
i2c_write(mtr, SAA7196_I2C_ADDR, I2C_READ, 0x0, 0x0)
|
||||
|
||||
static i2c_print_err = 1;
|
||||
static int
|
||||
i2c_write(meteor_reg_t * mtr, u_char slave, u_char rw, u_char reg, u_char data)
|
||||
{
|
||||
register unsigned long wait_counter = 0x0001ffff;
|
||||
register volatile u_long *iic_write_loc = (volatile u_long *)mtr->iic_virt_addr;
|
||||
register int err = 0;
|
||||
register unsigned long wait_counter = 0x0001ffff;
|
||||
register mreg_t * iic_write_loc = &mtr->base->i2c_write;
|
||||
register int err = 0;
|
||||
|
||||
|
||||
/* Write the data the the i2c write register */
|
||||
*iic_write_loc = SAA7116_IIC_NEW_CYCLE |
|
||||
|
@ -527,39 +463,42 @@ register int err = 0;
|
|||
|
||||
/* 1ffff should be enough delay time for the i2c cycle to complete */
|
||||
if(!wait_counter) {
|
||||
printf("meteor%d: saa7116 i2c %s transfer timeout 0x%x",
|
||||
METEOR_NUM(mtr),
|
||||
rw ? "read" : "write", *iic_write_loc);
|
||||
if(i2c_print_err)
|
||||
printf("meteor%d: %d i2c %s transfer timeout 0x%x",
|
||||
METEOR_NUM(mtr), slave,
|
||||
rw ? "read" : "write", *iic_write_loc);
|
||||
|
||||
err=1;
|
||||
}
|
||||
|
||||
/* Check for error on direct write, clear if any */
|
||||
if((*((volatile u_long *)mtr->stat_reg)) & IIC_DIRECT_TRANSFER_ABORTED){
|
||||
printf("meteor%d: saa7116 i2c %s tranfer aborted",
|
||||
METEOR_NUM(mtr),
|
||||
rw ? "read" : "write" );
|
||||
if(mtr->base->i2c_read & SAA7116_IIC_DIRECT_TRANSFER_ABORTED){
|
||||
mtr->base->i2c_read |= SAA7116_IIC_DIRECT_TRANSFER_ABORTED;
|
||||
if(i2c_print_err)
|
||||
printf("meteor%d: 0x%x i2c %s tranfer aborted",
|
||||
METEOR_NUM(mtr), slave,
|
||||
rw ? "read" : "write" );
|
||||
err= 1;
|
||||
}
|
||||
|
||||
if(err) {
|
||||
printf(" - reg=0x%x, value=0x%x.\n", reg, data);
|
||||
if(i2c_print_err)
|
||||
printf(" - reg=0x%x, value=0x%x.\n", reg, data);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
#undef i2c_print
|
||||
|
||||
|
||||
static char*
|
||||
static char *
|
||||
met_probe (pcici_t tag, pcidi_t type)
|
||||
{
|
||||
|
||||
switch (type) {
|
||||
|
||||
case 0x12238086ul: /* meteor */
|
||||
return ("Matrox Meteor");
|
||||
|
||||
case SAA7116_PHILIPS_ID: /* meteor */
|
||||
return("Philips SAA 7116");
|
||||
};
|
||||
return ((char*)0);
|
||||
return ((char *)0);
|
||||
}
|
||||
|
||||
/* interrupt handling routine
|
||||
|
@ -569,9 +508,9 @@ static void
|
|||
meteor_intr(void *arg)
|
||||
{
|
||||
meteor_reg_t *mtr = (meteor_reg_t *) arg;
|
||||
volatile u_long *cap = (volatile u_long *)mtr->capt_cntrl,
|
||||
*base = (volatile u_long *)mtr->virt_baseaddr,
|
||||
*stat = base + 18; /* mtr->virt_base + 0x48*/
|
||||
mreg_t *cap = &mtr->base->cap_cntl,
|
||||
*base = &mtr->base->dma1e,
|
||||
*stat = &mtr->base->irq_stat;
|
||||
u_long status = *stat,
|
||||
cap_err = *cap & 0x00000f00,
|
||||
#ifdef METEOR_CHECK_PCI_BUS
|
||||
|
@ -766,16 +705,15 @@ meteor_intr(void *arg)
|
|||
static void
|
||||
set_fps(meteor_reg_t *mtr, u_short fps)
|
||||
{
|
||||
volatile u_long *field_mask_even =
|
||||
(volatile u_long *)mtr->virt_baseaddr + 0x4c;
|
||||
volatile u_long *field_mask_odd = field_mask_even + 1;
|
||||
volatile u_long *field_mask_length = field_mask_odd + 1;
|
||||
int is_ntsc=1; /* assume ntsc or 30fps */
|
||||
mreg_t *field_mask_even = &mtr->base->fme;
|
||||
mreg_t *field_mask_odd = &mtr->base->fmo;
|
||||
mreg_t *field_mask_length = &mtr->base->fml;
|
||||
int is_ntsc=1; /* assume ntsc */
|
||||
unsigned status;
|
||||
|
||||
SAA7196_WRITE(mtr, 0x0d, SAA7196_REG(mtr, 0x0d) | 0x02);
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC, SAA7196_REG(mtr, SAA7196_STDC) | 0x02);
|
||||
SAA7196_READ(mtr);
|
||||
status = ((*((volatile u_long *)mtr->stat_reg)) & 0xff000000L) >> 24;
|
||||
status = (mtr->base->i2c_read & 0xff000000L) >> 24;
|
||||
if((status & 0x40) == 0)
|
||||
is_ntsc = ((status & 0x20) != 0) ;
|
||||
|
||||
|
@ -821,29 +759,115 @@ vm_offset_t addr = NULL;
|
|||
return addr;
|
||||
}
|
||||
|
||||
static void
|
||||
bt254_write(meteor_reg_t *mtr, u_char addr, u_char data)
|
||||
{
|
||||
addr &= 0x7; /* sanity? */
|
||||
mtr->bt254_reg[addr] = data;
|
||||
PCF8574_DATA_WRITE(mtr, data); /* set data */
|
||||
PCF8574_CTRL_WRITE(mtr, (PCF8574_CTRL_REG(mtr) & ~0x7) | addr);
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) & ~0x10); /* WR/ to 0 */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) | 0x10); /* WR to 1 */
|
||||
PCF8574_DATA_WRITE(mtr, 0xff); /* clr data */
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
bt254_init(meteor_reg_t *mtr)
|
||||
{
|
||||
int i;
|
||||
|
||||
PCF8574_CTRL_WRITE(mtr, 0x7f);
|
||||
PCF8574_DATA_WRITE(mtr, 0xff); /* data port must be 0xff */
|
||||
PCF8574_CTRL_WRITE(mtr, 0x7f);
|
||||
|
||||
/* init RGB module for 24bpp, composite input */
|
||||
for(i=0; i<NUM_BT254_REGS; i++)
|
||||
bt254_write(mtr, i, bt254_default[i]);
|
||||
|
||||
bt254_write(mtr, BT254_COMMAND, 0x00); /* 24 bpp */
|
||||
}
|
||||
|
||||
static void
|
||||
select_bt254(meteor_reg_t *mtr)
|
||||
{
|
||||
/* disable saa7196, saaen = 1 */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) | 0x80);
|
||||
/* enable Bt254, bten = 0 */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) & ~0x40);
|
||||
}
|
||||
|
||||
static void
|
||||
select_saa7196(meteor_reg_t *mtr)
|
||||
{
|
||||
/* disable Bt254, bten = 1 */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) | 0x40);
|
||||
/* enable saa7196, saaen = 0 */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) & ~0x80);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the capture card to NTSC RGB 16 640x480
|
||||
* Initialize the 7116, 7196 and the RGB module.
|
||||
*/
|
||||
static void
|
||||
meteor_init ( meteor_reg_t *mtr )
|
||||
{
|
||||
volatile u_long *vbase_addr;
|
||||
int i;
|
||||
mreg_t *vbase_addr;
|
||||
int i;
|
||||
|
||||
*((volatile u_long *)(mtr->capt_cntrl)) = 0x00000040L;
|
||||
|
||||
vbase_addr = (volatile u_long *) mtr->virt_baseaddr;
|
||||
for (i= 0 ; i < NUM_SAA7116_PCI_REGS; i++)
|
||||
/*
|
||||
* Initialize the Philips SAA7116
|
||||
*/
|
||||
mtr->base->cap_cntl = 0x00000040L;
|
||||
vbase_addr = &mtr->base->dma1e;
|
||||
for (i = 0 ; i < (sizeof(struct saa7116_regs)/sizeof(mreg_t)); i++)
|
||||
*vbase_addr++ = saa7116_pci_default[i];
|
||||
|
||||
for (i = 0; i < NUM_SAA7196_I2C_REGS; i++) {
|
||||
SAA7196_WRITE(mtr, i, saa7196_i2c_default[i]);
|
||||
/*
|
||||
* Check for the Philips SAA7196
|
||||
*/
|
||||
i2c_print_err = 0;
|
||||
if(i2c_write(mtr, SAA7196_I2C_ADDR, SAA7116_I2C_WRITE, 0, 0xff) == 0) {
|
||||
i2c_print_err = 1;
|
||||
/*
|
||||
* Initialize 7196
|
||||
*/
|
||||
for (i = 0; i < NUM_SAA7196_I2C_REGS; i++)
|
||||
SAA7196_WRITE(mtr, i, saa7196_i2c_default[i]);
|
||||
/*
|
||||
* Get version number.
|
||||
*/
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
SAA7196_REG(mtr, SAA7196_STDC) & ~0x02);
|
||||
SAA7196_READ(mtr);
|
||||
printf("meteor%d: <Philips SAA 7196> rev 0x%x\n",
|
||||
METEOR_NUM(mtr), (mtr->base->i2c_read&0xff000000L)>>28);
|
||||
} else {
|
||||
i2c_print_err = 1;
|
||||
printf("meteor%d: <Philips SAA 7196 NOT FOUND>\n",
|
||||
METEOR_NUM(mtr));
|
||||
}
|
||||
/*
|
||||
* Check for RGB module, initialized if found.
|
||||
*/
|
||||
i2c_print_err = 0;
|
||||
if(i2c_write(mtr,PCF8574_DATA_I2C_ADDR,SAA7116_I2C_WRITE,0,0xff) == 0) {
|
||||
i2c_print_err = 1;
|
||||
printf("meteor%d: <Booktree 254 (RGB module)>\n",
|
||||
METEOR_NUM(mtr)); /* does this have a rev #? */
|
||||
bt254_init(mtr); /* Set up RGB module */
|
||||
mtr->flags = METEOR_RGB;
|
||||
} else {
|
||||
i2c_print_err = 1;
|
||||
mtr->flags = 0;
|
||||
}
|
||||
|
||||
set_fps(mtr, 30);
|
||||
|
||||
}
|
||||
|
||||
static void met_attach(pcici_t tag, int unit)
|
||||
static void
|
||||
met_attach(pcici_t tag, int unit)
|
||||
{
|
||||
#ifdef METEOR_IRQ
|
||||
u_long old_irq, new_irq;
|
||||
|
@ -853,17 +877,16 @@ static void met_attach(pcici_t tag, int unit)
|
|||
u_long latency;
|
||||
|
||||
if (unit >= NMETEOR) {
|
||||
printf("meteor%d: attach: invalid unit number\n", unit);
|
||||
printf("meteor%d: attach: only %d units configured.\n",
|
||||
unit, NMETEOR);
|
||||
printf("meteor%d: attach: invalid unit number.\n", unit);
|
||||
return ;
|
||||
}
|
||||
|
||||
mtr = &meteor[unit];
|
||||
pci_map_mem(tag, 0x10, &(mtr->virt_baseaddr),
|
||||
&(mtr->phys_baseaddr));
|
||||
/* IIC addres at 0x64 offset bytes */
|
||||
mtr->capt_cntrl = mtr->virt_baseaddr + 0x40;
|
||||
mtr->stat_reg = mtr->virt_baseaddr + 0x60;
|
||||
mtr->iic_virt_addr = mtr->virt_baseaddr + 0x64;
|
||||
mtr->tag = tag;
|
||||
pci_map_mem(tag, PCI_MAP_REG_START, (u_long *)&mtr->base,
|
||||
&mtr->phys_base);
|
||||
|
||||
#ifdef METEOR_IRQ /* from the configuration file */
|
||||
old_irq = pci_conf_read(tag, PCI_INTERRUPT_REG);
|
||||
|
@ -872,10 +895,16 @@ static void met_attach(pcici_t tag, int unit)
|
|||
printf("meteor%d: attach: irq changed from %d to %d\n",
|
||||
unit, (old_irq & 0xff), (new_irq & 0xff));
|
||||
#endif METEOR_IRQ
|
||||
/* set latency timer */
|
||||
#define PCI_LATENCY_TIMER 0x0c
|
||||
#ifndef DEF_LATENCY_VALUE
|
||||
#define DEF_LATENCY_VALUE 32 /* is this value ok? */
|
||||
/* setup the interrupt handling routine */
|
||||
pci_map_int(tag, meteor_intr, (void*) mtr, &net_imask);
|
||||
|
||||
/*
|
||||
* PCI latency timer. 32 is a good value for 4 bus mastering slots, if
|
||||
* you have more than for, then 16 would probably be a better value.
|
||||
*
|
||||
*/
|
||||
#ifndef METEOR_DEF_LATENCY_VALUE
|
||||
#define METEOR_DEF_LATENCY_VALUE 32
|
||||
#endif
|
||||
latency = pci_conf_read(tag, PCI_LATENCY_TIMER);
|
||||
latency = (latency >> 8) & 0xff;
|
||||
|
@ -887,19 +916,15 @@ static void met_attach(pcici_t tag, int unit)
|
|||
unit);
|
||||
}
|
||||
if(!latency) {
|
||||
latency = DEF_LATENCY_VALUE;
|
||||
latency = METEOR_DEF_LATENCY_VALUE;
|
||||
pci_conf_write(tag, PCI_LATENCY_TIMER, latency<<8);
|
||||
}
|
||||
if(bootverbose) {
|
||||
printf(" %d.\n", latency);
|
||||
}
|
||||
|
||||
meteor_init(mtr); /* set up saa7116 and saa7196 chips */
|
||||
mtr->tag = tag;
|
||||
/* setup the interrupt handling routine */
|
||||
pci_map_int (tag, meteor_intr, (void*) mtr, &net_imask);
|
||||
meteor_init(mtr); /* set up saa7116, saa7196, and rgb module */
|
||||
|
||||
/* 640*240*3 round up to nearest pag e*/
|
||||
if(METEOR_ALLOC)
|
||||
buf = get_meteor_mem(unit, METEOR_ALLOC);
|
||||
else
|
||||
|
@ -914,32 +939,53 @@ static void met_attach(pcici_t tag, int unit)
|
|||
if(buf != NULL) {
|
||||
bzero((caddr_t) buf, METEOR_ALLOC);
|
||||
buf = vtophys(buf);
|
||||
*((volatile u_long *) mtr->virt_baseaddr) = buf;
|
||||
/* 640x480 RGB 16 */
|
||||
*((volatile u_long *) mtr->virt_baseaddr + 3) = buf + 0x500;
|
||||
*((volatile u_long *) mtr->virt_baseaddr + 36) =
|
||||
*((volatile u_long *) mtr->virt_baseaddr + 35) = buf +
|
||||
METEOR_ALLOC;
|
||||
mtr->base->dma1e = buf;
|
||||
mtr->base->dma1o = buf + 0x500;
|
||||
mtr->base->dma_end_e =
|
||||
mtr->base->dma_end_o = buf + METEOR_ALLOC;
|
||||
}
|
||||
mtr->flags = METEOR_INITALIZED | METEOR_NTSC | METEOR_DEV0 |
|
||||
METEOR_RGB16;
|
||||
/* 1 frame of 640x480 RGB 16 */
|
||||
/* 1 frame of 640x480 RGB 16 */
|
||||
mtr->cols = 640;
|
||||
mtr->rows = 480;
|
||||
mtr->depth = 2; /* two bytes per pixel */
|
||||
mtr->frames = 1; /* one frame */
|
||||
|
||||
mtr->flags |= METEOR_INITALIZED | METEOR_AUTOMODE | METEOR_DEV0 |
|
||||
METEOR_RGB16;
|
||||
#ifdef DEVFS
|
||||
mtr->devfs_token = devfs_add_devsw( "/", "meteor", &meteor_cdevsw, unit,
|
||||
DV_CHR, 0, 0, 0644);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
meteor_reset(meteor_reg_t * const sc)
|
||||
#define UNIT(x) ((x) & 0x07)
|
||||
|
||||
static int
|
||||
meteor_reset(dev_t dev)
|
||||
{
|
||||
int unit = UNIT(minor(dev));
|
||||
struct saa7116_regs *m;
|
||||
|
||||
if(unit >= NMETEOR)
|
||||
return ENXIO;
|
||||
|
||||
m = meteor[unit].base;
|
||||
|
||||
m->cap_cntl = 0x0;
|
||||
tsleep((caddr_t)m, METPRI, "Mreset", hz/50);
|
||||
|
||||
m->cap_cntl = 0x8ff0;
|
||||
m->cap_cntl = 0x80c0;
|
||||
m->cap_cntl = 0x8040;
|
||||
tsleep((caddr_t)m, METPRI, "Mreset", hz/10);
|
||||
m->cap_cntl = 0x80c0;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
**
|
||||
** Meteor character device driver routines
|
||||
|
@ -947,7 +993,6 @@ meteor_reset(meteor_reg_t * const sc)
|
|||
**---------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define UNIT(x) ((x) & 0x07)
|
||||
|
||||
int
|
||||
meteor_open(dev_t dev, int flags, int fmt, struct proc *p)
|
||||
|
@ -1015,7 +1060,7 @@ meteor_close(dev_t dev, int flags, int fmt, struct proc *p)
|
|||
/*
|
||||
* Turn off capture mode.
|
||||
*/
|
||||
*((volatile u_long *) mtr->capt_cntrl) = 0x8ff0;
|
||||
mtr->base->cap_cntl = 0x8ff0;
|
||||
mtr->flags &= ~(METEOR_CAP_MASK|METEOR_WANT_MASK);
|
||||
|
||||
#ifdef METEOR_DEALLOC_PAGES
|
||||
|
@ -1042,8 +1087,7 @@ meteor_close(dev_t dev, int flags, int fmt, struct proc *p)
|
|||
static void
|
||||
start_capture(meteor_reg_t *mtr, unsigned type)
|
||||
{
|
||||
volatile u_long *cap = (volatile u_long *)mtr->capt_cntrl;
|
||||
volatile u_long *p =(volatile u_long *)mtr->virt_baseaddr;
|
||||
mreg_t *cap = &mtr->base->cap_cntl;
|
||||
|
||||
mtr->flags |= type;
|
||||
switch(mtr->flags & METEOR_ONLY_FIELDS_MASK) {
|
||||
|
@ -1128,7 +1172,7 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
#ifdef METEOR_TEST_VIDEO
|
||||
struct meteor_video *video;
|
||||
#endif
|
||||
volatile u_long *p;
|
||||
mreg_t *p;
|
||||
vm_offset_t buf;
|
||||
|
||||
error = 0;
|
||||
|
@ -1172,53 +1216,136 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
break;
|
||||
case METEORSTATUS: /* get 7196 status */
|
||||
temp = 0;
|
||||
SAA7196_WRITE(mtr, 0x0d, SAA7196_REG(mtr, 0x0d) | 0x02);
|
||||
p = &mtr->base->i2c_read;
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
SAA7196_REG(mtr, SAA7196_STDC) | 0x02);
|
||||
SAA7196_READ(mtr);
|
||||
temp |= ((*((volatile u_long *)mtr->stat_reg)) & 0xff000000L) >> 24;
|
||||
SAA7196_WRITE(mtr, 0x0d, SAA7196_REG(mtr, 0x0d) & 0x02);
|
||||
temp |= (*p & 0xff000000L) >> 24;
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
SAA7196_REG(mtr, SAA7196_STDC) & ~0x02);
|
||||
SAA7196_READ(mtr);
|
||||
temp |= ((*((volatile u_long *)mtr->stat_reg)) & 0xff000000L) >> 16;
|
||||
temp |= (*p & 0xff000000L) >> 16;
|
||||
*(u_short *)arg = temp;
|
||||
break;
|
||||
case METEORSHUE: /* set hue */
|
||||
SAA7196_WRITE(mtr, 0x07, *(char *)arg);
|
||||
SAA7196_WRITE(mtr, SAA7196_HUEC, *(char *)arg);
|
||||
break;
|
||||
case METEORGHUE: /* get hue */
|
||||
*(char *)arg = SAA7196_REG(mtr, 0x07);
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_HUEC);
|
||||
break;
|
||||
case METEORSCHCV: /* set chrominance gain */
|
||||
SAA7196_WRITE(mtr, 0x11, *(char *)arg);
|
||||
SAA7196_WRITE(mtr, SAA7196_CGAINR, *(char *)arg);
|
||||
break;
|
||||
case METEORGCHCV: /* get chrominance gain */
|
||||
*(char *)arg = SAA7196_REG(mtr, 0x11);
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_CGAINR);
|
||||
break;
|
||||
case METEORSBRIG: /* set brightness */
|
||||
SAA7196_WRITE(mtr, SAA7196_BRIG, *(char *)arg);
|
||||
break;
|
||||
case METEORGBRIG: /* get brightness */
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_BRIG);
|
||||
break;
|
||||
case METEORSCSAT: /* set chroma saturation */
|
||||
SAA7196_WRITE(mtr, SAA7196_CSAT, *(char *)arg);
|
||||
break;
|
||||
case METEORGCSAT: /* get chroma saturation */
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_CSAT);
|
||||
break;
|
||||
case METEORSCONT: /* set contrast */
|
||||
SAA7196_WRITE(mtr, SAA7196_CONT, *(char *)arg);
|
||||
break;
|
||||
case METEORGCONT: /* get contrast */
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_CONT);
|
||||
break;
|
||||
case METEORSBT254:
|
||||
if((mtr->flags & METEOR_RGB) == 0)
|
||||
return EINVAL;
|
||||
temp = *(unsigned short *)arg;
|
||||
bt254_write(mtr, temp & 0xf, (temp & 0x0ff0) >> 4);
|
||||
break;
|
||||
case METEORGBT254:
|
||||
if((mtr->flags & METEOR_RGB) == 0)
|
||||
return EINVAL;
|
||||
temp = *(unsigned short *)arg & 0x7;
|
||||
*(unsigned short *)arg = mtr->bt254_reg[temp] << 4 | temp;
|
||||
break;
|
||||
case METEORSHWS: /* set horizontal window start */
|
||||
SAA7196_WRITE(mtr, SAA7196_HWS, *(char *)arg);
|
||||
break;
|
||||
case METEORGHWS: /* get horizontal window start */
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_HWS);
|
||||
break;
|
||||
case METEORSVWS: /* set vertical window start */
|
||||
SAA7196_WRITE(mtr, SAA7196_VWS, *(char *)arg);
|
||||
break;
|
||||
case METEORGVWS: /* get vertical window start */
|
||||
*(char *)arg = SAA7196_REG(mtr, SAA7196_VWS);
|
||||
break;
|
||||
case METEORSINPUT: /* set input device */
|
||||
switch(*(unsigned long *)arg & METEOR_DEV_MASK) {
|
||||
case 0: /* default */
|
||||
case METEOR_INPUT_DEV0:
|
||||
if(mtr->flags & METEOR_RGB)
|
||||
select_saa7196(mtr);
|
||||
mtr->flags = (mtr->flags & ~METEOR_DEV_MASK)
|
||||
| METEOR_DEV0;
|
||||
|
||||
SAA7196_WRITE(mtr, 0x0e,
|
||||
(SAA7196_REG(mtr, 0x0e) & ~0x3) | 0x0);
|
||||
SAA7196_WRITE(mtr, 0x06,
|
||||
(SAA7196_REG(mtr, 0x06) & ~0x80));
|
||||
break;
|
||||
case METEOR_INPUT_DEV1:
|
||||
if(mtr->flags & METEOR_RGB)
|
||||
select_saa7196(mtr);
|
||||
mtr->flags = (mtr->flags & ~METEOR_DEV_MASK)
|
||||
| METEOR_DEV1;
|
||||
SAA7196_WRITE(mtr, 0x0e,
|
||||
(SAA7196_REG(mtr, 0x0e) & ~0x3) | 0x1);
|
||||
SAA7196_WRITE(mtr, 0x06,
|
||||
(SAA7196_REG(mtr, 0x06) & ~0x80));
|
||||
break;
|
||||
case METEOR_INPUT_DEV2:
|
||||
if(mtr->flags & METEOR_RGB)
|
||||
select_saa7196(mtr);
|
||||
mtr->flags = (mtr->flags & ~METEOR_DEV_MASK)
|
||||
| METEOR_DEV2;
|
||||
SAA7196_WRITE(mtr, 0x0e,
|
||||
(SAA7196_REG(mtr, 0x0e) & ~0x3) | 0x2);
|
||||
SAA7196_WRITE(mtr, 0x06,
|
||||
(SAA7196_REG(mtr, 0x06) & ~0x80));
|
||||
break;
|
||||
case METEOR_INPUT_DEV3:
|
||||
if(mtr->flags & METEOR_RGB)
|
||||
select_saa7196(mtr);
|
||||
mtr->flags = (mtr->flags & ~METEOR_DEV_MASK)
|
||||
| METEOR_DEV3;
|
||||
SAA7196_WRITE(mtr, 0x0e,
|
||||
(SAA7196_REG(mtr, 0x0e) | 0x3));
|
||||
SAA7196_WRITE(mtr, 0x06,
|
||||
(SAA7196_REG(mtr, 0x06) & ~0x80) );
|
||||
break;
|
||||
case METEOR_INPUT_DEV_SVIDEO:
|
||||
if(mtr->flags & METEOR_RGB)
|
||||
select_saa7196(mtr);
|
||||
mtr->flags = (mtr->flags & ~METEOR_DEV_MASK)
|
||||
| METEOR_DEV_SVIDEO;
|
||||
SAA7196_WRITE(mtr, 0x0e,
|
||||
(SAA7196_REG(mtr, 0x0e) & ~0x3) | 0x2);
|
||||
SAA7196_WRITE(mtr, 0x06,
|
||||
(SAA7196_REG(mtr, 0x06) & ~0x80) | 0x80);
|
||||
break;
|
||||
case METEOR_INPUT_DEV_RGB:
|
||||
if((mtr->flags & METEOR_RGB) == 0)
|
||||
return EINVAL;
|
||||
mtr->flags = (mtr->flags & ~METEOR_DEV_MASK)
|
||||
| METEOR_DEV_RGB;
|
||||
SAA7196_WRITE(mtr, 0x0e,
|
||||
(SAA7196_REG(mtr, 0x0e) & ~0x3) | 0x3);
|
||||
SAA7196_WRITE(mtr, 0x06,
|
||||
(SAA7196_REG(mtr, 0x06) & ~0x80));
|
||||
select_bt254(mtr);
|
||||
SAA7196_WRITE(mtr, 0x0e, /* chn 3 for synch */
|
||||
(SAA7196_REG(mtr, 0x0e) & ~0x3) | 0x3);
|
||||
break;
|
||||
default:
|
||||
return EINVAL;
|
||||
|
@ -1233,8 +1360,8 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
case METEOR_FMT_NTSC:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
METEOR_NTSC;
|
||||
SAA7196_WRITE(mtr, 0x0d,
|
||||
(SAA7196_REG(mtr, 0x0d) & ~0x01));
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
(SAA7196_REG(mtr, SAA7196_STDC) & ~0x01));
|
||||
SAA7196_WRITE(mtr, 0x0f,
|
||||
(SAA7196_REG(mtr, 0x0f) & ~0xe0) | 0x40);
|
||||
SAA7196_WRITE(mtr, 0x22, 0x80);
|
||||
|
@ -1247,8 +1374,8 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
case METEOR_FMT_PAL:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
METEOR_PAL;
|
||||
SAA7196_WRITE(mtr, 0x0d,
|
||||
(SAA7196_REG(mtr, 0x0d) & ~0x01));
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
(SAA7196_REG(mtr, SAA7196_STDC) & ~0x01));
|
||||
SAA7196_WRITE(mtr, 0x0f,
|
||||
(SAA7196_REG(mtr, 0x0f) & ~0xe0));
|
||||
SAA7196_WRITE(mtr, 0x22, 0x00);
|
||||
|
@ -1261,8 +1388,8 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
case METEOR_FMT_SECAM:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
METEOR_SECAM;
|
||||
SAA7196_WRITE(mtr, 0x0d,
|
||||
(SAA7196_REG(mtr, 0x0d) & ~0x01) | 0x1);
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
(SAA7196_REG(mtr, SAA7196_STDC) & ~0x01) | 0x1);
|
||||
SAA7196_WRITE(mtr, 0x0f,
|
||||
(SAA7196_REG(mtr, 0x0f) & ~0xe0) | 0x20);
|
||||
SAA7196_WRITE(mtr, 0x22, 0x00);
|
||||
|
@ -1275,8 +1402,8 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
case METEOR_FMT_AUTOMODE:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
METEOR_AUTOMODE;
|
||||
SAA7196_WRITE(mtr, 0x0d,
|
||||
(SAA7196_REG(mtr, 0x0d) & ~0x01));
|
||||
SAA7196_WRITE(mtr, SAA7196_STDC,
|
||||
(SAA7196_REG(mtr, SAA7196_STDC) & ~0x01));
|
||||
SAA7196_WRITE(mtr, 0x0f,
|
||||
(SAA7196_REG(mtr, 0x0f) & ~0xe0) | 0x80);
|
||||
break;
|
||||
|
@ -1319,7 +1446,7 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
case METEOR_CAP_STOP_CONT:
|
||||
if (mtr->flags & METEOR_CONTIN) {
|
||||
/* turn off capture */
|
||||
*((volatile u_long *) mtr->capt_cntrl) = 0x8ff0;
|
||||
mtr->base->cap_cntl = 0x8ff0;
|
||||
mtr->flags &= ~(METEOR_CONTIN|METEOR_WANT_MASK);
|
||||
}
|
||||
break;
|
||||
|
@ -1366,13 +1493,13 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
case METEOR_CAP_STOP_FRAMES:
|
||||
if (mtr->flags & METEOR_SYNCAP) {
|
||||
/* turn off capture */
|
||||
*((volatile u_long *) mtr->capt_cntrl) = 0x8ff0;
|
||||
mtr->base->cap_cntl = 0x8ff0;
|
||||
mtr->flags &= ~(METEOR_SYNCAP|METEOR_WANT_MASK);
|
||||
}
|
||||
break;
|
||||
case METEOR_HALT_N_FRAMES:
|
||||
if(mtr->flags & METEOR_SYNCAP) {
|
||||
*((volatile u_long *) mtr->capt_cntrl) = 0x8ff0;
|
||||
mtr->base->cap_cntl = 0x8ff0;
|
||||
mtr->flags &= ~(METEOR_WANT_MASK);
|
||||
}
|
||||
break;
|
||||
|
@ -1466,7 +1593,7 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
|||
mtr->cols = geo->columns;
|
||||
mtr->frames = geo->frames;
|
||||
|
||||
p = (volatile u_long *) mtr->virt_baseaddr;
|
||||
p = &mtr->base->dma1e;
|
||||
#ifdef METEOR_TEST_VIDEO
|
||||
if(mtr->video.addr)
|
||||
buf = vtophys(mtr->video.addr);
|
||||
|
|
245
sys/pci/meteor_reg.h
Normal file
245
sys/pci/meteor_reg.h
Normal file
|
@ -0,0 +1,245 @@
|
|||
/*
|
||||
* Copyright (c) 1995 Mark Tinguely and Jim Lowe
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Mark Tinguely and Jim Lowe
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* 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.
|
||||
*/
|
||||
#ifndef PCI_LATENCY_TIMER
|
||||
#define PCI_LATENCY_TIMER 0x0c /* pci timer register */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Definitions for the Philips SAA7116 digital video to pci interface.
|
||||
*/
|
||||
#define SAA7116_PHILIPS_ID 0x12238086ul
|
||||
#define SAA7116_I2C_WRITE 0x00
|
||||
#define SAA7116_I2C_READ 0x01
|
||||
#define SAA7116_IIC_NEW_CYCLE 0x1000000L
|
||||
#define SAA7116_IIC_DIRECT_TRANSFER_ABORTED 0x0000200L
|
||||
|
||||
typedef volatile u_int mreg_t;
|
||||
struct saa7116_regs {
|
||||
mreg_t dma1e; /* Base address for even field dma chn 1 */
|
||||
mreg_t dma2e; /* Base address for even field dma chn 2 */
|
||||
mreg_t dma3e; /* Base address for even field dma chn 3 */
|
||||
mreg_t dma1o; /* Base address for odd field dma chn 1 */
|
||||
mreg_t dma2o; /* Base address for odd field dma chn 2 */
|
||||
mreg_t dma3o; /* Base address for odd field dma chn 3 */
|
||||
mreg_t stride1e; /* Address stride for even field dma chn 1 */
|
||||
mreg_t stride2e; /* Address stride for even field dma chn 2 */
|
||||
mreg_t stride3e; /* Address stride for even field dma chn 3 */
|
||||
mreg_t stride1o; /* Address stride for odd field dma chn 1 */
|
||||
mreg_t stride2o; /* Address stride for odd field dma chn 2 */
|
||||
mreg_t stride3o; /* Address stride for odd field dma chn 3 */
|
||||
mreg_t routee; /* Route/mode even */
|
||||
mreg_t routeo; /* Route/mode odd */
|
||||
mreg_t fifo_t; /* FIFO trigger for PCI int */
|
||||
mreg_t field_t; /* Field toggle */
|
||||
mreg_t cap_cntl; /* Capture control */
|
||||
mreg_t retry_wait_cnt; /* Clks for master to wait after disconnect */
|
||||
mreg_t irq_stat; /* IRQ mask and status reg */
|
||||
mreg_t fme; /* Field Mask even */
|
||||
mreg_t fmo; /* Field mask odd */
|
||||
mreg_t fml; /* Field mask length */
|
||||
mreg_t fifo_t_err; /* FIFO almost empty/almost full ptrs */
|
||||
mreg_t i2c_phase; /* i2c phase register */
|
||||
mreg_t i2c_read; /* i2c read register */
|
||||
mreg_t i2c_write; /* i2c write register */
|
||||
mreg_t i2c_auto_a_e; /* i2c auto register a, even */
|
||||
mreg_t i2c_auto_b_e; /* i2c auto register b, even */
|
||||
mreg_t i2c_auto_c_e; /* i2c auto register c, even */
|
||||
mreg_t i2c_auto_d_e; /* i2c auto register d, even */
|
||||
mreg_t i2c_auto_a_o; /* i2c auto register a, odd */
|
||||
mreg_t i2c_auto_b_o; /* i2c auto register b, odd */
|
||||
mreg_t i2c_auto_c_o; /* i2c auto register c, odd */
|
||||
mreg_t i2c_auto_d_o; /* i2c auto register d, odd */
|
||||
mreg_t i2c_auto_enable;/* enable above auto registers */
|
||||
mreg_t dma_end_e; /* DMA end even (range) */
|
||||
mreg_t dma_end_o; /* DMA end odd (range) */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Definitions for the Philips SAA7196 digital video decoder,
|
||||
* scalar, and clock generator circuit (DESCpro).
|
||||
*/
|
||||
#define NUM_SAA7196_I2C_REGS 49
|
||||
#define SAA7196_I2C_ADDR 0x40
|
||||
#define SAA7196_WRITE(mtr, reg, data) \
|
||||
i2c_write(mtr, SAA7196_I2C_ADDR, SAA7116_I2C_WRITE, reg, data), \
|
||||
mtr->saa7196_i2c[reg] = data
|
||||
#define SAA7196_REG(mtr, reg) mtr->saa7196_i2c[reg]
|
||||
#define SAA7196_READ(mtr) \
|
||||
i2c_write(mtr, SAA7196_I2C_ADDR, SAA7116_I2C_READ, 0x0, 0x0)
|
||||
|
||||
#define SAA7196_IDEL 0x00 /* Increment delay */
|
||||
#define SAA7196_HSB5 0x01 /* H-sync begin; 50 hz */
|
||||
#define SAA7196_HSS5 0x02 /* H-sync stop; 50 hz */
|
||||
#define SAA7196_HCB5 0x03 /* H-clamp begin; 50 hz */
|
||||
#define SAA7196_HCS5 0x04 /* H-clamp stop; 50 hz */
|
||||
#define SAA7196_HSP5 0x05 /* H-sync after PHI1; 50 hz */
|
||||
#define SAA7196_LUMC 0x06 /* Luminance control */
|
||||
#define SAA7196_HUEC 0x07 /* Hue control */
|
||||
#define SAA7196_CKTQ 0x08 /* Colour Killer Threshold QAM (PAL, NTSC) */
|
||||
#define SAA7196_CKTS 0x09 /* Colour Killer Threshold SECAM */
|
||||
#define SAA7196_PALS 0x0a /* PAL switch sensitivity */
|
||||
#define SAA7196_SECAMS 0x0b /* SECAM switch sensitivity */
|
||||
#define SAA7196_CGAINC 0x0c /* Chroma gain control */
|
||||
#define SAA7196_STDC 0x0d /* Standard/Mode control */
|
||||
#define SAA7196_IOCC 0x0e /* I/O and Clock Control */
|
||||
#define SAA7196_CTRL1 0x0f /* Control #1 */
|
||||
#define SAA7196_CTRL2 0x10 /* Control #2 */
|
||||
#define SAA7196_CGAINR 0x11 /* Chroma Gain Reference */
|
||||
#define SAA7196_CSAT 0x12 /* Chroma Saturation */
|
||||
#define SAA7196_CONT 0x13 /* Luminance Contrast */
|
||||
#define SAA7196_HSB6 0x14 /* H-sync begin; 60 hz */
|
||||
#define SAA7196_HSS6 0x15 /* H-sync stop; 60 hz */
|
||||
#define SAA7196_HCB6 0x16 /* H-clamp begin; 60 hz */
|
||||
#define SAA7196_HCS6 0x17 /* H-clamp stop; 60 hz */
|
||||
#define SAA7196_HSP6 0x18 /* H-sync after PHI1; 60 hz */
|
||||
#define SAA7196_BRIG 0x19 /* Luminance Brightness */
|
||||
#define SAA7196_FMTS 0x20 /* Formats and sequence */
|
||||
#define SAA7196_OUTPIX 0x21 /* Output data pixel/line */
|
||||
#define SAA7196_INPIX 0x22 /* Input data pixel/line */
|
||||
#define SAA7196_HWS 0x23 /* Horiz. window start */
|
||||
#define SAA7196_HFILT 0x24 /* Horiz. filter */
|
||||
#define SAA7196_OUTLINE 0x25 /* Output data lines/field */
|
||||
#define SAA7196_INLINE 0x26 /* Input data lines/field */
|
||||
#define SAA7196_VWS 0x27 /* Vertical window start */
|
||||
#define SAA7196_VYP 0x28 /* AFS/vertical Y processing */
|
||||
#define SAA7196_VBS 0x29 /* Vertical Bypass start */
|
||||
#define SAA7196_VBCNT 0x2a /* Vertical Bypass count */
|
||||
#define SAA7196_VBP 0x2b /* veritcal Bypass Polarity */
|
||||
#define SAA7196_VLOW 0x2c /* Colour-keying lower V limit */
|
||||
#define SAA7196_VHIGH 0x2d /* Colour-keying upper V limit */
|
||||
#define SAA7196_ULOW 0x2e /* Colour-keying lower U limit */
|
||||
#define SAA7196_UHIGH 0x2f /* Colour-keying upper U limit */
|
||||
#define SAA7196_DPATH 0x30 /* Data path setting */
|
||||
|
||||
/*
|
||||
* Defines for the PCF8574.
|
||||
*/
|
||||
#define NUM_PCF8574_I2C_REGS 2
|
||||
#define PCF8574_CTRL_I2C_ADDR 0x70
|
||||
#define PCF8574_DATA_I2C_ADDR 0x72
|
||||
#define PCF8574_CTRL_WRITE(mtr, data) \
|
||||
i2c_write(mtr, PCF8574_CTRL_I2C_ADDR, SAA7116_I2C_WRITE, 0, data), \
|
||||
mtr->pcf_i2c[0] = data
|
||||
#define PCF8574_DATA_WRITE(mtr, data) \
|
||||
i2c_write(mtr, PCF8574_DATA_I2C_ADDR, SAA7116_I2C_WRITE, 0, data), \
|
||||
mtr->pcf_i2c[1] = data
|
||||
#define PCF8574_CTRL_REG(mtr) mtr->pcf_i2c[0]
|
||||
#define PCF8574_DATA_REG(mtr) mtr->pcf_i2c[1]
|
||||
|
||||
|
||||
/*
|
||||
* Defines for the BT254.
|
||||
*/
|
||||
#define NUM_BT254_REGS 7
|
||||
|
||||
#define BT254_COMMAND 0
|
||||
#define BT254_IOUT1 1
|
||||
#define BT254_IOUT2 2
|
||||
#define BT254_IOUT3 3
|
||||
#define BT254_IOUT4 4
|
||||
#define BT254_IOUT5 5
|
||||
#define BT254_IOUT6 6
|
||||
|
||||
/*
|
||||
* Meteor info structure, one per meteor card installed.
|
||||
*/
|
||||
typedef struct meteor_softc {
|
||||
struct saa7116_regs *base; /* saa7116 register virtual address */
|
||||
vm_offset_t phys_base; /* saa7116 register physical address */
|
||||
pcici_t tag; /* PCI tag, for doing PCI commands */
|
||||
vm_offset_t bigbuf; /* buffer that holds the captured image */
|
||||
int alloc_pages; /* number of pages in bigbuf */
|
||||
struct proc *proc; /* process to receive raised signal */
|
||||
int signal; /* signal to send to process */
|
||||
struct meteor_mem *mem; /* used to control sync. multi-frame output */
|
||||
u_long synch_wait; /* wait for free buffer before continuing */
|
||||
short current; /* frame number in buffer (1-frames) */
|
||||
short rows; /* number of rows in a frame */
|
||||
short cols; /* number of columns in a frame */
|
||||
short depth; /* number of byte per pixel */
|
||||
short frames; /* number of frames allocated */
|
||||
int frame_size; /* number of bytes in a frame */
|
||||
u_long fifo_errors; /* number of fifo capture errors since open */
|
||||
u_long dma_errors; /* number of DMA capture errors since open */
|
||||
u_long frames_captured;/* number of frames captured since open */
|
||||
u_long even_fields_captured; /* number of even fields captured */
|
||||
u_long odd_fields_captured; /* number of odd fields captured */
|
||||
u_long range_enable; /* enable range checking ?? */
|
||||
unsigned flags;
|
||||
#define METEOR_INITALIZED 0x00000001
|
||||
#define METEOR_OPEN 0x00000002
|
||||
#define METEOR_MMAP 0x00000004
|
||||
#define METEOR_INTR 0x00000008
|
||||
#define METEOR_READ 0x00000010 /* XXX never gets referenced */
|
||||
#define METEOR_SINGLE 0x00000020 /* get single frame */
|
||||
#define METEOR_CONTIN 0x00000040 /* continuously get frames */
|
||||
#define METEOR_SYNCAP 0x00000080 /* synchronously get frames */
|
||||
#define METEOR_CAP_MASK 0x000000f0
|
||||
#define METEOR_NTSC 0x00000100
|
||||
#define METEOR_PAL 0x00000200
|
||||
#define METEOR_SECAM 0x00000400
|
||||
#define METEOR_AUTOMODE 0x00000800
|
||||
#define METEOR_FORM_MASK 0x00000f00
|
||||
#define METEOR_DEV0 0x00001000
|
||||
#define METEOR_DEV1 0x00002000
|
||||
#define METEOR_DEV2 0x00004000
|
||||
#define METEOR_DEV3 0x00008000
|
||||
#define METEOR_DEV_SVIDEO 0x00006000
|
||||
#define METEOR_DEV_RGB 0x0000a000
|
||||
#define METEOR_DEV_MASK 0x2000f000
|
||||
#define METEOR_RGB16 0x00010000
|
||||
#define METEOR_RGB24 0x00020000
|
||||
#define METEOR_YUV_PACKED 0x00040000
|
||||
#define METEOR_YUV_PLANER 0x00080000
|
||||
#define METEOR_WANT_EVEN 0x00100000 /* want even frame */
|
||||
#define METEOR_WANT_ODD 0x00200000 /* want odd frame */
|
||||
#define METEOR_WANT_MASK 0x00300000
|
||||
#define METEOR_ONLY_EVEN_FIELDS 0x01000000
|
||||
#define METEOR_ONLY_ODD_FIELDS 0x02000000
|
||||
#define METEOR_ONLY_FIELDS_MASK 0x03000000
|
||||
#define METEOR_YUV_422 0x04000000
|
||||
#define METEOR_YUV_411 0x08000000
|
||||
#define METEOR_YUV_811 0x10000000
|
||||
#define METEOR_OUTPUT_FMT_MASK 0x1f0f0000
|
||||
#define METEOR_RGB 0x20000000 /* meteor rgb unit */
|
||||
|
||||
u_char saa7196_i2c[NUM_SAA7196_I2C_REGS]; /* saa7196 register values */
|
||||
u_char pcf_i2c[NUM_PCF8574_I2C_REGS]; /* PCF8574 register values */
|
||||
u_char bt254_reg[NUM_BT254_REGS]; /* BT254 register values */
|
||||
u_short fps; /* frames per second */
|
||||
#ifdef DEVFS
|
||||
void *devfs_token;
|
||||
#endif
|
||||
#ifdef METEOR_TEST_VIDEO
|
||||
struct meteor_video video;
|
||||
#endif
|
||||
} meteor_reg_t;
|
|
@ -89,6 +89,18 @@ struct meteor_video {
|
|||
#define METEORGSIGNAL _IOR('x', 12, unsigned int) /* get signal */
|
||||
#define METEORSVIDEO _IOW('x', 13, struct meteor_video) /* set video */
|
||||
#define METEORGVIDEO _IOR('x', 13, struct meteor_video) /* get video */
|
||||
#define METEORSBRIG _IOW('x', 14, unsigned char) /* set brightness */
|
||||
#define METEORGBRIG _IOR('x', 14, unsigned char) /* get brightness */
|
||||
#define METEORSCSAT _IOW('x', 15, unsigned char) /* set chroma sat */
|
||||
#define METEORGCSAT _IOR('x', 15, unsigned char) /* get uv saturation */
|
||||
#define METEORSCONT _IOW('x', 16, unsigned char) /* set contrast */
|
||||
#define METEORGCONT _IOR('x', 16, unsigned char) /* get contrast */
|
||||
#define METEORSBT254 _IOW('x', 17, unsigned short) /* set Bt254 reg */
|
||||
#define METEORGBT254 _IOR('x', 17, unsigned short) /* get Bt254 reg */
|
||||
#define METEORSHWS _IOW('x', 18, unsigned char) /* set hor start reg */
|
||||
#define METEORGHWS _IOR('x', 18, unsigned char) /* get hor start reg */
|
||||
#define METEORSVWS _IOW('x', 19, unsigned char) /* set vert start reg */
|
||||
#define METEORGVWS _IOR('x', 19, unsigned char) /* get vert start reg */
|
||||
|
||||
#define METEOR_STATUS_ID_MASK 0xf000 /* ID of 7196 */
|
||||
#define METEOR_STATUS_DIR 0x0800 /* Direction of Expansion port YUV */
|
||||
|
@ -121,7 +133,8 @@ struct meteor_video {
|
|||
#define METEOR_INPUT_DEV1 0x02000 /* camera input 1 */
|
||||
#define METEOR_INPUT_DEV2 0x04000 /* camera input 2 */
|
||||
#define METEOR_INPUT_DEV3 0x08000 /* camera input 3 */
|
||||
#define METEOR_INPUT_DEV_SVIDEO METEOR_GEO_DEV3
|
||||
#define METEOR_INPUT_DEV_RGB 0x0a000 /* for rgb version of meteor */
|
||||
#define METEOR_INPUT_DEV_SVIDEO 0x06000 /* S-video input port */
|
||||
|
||||
/* valid video output formats: */
|
||||
#define METEOR_GEO_RGB16 0x0010000 /* packed -- initialized default */
|
||||
|
|
Loading…
Reference in a new issue