Here is a patch that fix a few problems with the RGB version of
the meteor card. Submitted-by: james
This commit is contained in:
parent
475dca82bb
commit
068439339a
@ -129,6 +129,18 @@
|
||||
Changed the spelling of PLANER to PLANAR as pointed
|
||||
out by Paco Hope <paco@cs.virigina.edu> and define
|
||||
PLANER to be PLANAR for backward compatibility.
|
||||
5/28/95 METEOR_INPUT_DEV_RCA -> METEOR_INPUT_DEV0, not
|
||||
METEOR_GEO_DEV0. Pointed out by Ian Reid,
|
||||
<ian@robots.ox.ac.uk>.
|
||||
METEOR_DEV_MASK should be 0x0000f000 and not
|
||||
0x2000f000, otherwise METEOR_RGB gets masked
|
||||
out. Pointed out by Ian Reid.
|
||||
Changed the fps code to give even distribution for
|
||||
low frame rates. Code supplied by Ian Reid.
|
||||
Fix some problems with the RGB version. Patch supplied
|
||||
by <ljo@po.cwru.edu>.
|
||||
Added METEOR_FIELD_MODE to include files for a
|
||||
future version of this driver.
|
||||
*/
|
||||
|
||||
#include "meteor.h"
|
||||
@ -622,6 +634,12 @@ meteor_intr(void *arg)
|
||||
*base = next_base;
|
||||
/* XXX should add adjustments for YUV_422 & PLANAR */
|
||||
}
|
||||
/*
|
||||
* If the user requested to be notified via signal,
|
||||
* let them know the field is complete.
|
||||
*/
|
||||
if(mtr->proc && (mtr->signal & METEOR_SIG_MODE_MASK))
|
||||
psignal(mtr->proc, mtr->signal&(~METEOR_SIG_MODE_MASK));
|
||||
}
|
||||
if (status & 0x2) { /* odd field */
|
||||
mtr->odd_fields_captured++;
|
||||
@ -630,6 +648,12 @@ meteor_intr(void *arg)
|
||||
*(base+3) = next_base + *(base+6);
|
||||
/* XXX should add adjustments for YUV_422 & PLANAR */
|
||||
}
|
||||
/*
|
||||
* If the user requested to be notified via signal,
|
||||
* let them know the field is complete.
|
||||
*/
|
||||
if(mtr->proc && (mtr->signal & METEOR_SIG_MODE_MASK))
|
||||
psignal(mtr->proc, mtr->signal&(~METEOR_SIG_MODE_MASK));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -661,8 +685,8 @@ meteor_intr(void *arg)
|
||||
* If the user requested to be notified via signal,
|
||||
* let them know the frame is complete.
|
||||
*/
|
||||
if(mtr->proc && mtr->signal)
|
||||
psignal(mtr->proc, mtr->signal);
|
||||
if(mtr->proc && !(mtr->signal & METEOR_SIG_MODE_MASK))
|
||||
psignal(mtr->proc, mtr->signal&(~METEOR_SIG_MODE_MASK));
|
||||
/*
|
||||
* Reset the want flags if in continuous or
|
||||
* synchronous capture mode.
|
||||
@ -784,14 +808,29 @@ set_fps(meteor_reg_t *mtr, u_short fps)
|
||||
/*
|
||||
* Compute the mask/length using the fps.
|
||||
*/
|
||||
if(fps < maxfps) {
|
||||
float b, step;
|
||||
if(fps == maxfps) {
|
||||
mask = 0x1;
|
||||
length = 0x0;
|
||||
} else if ((float)fps == maxfps/2.0) {
|
||||
mask = 0x1;
|
||||
length = 0x1;
|
||||
} else if (fps > maxfps/2) {
|
||||
float step, b;
|
||||
|
||||
mask = (1 << maxfps) - 1;
|
||||
length = ((maxfps - 1) << 16) | (maxfps - 1);
|
||||
step = (float)(maxfps - 1) / (float)(maxfps - fps);
|
||||
mask = (1<<maxfps) - 1;
|
||||
length = maxfps - 1;
|
||||
step = (float)(maxfps - 1)/(float)(maxfps - fps);
|
||||
for(b=step; b < maxfps; b += step) {
|
||||
mask &= ~(1<<((int)b));
|
||||
mask &= ~(1<<((int)b)); /* mask out the bth frame */
|
||||
}
|
||||
} else { /* fps < maxfps/2 */
|
||||
float step, b;
|
||||
|
||||
mask = 0x1;
|
||||
length = maxfps - 1;
|
||||
step = (float)(maxfps -1)/(float)(fps);
|
||||
for(b = step + 1; b < maxfps - 1; b += step) {
|
||||
mask |= (1<<((int)b)); /* mask in the bth frame */
|
||||
}
|
||||
}
|
||||
|
||||
@ -799,7 +838,7 @@ set_fps(meteor_reg_t *mtr, u_short fps)
|
||||
* Set the fps.
|
||||
*/
|
||||
s7116->fme = s7116->fmo = mask;
|
||||
s7116->fml = length;
|
||||
s7116->fml = (length << 16) | length;;
|
||||
|
||||
mtr->fps = fps;
|
||||
|
||||
@ -864,6 +903,19 @@ int i;
|
||||
bt254_write(mtr, BT254_COMMAND, 0x00); /* 24 bpp */
|
||||
}
|
||||
|
||||
static void
|
||||
bt254_ntsc(meteor_reg_t *mtr, int arg)
|
||||
{
|
||||
if (arg){
|
||||
/* Set NTSC bit */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) | 0x20);
|
||||
}
|
||||
else {
|
||||
/* reset NTSC bit */
|
||||
PCF8574_CTRL_WRITE(mtr, PCF8574_CTRL_REG(mtr) &= ~0x20);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
select_bt254(meteor_reg_t *mtr)
|
||||
{
|
||||
@ -1458,6 +1510,9 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
||||
SAA7196_WRITE(mtr, 0x26, 0xf0);
|
||||
SAA7196_WRITE(mtr, 0x28,
|
||||
(SAA7196_REG(mtr, 0x28) & ~0x0c)) ;
|
||||
if(mtr->flags & METEOR_RGB){
|
||||
bt254_ntsc(mtr, 1);
|
||||
}
|
||||
break;
|
||||
case METEOR_FMT_PAL:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
@ -1472,6 +1527,9 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
||||
SAA7196_WRITE(mtr, 0x26, 0x20);
|
||||
SAA7196_WRITE(mtr, 0x28,
|
||||
(SAA7196_REG(mtr, 0x28) & ~0x0c) | 0x04) ;
|
||||
if(mtr->flags & METEOR_RGB){
|
||||
bt254_ntsc(mtr, 0);
|
||||
}
|
||||
break;
|
||||
case METEOR_FMT_SECAM:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
@ -1486,6 +1544,9 @@ meteor_ioctl(dev_t dev, int cmd, caddr_t arg, int flag, struct proc *pr)
|
||||
SAA7196_WRITE(mtr, 0x26, 0x20);
|
||||
SAA7196_WRITE(mtr, 0x28,
|
||||
(SAA7196_REG(mtr, 0x28) & ~0x0c) | 0x04) ;
|
||||
if(mtr->flags & METEOR_RGB){
|
||||
bt254_ntsc(mtr, 0);
|
||||
}
|
||||
break;
|
||||
case METEOR_FMT_AUTOMODE:
|
||||
mtr->flags = (mtr->flags & ~METEOR_FORM_MASK) |
|
||||
|
@ -147,10 +147,10 @@ struct saa7116_regs {
|
||||
#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), \
|
||||
i2c_write(mtr, PCF8574_CTRL_I2C_ADDR, SAA7116_I2C_WRITE, data, data), \
|
||||
mtr->pcf_i2c[0] = data
|
||||
#define PCF8574_DATA_WRITE(mtr, data) \
|
||||
i2c_write(mtr, PCF8574_DATA_I2C_ADDR, SAA7116_I2C_WRITE, 0, data), \
|
||||
i2c_write(mtr, PCF8574_DATA_I2C_ADDR, SAA7116_I2C_WRITE, data, data), \
|
||||
mtr->pcf_i2c[1] = data
|
||||
#define PCF8574_CTRL_REG(mtr) mtr->pcf_i2c[0]
|
||||
#define PCF8574_DATA_REG(mtr) mtr->pcf_i2c[1]
|
||||
@ -180,6 +180,9 @@ typedef struct meteor_softc {
|
||||
int alloc_pages; /* number of pages in bigbuf */
|
||||
struct proc *proc; /* process to receive raised signal */
|
||||
int signal; /* signal to send to process */
|
||||
#define METEOR_SIG_MODE_MASK 0xffff0000
|
||||
#define METEOR_SIG_FIELD_MODE 0x00010000
|
||||
#define METEOR_SIG_FRAME_MODE 0x00000000
|
||||
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) */
|
||||
@ -215,7 +218,7 @@ typedef struct meteor_softc {
|
||||
#define METEOR_DEV3 0x00008000
|
||||
#define METEOR_DEV_SVIDEO 0x00006000
|
||||
#define METEOR_DEV_RGB 0x0000a000
|
||||
#define METEOR_DEV_MASK 0x2000f000
|
||||
#define METEOR_DEV_MASK 0x0000f000
|
||||
#define METEOR_RGB16 0x00010000
|
||||
#define METEOR_RGB24 0x00020000
|
||||
#define METEOR_YUV_PACKED 0x00040000
|
||||
@ -230,6 +233,7 @@ typedef struct meteor_softc {
|
||||
#define METEOR_OUTPUT_FMT_MASK 0x040f0000
|
||||
#define METEOR_WANT_TS 0x08000000 /* time-stamp a frame */
|
||||
#define METEOR_RGB 0x20000000 /* meteor rgb unit */
|
||||
#define METEOR_FIELD_MODE 0x80000000
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user