1 /* Bt832 CMOS Camera Video Processor (VP)
3 The Bt832 CMOS Camera Video Processor chip connects a Quartsight CMOS
4 color digital camera directly to video capture devices via an 8-bit,
5 4:2:2 YUV or YCrCb video interface.
7 i2c addresses: 0x88 or 0x8a
10 /* The 64 registers: */
13 #define BT832_OFFSET 0
15 #define BT832_G1COMP 2
16 #define BT832_G2COMP 3
21 #define BT832_COARSEH 7
22 #define BT832_COARSEL 8
23 #define BT832_CAMGAIN 9
34 #define BT832_APCOR 19
35 #define BT832_GAMCOR 20
36 // Level Accumulator Inputs
37 #define BT832_VPCONTROL2 21
38 #define BT832_ZONECODE0 22
39 #define BT832_ZONECODE1 23
40 #define BT832_ZONECODE2 24
41 #define BT832_ZONECODE3 25
42 // Level Accumulator Outputs:
46 #define BT832_BLACKACC 29
47 #define BT832_EXP_AGC 30
48 #define BT832_LACC0 31
49 #define BT832_LACC1 32
50 #define BT832_LACC2 33
51 #define BT832_LACC3 34
52 #define BT832_LACC4 35
53 #define BT832_LACC5 36
54 #define BT832_LACC6 37
55 #define BT832_LACC7 38
57 #define BT832_VP_CONTROL0 39
58 #define BT832_VP_CONTROL1 40
59 #define BT832_THRESH 41
60 #define BT832_VP_TESTCONTROL0 42
61 #define BT832_VP_DMCODE 43
62 #define BT832_ACB_CONFIG 44
63 #define BT832_ACB_GNBASE 45
64 #define BT832_ACB_MU 46
65 #define BT832_CAM_TEST0 47
66 #define BT832_AEC_CONFIG 48
67 #define BT832_AEC_TL 49
68 #define BT832_AEC_TC 50
69 #define BT832_AEC_TH 51
71 #define BT832_VP_STATUS 52
72 #define BT832_VP_LINECOUNT 53
73 #define BT832_CAM_DEVICEL 54 // e.g. 0x19
74 #define BT832_CAM_DEVICEH 55 // e.g. 0x40 == 0x194 Mask0, 0x194 = 404 decimal (VVL-404 camera)
75 #define BT832_CAM_STATUS 56
76 #define BT832_56_CAMERA_PRESENT 0x20
78 #define BT832_CAM_SETUP0 57
79 #define BT832_CAM_SETUP1 58
80 #define BT832_CAM_SETUP2 59
81 #define BT832_CAM_SETUP3 60
83 #define BT832_DEFCOR 61
84 #define BT832_VP_TESTCONTROL1 62
85 #define BT832_DEVICE_ID 63
86 # define BT832_DEVICE_ID__31 0x31 // Bt832 has ID 0x31
88 /* STMicroelectronivcs VV5404 camera module
89 i2c: 0x20: sensor address
90 i2c: 0xa0: eeprom for ccd defect map
92 #define VV5404_device_h 0x00 // 0x19
93 #define VV5404_device_l 0x01 // 0x40
94 #define VV5404_status0 0x02
95 #define VV5404_linecountc 0x03 // current line counter
96 #define VV5404_linecountl 0x04
97 #define VV5404_setup0 0x10
98 #define VV5404_setup1 0x11
99 #define VV5404_setup2 0x12
100 #define VV5404_setup4 0x14
101 #define VV5404_setup5 0x15
102 #define VV5404_fine_h 0x20 // fine exposure
103 #define VV5404_fine_l 0x21
104 #define VV5404_coarse_h 0x22 //coarse exposure
105 #define VV5404_coarse_l 0x23
106 #define VV5404_gain 0x24 // ADC pre-amp gain setting
107 #define VV5404_clk_div 0x25
108 #define VV5404_cr 0x76 // control register
109 #define VV5404_as0 0x77 // ADC setup register
113 #define BT832_HEXDUMP _IOR('b',1,int)
114 #define BT832_REATTACH _IOR('b',2,int)
116 /* from BT8x8VXD/capdrv/dialogs.cpp */
119 typedef enum { SVI, Logitech, Rockwell } CAMERA;
121 static COMBOBOX_ENTRY gwCameraOptions[] =
123 { SVI, "Silicon Vision 512N" },
124 { Logitech, "Logitech VideoMan 1.3" },
125 { Rockwell, "Rockwell QuartzSight PCI 1.0" }
129 //===========================================================================
130 typedef enum { TGB_NTSC624, TGB_NTSC780, TGB_NTSC858, TGB_NTSC392 } TimeGenByte;
132 BYTE SRAMTable[][ 60 ] =
136 0x33, // size of table = 51
137 0x0E, 0xC0, 0x00, 0x00, 0x90, 0x02, 0x03, 0x10, 0x03, 0x06,
138 0x10, 0x04, 0x12, 0x12, 0x05, 0x02, 0x13, 0x04, 0x19, 0x00,
139 0x04, 0x39, 0x00, 0x06, 0x59, 0x08, 0x03, 0x85, 0x08, 0x07,
140 0x03, 0x50, 0x00, 0x91, 0x40, 0x00, 0x11, 0x01, 0x01, 0x4D,
141 0x0D, 0x02, 0x03, 0x11, 0x01, 0x05, 0x37, 0x00, 0x37, 0x21, 0x00
145 0x33, // size of table = 51
146 0x0e, 0xc0, 0x00, 0x00, 0x90, 0xe2, 0x03, 0x10, 0x03, 0x06,
147 0x10, 0x34, 0x12, 0x12, 0x65, 0x02, 0x13, 0x24, 0x19, 0x00,
148 0x24, 0x39, 0x00, 0x96, 0x59, 0x08, 0x93, 0x85, 0x08, 0x97,
149 0x03, 0x50, 0x50, 0xaf, 0x40, 0x30, 0x5f, 0x01, 0xf1, 0x7f,
150 0x0d, 0xf2, 0x03, 0x11, 0xf1, 0x05, 0x37, 0x30, 0x85, 0x21, 0x50
154 0x33, // size of table = 51
155 0x0c, 0xc0, 0x00, 0x00, 0x90, 0xc2, 0x03, 0x10, 0x03, 0x06,
156 0x10, 0x34, 0x12, 0x12, 0x65, 0x02, 0x13, 0x24, 0x19, 0x00,
157 0x24, 0x39, 0x00, 0x96, 0x59, 0x08, 0x93, 0x83, 0x08, 0x97,
158 0x03, 0x50, 0x30, 0xc0, 0x40, 0x30, 0x86, 0x01, 0x01, 0xa6,
159 0x0d, 0x62, 0x03, 0x11, 0x61, 0x05, 0x37, 0x30, 0xac, 0x21, 0x50
162 // This table has been modified to be used for Fusion Rev D
164 0x2A, // size of table = 42
165 0x06, 0x08, 0x04, 0x0a, 0xc0, 0x00, 0x18, 0x08, 0x03, 0x24,
166 0x08, 0x07, 0x02, 0x90, 0x02, 0x08, 0x10, 0x04, 0x0c, 0x10,
167 0x05, 0x2c, 0x11, 0x04, 0x55, 0x48, 0x00, 0x05, 0x50, 0x00,
168 0xbf, 0x0c, 0x02, 0x2f, 0x3d, 0x00, 0x2f, 0x3f, 0x00, 0xc3,
173 //===========================================================================
174 // This is the structure of the camera specifications
175 //===========================================================================
176 typedef struct tag_cameraSpec
178 SignalFormat signal; // which digital signal format the camera has
179 VideoFormat vidFormat; // video standard
180 SyncVideoRef syncRef; // which sync video reference is used
181 State syncOutput; // enable sync output for sync video input?
182 DecInputClk iClk; // which input clock is used
183 TimeGenByte tgb; // which timing generator byte does the camera use
184 int HReset; // select 64, 48, 32, or 16 CLKx1 for HReset
185 PLLFreq pllFreq; // what synthesized frequency to set PLL to
186 VSIZEPARMS vSize; // video size the camera produces
187 int lineCount; // expected total number of half-line per frame - 1
188 BOOL interlace; // interlace signal?
191 //===========================================================================
193 // Camera specifications database. Update this table whenever camera spec
194 // has been changed or added/deleted supported camera models
195 //===========================================================================
196 static CameraSpec dbCameraSpec[ N_CAMERAOPTIONS ] =
197 { // Silicon Vision 512N
198 { Signal_CCIR656, VFormat_NTSC, VRef_alignedCb, Off, DecClk_GPCLK, TGB_NTSC624, 64, KHz19636,
199 // Clkx1_HACTIVE, Clkx1_HDELAY, VActive, VDelay, linesPerField; lineCount, Interlace
200 { 512, 0x64, 480, 0x13, 240 }, 0, TRUE
202 // Logitech VideoMan 1.3
203 { Signal_CCIR656, VFormat_NTSC, VRef_alignedCb, Off, DecClk_GPCLK, TGB_NTSC780, 64, KHz24545,
204 // Clkx1_HACTIVE, Clkx1_HDELAY, VActive, VDelay, linesPerField; lineCount, Interlace
205 { 640, 0x80, 480, 0x1A, 240 }, 0, TRUE
207 // Rockwell QuartzSight
208 // Note: Fusion Rev D (rev ID 0x02) and later supports 16 pixels for HReset which is preferable.
209 // Use 32 for earlier version of hardware. Clkx1_HDELAY also changed from 0x27 to 0x20.
210 { Signal_CCIR656, VFormat_NTSC, VRef_alignedCb, Off, DecClk_GPCLK, TGB_NTSC392, 16, KHz28636,
211 // Clkx1_HACTIVE, Clkx1_HDELAY, VActive, VDelay, linesPerField; lineCount, Interlace
212 { 352, 0x20, 576, 0x08, 288 }, 607, FALSE
218 The corresponding APIs required to be invoked are:
219 SetConnector( ConCamera, TRUE/FALSE );
220 SetSignalFormat( spec.signal );
221 SetVideoFormat( spec.vidFormat );
222 SetSyncVideoRef( spec.syncRef );
223 SetEnableSyncOutput( spec.syncOutput );
224 SetTimGenByte( SRAMTable[ spec.tgb ], SRAMTableSize[ spec.tgb ] );
225 SetHReset( spec.HReset );
226 SetPLL( spec.pllFreq );
227 SetDecInputClock( spec.iClk );
228 SetVideoInfo( spec.vSize );
229 SetTotalLineCount( spec.lineCount );
230 SetInterlaceMode( spec.interlace );
235 Digital video is a sampled form of analog video. The most common sampling schemes in use today are:
236 Pixel Clock Horiz Horiz Vert
238 NTSC square pixel 12.27 MHz 780 640 525
239 NTSC CCIR-601 13.5 MHz 858 720 525
240 NTSC 4FSc 14.32 MHz 910 768 525
241 PAL square pixel 14.75 MHz 944 768 625
242 PAL CCIR-601 13.5 MHz 864 720 625
243 PAL 4FSc 17.72 MHz 1135 948 625
245 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.
250 //===========================================================================
251 // CCIR656 Digital Input Support: The tables were taken from DScaler proyect
253 // 13 Dec 2000 - Michael Eskin, Conexant Systems - Initial version
256 //===========================================================================
257 // Timing generator SRAM table values for CCIR601 720x480 NTSC
258 //===========================================================================
260 BYTE BtCard::SRAMTable_NTSC[] =
262 // SRAM Timing Table for NTSC
282 //===========================================================================
283 // Timing generator SRAM table values for CCIR601 720x576 NTSC
284 //===========================================================================
286 BYTE BtCard::SRAMTable_PAL[] =
288 // SRAM Timing Table for PAL