@@ -50,6 +50,7 @@ memory mounted on GAPUINO board.
5050
5151/*  Includes ------------------------------------------------------------------*/ 
5252#include  " himax.h" 
53+ #include  " camera.h" 
5354
5455/* * @addtogroup BSP
5556 * @{ 
@@ -77,93 +78,122 @@ memory mounted on GAPUINO board.
7778/* * @defgroup GAPUINO_HIMAX_Private_Variables I2C Private Variables
7879 * @{ 
7980 */  
81+ #define  HIMAX_LINE_LEN_PCK_QVGA  0x178 
82+ #define  HIMAX_FRAME_LENGTH_QVGA  0x104 
83+ 
84+ #define  HIMAX_LINE_LEN_PCK_QQVGA  0x178 
85+ #define  HIMAX_FRAME_LENGTH_QQVGA  0x084 
86+ 
8087static  regval_list_t  himax_default_regs[] = {
81-  {BLC_TGT, 0x08 }, //  BLC target :8 at 8 bit mode
82-  {BLC2_TGT, 0x08 }, //  BLI target :8 at 8 bit mode
83-  {0x3044 , 0x0A }, //  Increase CDS time for settling
84-  {0x3045 , 0x00 }, //  Make symetric for cds_tg and rst_tg
85-  {0x3047 , 0x0A }, //  Increase CDS time for settling
86-  {0x3050 , 0xC0 }, //  Make negative offset up to 4x
87-  {0x3051 , 0x42 },
88-  {0x3052 , 0x50 },
89-  {0x3053 , 0x00 },
90-  {0x3054 , 0x03 }, //  tuning sf sig clamping as lowest
91-  {0x3055 , 0xF7 }, //  tuning dsun
92-  {0x3056 , 0xF8 }, //  increase adc nonoverlap clk
93-  {0x3057 , 0x29 }, //  increase adc pwr for missing code
94-  {0x3058 , 0x1F }, //  turn on dsun
95-  {0x3059 , 0x1E },
96-  {0x3064 , 0x00 },
97-  {0x3065 , 0x04 }, //  pad pull 0
98- 
99-  {BLC_CFG, 0x43 }, //  BLC_on, IIR
100- 
101-  {0x1001 , 0x43 }, //  BLC dithering en
102-  {0x1002 , 0x43 }, //  blc_darkpixel_thd
103-  {0x0350 , 0x00 }, //  Dgain Control
104-  {BLI_EN, 0x01 }, //  BLI enable
105-  {0x1003 , 0x00 }, //  BLI Target [Def: 0x20]
106- 
107-  {DPC_CTRL, 0x01 }, //  DPC option 0: DPC off 1 : mono 3 : bayer1 5 : bayer2
108-  {0x1009 , 0xA0 }, //  cluster hot pixel th
109-  {0x100A , 0x60 }, //  cluster cold pixel th
110-  {SINGLE_THR_HOT, 0x90 }, //  single hot pixel th
111-  {SINGLE_THR_COLD, 0x40 }, //  single cold pixel th
112-  {0x1012 , 0x00 }, //  Sync. shift disable
113-  {0x2000 , 0x07 },
114-  {0x2003 , 0x00 },
115-  {0x2004 , 0x1C },
116-  {0x2007 , 0x00 },
117-  {0x2008 , 0x58 },
118-  {0x200B , 0x00 },
119-  {0x200C , 0x7A },
120-  {0x200F , 0x00 },
121-  {0x2010 , 0xB8 },
122-  {0x2013 , 0x00 },
123-  {0x2014 , 0x58 },
124-  {0x2017 , 0x00 },
125-  {0x2018 , 0x9B },
126- 
127-  {AE_CTRL, 0x01 }, // Automatic Exposure
128-  {AE_TARGET_MEAN, 0x3C }, // AE target mean [Def: 0x3C]
129-  {AE_MIN_MEAN, 0x0A }, // AE min target mean [Def: 0x0A]
130- 
131-  {INTEGRATION_H, 0x01 }, // Integration H [Def: 0x01]
132-  {INTEGRATION_L, 0x08 }, // Integration L [Def: 0x08]
133-  {ANALOG_GAIN, 0x00 }, // Analog Global Gain [Def: 0x00]
134-  {DAMPING_FACTOR, 0x20 }, // Damping Factor [Def: 0x20]
135-  {DIGITAL_GAIN_H, 0x01 }, // Digital Gain High [Def: 0x01]
136-  {DIGITAL_GAIN_L, 0x00 }, // Digital Gain Low [Def: 0x00]
137- 
138-  {CONVERGE_IN_TH, 0x03 }, // Converge in threshold [Def: 0x03]
139-  {CONVERGE_OUT_TH, 0x05 }, // Converge out threshold [Def: 0x05]
140-  {MAX_INTG_H, 0x01 }, // Maximum INTG High Byte [Def: 0x01]
141-  {MAX_INTG_L, 0x54 }, // Maximum INTG Low Byte [Def: 0x54]
142-  {MAX_AGAIN_FULL, 0x03 }, // Maximum Analog gain in full frame mode [Def: 0x03]
143-  {MAX_AGAIN_BIN2, 0x04 }, // Maximum Analog gain in bin2 mode [Def: 0x04]
144- 
145-  {0x210B , 0xC0 },
146-  {0x210E , 0x00 }, // Flicker Control
147-  {0x210F , 0x00 },
148-  {0x2110 , 0x3C },
149-  {0x2111 , 0x00 },
150-  {0x2112 , 0x32 },
151- 
152-  {0x2150 , 0x30 },
153-  {0x0340 , 0x02 },
154-  {0x0341 , 0x16 },
155-  {0x0342 , 0x01 },
156-  {0x0343 , 0x78 },
157-  {0x3010 , 0x01 }, //  324 x 244 pixel
158-  {0x0383 , 0x01 },
159-  {0x0387 , 0x01 },
160-  {0x0390 , 0x03 },
161-  {0x3011 , 0x70 },
162-  {0x3059 , 0x02 },
163-  {0x3060 , 0x00 },
164-  // {0x0601, 0x01},
165-  {IMG_ORIENTATION, 0x00 },
166-  {0x0104 , 0x01 }
88+  {BLC_TGT, 0x08 }, //  BLC target :8 at 8 bit mode
89+  {BLC2_TGT, 0x08 }, //  BLI target :8 at 8 bit mode
90+  {0x3044 , 0x0A }, //  Increase CDS time for settling
91+  {0x3045 , 0x00 }, //  Make symetric for cds_tg and rst_tg
92+  {0x3047 , 0x0A }, //  Increase CDS time for settling
93+  {0x3050 , 0xC0 }, //  Make negative offset up to 4x
94+  {0x3051 , 0x42 },
95+  {0x3052 , 0x50 },
96+  {0x3053 , 0x00 },
97+  {0x3054 , 0x03 }, //  tuning sf sig clamping as lowest
98+  {0x3055 , 0xF7 }, //  tuning dsun
99+  {0x3056 , 0xF8 }, //  increase adc nonoverlap clk
100+  {0x3057 , 0x29 }, //  increase adc pwr for missing code
101+  {0x3058 , 0x1F }, //  turn on dsun
102+  {0x3059 , 0x1E },
103+  {0x3064 , 0x00 },
104+  {0x3065 , 0x04 }, //  pad pull 0
105+ 
106+  {BLC_CFG, 0x43 }, //  BLC_on, IIR
107+ 
108+  {0x1001 , 0x43 }, //  BLC dithering en
109+  {0x1002 , 0x43 }, //  blc_darkpixel_thd
110+  {0x0350 , 0x7F }, //  Dgain Control
111+  {BLI_EN, 0x01 }, //  BLI enable
112+  {0x1003 , 0x00 }, //  BLI Target [Def: 0x20]
113+ 
114+  {DPC_CTRL, 0x01 }, //  DPC option 0: DPC off 1 : mono 3 : bayer1 5 : bayer2
115+  {0x1009 , 0xA0 }, //  cluster hot pixel th
116+  {0x100A , 0x60 }, //  cluster cold pixel th
117+  {SINGLE_THR_HOT, 0x90 }, //  single hot pixel th
118+  {SINGLE_THR_COLD, 0x40 }, //  single cold pixel th
119+  {0x1012 , 0x00 }, //  Sync. shift disable
120+  {0x2000 , 0x07 },
121+  {0x2003 , 0x00 },
122+  {0x2004 , 0x1C },
123+  {0x2007 , 0x00 },
124+  {0x2008 , 0x58 },
125+  {0x200B , 0x00 },
126+  {0x200C , 0x7A },
127+  {0x200F , 0x00 },
128+  {0x2010 , 0xB8 },
129+  {0x2013 , 0x00 },
130+  {0x2014 , 0x58 },
131+  {0x2017 , 0x00 },
132+  {0x2018 , 0x9B },
133+ 
134+  {AE_CTRL, 0x01 }, // Automatic Exposure
135+  {AE_TARGET_MEAN, 0x3C }, // AE target mean [Def: 0x3C]
136+  {AE_MIN_MEAN, 0x0A }, // AE min target mean [Def: 0x0A]
137+  {CONVERGE_IN_TH, 0x03 }, // Converge in threshold [Def: 0x03]
138+  {CONVERGE_OUT_TH, 0x05 }, // Converge out threshold [Def: 0x05]
139+  {MAX_INTG_H, (HIMAX_FRAME_LENGTH_QVGA-2 )>>8 }, // Maximum INTG High Byte [Def: 0x01]
140+  {MAX_INTG_L, (HIMAX_FRAME_LENGTH_QVGA-2 )&0xFF }, // Maximum INTG Low Byte [Def: 0x54]
141+  {MAX_AGAIN_FULL, 0x03 }, // Maximum Analog gain in full frame mode [Def: 0x03]
142+  {MAX_AGAIN_BIN2, 0x04 }, // Maximum Analog gain in bin2 mode [Def: 0x04]
143+  {MAX_DGAIN, 0xC0 },
144+ 
145+  {INTEGRATION_H, 0x01 }, // Integration H [Def: 0x01]
146+  {INTEGRATION_L, 0x08 }, // Integration L [Def: 0x08]
147+  {ANALOG_GAIN, 0x00 }, // Analog Global Gain [Def: 0x00]
148+  {DAMPING_FACTOR, 0x20 }, // Damping Factor [Def: 0x20]
149+  {DIGITAL_GAIN_H, 0x01 }, // Digital Gain High [Def: 0x01]
150+  {DIGITAL_GAIN_L, 0x00 }, // Digital Gain Low [Def: 0x00]
151+ 
152+  {FS_CTRL, 0x00 }, // Flicker Control
153+ 
154+  {FS_60HZ_H, 0x00 },
155+  {FS_60HZ_L, 0x3C },
156+  {FS_50HZ_H, 0x00 },
157+  {FS_50HZ_L, 0x32 },
158+ 
159+  {MD_CTRL, 0x30 },
160+  {FRAME_LEN_LINES_H, HIMAX_FRAME_LENGTH_QVGA>>8 },
161+  {FRAME_LEN_LINES_L, HIMAX_FRAME_LENGTH_QVGA&0xFF },
162+  {LINE_LEN_PCK_H, HIMAX_LINE_LEN_PCK_QVGA>>8 },
163+  {LINE_LEN_PCK_L, HIMAX_LINE_LEN_PCK_QVGA&0xFF },
164+  {QVGA_WIN_EN, 0x01 }, //  Enable QVGA window readout
165+  {0x0383 , 0x01 },
166+  {0x0387 , 0x01 },
167+  {0x0390 , 0x00 },
168+  {0x3011 , 0x70 },
169+  {0x3059 , 0x02 },
170+  {OSC_CLK_DIV, 0x0B },
171+  {IMG_ORIENTATION, 0x00 }, //  change the orientation
172+  {0x0104 , 0x01 },
173+ };
174+ 
175+ static  regval_list_t  himax_qvga_regs[] = {
176+  {0x0383 , 0x01 },
177+  {0x0387 , 0x01 },
178+  {0x0390 , 0x00 },
179+  {MAX_INTG_H, (HIMAX_FRAME_LENGTH_QVGA-2 )>>8 },
180+  {MAX_INTG_L, (HIMAX_FRAME_LENGTH_QVGA-2 )&0xFF },
181+  {FRAME_LEN_LINES_H, (HIMAX_FRAME_LENGTH_QVGA>>8 )},
182+  {FRAME_LEN_LINES_L, (HIMAX_FRAME_LENGTH_QVGA&0xFF )},
183+  {LINE_LEN_PCK_H, (HIMAX_LINE_LEN_PCK_QVGA>>8 )},
184+  {LINE_LEN_PCK_L, (HIMAX_LINE_LEN_PCK_QVGA&0xFF )},
185+ };
186+ 
187+ static  regval_list_t  himax_qqvga_regs[] = {
188+  {0x0383 , 0x03 },
189+  {0x0387 , 0x03 },
190+  {0x0390 , 0x03 },
191+  {MAX_INTG_H, (HIMAX_FRAME_LENGTH_QQVGA-2 )>>8 },
192+  {MAX_INTG_L, (HIMAX_FRAME_LENGTH_QQVGA-2 )&0xFF },
193+  {FRAME_LEN_LINES_H, (HIMAX_FRAME_LENGTH_QQVGA>>8 )},
194+  {FRAME_LEN_LINES_L, (HIMAX_FRAME_LENGTH_QQVGA&0xFF )},
195+  {LINE_LEN_PCK_H, (HIMAX_LINE_LEN_PCK_QQVGA>>8 )},
196+  {LINE_LEN_PCK_L, (HIMAX_LINE_LEN_PCK_QQVGA&0xFF )},
167197};
168198
169199/*  SPI transfer command sequence array */ 
@@ -207,8 +237,12 @@ uint8_t HIMAX_Open(void)
207237
208238 // printf("Model: %x:%x\n", HIMAX_RegRead(MODEL_ID_H), HIMAX_RegRead(MODEL_ID_L));
209239
210-  if  (HIMAX_Reset ()!=0 ) return  -1 ;
211-  // HIMAX_Boot();
240+  if  (HIMAX_Reset ()!=0 ) {
241+  return  -1 ;
242+  }
243+ 
244+  HIMAX_Boot ();
245+ 
212246 // For debugging camera Configuration
213247 // HIMAX_PrintReg();
214248 HAL_Delay (200 );
@@ -220,9 +254,105 @@ uint8_t HIMAX_Open(void)
220254 * @brief This function selects HIMAX camera mode. 
221255 * @retval None 
222256 */  
223- void  HIMAX_Mode (uint8_t  mode)
257+ int  HIMAX_Mode (uint8_t  mode)
258+ {
259+  return  HIMAX_RegWrite (MODE_SELECT, mode);
260+ }
261+ 
262+ int  HIMAX_SetResolution (uint32_t  resolution)
224263{
225-  HIMAX_RegWrite (MODE_SELECT, mode);
264+  int  ret = 0 ;
265+  uint32_t  regs_count = 0 ;
266+  regval_list_t  *regs = NULL ;
267+ 
268+  switch  (resolution) {
269+  case  CAMERA_R160x120:
270+  regs = himax_qqvga_regs;
271+  regs_count = sizeof (himax_qqvga_regs) / sizeof (regval_list_t );
272+  break ;
273+  case  CAMERA_R320x240:
274+  regs = himax_qvga_regs;
275+  regs_count = sizeof (himax_qvga_regs) / sizeof (regval_list_t );
276+  break ;
277+  default :
278+  return  -1 ;
279+  }
280+ 
281+  for (uint32_t  i = 0 ; i < regs_count; i++) {
282+  ret |= HIMAX_RegWrite (regs[i].reg_num , regs[i].value );
283+  }
284+ 
285+  return  ret;
286+ }
287+ 
288+ int  HIMAX_SetFramerate (uint32_t  framerate)
289+ {
290+  uint8_t  osc_div = 0 ;
291+  //  binning is enabled for QQVGA
292+  uint8_t  binning = HIMAX_RegRead (BINNING_MODE) & 0x03 ;
293+ 
294+  switch  (framerate) {
295+  case  15 :
296+  osc_div = (binning) ? 0x00  : 0x01 ;
297+  break ;
298+  case  30 :
299+  osc_div = (binning) ? 0x01  : 0x02 ;
300+  break ;
301+  case  60 :
302+  osc_div = (binning) ? 0x02  : 0x03 ;
303+  break ;
304+  case  120 :
305+  //  Set to max FPS for QVGA and QQVGA.
306+  osc_div = 0x03 ;
307+  break ;
308+  default :
309+  return  -1 ;
310+  }
311+ 
312+  return  HIMAX_RegWrite (OSC_CLK_DIV, 0x08  | osc_div);
313+ }
314+ 
315+ int  HIMAX_EnableMD (bool  enable)
316+ {
317+  int  ret = HIMAX_ClearMD ();
318+  if  (enable) {
319+  ret |= HIMAX_RegWrite (MD_CTRL, 0x03 );
320+  } else  {
321+  ret |= HIMAX_RegWrite (MD_CTRL, 0x30 );
322+  }
323+  return  ret;
324+ }
325+ 
326+ int  HIMAX_SetMDThreshold (uint32_t  low, uint32_t  high)
327+ {
328+  int  ret = 0 ;
329+  ret |= HIMAX_RegWrite (MD_THL, low & 0xff );
330+  ret |= HIMAX_RegWrite (MD_THH, high & 0xff );
331+  return  ret;
332+ }
333+ 
334+ int  HIMAX_SetLROI (uint32_t  x1, uint32_t  y1, uint32_t  x2, uint32_t  y2)
335+ {
336+  int  ret = 0 ;
337+  ret |= HIMAX_RegWrite (MD_LROI_X_START_H, (x1>>8 ));
338+  ret |= HIMAX_RegWrite (MD_LROI_X_START_L, (x1&0xff ));
339+  ret |= HIMAX_RegWrite (MD_LROI_Y_START_H, (y1>>8 ));
340+  ret |= HIMAX_RegWrite (MD_LROI_Y_START_L, (y1&0xff ));
341+  ret |= HIMAX_RegWrite (MD_LROI_X_END_H, (x2>>8 ));
342+  ret |= HIMAX_RegWrite (MD_LROI_X_END_L, (x2&0xff ));
343+  ret |= HIMAX_RegWrite (MD_LROI_Y_END_H, (y2>>8 ));
344+  ret |= HIMAX_RegWrite (MD_LROI_Y_END_L, (y2&0xff ));
345+  return  ret;
346+ }
347+ 
348+ int  HIMAX_PollMD ()
349+ {
350+  return  HIMAX_RegRead (MD_INTERRUPT);
351+ }
352+ 
353+ int  HIMAX_ClearMD ()
354+ {
355+  return  HIMAX_RegWrite (I2C_CLEAR, 0x01 );
226356}
227357
228358/* *
@@ -284,13 +414,12 @@ static uint8_t HIMAX_Boot()
284414 uint32_t  i;
285415
286416 for (i = 0 ; i < (sizeof (himax_default_regs) / sizeof (regval_list_t )); i++) {
287-  // printf("%d\n", i);
288417 HIMAX_RegWrite (himax_default_regs[i].reg_num , himax_default_regs[i].value );
289-  // delay(1);
290418 }
291419
292420 HIMAX_RegWrite (PCLK_POLARITY, (0x20  | PCLK_FALLING_EDGE));
293421
422+  HIMAX_RegWrite (MODE_SELECT, HIMAX_Standby);
294423 return  0 ;
295424}
296425
@@ -354,4 +483,4 @@ static uint8_t HIMAX_PrintReg()
354483
355484/* *
356485 * @} 
357-  */  
486+  */  
0 commit comments