Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

/* Bt832 CMOS Camera Video Processor (VP)

 The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS
  color digital camera directly to video capture devices via an 8-bit,
  4:2:2 YUV or YCrCb video interface.

 i2c addresses: 0x88 or 0x8a
 */


/* The 64 registers: */

// Input Processor
#define BT832_OFFSET 0
#define BT832_RCOMP     1
#define BT832_G1COMP    2
#define BT832_G2COMP    3
#define BT832_BCOMP     4
// Exposures:
#define BT832_FINEH     5
#define BT832_FINEL     6
#define BT832_COARSEH   7
#define BT832_COARSEL   8
#define BT832_CAMGAIN   9
// Main Processor:
#define BT832_M00       10
#define BT832_M01       11
#define BT832_M02       12
#define BT832_M10       13
#define BT832_M11       14
#define BT832_M12       15
#define BT832_M20       16
#define BT832_M21       17
#define BT832_M22       18
#define BT832_APCOR     19
#define BT832_GAMCOR    20
// Level Accumulator Inputs
#define BT832_VPCONTROL2        21
#define BT832_ZONECODE0 22
#define BT832_ZONECODE1 23
#define BT832_ZONECODE2 24
#define BT832_ZONECODE3 25
// Level Accumulator Outputs:
#define BT832_RACC      26
#define BT832_GACC      27
#define BT832_BACC      28
#define BT832_BLACKACC  29
#define BT832_EXP_AGC   30
#define BT832_LACC0     31
#define BT832_LACC1     32
#define BT832_LACC2     33
#define BT832_LACC3     34
#define BT832_LACC4     35
#define BT832_LACC5     36
#define BT832_LACC6     37
#define BT832_LACC7     38
// System:
#define BT832_VP_CONTROL0       39
#define BT832_VP_CONTROL1       40
#define BT832_THRESH    41
#define BT832_VP_TESTCONTROL0   42
#define BT832_VP_DMCODE 43
#define BT832_ACB_CONFIG        44
#define BT832_ACB_GNBASE        45
#define BT832_ACB_MU    46
#define BT832_CAM_TEST0 47
#define BT832_AEC_CONFIG        48
#define BT832_AEC_TL    49
#define BT832_AEC_TC    50
#define BT832_AEC_TH    51
// Status:
#define BT832_VP_STATUS 52
#define BT832_VP_LINECOUNT      53
#define BT832_CAM_DEVICEL       54 // e.g. 0x19
#define BT832_CAM_DEVICEH       55 // e.g. 0x40  == 0x194 Mask0, 0x194 = 404 decimal (VVL-404 camera)
#define BT832_CAM_STATUS                56
 #define BT832_56_CAMERA_PRESENT 0x20
//Camera Setups:
#define BT832_CAM_SETUP0        57
#define BT832_CAM_SETUP1        58
#define BT832_CAM_SETUP2        59
#define BT832_CAM_SETUP3        60
// System:
#define BT832_DEFCOR            61
#define BT832_VP_TESTCONTROL1   62
#define BT832_DEVICE_ID         63
# define BT832_DEVICE_ID__31            0x31 // Bt832 has ID 0x31

/* STMicroelectronivcs VV5404 camera module
   i2c: 0x20: sensor address
   i2c: 0xa0: eeprom for ccd defect map
 */

#define VV5404_device_h         0x00  // 0x19
#define VV5404_device_l         0x01  // 0x40
#define VV5404_status0          0x02
#define VV5404_linecountc       0x03 // current line counter
#define VV5404_linecountl       0x04
#define VV5404_setup0           0x10
#define VV5404_setup1           0x11
#define VV5404_setup2           0x12
#define VV5404_setup4           0x14
#define VV5404_setup5           0x15
#define VV5404_fine_h           0x20  // fine exposure
#define VV5404_fine_l           0x21
#define VV5404_coarse_h         0x22  //coarse exposure
#define VV5404_coarse_l         0x23
#define VV5404_gain             0x24 // ADC pre-amp gain setting
#define VV5404_clk_div          0x25
#define VV5404_cr               0x76 // control register
#define VV5404_as0              0x77 // ADC setup register


// IOCTL
#define BT832_HEXDUMP   _IOR('b',1,int)
#define BT832_REATTACH  _IOR('b',2,int)

/* from BT8x8VXD/capdrv/dialogs.cpp */

/*
typedef enum { SVI, Logitech, Rockwell } CAMERA;

static COMBOBOX_ENTRY gwCameraOptions[] =
{
   { SVI,      "Silicon Vision 512N" },
   { Logitech, "Logitech VideoMan 1.3"  },
   { Rockwell, "Rockwell QuartzSight PCI 1.0"   }
};

// SRAM table values
//===========================================================================
typedef enum { TGB_NTSC624, TGB_NTSC780, TGB_NTSC858, TGB_NTSC392 } TimeGenByte;

BYTE SRAMTable[][ 60 ] =
{
   // TGB_NTSC624
   {
      0x33, // size of table = 51
      0x0E, 0xC0, 0x00, 0x00, 0x90, 0x02, 0x03, 0x10, 0x03, 0x06,
      0x10, 0x04, 0x12, 0x12, 0x05, 0x02, 0x13, 0x04, 0x19, 0x00,
      0x04, 0x39, 0x00, 0x06, 0x59, 0x08, 0x03, 0x85, 0x08, 0x07,
      0x03, 0x50, 0x00, 0x91, 0x40, 0x00, 0x11, 0x01, 0x01, 0x4D,
      0x0D, 0x02, 0x03, 0x11, 0x01, 0x05, 0x37, 0x00, 0x37, 0x21, 0x00
   },
   // TGB_NTSC780
   {
      0x33, // size of table = 51
      0x0e, 0xc0, 0x00, 0x00, 0x90, 0xe2, 0x03, 0x10, 0x03, 0x06,
      0x10, 0x34, 0x12, 0x12, 0x65, 0x02, 0x13, 0x24, 0x19, 0x00,
      0x24, 0x39, 0x00, 0x96, 0x59, 0x08, 0x93, 0x85, 0x08, 0x97,
      0x03, 0x50, 0x50, 0xaf, 0x40, 0x30, 0x5f, 0x01, 0xf1, 0x7f,
      0x0d, 0xf2, 0x03, 0x11, 0xf1, 0x05, 0x37, 0x30, 0x85, 0x21, 0x50
   },
   // TGB_NTSC858
   {
      0x33, // size of table = 51
      0x0c, 0xc0, 0x00, 0x00, 0x90, 0xc2, 0x03, 0x10, 0x03, 0x06,
      0x10, 0x34, 0x12, 0x12, 0x65, 0x02, 0x13, 0x24, 0x19, 0x00,
      0x24, 0x39, 0x00, 0x96, 0x59, 0x08, 0x93, 0x83, 0x08, 0x97,
      0x03, 0x50, 0x30, 0xc0, 0x40, 0x30, 0x86, 0x01, 0x01, 0xa6,
      0x0d, 0x62, 0x03, 0x11, 0x61, 0x05, 0x37, 0x30, 0xac, 0x21, 0x50
   },
   // TGB_NTSC392
   // This table has been modified to be used for Fusion Rev D
   {
      0x2A, // size of table = 42
      0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
      0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
      0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
      0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
      0x20, 0x00
   }
};

//===========================================================================
// This is the structure of the camera specifications
//===========================================================================
typedef struct tag_cameraSpec
{
   SignalFormat signal;       // which digital signal format the camera has
   VideoFormat  vidFormat;    // video standard
   SyncVideoRef syncRef;      // which sync video reference is used
   State        syncOutput;   // enable sync output for sync video input?
   DecInputClk  iClk;         // which input clock is used
   TimeGenByte  tgb;          // which timing generator byte does the camera use
   int          HReset;       // select 64, 48, 32, or 16 CLKx1 for HReset
   PLLFreq      pllFreq;      // what synthesized frequency to set PLL to
   VSIZEPARMS   vSize;        // video size the camera produces
   int          lineCount;    // expected total number of half-line per frame - 1
   BOOL         interlace;    // interlace signal?
} CameraSpec;

//===========================================================================
// <UPDATE REQUIRED>
// Camera specifications database. Update this table whenever camera spec
// has been changed or added/deleted supported camera models
//===========================================================================
static CameraSpec dbCameraSpec[ N_CAMERAOPTIONS ] =
{  // Silicon Vision 512N
   { Signal_CCIR656, VFormat_NTSC, VRef_alignedCb, Off, DecClk_GPCLK, TGB_NTSC624, 64, KHz19636,
      // Clkx1_HACTIVE, Clkx1_HDELAY, VActive, VDelay, linesPerField; lineCount, Interlace
   {         512,           0x64,       480,    0x13,      240 },         0,       TRUE
   },
   // Logitech VideoMan 1.3
   { Signal_CCIR656, VFormat_NTSC, VRef_alignedCb, Off, DecClk_GPCLK, TGB_NTSC780, 64, KHz24545,
      // Clkx1_HACTIVE, Clkx1_HDELAY, VActive, VDelay, linesPerField; lineCount, Interlace
      {      640,           0x80,       480,    0x1A,      240 },         0,       TRUE
   },
   // Rockwell QuartzSight
   // Note: Fusion Rev D (rev ID 0x02) and later supports 16 pixels for HReset which is preferable.
   //       Use 32 for earlier version of hardware. Clkx1_HDELAY also changed from 0x27 to 0x20.
   { Signal_CCIR656, VFormat_NTSC, VRef_alignedCb, Off, DecClk_GPCLK, TGB_NTSC392, 16, KHz28636,
      // Clkx1_HACTIVE, Clkx1_HDELAY, VActive, VDelay, linesPerField; lineCount, Interlace
      {      352,           0x20,       576,    0x08,      288 },       607,       FALSE
   }
};
*/


/*
The corresponding APIs required to be invoked are:
SetConnector( ConCamera, TRUE/FALSE );
SetSignalFormat( spec.signal );
SetVideoFormat( spec.vidFormat );
SetSyncVideoRef( spec.syncRef );
SetEnableSyncOutput( spec.syncOutput );
SetTimGenByte( SRAMTable[ spec.tgb ], SRAMTableSize[ spec.tgb ] );
SetHReset( spec.HReset );
SetPLL( spec.pllFreq );
SetDecInputClock( spec.iClk );
SetVideoInfo( spec.vSize );
SetTotalLineCount( spec.lineCount );
SetInterlaceMode( spec.interlace );
*/


/* from web:
 Video Sampling
Digital video is a sampled form of analog video. The most common sampling schemes in use today are:
                  Pixel Clock   Horiz    Horiz    Vert
                   Rate         Total    Active
NTSC square pixel  12.27 MHz    780      640      525
NTSC CCIR-601      13.5  MHz    858      720      525
NTSC 4FSc          14.32 MHz    910      768      525
PAL  square pixel  14.75 MHz    944      768      625
PAL  CCIR-601      13.5  MHz    864      720      625
PAL  4FSc          17.72 MHz   1135      948      625

For the CCIR-601 standards, the sampling is based on a static orthogonal sampling grid. The luminance component (Y) is sampled at 13.5 MHz, while the two color difference signals, Cr and Cb are sampled at half that, or 6.75 MHz. The Cr and Cb samples are colocated with alternate Y samples, and they are taken at the same position on each line, such that one sample is coincident with the 50% point of the falling edge of analog sync. The samples are coded to either 8 or 10 bits per component.
*/


/* from DScaler:*/
/*
//===========================================================================
// CCIR656 Digital Input Support: The tables were taken from DScaler proyect
//
// 13 Dec 2000 - Michael Eskin, Conexant Systems - Initial version
//

//===========================================================================
// Timing generator SRAM table values for CCIR601 720x480 NTSC
//===========================================================================
// For NTSC CCIR656
BYTE BtCard::SRAMTable_NTSC[] =
{
    // SRAM Timing Table for NTSC
    0x0c, 0xc0, 0x00,
    0x00, 0x90, 0xc2,
    0x03, 0x10, 0x03,
    0x06, 0x10, 0x34,
    0x12, 0x12, 0x65,
    0x02, 0x13, 0x24,
    0x19, 0x00, 0x24,
    0x39, 0x00, 0x96,
    0x59, 0x08, 0x93,
    0x83, 0x08, 0x97,
    0x03, 0x50, 0x30,
    0xc0, 0x40, 0x30,
    0x86, 0x01, 0x01,
    0xa6, 0x0d, 0x62,
    0x03, 0x11, 0x61,
    0x05, 0x37, 0x30,
    0xac, 0x21, 0x50
};

//===========================================================================
// Timing generator SRAM table values for CCIR601 720x576 NTSC
//===========================================================================
// For PAL CCIR656
BYTE BtCard::SRAMTable_PAL[] =
{
    // SRAM Timing Table for PAL
    0x36, 0x11, 0x01,
    0x00, 0x90, 0x02,
    0x05, 0x10, 0x04,
    0x16, 0x14, 0x05,
    0x11, 0x00, 0x04,
    0x12, 0xc0, 0x00,
    0x31, 0x00, 0x06,
    0x51, 0x08, 0x03,
    0x89, 0x08, 0x07,
    0xc0, 0x44, 0x00,
    0x81, 0x01, 0x01,
    0xa9, 0x0d, 0x02,
    0x02, 0x50, 0x03,
    0x37, 0x3d, 0x00,
    0xaf, 0x21, 0x00,
};
*/