import PULS_20180308
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / imgsensor / src / mt8127 / hi708_yuv / hi708yuv_Sensor.c
CommitLineData
6fa3eb70
S
1\r
2/* Copyright Statement:\r
3 *\r
4 * This software/firmware and related documentation ("MediaTek Software") are\r
5 * protected under relevant copyright laws. The information contained herein\r
6 * is confidential and proprietary to MediaTek Inc. and/or its licensors.\r
7 * Without the prior written permission of MediaTek inc. and/or its licensors,\r
8 * any reproduction, modification, use or disclosure of MediaTek Software,\r
9 * and information contained herein, in whole or in part, shall be strictly prohibited.\r
10 */\r
11/* MediaTek Inc. (C) 2010. All rights reserved.\r
12 *\r
13 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES\r
14 * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")\r
15 * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON\r
16 * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,\r
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF\r
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.\r
19 * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE\r
20 * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR\r
21 * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH\r
22 * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES\r
23 * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES\r
24 * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK\r
25 * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR\r
26 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND\r
27 * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,\r
28 * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,\r
29 * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO\r
30 * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.\r
31 *\r
32 * The following software/firmware and/or related documentation ("MediaTek Software")\r
33 * have been modified by MediaTek Inc. All revisions are subject to any receiver's\r
34 * applicable license agreements with MediaTek Inc.\r
35 */\r
36\r
37\r
38/*****************************************************************************\r
39* Copyright Statement:\r
40* --------------------\r
41* This software is protected by Copyright and the information contained\r
42* herein is confidential. The software may not be copied and the information\r
43* contained herein may not be used or disclosed except with the written\r
44* permission of MediaTek Inc. (C) 2008\r
45*\r
46* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES\r
47* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")\r
48* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON\r
49* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,\r
50* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF\r
51* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.\r
52* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE\r
53* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR\r
54* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH\r
55* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO\r
56* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S\r
57* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.\r
58*\r
59* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE\r
60* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,\r
61* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,\r
62* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO\r
63* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.\r
64*\r
65* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE\r
66* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF\r
67* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND\r
68* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER\r
69* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).\r
70*\r
71*****************************************************************************//*****************************************************************************\r
72 *\r
73 * Filename:\r
74 * ---------\r
75 * sensor.c\r
76 *\r
77 * Project:\r
78 * --------\r
79 * DUMA\r
80 *\r
81 * Description:\r
82 * ------------\r
83 * Source code of Sensor driver\r
84 *\r
85 *\r
86 * Author:\r
87 * -------\r
88 * PC Huang (MTK02204)\r
89 *\r
90 *============================================================================\r
91 * HISTORY\r
92 * Below this line, this part is controlled by CC/CQ. DO NOT MODIFY!!\r
93 *------------------------------------------------------------------------------\r
94 * $Revision:$\r
95 * $Modtime:$\r
96 * $Log:$\r
97 *\r
98 * 07 11 2011 jun.pei\r
99 * [ALPS00059464] hi708 sensor check in\r
100 * .\r
101 *\r
102 *\r
103 *------------------------------------------------------------------------------\r
104 * Upper this line, this part is controlled by CC/CQ. DO NOT MODIFY!!\r
105 *============================================================================\r
106 ****************************************************************************/\r
107#include <linux/videodev2.h>\r
108#include <linux/i2c.h>\r
109#include <linux/platform_device.h>\r
110#include <linux/delay.h>\r
111#include <linux/cdev.h>\r
112#include <linux/uaccess.h>\r
113#include <linux/fs.h>\r
114#include <asm/atomic.h>\r
115//#include <mach/mt6516_pll.h>\r
116\r
117#include "kd_camera_hw.h"\r
118#include "kd_imgsensor.h"\r
119#include "kd_imgsensor_define.h"\r
120#include "kd_imgsensor_errcode.h"\r
121#include "kd_camera_feature.h"\r
122\r
123#include "hi708yuv_Sensor.h"\r
124#include "hi708yuv_Camera_Sensor_para.h"\r
125#include "hi708yuv_CameraCustomized.h"\r
126\r
127#define HI708YUV_DEBUG\r
128#ifdef HI708YUV_DEBUG\r
129#define SENSORDB printk\r
130#else\r
131 \r
132#define SENSORDB(x,...)\r
133#endif\r
134\r
135#if 0\r
136extern int iReadReg(u16 a_u2Addr , u8 * a_puBuff , u16 i2cId);\r
137extern int iWriteReg(u16 a_u2Addr , u32 a_u4Data , u32 a_u4Bytes , u16 i2cId);\r
138static int sensor_id_fail = 0; \r
139#define HI708_write_cmos_sensor(addr, para) iWriteReg((u16) addr , (u32) para ,1,HI708_WRITE_ID)\r
140#define HI708_write_cmos_sensor_2(addr, para, bytes) iWriteReg((u16) addr , (u32) para ,bytes,HI708_WRITE_ID)\r
141kal_uint16 HI708_read_cmos_sensor(kal_uint32 addr)\r
142{\r
143kal_uint16 get_byte=0;\r
144 iReadReg((u16) addr ,(u8*)&get_byte,HI708_WRITE_ID);\r
145 return get_byte;\r
146}\r
147\r
148#endif\r
149\r
150#if defined(DTV_NMI5625) || defined(ATV_NMI168H)\r
151extern bool g_bIsAtvStart;\r
152#endif\r
153\r
154static DEFINE_SPINLOCK(hi708_yuv_drv_lock);\r
155\r
156extern int iReadRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u8 * a_pRecvData, u16 a_sizeRecvData, u16 i2cId);\r
157extern int iWriteRegI2C(u8 *a_pSendData , u16 a_sizeSendData, u16 i2cId);\r
158kal_uint16 HI708_write_cmos_sensor(kal_uint8 addr, kal_uint8 para)\r
159{\r
160 char puSendCmd[2] = {(char)(addr & 0xFF) , (char)(para & 0xFF)};\r
161 iWriteRegI2C(puSendCmd , 2,HI708_WRITE_ID);\r
162 return 0;\r
163}\r
164kal_uint16 HI708_read_cmos_sensor(kal_uint8 addr)\r
165{\r
166 kal_uint16 get_byte=0;\r
167 char puSendCmd = { (char)(addr & 0xFF) };\r
168 iReadRegI2C(&puSendCmd , 1, (u8*)&get_byte,1,HI708_WRITE_ID);\r
169 return get_byte;\r
170}\r
171\r
6fa3eb70
S
172#define HI708_LOAD_FROM_T_FLASH\r
173#ifdef HI708_LOAD_FROM_T_FLASH\r
174\r
175static kal_uint8 fromsd = 0;\r
176kal_uint16 HI708_write_cmos_sensor(kal_uint8 addr, kal_uint8 para);\r
177\r
178#define HI708_OP_CODE_INI 0x00 /* Initial value. */\r
179#define HI708_OP_CODE_REG 0x01 /* Register */\r
180#define HI708_OP_CODE_DLY 0x02 /* Delay */\r
181#define HI708_OP_CODE_END 0x03 /* End of initial setting. */\r
182\r
183 typedef struct\r
184 {\r
185 u16 init_reg;\r
186 u16 init_val; /* Save the register value and delay tick */\r
187 u8 op_code; /* 0 - Initial value, 1 - Register, 2 - Delay, 3 - End of setting. */\r
188 } HI708_initial_set_struct;\r
189\r
190 HI708_initial_set_struct HI708_Init_Reg[1000];\r
191 \r
192 u32 strtol(const char *nptr, u8 base)\r
193 {\r
194 u8 ret;\r
195 if(!nptr || (base!=16 && base!=10 && base!=8))\r
196 {\r
197 printk("%s(): NULL pointer input\n", __FUNCTION__);\r
198 return -1;\r
199 }\r
200 for(ret=0; *nptr; nptr++)\r
201 {\r
202 if((base==16 && *nptr>='A' && *nptr<='F') || \r
203 (base==16 && *nptr>='a' && *nptr<='f') || \r
204 (base>=10 && *nptr>='0' && *nptr<='9') ||\r
205 (base>=8 && *nptr>='0' && *nptr<='7') )\r
206 {\r
207 ret *= base;\r
208 if(base==16 && *nptr>='A' && *nptr<='F')\r
209 ret += *nptr-'A'+10;\r
210 else if(base==16 && *nptr>='a' && *nptr<='f')\r
211 ret += *nptr-'a'+10;\r
212 else if(base>=10 && *nptr>='0' && *nptr<='9')\r
213 ret += *nptr-'0';\r
214 else if(base>=8 && *nptr>='0' && *nptr<='7')\r
215 ret += *nptr-'0';\r
216 }\r
217 else\r
218 return ret;\r
219 }\r
220 return ret;\r
221 }\r
222\r
223 u8 Hi708_Initialize_from_T_Flash()\r
224 {\r
225 //FS_HANDLE fp = -1; /* Default, no file opened. */\r
226 //u8 *data_buff = NULL;\r
227 u8 *curr_ptr = NULL;\r
228 u32 file_size = 0;\r
229 //u32 bytes_read = 0;\r
230 u32 i = 0, j = 0;\r
231 u8 func_ind[4] = {0}; /* REG or DLY */\r
232\r
233\r
234 struct file *fp; \r
235 mm_segment_t fs; \r
236 loff_t pos = 0; \r
237 static u8 data_buff[10*1024] ;\r
238\r
239 fp = filp_open("/storage/sdcard0/hi708_sd.dat", O_RDONLY , 0); \r
240 if (IS_ERR(fp)) { \r
241 printk("create file error\n"); \r
242 return 2;//-1; \r
243 } \r
244 else\r
245 printk("Hi708_Initialize_from_T_Flash Open File Success\n");\r
246\r
247 fs = get_fs(); \r
248 set_fs(KERNEL_DS); \r
249\r
250 file_size = vfs_llseek(fp, 0, SEEK_END);\r
251 vfs_read(fp, data_buff, file_size, &pos); \r
252 filp_close(fp, NULL); \r
253 set_fs(fs);\r
254\r
255 printk("1\n");\r
256\r
257 /* Start parse the setting witch read from t-flash. */\r
258 curr_ptr = data_buff;\r
259 while (curr_ptr < (data_buff + file_size))\r
260 {\r
261 while ((*curr_ptr == ' ') || (*curr_ptr == '\t'))/* Skip the Space & TAB */\r
262 curr_ptr++; \r
263\r
264 if (((*curr_ptr) == '/') && ((*(curr_ptr + 1)) == '*'))\r
265 {\r
266 while (!(((*curr_ptr) == '*') && ((*(curr_ptr + 1)) == '/')))\r
267 {\r
268 curr_ptr++; /* Skip block comment code. */\r
269 }\r
270\r
271 while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A)))\r
272 {\r
273 curr_ptr++;\r
274 }\r
275\r
276 curr_ptr += 2; /* Skip the enter line */\r
277\r
278 continue ;\r
279 }\r
280\r
281 if (((*curr_ptr) == '/') || ((*curr_ptr) == '{') || ((*curr_ptr) == '}')) /* Comment line, skip it. */\r
282 {\r
283 while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A)))\r
284 {\r
285 curr_ptr++;\r
286 }\r
287\r
288 curr_ptr += 2; /* Skip the enter line */\r
289\r
290 continue ;\r
291 }\r
292 /* This just content one enter line. */\r
293 if (((*curr_ptr) == 0x0D) && ((*(curr_ptr + 1)) == 0x0A))\r
294 {\r
295 curr_ptr += 2;\r
296 continue ;\r
297 }\r
298 //printk(" curr_ptr1 = %s\n",curr_ptr);\r
299 memcpy(func_ind, curr_ptr, 3);\r
300\r
301 if (strcmp((const char *)func_ind, "REG") == 0) /* REG */\r
302 {\r
303 curr_ptr += 6; /* Skip "REG(0x" or "DLY(" */\r
304 HI708_Init_Reg[i].op_code = HI708_OP_CODE_REG;\r
305\r
306 HI708_Init_Reg[i].init_reg = strtol((const char *)curr_ptr, 16);\r
307 curr_ptr += 5; /* Skip "00, 0x" */\r
308\r
309 HI708_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 16);\r
310 curr_ptr += 4; /* Skip "00);" */\r
311 }\r
312 else /* DLY */\r
313 {\r
314 /* Need add delay for this setting. */\r
315 curr_ptr += 4; \r
316 HI708_Init_Reg[i].op_code = HI708_OP_CODE_DLY;\r
317\r
318 HI708_Init_Reg[i].init_reg = 0xFF;\r
319 HI708_Init_Reg[i].init_val = strtol((const char *)curr_ptr, 10); /* Get the delay ticks, the delay should less then 50 */\r
320 }\r
321 i++;\r
322\r
323 /* Skip to next line directly. */\r
324 while (!((*curr_ptr == 0x0D) && (*(curr_ptr+1) == 0x0A)))\r
325 {\r
326 curr_ptr++;\r
327 }\r
328 curr_ptr += 2;\r
329 }\r
330 printk("2\n");\r
331 /* (0xFFFF, 0xFFFF) means the end of initial setting. */\r
332 HI708_Init_Reg[i].op_code = HI708_OP_CODE_END;\r
333 HI708_Init_Reg[i].init_reg = 0xFF;\r
334 HI708_Init_Reg[i].init_val = 0xFF;\r
335 i++;\r
336 //for (j=0; j<i; j++)\r
337 //printk(" %x == %x\n",SP2528_Init_Reg[j].init_reg, SP2528_Init_Reg[j].init_val);\r
338\r
339 /* Start apply the initial setting to sensor. */\r
340#if 1\r
341 for (j=0; j<i; j++)\r
342 {\r
343 if (HI708_Init_Reg[j].op_code == HI708_OP_CODE_END) /* End of the setting. */\r
344 {\r
345 break ;\r
346 }\r
347 else if (HI708_Init_Reg[j].op_code == HI708_OP_CODE_DLY)\r
348 {\r
349 msleep(HI708_Init_Reg[j].init_val); /* Delay */\r
350 }\r
351 else if (HI708_Init_Reg[j].op_code == HI708_OP_CODE_REG)\r
352 {\r
353 HI708_write_cmos_sensor((kal_uint8)HI708_Init_Reg[j].init_reg, (kal_uint8)HI708_Init_Reg[j].init_val);\r
354 }\r
355 else\r
356 {\r
357 printk("REG ERROR!\n");\r
358 }\r
359 }\r
360#endif\r
361 printk("3\n");\r
362 return 1; \r
363 }\r
364\r
365#endif\r
366\r
367/*******************************************************************************\r
368* // Adapter for Winmo typedef \r
369********************************************************************************/\r
370#define WINMO_USE 0\r
371\r
372#define Sleep(ms) mdelay(ms)\r
373#define RETAILMSG(x,...)\r
374#define TEXT\r
375\r
376\r
377/*******************************************************************************\r
378* follow is define by jun\r
379********************************************************************************/\r
380MSDK_SENSOR_CONFIG_STRUCT HI708SensorConfigData;\r
381\r
382static struct HI708_sensor_STRUCT HI708_sensor;\r
383static kal_uint32 HI708_zoom_factor = 0; \r
384static kal_bool HI708_night_flag = 0;\r
385static int sensor_id_fail = 0; \r
386const HI708_SENSOR_INIT_INFO HI708_Initial_Setting_Info[] =\r
387{\r
388{0x01,0xf1},\r
389{0x01,0xf3},\r
390{0x01,0xf1},\r
391\r
392{0x11,0x93},//ForNoFixedFramerateBit[2]\r
393{0x12,0x05},//PCLKINV\r
394\r
395{0x20,0x00},\r
396{0x21,0x04},\r
397{0x22,0x00},\r
398{0x23,0x04},\r
399\r
400{0x24, 0x01},\r
401{0x25, 0xe0},\r
402{0x26, 0x02},\r
403{0x27, 0x80},\r
404\r
405{0x40, 0x01}, //HBLANK: 0x70 = 112\r
406{0x41, 0x58},\r
407{0x42, 0x00}, //VBLANK: 0x40 = 64\r
408{0x43, 0x14}, //0x04 -> 0x40: For Max Framerate = 30fps\r
409//BLC\r
410{0x80,0x2e},\r
411{0x81,0x7e},\r
412{0x82,0x90},\r
413{0x83,0x30},\r
414{0x84,0x20},\r
415{0x85,0x0b},\r
416{0x89,0x48},//BLChold\r
417{0x90,0x0e},\r
418{0x91,0x0e},\r
419\r
420{0x92,0x40},//AG_IN\r
421{0x93,0x38},//AG_OUT\r
422{0x98,0x20},\r
423{0x99,0x43},//OutBLC\r
424{0xa0,0x43},//DarkBLC\r
425{0xa8,0x43},//NormalBLC\r
426\r
427//Page2\r
428{0x03,0x02},\r
429{0x20,0x33},\r
430{0x21,0x77},\r
431{0x22,0xa7},\r
432{0x23,0x30},\r
433{0x52,0xa2},\r
434{0x55,0x18},\r
435{0x56,0x0c},\r
436{0x60,0x11},\r
437{0x61,0x1b},\r
438{0x62,0x11},\r
439{0x63,0x1a},\r
440{0x64,0x11},\r
441{0x65,0x1a},\r
442{0x72,0x12},\r
443{0x73,0x19},\r
444{0x74,0x12},\r
445{0x75,0x19},\r
446{0x80,0x1d},\r
447{0x81,0x6f},\r
448{0x82,0x1e},\r
449{0x83,0x2b},\r
450{0x84,0x1e},\r
451{0x85,0x2b},\r
452{0x92,0x45},\r
453{0x93,0x52},\r
454{0x94,0x45},\r
455{0x95,0x52},\r
456{0xa0,0x1d},\r
457{0xa1,0x6b},\r
458{0xa4,0x6b},\r
459{0xa5,0x1d},\r
460{0xa8,0x2e},\r
461{0xa9,0x42},\r
462{0xaa,0x55},\r
463{0xab,0x69},\r
464{0xb8,0x10},\r
465{0xb9,0x13},\r
466{0xbc,0x1d},\r
467{0xbd,0x1f},\r
468{0xc0,0x04},\r
469{0xc1,0x0d},\r
470{0xc4,0x05},\r
471{0xc5,0x0c},\r
472{0xc8,0x06},\r
473{0xc9,0x0b},\r
474{0xcc,0x06},\r
475{0xcd,0x0a},\r
476{0xc2,0x04},\r
477{0xc3,0x0d},\r
478{0xc6,0x05},\r
479{0xc7,0x0c},\r
480{0xca,0x06},\r
481{0xcb,0x0b},\r
482{0xce,0x06},\r
483{0xcf,0x0a},\r
484{0xd0,0x03},\r
485{0xd1,0x1c},\r
486{0xd6,0x46},\r
487{0xd7,0x48},\r
488\r
489//Page10\r
490{0x03,0x10},\r
491{0x10,0x03},//03;//ISPCTL1;YUVORDER{FIX)\r
492{0x11,0x43},\r
493{0x12,0xF0},//Yoffet;dyoffseetenable\r
494{0x40,0x8a}, //0x95\r
495{0x41,0x00},//00DYOFS\r
496{0x42,0x01},//Cb//3\r
497{0x43,0x01},//Cr//4\r
498{0x48,0x94},//Contrast //0xaa\r
499{0x50,0x48},//AGBRT\r
500\r
501{0x60,0x7f},\r
502{0x61,0x00},//\r
503{0x62,0x86},//SATB\r
504{0x63,0x90},//SATR 0x8a\r
505{0x64,0x48},//AGSAT\r
506{0x67,0x3f},\r
507{0x68,0x80},\r
508\r
509//LPF\r
510{0x03,0x11},\r
511{0x10,0x25}, //LPF_CTL1//0x01\r
512{0x11,0x07}, //TestSetting\r
513{0x20,0x00}, //LPF_AUTO_CTL\r
514{0x21,0x38}, //LPF_PGA_TH\r
515{0x22,0x00}, //LPF_TIME_TH\r
516{0x23,0x10}, //TestSetting\r
517{0x60,0x10}, //ZARA_SIGMA_TH//40->10\r
518{0x61,0x82},\r
519{0x62,0x00}, //ZARA_HLVL_CTL\r
520{0x63,0x00}, //ZARA_LLVL_CTL\r
521{0x64,0x00}, //ZARA_DY_CTL\r
522\r
523{0x67,0xA0}, //TestSetting\r
524{0x68,0x40}, //TestSetting\r
525{0x69,0x10}, //TestSetting\r
526\r
527//2D\r
528{0x03,0x12},\r
529{0x40,0xeb}, //YC2D_LPF_CTL1\r
530{0x41,0x10}, //YC2D_LPF_CTL2\r
531{0x50,0x18}, //TestSetting\r
532{0x51,0x24}, //TestSetting\r
533{0x70,0x1f}, //GBGR_CTL1//0x1f\r
534{0x71,0x00}, //TestSetting\r
535{0x72,0x00}, //TestSetting\r
536{0x73,0x00}, //TestSetting\r
537{0x74,0x10}, //GBGR_G_UNIT_TH\r
538{0x75,0x10}, //GBGR_RB_UNIT_TH\r
539{0x76,0x20}, //GBGR_EDGE_TH\r
540{0x77,0x80}, //GBGR_HLVL_TH\r
541{0x78,0x88}, //GBGR_HLVL_COMP\r
542{0x79,0x18}, //TestSetting\r
543{0xb0,0x7d},//dpc\r
544\r
545//Edge\r
546{0x03,0x13},\r
547{0x10,0x01}, \r
548{0x11,0x89}, \r
549{0x12,0x14}, \r
550{0x13,0x19}, \r
551{0x14,0x08}, //TestSetting\r
552{0x20,0x06}, //SHARP_SLOPE\r
553{0x21,0x05}, //SHARP_SLOPE_TH\r
554{0x23,0x30}, //SHARP_DY_CTL\r
555{0x24,0x33}, //40->33\r
556{0x25,0x08}, //SHARP_PGA_TH\r
557{0x26,0x18}, //TestSetting\r
558{0x27,0x00}, //TestSetting\r
559{0x28,0x08}, //TestSetting\r
560{0x29,0x50}, //AG_TH\r
561{0x2a,0xe0}, //regionratio\r
562{0x2b,0x10}, //TestSetting\r
563{0x2c,0x28}, //TestSetting\r
564{0x2d,0x40}, //TestSetting\r
565{0x2e,0x00}, //TestSetting\r
566{0x2f,0x00}, //TestSetting\r
567{0x30,0x11}, //TestSetting\r
568{0x80,0x03}, //SHARP2D_CTL\r
569{0x81,0x07}, //TestSetting\r
570{0x90,0x06}, //SHARP2D_SLOPE\r
571{0x91,0x05}, //SHARP2D_DIFF_CTL\r
572{0x92,0x00}, //SHARP2D_HI_CLIP\r
573{0x93,0x20}, //SHARP2D_DY_CTL\r
574{0x94,0x42}, //TestSetting\r
575{0x95,0x60}, //TestSetting\r
576\r
577//Shading\r
578{0x03,0x14},\r
579{0x10,0x01},\r
580{0x20,0x93},//XCEN\r
581{0x21,0x80},//YCEN\r
582{0x22,0x54},//76;34;2b\r
583{0x23,0x50},//4b;15;0d\r
584{0x24,0x44},//3b;10;0b\r
585\r
586//Page15CMC\r
587{0x03,0x15},\r
588{0x10,0x03},\r
589\r
590{0x14,0x3c},\r
591{0x16,0x2c},\r
592{0x17,0x2f},\r
593\r
594{0x30,0xcb},\r
595{0x31,0x61},\r
596{0x32,0x16},\r
597{0x33,0x23},\r
598{0x34,0xce},\r
599{0x35,0x2b},\r
600{0x36,0x01},\r
601{0x37,0x34},\r
602{0x38,0x75},\r
603\r
604{0x40,0x87},\r
605{0x41,0x18},\r
606{0x42,0x91},\r
607{0x43,0x94},\r
608{0x44,0x9f},\r
609{0x45,0x33},\r
610{0x46,0x00},\r
611{0x47,0x94},\r
612{0x48,0x14},\r
613\r
614//PAGE16\r
615//GammaCorrection\r
616{0x03,0x16},\r
617\r
618{0x30,0x00},\r
619{0x31,0x0a},\r
620{0x32,0x1b},\r
621{0x33,0x2e},\r
622{0x34,0x5c},\r
623{0x35,0x79},\r
624{0x36,0x95},\r
625{0x37,0xa4},\r
626{0x38,0xb1},\r
627{0x39,0xbd},\r
628{0x3a,0xc8},\r
629{0x3b,0xd9},\r
630{0x3c,0xe8},\r
631{0x3d,0xf5},\r
632{0x3e,0xff},\r
633\r
634//PAGE17\r
635//AutoFlickerCancellation\r
636{0x03,0x17},\r
637{0xc4,0x3c},\r
638{0xc5,0x32},\r
639\r
640//Page20AE\r
641{0x03,0x20},\r
642{0x10,0x0c},\r
643{0x11,0x04},\r
644\r
645{0x20,0x01},\r
646{0x28,0x27},\r
647{0x29,0xa1},\r
648\r
649{0x2a,0xf0},\r
650{0x2b,0x34},\r
651\r
652{0x30, 0x78},\r
653\r
654{0x39,0x22},\r
655{0x3a,0xde},\r
656{0x3b,0x22},\r
657{0x3c,0xde},\r
658\r
659{0x60,0x95},//d5;99\r
660{0x68,0x3c},\r
661{0x69,0x64},\r
662{0x6A,0x28},\r
663{0x6B,0xc8},\r
664\r
665{0x70,0x48},//YTarget42\r
666\r
667{0x76,0x22},//Unlockbnd1\r
668{0x77,0x02},//Unlockbnd2\r
669\r
670{0x78,0x12},//Yth1\r
671{0x79,0x26},//Yth2\r
672{0x7a,0x23},//Yth3\r
673\r
674{0x7c,0x1c},\r
675{0x7d,0x22},\r
676\r
677{0x83, 0x01}, //EXP Normal 33.33 fps \r
678{0x84, 0xbc}, \r
679{0x85, 0x56}, \r
680{0x86, 0x00}, //EXPMin 3250.00 fps\r
681{0x87, 0xfa}, \r
682{0x88, 0x01}, //EXP Max 7.14 fps \r
683{0x89, 0xbc}, \r
684{0x8a, 0x56}, \r
685{0x8B, 0x1f}, //EXP100 \r
686{0x8C, 0xbd}, \r
687{0x8D, 0x1a}, //EXP120 \r
688{0x8E, 0x5e}, \r
689{0x9c, 0x03}, //EXP Limit 812.50 fps \r
690{0x9d, 0x6b}, \r
691{0x9e, 0x00}, //EXP Unit \r
692{0x9f, 0xfa}, \r
693// {0xa4, 0x18}, \r
694\r
695\r
696{0x94, 0x01},\r
697{0x95, 0xb7},\r
698{0x96, 0x74}, \r
699{0x98, 0x8C},\r
700{0x99, 0x23}, \r
701\r
702{0xb1, 0x14},\r
703{0xb2, 0x48},\r
704{0xb4, 0x14},\r
705{0xb5, 0x38},\r
706{0xb6, 0x26},\r
707{0xb7, 0x20},\r
708{0xb8, 0x1d},\r
709{0xb9, 0x1b},\r
710{0xba, 0x1a},\r
711{0xbb, 0x19},\r
712{0xbc, 0x19},\r
713{0xbd, 0x18},\r
714\r
715{0xc0, 0x1a}, //0x1a->0x16\r
716{0xc3, 0x48},\r
717{0xc4, 0x48}, \r
718\r
719\r
720//Page22AWB\r
721{0x03,0x22},\r
722{0x10,0xfb},\r
723{0x11,0x26},\r
724{0x30,0x80},\r
725{0x31,0x80},\r
726{0x38,0x12},\r
727{0x39,0x33},\r
728{0x3a,0x88},\r
729{0x3b,0xc4},\r
730{0x40,0xf0},\r
731{0x41,0x33},\r
732{0x42,0x33},\r
733{0x43,0xf3},\r
734{0x44,0x55},\r
735{0x45,0x44},\r
736{0x46,0x02},\r
737{0x60,0x00},\r
738{0x61,0x00},\r
739{0x80,0x39},\r
740{0x81,0x20},\r
741{0x82,0x22},\r
742{0x83,0x46},\r
743{0x84,0x16},\r
744{0x85,0x57},\r
745{0x86,0x28},\r
746{0x87,0x38},\r
747{0x88,0x20},\r
748{0x89,0x48},\r
749{0x8a,0x38},\r
750{0x8b,0x02},\r
751{0x8d,0x22},\r
752{0x8e,0x71},\r
753{0x8f,0x63},\r
754{0x90,0x60},\r
755{0x91,0x5c},\r
756{0x92,0x56},\r
757{0x93,0x52},\r
758{0x94,0x4c},\r
759{0x95,0x36},\r
760{0x96,0x31},\r
761{0x97,0x2e},\r
762{0x98,0x2a},\r
763{0x99,0x29},\r
764{0x9a,0x26},\r
765{0x9b,0x09},\r
766{0xb0,0x30},\r
767{0xb1,0x48},\r
768{0x03,0x22},\r
769{0x10,0xfb},\r
770\r
771{0x03,0x20},\r
772{0x10,0x9c},\r
773\r
774{0x01,0xf0},\r
775{0x03,0x00},\r
776{0x01,0xc0},\r
777\r
778{0xff,0xff}//EndofInitialSetting\r
779};\r
780\r
781static void HI708_Set_VGA_mode(void)\r
782{\r
783 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg\r
784\r
785 HI708_write_cmos_sensor(0x03, 0x00);\r
786 HI708_write_cmos_sensor(0x10, 0x00); //VGA Size\r
787\r
788 HI708_write_cmos_sensor(0x20, 0x00);\r
789 HI708_write_cmos_sensor(0x21, 0x04);\r
790\r
791 HI708_write_cmos_sensor(0x40, 0x01); //HBLANK: 0x70 = 112\r
792 HI708_write_cmos_sensor(0x41, 0x58);\r
793 HI708_write_cmos_sensor(0x42, 0x00); //VBLANK: 0x04 = 4\r
794 HI708_write_cmos_sensor(0x43, 0x14);\r
795\r
796 // HI708_write_cmos_sensor(0x03, 0x11);\r
797 // HI708_write_cmos_sensor(0x10, 0x25); \r
798\r
799 HI708_write_cmos_sensor(0x03, 0x20);\r
800\r
801 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
802 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
803 \r
804 //HI708_write_cmos_sensor(0x83, 0x00);\r
805 // HI708_write_cmos_sensor(0x84, 0xbe);\r
806 //HI708_write_cmos_sensor(0x85, 0x6e);\r
807 HI708_write_cmos_sensor(0x86, 0x00);\r
808 HI708_write_cmos_sensor(0x87, 0xfa);\r
809\r
810 HI708_write_cmos_sensor(0x8b, 0x1f);\r
811 HI708_write_cmos_sensor(0x8c, 0xbd);\r
812 HI708_write_cmos_sensor(0x8d, 0x1a);\r
813 HI708_write_cmos_sensor(0x8e, 0x5e);\r
814\r
815 HI708_write_cmos_sensor(0x9c, 0x03);//0b\r
816 HI708_write_cmos_sensor(0x9d, 0x6b);//b8\r
817 HI708_write_cmos_sensor(0x9e, 0x00);\r
818 HI708_write_cmos_sensor(0x9f, 0xfa);\r
819\r
820 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
821\r
822 HI708_write_cmos_sensor(0x03, 0x20);\r
823 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
824 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
825\r
826}\r
827\r
828static void HI708_Initial_Setting(void)\r
829{\r
830 kal_uint32 iEcount;\r
831 for(iEcount=0;(!((0xff==(HI708_Initial_Setting_Info[iEcount].address))&&(0xff==(HI708_Initial_Setting_Info[iEcount].data))));iEcount++)\r
832 { \r
833 HI708_write_cmos_sensor(HI708_Initial_Setting_Info[iEcount].address, HI708_Initial_Setting_Info[iEcount].data);\r
834 }\r
835 \r
836 HI708_Set_VGA_mode();\r
837}\r
838\r
839static void HI708_Init_Parameter(void)\r
840{\r
841 spin_lock(&hi708_yuv_drv_lock);\r
842 HI708_sensor.first_init = KAL_TRUE;\r
843 HI708_sensor.pv_mode = KAL_TRUE;\r
844 HI708_sensor.night_mode = KAL_FALSE;\r
845 HI708_sensor.MPEG4_Video_mode = KAL_FALSE;\r
846\r
847 HI708_sensor.cp_pclk = HI708_sensor.pv_pclk;\r
848\r
849 HI708_sensor.pv_dummy_pixels = 0;\r
850 HI708_sensor.pv_dummy_lines = 0;\r
851 HI708_sensor.cp_dummy_pixels = 0;\r
852 HI708_sensor.cp_dummy_lines = 0;\r
853\r
854 HI708_sensor.wb = 0;\r
855 HI708_sensor.exposure = 0;\r
856 HI708_sensor.effect = 0;\r
857 HI708_sensor.banding = AE_FLICKER_MODE_50HZ;\r
858\r
859 HI708_sensor.pv_line_length = 640;\r
860 HI708_sensor.pv_frame_height = 480;\r
861 HI708_sensor.cp_line_length = 640;\r
862 HI708_sensor.cp_frame_height = 480;\r
863 spin_unlock(&hi708_yuv_drv_lock); \r
864}\r
865\r
866static kal_uint8 HI708_power_on(void)\r
867{\r
868 kal_uint8 HI708_sensor_id = 0;\r
869 spin_lock(&hi708_yuv_drv_lock);\r
870 HI708_sensor.pv_pclk = 13000000;\r
871 spin_unlock(&hi708_yuv_drv_lock);\r
872 //Software Reset\r
873 HI708_write_cmos_sensor(0x01,0xf1);\r
874 HI708_write_cmos_sensor(0x01,0xf3);\r
875 HI708_write_cmos_sensor(0x01,0xf1);\r
876\r
877 /* Read Sensor ID */\r
878 HI708_sensor_id = HI708_read_cmos_sensor(0x04);\r
879 SENSORDB("[HI708YUV]:read Sensor ID:%x\n",HI708_sensor_id); \r
880 return HI708_sensor_id;\r
881}\r
882\r
883\r
884/*************************************************************************\r
885* FUNCTION\r
886* HI708Open\r
887*\r
888* DESCRIPTION\r
889* This function initialize the registers of CMOS sensor\r
890*\r
891* PARAMETERS\r
892* None\r
893*\r
894* RETURNS\r
895* None\r
896*\r
897* GLOBALS AFFECTED\r
898*\r
899*************************************************************************/\r
900UINT32 HI708Open(void)\r
901{\r
902 spin_lock(&hi708_yuv_drv_lock);\r
903 sensor_id_fail = 0; \r
904 spin_unlock(&hi708_yuv_drv_lock);\r
905 SENSORDB("[Enter]:HI708 Open func:");\r
906\r
907\r
908 if (HI708_power_on() != HI708_SENSOR_ID) \r
909 {\r
910 SENSORDB("[HI708]Error:read sensor ID fail\n");\r
911 spin_lock(&hi708_yuv_drv_lock);\r
912 sensor_id_fail = 1;\r
913 spin_unlock(&hi708_yuv_drv_lock);\r
914 return ERROR_SENSOR_CONNECT_FAIL;\r
915 }\r
916\r
917 /* Apply sensor initail setting*/\r
918\r
919 #ifdef HI708_LOAD_FROM_T_FLASH \r
920 \r
921 struct file *fp; \r
922 mm_segment_t fs; \r
923 loff_t pos = 0; \r
924 //static char buf[10*1024] ;\r
925\r
926 printk("HI708 Open File Start\n");\r
927 fp = filp_open("/storage/sdcard0/hi708_sd.dat", O_RDONLY , 0); \r
928 if (IS_ERR(fp)) \r
929 { \r
930 fromsd = 0; \r
931 printk("open file error\n");\r
932 ////////return 0;\r
933 } \r
934 else \r
935 {\r
936 printk("open file success\n");\r
937 fromsd = 1;\r
938 //SP2528_Initialize_from_T_Flash();\r
939 filp_close(fp, NULL); \r
940 }\r
941 //set_fs(fs);\r
942 if(fromsd == 1)\r
943 Hi708_Initialize_from_T_Flash();\r
944 else\r
945 {\r
946 HI708_Initial_Setting();\r
947 }\r
948 HI708_Init_Parameter(); \r
949 #else\r
950 /* Apply sensor initail setting*/\r
951 HI708_Initial_Setting();\r
952 HI708_Init_Parameter(); \r
953 #endif\r
954 \r
955 \r
956\r
957 SENSORDB("[Exit]:HI708 Open func\n"); \r
958 return ERROR_NONE;\r
959} /* HI708Open() */\r
960\r
961UINT32 HI708Init(void)\r
962{\r
963 UINT32 open_ret = HI708Open();\r
964 \r
965 if (ERROR_SENSOR_CONNECT_FAIL != open_ret)\r
966 { \r
967 HI708_write_cmos_sensor(0x03, 0x00); \r
968 HI708_write_cmos_sensor(0x08, 0x0f); \r
969 HI708_write_cmos_sensor(0x01, 0xf1); //sensor sleep mode\r
970 mDELAY(20);\r
971 } \r
972\r
973 return open_ret;\r
974} /* HI708Init() */\r
975\r
976/*************************************************************************\r
977* FUNCTION\r
978* HI708_GetSensorID\r
979*\r
980* DESCRIPTION\r
981* This function get the sensor ID\r
982*\r
983* PARAMETERS\r
984* None\r
985*\r
986* RETURNS\r
987* None\r
988*\r
989* GLOBALS AFFECTED\r
990*\r
991*************************************************************************/\r
992static kal_uint32 HI708_GetSensorID(kal_uint32 *sensorID)\r
993{\r
994 SENSORDB("[Enter]:HI708 Open func ");\r
995 *sensorID = HI708_power_on() ;\r
996\r
997 if (*sensorID != HI708_SENSOR_ID) \r
998 {\r
999 SENSORDB("[HI708]Error:read sensor ID fail\n");\r
1000 spin_lock(&hi708_yuv_drv_lock);\r
1001 sensor_id_fail = 1;\r
1002 spin_unlock(&hi708_yuv_drv_lock);\r
1003 *sensorID = 0xFFFFFFFF; \r
1004 return ERROR_SENSOR_CONNECT_FAIL;\r
1005 } \r
1006\r
1007 return ERROR_NONE; \r
1008} /* HI708Open */\r
1009\r
1010\r
1011/*************************************************************************\r
1012* FUNCTION\r
1013* HI708Close\r
1014*\r
1015* DESCRIPTION\r
1016* This function is to turn off sensor module power.\r
1017*\r
1018* PARAMETERS\r
1019* None\r
1020*\r
1021* RETURNS\r
1022* None\r
1023*\r
1024* GLOBALS AFFECTED\r
1025*\r
1026*************************************************************************/\r
1027UINT32 HI708Close(void)\r
1028{\r
1029\r
1030 return ERROR_NONE;\r
1031} /* HI708Close() */\r
1032\r
1033\r
1034static void HI708_Set_Mirror_Flip(kal_uint8 image_mirror)\r
1035{\r
1036 /********************************************************\r
1037 * Page Mode 0: Reg 0x0011 bit[1:0] = [Y Flip : X Flip]\r
1038 * 0: Off; 1: On.\r
1039 *********************************************************/ \r
1040 kal_uint8 temp_data; \r
1041 SENSORDB("[Enter]:HI708 set Mirror_flip func:image_mirror=%d\n",image_mirror); \r
1042 HI708_write_cmos_sensor(0x03,0x00); //Page 0 \r
1043 temp_data = (HI708_read_cmos_sensor(0x11) & 0xfc);\r
1044 spin_lock(&hi708_yuv_drv_lock);\r
1045 //HI708_sensor.mirror = (HI708_read_cmos_sensor(0x11) & 0xfc); \r
1046 switch (image_mirror) \r
1047 {\r
1048 case IMAGE_NORMAL:\r
1049 //HI708_sensor.mirror |= 0x00;\r
1050 temp_data |= 0x00;\r
1051 break;\r
1052 case IMAGE_H_MIRROR:\r
1053 //HI708_sensor.mirror |= 0x01;\r
1054 temp_data |= 0x01;\r
1055 break;\r
1056 case IMAGE_V_MIRROR:\r
1057 //HI708_sensor.mirror |= 0x02;\r
1058 temp_data |= 0x02;\r
1059 break;\r
1060 case IMAGE_HV_MIRROR:\r
1061 //HI708_sensor.mirror |= 0x03;\r
1062 temp_data |= 0x03;\r
1063 break;\r
1064 default:\r
1065 //HI708_sensor.mirror |= 0x00;\r
1066 temp_data |= 0x00;\r
1067 }\r
1068 HI708_sensor.mirror = temp_data;\r
1069 spin_unlock(&hi708_yuv_drv_lock);\r
1070 HI708_write_cmos_sensor(0x11, HI708_sensor.mirror);\r
1071 SENSORDB("[Exit]:HI708 set Mirror_flip func\n");\r
1072}\r
1073\r
1074#if 0\r
1075static void HI708_set_dummy(kal_uint16 dummy_pixels,kal_uint16 dummy_lines)\r
1076{ \r
1077 HI708_write_cmos_sensor(0x03, 0x00); //Page 0\r
1078 HI708_write_cmos_sensor(0x40,((dummy_pixels & 0x0F00))>>8); //HBLANK\r
1079 HI708_write_cmos_sensor(0x41,(dummy_pixels & 0xFF));\r
1080 HI708_write_cmos_sensor(0x42,((dummy_lines & 0xFF00)>>8)); //VBLANK ( Vsync Type 1)\r
1081 HI708_write_cmos_sensor(0x43,(dummy_lines & 0xFF));\r
1082} \r
1083#endif\r
1084\r
1085// 640 * 480\r
1086\r
1087\r
1088static void HI708_Cal_Min_Frame_Rate(kal_uint16 min_framerate)\r
1089{\r
1090 kal_uint32 HI708_expmax = 0;\r
1091 kal_uint32 HI708_expbanding = 0;\r
1092 kal_uint32 temp_data;\r
1093 \r
1094 SENSORDB("[HI708] HI708_Cal_Min_Frame_Rate:min_fps=%d\n",min_framerate);\r
1095\r
1096 //No Fixed Framerate\r
1097 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg\r
1098 HI708_write_cmos_sensor(0x03, 0x00);\r
1099 HI708_write_cmos_sensor(0x11, HI708_read_cmos_sensor(0x11)&0xfb);\r
1100\r
1101 HI708_write_cmos_sensor(0x03, 0x20);\r
1102 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1103 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1104 //HI708_write_cmos_sensor(0x11, 0x04);\r
1105 //HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1106 //HI708_write_cmos_sensor(0x2a, 0xf0);\r
1107 //HI708_write_cmos_sensor(0x2b, 0x34);\r
1108\r
1109 HI708_write_cmos_sensor(0x03, 0x00);\r
1110 temp_data = ((HI708_read_cmos_sensor(0x40)<<8)|HI708_read_cmos_sensor(0x41));\r
1111 spin_lock(&hi708_yuv_drv_lock);\r
1112 HI708_sensor.pv_dummy_pixels = temp_data;\r
1113 HI708_sensor.pv_line_length = HI708_VGA_DEFAULT_PIXEL_NUMS+ HI708_sensor.pv_dummy_pixels ;\r
1114 spin_unlock(&hi708_yuv_drv_lock);\r
1115\r
1116 if(HI708_sensor.banding == AE_FLICKER_MODE_50HZ)\r
1117 {\r
1118 HI708_expbanding = (HI708_sensor.pv_pclk/HI708_sensor.pv_line_length/100)*HI708_sensor.pv_line_length/8;\r
1119 HI708_expmax = HI708_expbanding*10*(100/min_framerate) ;\r
1120 }\r
1121 else if(HI708_sensor.banding == AE_FLICKER_MODE_60HZ)\r
1122 {\r
1123 HI708_expbanding = (HI708_sensor.pv_pclk/HI708_sensor.pv_line_length/120)*HI708_sensor.pv_line_length/8;\r
1124 HI708_expmax = HI708_expbanding*10*(120/min_framerate) ;\r
1125 }\r
1126 else//default 5oHZ\r
1127 {\r
1128 SENSORDB("[HI708][Error] Wrong Banding Setting!!!...");\r
1129 }\r
1130\r
1131 HI708_write_cmos_sensor(0x03, 0x00);\r
1132 HI708_write_cmos_sensor(0x12, 0x05);\r
1133 \r
1134 HI708_write_cmos_sensor(0x03, 0x20);\r
1135\r
1136 HI708_write_cmos_sensor(0x8b, 0x1f);\r
1137 HI708_write_cmos_sensor(0x8c, 0xbd);\r
1138 HI708_write_cmos_sensor(0x8d, 0x1a);\r
1139 HI708_write_cmos_sensor(0x8e, 0x5e);\r
1140\r
1141 HI708_write_cmos_sensor(0x9c, 0x03);//0b\r
1142 HI708_write_cmos_sensor(0x9d, 0x6b);//b8\r
1143 HI708_write_cmos_sensor(0x9e, 0x00);\r
1144 HI708_write_cmos_sensor(0x9f, 0xfa);\r
1145\r
1146\r
1147 if(HI708_sensor.night_mode)\r
1148 { \r
1149 HI708_write_cmos_sensor(0x03, 0x20);\r
1150 HI708_write_cmos_sensor(0x83, 0x02);//(HI708_expmax>>16)&0xff);//7fps\r
1151 HI708_write_cmos_sensor(0x84, 0x49);//(HI708_expmax>>8)&0xff);\r
1152 HI708_write_cmos_sensor(0x85, 0xf0);//(HI708_expmax>>0)&0xff);\r
1153 HI708_write_cmos_sensor(0x88, 0x02);//(HI708_expmax>>16)&0xff);//7fps\r
1154 HI708_write_cmos_sensor(0x89, 0x49);//(HI708_expmax>>8)&0xff);\r
1155 HI708_write_cmos_sensor(0x8a, 0xf0);//(HI708_expmax>>0)&0xff);\r
1156 HI708_night_flag = KAL_TRUE;\r
1157 }else\r
1158 {\r
1159 if(HI708_night_flag)\r
1160 {\r
1161 HI708_write_cmos_sensor(0x83, 0x02);//(HI708_expmax>>16)&0xff);//01 10fps\r
1162 HI708_write_cmos_sensor(0x84, 0x7a);//(HI708_expmax>>8)&0xff);//bc\r
1163 HI708_write_cmos_sensor(0x85, 0xc4);//(HI708_expmax>>0)&0xff);//56\r
1164 HI708_night_flag = KAL_FALSE;\r
1165 }\r
1166 HI708_write_cmos_sensor(0x88, 0x02);//(HI708_expmax>>16)&0xff);//01 10fps\r
1167 HI708_write_cmos_sensor(0x89, 0x7a);//(HI708_expmax>>8)&0xff);//bc\r
1168 HI708_write_cmos_sensor(0x8a, 0xc4);//(HI708_expmax>>0)&0xff);//56\r
1169 }\r
1170\r
1171 HI708_write_cmos_sensor(0x03, 0x20);\r
1172 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1173 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1174 HI708_write_cmos_sensor(0x03, 0x00);\r
1175 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1176 \r
1177}\r
1178\r
1179\r
1180static void HI708_Fix_Video_Frame_Rate(kal_uint16 fix_framerate)\r
1181{\r
1182 kal_uint32 HI708_expfix;\r
1183 kal_uint32 HI708_expfix_temp;\r
1184 kal_uint32 HI708_expmax = 0;\r
1185 kal_uint32 HI708_expbanding = 0;\r
1186 kal_uint32 temp_data1,temp_data2;\r
1187 \r
1188 SENSORDB("[Enter]HI708 Fix_video_frame_rate func: fix_fps=%d\n",fix_framerate);\r
1189\r
1190 spin_lock(&hi708_yuv_drv_lock);\r
1191 HI708_sensor.video_current_frame_rate = fix_framerate;\r
1192 spin_unlock(&hi708_yuv_drv_lock);\r
1193 // Fixed Framerate\r
1194 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg\r
1195\r
1196 HI708_write_cmos_sensor(0x03, 0x00);\r
1197 //HI708_write_cmos_sensor(0x11, HI708_read_cmos_sensor(0x11)|0x04);\r
1198\r
1199 //HI708_write_cmos_sensor(0x12,HI708_read_cmos_sensor(0x12)&0xfe);\r
1200 \r
1201 HI708_write_cmos_sensor(0x03, 0x20);\r
1202 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1203\r
1204 HI708_write_cmos_sensor(0x11, 0x00);\r
1205 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1206 //HI708_write_cmos_sensor(0x2a, 0x00);\r
1207 //HI708_write_cmos_sensor(0x2b, 0x35);\r
1208\r
1209 HI708_write_cmos_sensor(0x03, 0x00);\r
1210 temp_data1 = ((HI708_read_cmos_sensor(0x40)<<8)|HI708_read_cmos_sensor(0x41));\r
1211 temp_data2 = ((HI708_read_cmos_sensor(0x42)<<8)|HI708_read_cmos_sensor(0x43));\r
1212 spin_lock(&hi708_yuv_drv_lock);\r
1213 HI708_sensor.pv_dummy_pixels = temp_data1; \r
1214 HI708_sensor.pv_line_length = HI708_VGA_DEFAULT_PIXEL_NUMS + HI708_sensor.pv_dummy_pixels ; \r
1215 HI708_sensor.pv_dummy_lines = temp_data2;\r
1216 spin_unlock(&hi708_yuv_drv_lock);\r
1217 \r
1218 HI708_expfix_temp = ((HI708_sensor.pv_pclk*10/fix_framerate)-(HI708_sensor.pv_line_length*HI708_sensor.pv_dummy_lines))/8; \r
1219 HI708_expfix = ((HI708_expfix_temp*8/HI708_sensor.pv_line_length)*HI708_sensor.pv_line_length)/8;\r
1220 \r
1221 HI708_write_cmos_sensor(0x03, 0x20); \r
1222 //HI708_write_cmos_sensor(0x83, (HI708_expfix>>16)&0xff);\r
1223 //HI708_write_cmos_sensor(0x84, (HI708_expfix>>8)&0xff);\r
1224 //HI708_write_cmos_sensor(0x85, (HI708_expfix>>0)&0xff); \r
1225 HI708_write_cmos_sensor(0x8b, 0x1f);\r
1226 HI708_write_cmos_sensor(0x8c, 0xbd);\r
1227 HI708_write_cmos_sensor(0x8d, 0x1a);\r
1228 HI708_write_cmos_sensor(0x8e, 0x5e);\r
1229/*\r
1230 if(HI708_sensor.night_mode)\r
1231 {\r
1232 HI708_write_cmos_sensor(0x83, 0x02);//(HI708_expfix>>16)&0xff);//10fps\r
1233 HI708_write_cmos_sensor(0x84, 0x7a);//(HI708_expfix>>8)&0xff);\r
1234 HI708_write_cmos_sensor(0x85, 0xc4);//(HI708_expfix>>0)&0xff); \r
1235 HI708_write_cmos_sensor(0x88, 0x02);//(HI708_expfix>>16)&0xff);//10fps\r
1236 HI708_write_cmos_sensor(0x89, 0x7a);//(HI708_expfix>>8)&0xff);\r
1237 HI708_write_cmos_sensor(0x8a, 0xc4);//(HI708_expfix>>0)&0xff); \r
1238 HI708_write_cmos_sensor(0x91, 0x02);//(HI708_expfix>>16)&0xff);//10fps\r
1239 HI708_write_cmos_sensor(0x92, 0x71);//(HI708_expfix>>8)&0xff);\r
1240 HI708_write_cmos_sensor(0x93, 0x00);//(HI708_expfix>>0)&0xff);\r
1241}else*/\r
1242//{\r
1243 HI708_write_cmos_sensor(0x83, 0x01);//(HI708_expfix>>16)&0xff);//11fps\r
1244 HI708_write_cmos_sensor(0x84, 0xbc);//(HI708_expfix>>8)&0xff);\r
1245 HI708_write_cmos_sensor(0x85, 0x56);//(HI708_expfix>>0)&0xff); \r
1246 HI708_write_cmos_sensor(0x88, 0x00);//(HI708_expfix>>16)&0xff);//11fps\r
1247 HI708_write_cmos_sensor(0x89, 0xde);//(HI708_expfix>>8)&0xff);\r
1248 HI708_write_cmos_sensor(0x8a, 0x2b);//(HI708_expfix>>0)&0xff); \r
1249 HI708_write_cmos_sensor(0x91, 0x01);//(HI708_expfix>>16)&0xff);//10fps\r
1250 HI708_write_cmos_sensor(0x92, 0xbb);//(HI708_expfix>>8)&0xff);\r
1251 HI708_write_cmos_sensor(0x93, 0x5c);//(HI708_expfix>>0)&0xff); \r
1252//}\r
1253 if(HI708_sensor.banding == AE_FLICKER_MODE_50HZ)\r
1254 {\r
1255 HI708_expbanding = ((HI708_read_cmos_sensor(0x8b)<<8)|HI708_read_cmos_sensor(0x8c));\r
1256 }\r
1257 else if(HI708_sensor.banding == AE_FLICKER_MODE_60HZ)\r
1258 {\r
1259 HI708_expbanding = ((HI708_read_cmos_sensor(0x8d)<<8)|HI708_read_cmos_sensor(0x8e));\r
1260 }\r
1261 else\r
1262 {\r
1263 SENSORDB("[HI708]Wrong Banding Setting!!!...");\r
1264 }\r
1265 HI708_expmax = ((HI708_expfix_temp-HI708_expbanding)/HI708_expbanding)*HI708_expbanding; \r
1266\r
1267 HI708_write_cmos_sensor(0x03, 0x20);\r
1268 //HI708_write_cmos_sensor(0x88, (HI708_expmax>>16)&0xff);\r
1269 //HI708_write_cmos_sensor(0x89, (HI708_expmax>>8)&0xff);\r
1270 //HI708_write_cmos_sensor(0x8a, (HI708_expmax>>0)&0xff);\r
1271\r
1272 HI708_write_cmos_sensor(0x03, 0x20);\r
1273 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1274 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1275\r
1276 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1277}\r
1278\r
1279#if 0\r
1280// 320 * 240\r
1281static void HI708_Set_QVGA_mode(void)\r
1282{\r
1283 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)|0x01); //Sleep: For Write Reg\r
1284 \r
1285 HI708_write_cmos_sensor(0x03, 0x00);\r
1286 HI708_write_cmos_sensor(0x10, 0x01); //QVGA Size: 0x10 -> 0x01\r
1287\r
1288 HI708_write_cmos_sensor(0x20, 0x00);\r
1289 HI708_write_cmos_sensor(0x21, 0x02);\r
1290\r
1291 HI708_write_cmos_sensor(0x40, 0x01); //HBLANK: 0x0158 = 344\r
1292 HI708_write_cmos_sensor(0x41, 0x58);\r
1293 HI708_write_cmos_sensor(0x42, 0x00); //VBLANK: 0x14 = 20\r
1294 HI708_write_cmos_sensor(0x43, 0x14);\r
1295\r
1296 HI708_write_cmos_sensor(0x03, 0x11); //QVGA Fixframerate\r
1297 HI708_write_cmos_sensor(0x10, 0x21); \r
1298\r
1299 HI708_write_cmos_sensor(0x03, 0x20);\r
1300 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1301 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1302\r
1303 HI708_write_cmos_sensor(0x83, 0x00);\r
1304 HI708_write_cmos_sensor(0x84, 0xaf);\r
1305 HI708_write_cmos_sensor(0x85, 0xc8);\r
1306 HI708_write_cmos_sensor(0x86, 0x00);\r
1307 HI708_write_cmos_sensor(0x87, 0xfa);\r
1308\r
1309 HI708_write_cmos_sensor(0x8b, 0x3a);\r
1310 HI708_write_cmos_sensor(0x8c, 0x98);\r
1311 HI708_write_cmos_sensor(0x8d, 0x30);\r
1312 HI708_write_cmos_sensor(0x8e, 0xd4);\r
1313\r
1314 HI708_write_cmos_sensor(0x9c, 0x0b);\r
1315 HI708_write_cmos_sensor(0x9d, 0x3b);\r
1316 HI708_write_cmos_sensor(0x9e, 0x00);\r
1317 HI708_write_cmos_sensor(0x9f, 0xfa);\r
1318\r
1319 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1320\r
1321 HI708_write_cmos_sensor(0x03, 0x20);\r
1322 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1323 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1324\r
1325}\r
1326#endif\r
1327void HI708_night_mode(kal_bool enable)\r
1328{\r
1329 SENSORDB("HHL[Enter]HI708 night mode func:enable = %d\n",enable);\r
1330 SENSORDB("HI708_sensor.video_mode = %d\n",HI708_sensor.MPEG4_Video_mode); \r
1331 SENSORDB("HI708_sensor.night_mode = %d\n",HI708_sensor.night_mode);\r
1332 spin_lock(&hi708_yuv_drv_lock);\r
1333 HI708_sensor.night_mode = enable;\r
1334 spin_unlock(&hi708_yuv_drv_lock);\r
1335\r
1336 if(HI708_sensor.MPEG4_Video_mode == KAL_TRUE)\r
1337 return;\r
1338\r
1339 if(enable)\r
1340\r
1341{\r
1342 if (HI708_sensor.banding == AE_FLICKER_MODE_50HZ) \r
1343 {\r
1344\r
1345 SENSORDB("[HI708]HI708NightMode Disable AE_FLICKER_MODE_50HZ\n");\r
1346\r
1347 HI708_write_cmos_sensor(0x03, 0x20);\r
1348 \r
1349 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1350 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1351\r
1352 //BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
1353 HI708_write_cmos_sensor(0x83, 0x02);\r
1354 HI708_write_cmos_sensor(0x84, 0x7a);\r
1355 HI708_write_cmos_sensor(0x85, 0xc4);//15fps\r
1356 HI708_write_cmos_sensor(0x86, 0x00);\r
1357 HI708_write_cmos_sensor(0x87, 0xfa);\r
1358 //END <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
1359 HI708_write_cmos_sensor(0x88, 0x02);\r
1360 HI708_write_cmos_sensor(0x89, 0x7a);\r
1361 HI708_write_cmos_sensor(0x8A, 0xc4);//7\r
1362 \r
1363 HI708_write_cmos_sensor(0x8b, 0x1f);\r
1364 HI708_write_cmos_sensor(0x8c, 0xbd);\r
1365 HI708_write_cmos_sensor(0x8d, 0x1a);\r
1366 HI708_write_cmos_sensor(0x8e, 0x5e);\r
1367 \r
1368 HI708_write_cmos_sensor(0x9c, 0x03);\r
1369 HI708_write_cmos_sensor(0x9d, 0x6b);\r
1370 HI708_write_cmos_sensor(0x9e, 0x00);\r
1371 HI708_write_cmos_sensor(0x9f, 0xfa);\r
1372 \r
1373 \r
1374 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1375 \r
1376 HI708_write_cmos_sensor(0x03, 0x20);\r
1377 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1378 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1379\r
1380\r
1381\r
1382}\r
1383else\r
1384{\r
1385SENSORDB("[HI708]HI708NightMode Disable AE_FLICKER_MODE_60HZ\n");\r
1386HI708_write_cmos_sensor(0x03, 0x20);\r
1387\r
1388HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1389HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1390\r
1391//BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
1392\r
1393 HI708_write_cmos_sensor(0x83, 0x02);\r
1394 HI708_write_cmos_sensor(0x84, 0x78);\r
1395 HI708_write_cmos_sensor(0x85, 0xd0);//15fps\r
1396HI708_write_cmos_sensor(0x86, 0x00);\r
1397HI708_write_cmos_sensor(0x87, 0xfa);\r
1398//END <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
1399HI708_write_cmos_sensor(0x88, 0x02);\r
1400HI708_write_cmos_sensor(0x89, 0x78);\r
1401HI708_write_cmos_sensor(0x8A, 0xd0);//7\r
1402\r
1403HI708_write_cmos_sensor(0x8b, 0x1f);\r
1404HI708_write_cmos_sensor(0x8c, 0xbd);\r
1405HI708_write_cmos_sensor(0x8d, 0x1a);\r
1406HI708_write_cmos_sensor(0x8e, 0x5e);\r
1407\r
1408HI708_write_cmos_sensor(0x9c, 0x03);\r
1409HI708_write_cmos_sensor(0x9d, 0x6b);\r
1410HI708_write_cmos_sensor(0x9e, 0x00);\r
1411HI708_write_cmos_sensor(0x9f, 0xfa);\r
1412\r
1413\r
1414HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1415\r
1416HI708_write_cmos_sensor(0x03, 0x20);\r
1417HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1418HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1419\r
1420\r
1421 }\r
1422 \r
1423\r
1424}\r
1425else\r
1426{\r
1427 if (HI708_sensor.banding == AE_FLICKER_MODE_50HZ) \r
1428 { SENSORDB("[HI708]HI708NightMode Enable AE_FLICKER_MODE_50HZ\n");\r
1429 HI708_write_cmos_sensor(0x03, 0x20);\r
1430 \r
1431 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1432 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1433 //BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
1434 HI708_write_cmos_sensor(0x83, 0x01);\r
1435 HI708_write_cmos_sensor(0x84, 0xbc);\r
1436 HI708_write_cmos_sensor(0x85, 0x56);//15fps\r
1437 HI708_write_cmos_sensor(0x86, 0x00);\r
1438 HI708_write_cmos_sensor(0x87, 0xfa);\r
1439 //END <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
1440 HI708_write_cmos_sensor(0x88, 0x01);\r
1441 HI708_write_cmos_sensor(0x89, 0xbc);\r
1442 HI708_write_cmos_sensor(0x8A, 0x56);//7\r
1443 \r
1444 HI708_write_cmos_sensor(0x8b, 0x1f);\r
1445 HI708_write_cmos_sensor(0x8c, 0xbd);\r
1446 HI708_write_cmos_sensor(0x8d, 0x1a);\r
1447 HI708_write_cmos_sensor(0x8e, 0x5e);\r
1448 \r
1449 HI708_write_cmos_sensor(0x9c, 0x03);\r
1450 HI708_write_cmos_sensor(0x9d, 0x6b);\r
1451 HI708_write_cmos_sensor(0x9e, 0x00);\r
1452 HI708_write_cmos_sensor(0x9f, 0xfa);\r
1453 \r
1454 \r
1455 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1456 \r
1457 HI708_write_cmos_sensor(0x03, 0x20);\r
1458 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1459 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1460\r
1461 }\r
1462 else\r
1463 { SENSORDB("[HI708]HI708NightMode Enable AE_FLICKER_MODE_60HZ\n");\r
1464\r
1465 HI708_write_cmos_sensor(0x03, 0x20);\r
1466 \r
1467 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)&0x7f); //Close AE\r
1468 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)|0x08); //Reset AE\r
1469 //BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
1470 HI708_write_cmos_sensor(0x83, 0x01);\r
1471 HI708_write_cmos_sensor(0x84, 0xc0);\r
1472 HI708_write_cmos_sensor(0x85, 0x3e);//15fps\r
1473 HI708_write_cmos_sensor(0x86, 0x00);\r
1474 HI708_write_cmos_sensor(0x87, 0xfa);\r
1475 //END<> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
1476 HI708_write_cmos_sensor(0x88, 0x01);\r
1477 HI708_write_cmos_sensor(0x89, 0xc0);\r
1478 HI708_write_cmos_sensor(0x8A, 0x3e);//7\r
1479 \r
1480 HI708_write_cmos_sensor(0x8b, 0x1f);\r
1481 HI708_write_cmos_sensor(0x8c, 0xbd);\r
1482 HI708_write_cmos_sensor(0x8d, 0x1a);\r
1483 HI708_write_cmos_sensor(0x8e, 0x5e);\r
1484 \r
1485 HI708_write_cmos_sensor(0x9c, 0x03);\r
1486 HI708_write_cmos_sensor(0x9d, 0x6b);\r
1487 HI708_write_cmos_sensor(0x9e, 0x00);\r
1488 HI708_write_cmos_sensor(0x9f, 0xfa);\r
1489 \r
1490 \r
1491 HI708_write_cmos_sensor(0x01, HI708_read_cmos_sensor(0x01)&0xfe); //Exit Sleep: For Write Reg\r
1492 \r
1493 HI708_write_cmos_sensor(0x03, 0x20);\r
1494 HI708_write_cmos_sensor(0x10, HI708_read_cmos_sensor(0x10)|0x80); //Open AE\r
1495 HI708_write_cmos_sensor(0x18, HI708_read_cmos_sensor(0x18)&0xf7); //Reset AE\r
1496\r
1497 }\r
1498\r
1499\r
1500}\r
1501}\r
1502\r
1503/*************************************************************************\r
1504* FUNCTION\r
1505* HI708Preview\r
1506*\r
1507* DESCRIPTION\r
1508* This function start the sensor preview.\r
1509*\r
1510* PARAMETERS\r
1511* *image_window : address pointer of pixel numbers in one period of HSYNC\r
1512* *sensor_config_data : address pointer of line numbers in one period of VSYNC\r
1513*\r
1514* RETURNS\r
1515* None\r
1516*\r
1517* GLOBALS AFFECTED\r
1518*\r
1519*************************************************************************/\r
1520static UINT32 HI708Preview(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window,\r
1521 MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data)\r
1522{\r
1523\r
1524 HI708_write_cmos_sensor(0x03, 0x22);\r
1525 HI708_write_cmos_sensor(0x10, 0xfb);\r
1526 spin_lock(&hi708_yuv_drv_lock);\r
1527 sensor_config_data->SensorImageMirror = IMAGE_HV_MIRROR; \r
1528 if(HI708_sensor.first_init == KAL_TRUE)\r
1529 {\r
1530 HI708_sensor.MPEG4_Video_mode = HI708_sensor.MPEG4_Video_mode;\r
1531 }\r
1532 else\r
1533 {\r
1534 HI708_sensor.MPEG4_Video_mode = KAL_FALSE;//!HI708_sensor.MPEG4_Video_mode;\r
1535 }\r
1536 spin_unlock(&hi708_yuv_drv_lock);\r
1537\r
1538 SENSORDB("HHL[Enter]:HI708 preview func:"); \r
1539 SENSORDB("HI708_sensor.video_mode = %d\n",HI708_sensor.MPEG4_Video_mode); \r
1540\r
1541 spin_lock(&hi708_yuv_drv_lock);\r
1542 HI708_sensor.first_init = KAL_FALSE; \r
1543 HI708_sensor.pv_mode = KAL_TRUE; \r
1544 spin_unlock(&hi708_yuv_drv_lock);\r
1545\r
1546 // { \r
1547 // SENSORDB("[HI708]preview set_VGA_mode\n");\r
1548 //\r
1549 // }\r
1550 \r
1551 //HI708_write_cmos_sensor(0x03, 0x10);\r
1552 //HI708_write_cmos_sensor(0x40, 0x03);\r
1553 //HI708_write_cmos_sensor(0x62, 0x83);\r
1554 //HI708_write_cmos_sensor(0x63, 0x9a); \r
1555\r
1556 // HI708_Set_Mirror_Flip(sensor_config_data->SensorImageMirror);\r
1557 // HI708_Set_Mirror_Flip(IMAGE_V_MIRROR);\r
1558\r
1559 SENSORDB("[Exit]:HI708 preview func\n");\r
1560 \r
4b9e9796 1561 HI708_night_mode(HI708_sensor.night_mode);\r
6fa3eb70
S
1562 return TRUE; \r
1563} /* HI708_Preview */\r
1564\r
1565\r
1566UINT32 HI708Capture(MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *image_window,\r
1567 MSDK_SENSOR_CONFIG_STRUCT *sensor_config_data)\r
1568{\r
1569kal_uint32 CapShutter; \r
1570 SENSORDB("HHL[HI708][Enter]HI708_capture_func\n");\r
1571 spin_lock(&hi708_yuv_drv_lock);\r
1572 HI708_sensor.pv_mode = KAL_FALSE; \r
1573 spin_unlock(&hi708_yuv_drv_lock);\r
1574#if 0\r
1575 HI708_write_cmos_sensor(0x03, 0x20);\r
1576 HI708_sensor.PvShutter = (HI708_read_cmos_sensor(0x80) << 16)|(HI708_read_cmos_sensor(0x81) << 8)|HI708_read_cmos_sensor(0x82);\r
1577 CapShutter = HI708_sensor.PvShutter;\r
1578 HI708_sensor.CapExposure=HI708_sensor.PvShutter*8*76923\r
1579\r
1580 HI708_write_cmos_sensor(0x03, 0x20);\r
1581 HI708_write_cmos_sensor(0x83, (CapShutter >> 16) & 0xFF);\r
1582 HI708_write_cmos_sensor(0x84, (CapShutter >> 8) & 0xFF);\r
1583 HI708_write_cmos_sensor(0x85, CapShutter & 0xFF); \r
1584 #endif\r
6fa3eb70
S
1585 return ERROR_NONE;\r
1586} /* HM3451Capture() */\r
1587\r
1588\r
1589UINT32 HI708GetResolution(MSDK_SENSOR_RESOLUTION_INFO_STRUCT *pSensorResolution)\r
1590{\r
1591 SENSORDB("[Enter]:HI708 get Resolution func\n");\r
1592\r
1593 pSensorResolution->SensorFullWidth=HI708_IMAGE_SENSOR_FULL_WIDTH ; \r
1594 pSensorResolution->SensorFullHeight=HI708_IMAGE_SENSOR_FULL_HEIGHT ;\r
1595 pSensorResolution->SensorPreviewWidth=HI708_IMAGE_SENSOR_PV_WIDTH ;\r
1596 pSensorResolution->SensorPreviewHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ;\r
1597 pSensorResolution->SensorVideoWidth=HI708_IMAGE_SENSOR_PV_WIDTH ;\r
1598 pSensorResolution->SensorVideoHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ;\r
1599 pSensorResolution->Sensor3DFullWidth=HI708_IMAGE_SENSOR_FULL_WIDTH ; \r
1600 pSensorResolution->Sensor3DFullHeight=HI708_IMAGE_SENSOR_FULL_HEIGHT ;\r
1601 pSensorResolution->Sensor3DPreviewWidth=HI708_IMAGE_SENSOR_PV_WIDTH ;\r
1602 pSensorResolution->Sensor3DPreviewHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ;\r
1603 pSensorResolution->Sensor3DVideoWidth=HI708_IMAGE_SENSOR_PV_WIDTH ;\r
1604 pSensorResolution->Sensor3DVideoHeight=HI708_IMAGE_SENSOR_PV_HEIGHT ;\r
1605\r
1606 SENSORDB("[Exit]:HI708 get Resolution func\n"); \r
1607 return ERROR_NONE;\r
1608} /* HI708GetResolution() */\r
1609\r
1610UINT32 HI708GetInfo(MSDK_SCENARIO_ID_ENUM ScenarioId,\r
1611 MSDK_SENSOR_INFO_STRUCT *pSensorInfo,\r
1612 MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData)\r
1613{\r
1614\r
1615 switch(ScenarioId)\r
1616 {\r
1617 \r
1618 case MSDK_SCENARIO_ID_CAMERA_ZSD:\r
1619 pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH;\r
1620 pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT;\r
1621 pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
1622 pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; \r
1623 pSensorInfo->SensorCameraPreviewFrameRate=15;\r
1624 break;\r
1625 \r
1626 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:\r
1627 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:\r
1628 pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH;\r
1629 pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT;\r
1630 pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
1631 pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; \r
1632 pSensorInfo->SensorCameraPreviewFrameRate=30;\r
1633 break;\r
1634 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:\r
1635 pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH;\r
1636 pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT;\r
1637 pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
1638 pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; \r
1639 pSensorInfo->SensorCameraPreviewFrameRate=30; \r
1640 break;\r
1641 case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added\r
1642 case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO:\r
1643 case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added \r
1644 pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH;\r
1645 pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT;\r
1646 pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
1647 pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; \r
1648 pSensorInfo->SensorCameraPreviewFrameRate=30; \r
1649 break;\r
1650 default:\r
1651 \r
1652 pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH;\r
1653 pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT;\r
1654 pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
1655 pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT; \r
1656 pSensorInfo->SensorCameraPreviewFrameRate=30;\r
1657 break;\r
1658 \r
1659 }\r
1660 \r
1661\r
1662\r
1663 SENSORDB("[Enter]:HI708 getInfo func:ScenarioId = %d\n",ScenarioId);\r
1664\r
1665 // pSensorInfo->SensorPreviewResolutionX=HI708_IMAGE_SENSOR_PV_WIDTH;\r
1666 // pSensorInfo->SensorPreviewResolutionY=HI708_IMAGE_SENSOR_PV_HEIGHT;\r
1667 // pSensorInfo->SensorFullResolutionX=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
1668 // pSensorInfo->SensorFullResolutionY=HI708_IMAGE_SENSOR_FULL_HEIGHT;\r
1669\r
1670 pSensorInfo->SensorCameraPreviewFrameRate=30;\r
1671 pSensorInfo->SensorVideoFrameRate=30;\r
1672 pSensorInfo->SensorStillCaptureFrameRate=30;\r
1673 pSensorInfo->SensorWebCamCaptureFrameRate=15;\r
1674 pSensorInfo->SensorResetActiveHigh=FALSE;//low is to reset \r
1675 pSensorInfo->SensorResetDelayCount=4; //4ms \r
1676 pSensorInfo->SensorOutputDataFormat=SENSOR_OUTPUT_FORMAT_YUYV; //SENSOR_OUTPUT_FORMAT_YVYU;\r
1677 pSensorInfo->SensorClockPolarity=SENSOR_CLOCK_POLARITY_LOW; \r
1678 pSensorInfo->SensorClockFallingPolarity=SENSOR_CLOCK_POLARITY_LOW;\r
1679 pSensorInfo->SensorHsyncPolarity = SENSOR_CLOCK_POLARITY_LOW;\r
1680 pSensorInfo->SensorVsyncPolarity = SENSOR_CLOCK_POLARITY_LOW;\r
1681 pSensorInfo->SensorInterruptDelayLines = 1; \r
1682 pSensorInfo->SensroInterfaceType=SENSOR_INTERFACE_TYPE_PARALLEL;\r
1683\r
1684\r
1685 pSensorInfo->CaptureDelayFrame = 2; \r
1686 pSensorInfo->PreviewDelayFrame = 2;//10; \r
1687 pSensorInfo->VideoDelayFrame = 0; \r
1688 pSensorInfo->SensorMasterClockSwitch = 0; \r
1689 pSensorInfo->SensorDrivingCurrent = ISP_DRIVING_8MA; \r
1690\r
1691 switch (ScenarioId)\r
1692 {\r
1693 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:\r
1694 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:\r
1695 case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW:\r
1696 case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: \r
1697 pSensorInfo->SensorClockFreq=26;\r
1698 pSensorInfo->SensorClockDividCount= 3;\r
1699 pSensorInfo->SensorClockRisingCount= 0;\r
1700 pSensorInfo->SensorClockFallingCount= 2;\r
1701 pSensorInfo->SensorPixelClockCount= 3;\r
1702 pSensorInfo->SensorDataLatchCount= 2;\r
1703 pSensorInfo->SensorGrabStartX = 4; \r
1704 pSensorInfo->SensorGrabStartY = 2; \r
1705 break;\r
1706 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:\r
1707 case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE:\r
1708 pSensorInfo->SensorClockFreq=26;\r
1709 pSensorInfo->SensorClockDividCount= 3;\r
1710 pSensorInfo->SensorClockRisingCount= 0;\r
1711 pSensorInfo->SensorClockFallingCount= 2;\r
1712 pSensorInfo->SensorPixelClockCount= 3;\r
1713 pSensorInfo->SensorDataLatchCount= 2;\r
1714 pSensorInfo->SensorGrabStartX = 4; \r
1715 pSensorInfo->SensorGrabStartY = 2;//4; \r
1716 break;\r
1717 default:\r
1718 pSensorInfo->SensorClockFreq=26;\r
1719 pSensorInfo->SensorClockDividCount=3;\r
1720 pSensorInfo->SensorClockRisingCount=0;\r
1721 pSensorInfo->SensorClockFallingCount=2;\r
1722 pSensorInfo->SensorPixelClockCount=3;\r
1723 pSensorInfo->SensorDataLatchCount=2;\r
1724 pSensorInfo->SensorGrabStartX = 4; \r
1725 pSensorInfo->SensorGrabStartY = 2;//4; \r
1726 break;\r
1727 }\r
1728 // HI708_PixelClockDivider=pSensorInfo->SensorPixelClockCount;\r
1729 memcpy(pSensorConfigData, &HI708SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));\r
1730\r
1731 SENSORDB("[Exit]:HI708 getInfo func\n"); \r
1732 return ERROR_NONE;\r
1733} /* HI708GetInfo() */\r
1734\r
1735\r
1736UINT32 HI708Control(MSDK_SCENARIO_ID_ENUM ScenarioId, MSDK_SENSOR_EXPOSURE_WINDOW_STRUCT *pImageWindow,\r
1737 MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData)\r
1738{\r
1739 SENSORDB("HHL [Enter]:HI708 Control func:ScenarioId = %d\n",ScenarioId);\r
1740\r
1741 switch (ScenarioId)\r
1742 {\r
1743 case MSDK_SCENARIO_ID_CAMERA_PREVIEW:\r
1744 case MSDK_SCENARIO_ID_VIDEO_PREVIEW:\r
1745 //case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW:\r
1746 //case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO: \r
1747 HI708Preview(pImageWindow, pSensorConfigData); \r
1748 break;\r
1749 case MSDK_SCENARIO_ID_CAMERA_CAPTURE_JPEG:\r
1750 //case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE:\r
1751 HI708Capture(pImageWindow, pSensorConfigData); \r
1752 break;\r
1753 // case MSDK_SCENARIO_ID_CAMERA_3D_PREVIEW: //added\r
1754 // case MSDK_SCENARIO_ID_CAMERA_3D_VIDEO:\r
1755 // case MSDK_SCENARIO_ID_CAMERA_3D_CAPTURE: //added \r
1756 // HI708Preview(pImageWindow, pSensorConfigData); \r
1757 // break;\r
1758 // case MSDK_SCENARIO_ID_CAMERA_ZSD:\r
1759 // HI708Capture(pImageWindow, pSensorConfigData); \r
1760 // break; \r
1761 default:\r
1762 break; \r
1763 }\r
1764\r
1765 SENSORDB("[Exit]:HI708 Control func\n"); \r
1766 return TRUE;\r
1767} /* HI708Control() */\r
1768\r
1769\r
1770/*************************************************************************\r
1771* FUNCTION\r
1772* HI708_set_param_wb\r
1773*\r
1774* DESCRIPTION\r
1775* wb setting.\r
1776*\r
1777* PARAMETERS\r
1778* none\r
1779*\r
1780* RETURNS\r
1781* None\r
1782*\r
1783* GLOBALS AFFECTED\r
1784*\r
1785*************************************************************************/\r
1786BOOL HI708_set_param_wb(UINT16 para)\r
1787{\r
1788 //This sensor need more time to balance AWB, \r
1789 //we suggest higher fps or drop some frame to avoid garbage color when preview initial\r
1790 SENSORDB("[Enter]HI708 set_param_wb func:para = %d\n",para);\r
1791\r
1792 if(HI708_sensor.wb == para) return KAL_TRUE; \r
1793\r
1794 spin_lock(&hi708_yuv_drv_lock);\r
1795 HI708_sensor.wb = para;\r
1796 spin_unlock(&hi708_yuv_drv_lock);\r
1797 \r
1798 switch (para)\r
1799 { \r
1800 case AWB_MODE_AUTO:\r
1801 {\r
1802 HI708_write_cmos_sensor(0x03, 0x22); \r
1803 HI708_write_cmos_sensor(0x11, 0x2e); \r
1804 HI708_write_cmos_sensor(0x80, 0x38);\r
1805 HI708_write_cmos_sensor(0x82, 0x30); \r
1806 HI708_write_cmos_sensor(0x83, 0x46);//56\r
1807 HI708_write_cmos_sensor(0x84, 0x16);\r
1808 HI708_write_cmos_sensor(0x85, 0x57);\r
1809 HI708_write_cmos_sensor(0x86, 0x28); \r
1810 } \r
1811 break;\r
1812 case AWB_MODE_CLOUDY_DAYLIGHT:\r
1813 {\r
1814 HI708_write_cmos_sensor(0x03, 0x22);\r
1815 HI708_write_cmos_sensor(0x11, 0x28);\r
1816 HI708_write_cmos_sensor(0x80, 0x52);\r
1817 HI708_write_cmos_sensor(0x81, 0x20);\r
1818 HI708_write_cmos_sensor(0x82, 0x2e);\r
1819 HI708_write_cmos_sensor(0x83, 0x5d);\r
1820 HI708_write_cmos_sensor(0x84, 0x55);\r
1821 HI708_write_cmos_sensor(0x85, 0x30);\r
1822 HI708_write_cmos_sensor(0x86, 0x25);\r
1823 } \r
1824 break;\r
1825 case AWB_MODE_DAYLIGHT:\r
1826 {\r
1827 HI708_write_cmos_sensor(0x03, 0x22);\r
1828 HI708_write_cmos_sensor(0x11, 0x28); \r
1829 HI708_write_cmos_sensor(0x80, 0x50);\r
1830 HI708_write_cmos_sensor(0x81, 0x20);\r
1831 HI708_write_cmos_sensor(0x82, 0x2d);\r
1832 HI708_write_cmos_sensor(0x83, 0x52);\r
1833 HI708_write_cmos_sensor(0x84, 0x40);\r
1834 HI708_write_cmos_sensor(0x85, 0x30);\r
1835 HI708_write_cmos_sensor(0x86, 0x1c);\r
1836 } \r
1837 break;\r
1838 case AWB_MODE_INCANDESCENT: \r
1839 {\r
1840 HI708_write_cmos_sensor(0x03, 0x22);\r
1841 HI708_write_cmos_sensor(0x11, 0x28); \r
1842 HI708_write_cmos_sensor(0x80, 0x29);\r
1843 HI708_write_cmos_sensor(0x82, 0x54);\r
1844 HI708_write_cmos_sensor(0x83, 0x2e);\r
1845 HI708_write_cmos_sensor(0x84, 0x23);\r
1846 HI708_write_cmos_sensor(0x85, 0x58);\r
1847 HI708_write_cmos_sensor(0x86, 0x4f);\r
1848 } \r
1849 break; \r
1850 case AWB_MODE_FLUORESCENT:\r
1851 {\r
1852 HI708_write_cmos_sensor(0x03, 0x22);\r
1853 HI708_write_cmos_sensor(0x11, 0x28);\r
1854 HI708_write_cmos_sensor(0x80, 0x40);\r
1855 HI708_write_cmos_sensor(0x81, 0x20);\r
1856 HI708_write_cmos_sensor(0x82, 0x4f);\r
1857 HI708_write_cmos_sensor(0x83, 0x44);\r
1858 HI708_write_cmos_sensor(0x84, 0x3a);\r
1859 HI708_write_cmos_sensor(0x85, 0x47);\r
1860 HI708_write_cmos_sensor(0x86, 0x3a);\r
1861 } \r
1862 break; \r
1863 case AWB_MODE_TUNGSTEN:\r
1864 {\r
1865 HI708_write_cmos_sensor(0x03, 0x22);\r
1866 HI708_write_cmos_sensor(0x80, 0x24);\r
1867 HI708_write_cmos_sensor(0x81, 0x20);\r
1868 HI708_write_cmos_sensor(0x82, 0x58);\r
1869 HI708_write_cmos_sensor(0x83, 0x27);\r
1870 HI708_write_cmos_sensor(0x84, 0x22);\r
1871 HI708_write_cmos_sensor(0x85, 0x58);\r
1872 HI708_write_cmos_sensor(0x86, 0x52);\r
1873 }\r
1874 break;\r
1875 case AWB_MODE_OFF:\r
1876 {\r
1877 SENSORDB("HI708 AWB OFF");\r
1878 HI708_write_cmos_sensor(0x03, 0x22);\r
1879 HI708_write_cmos_sensor(0x10, 0xe2);\r
1880 }\r
1881 break;\r
1882 default:\r
1883 return FALSE;\r
1884 }\r
1885\r
1886 return TRUE; \r
1887} /* HI708_set_param_wb */\r
1888\r
1889/*************************************************************************\r
1890* FUNCTION\r
1891* HI708_set_param_effect\r
1892*\r
1893* DESCRIPTION\r
1894* effect setting.\r
1895*\r
1896* PARAMETERS\r
1897* none\r
1898*\r
1899* RETURNS\r
1900* None\r
1901*\r
1902* GLOBALS AFFECTED\r
1903*\r
1904*************************************************************************/\r
1905BOOL HI708_set_param_effect(UINT16 para)\r
1906{\r
1907 SENSORDB("[Enter]HI708 set_param_effect func:para = %d\n",para);\r
1908 \r
1909 if(HI708_sensor.effect == para) return KAL_TRUE;\r
1910\r
1911 spin_lock(&hi708_yuv_drv_lock);\r
1912 HI708_sensor.effect = para;\r
1913 spin_unlock(&hi708_yuv_drv_lock);\r
1914 \r
1915 switch (para)\r
1916 {\r
1917 case MEFFECT_OFF:\r
1918 {\r
1919 HI708_write_cmos_sensor(0x03, 0x10);\r
1920 HI708_write_cmos_sensor(0x11, 0x43);\r
1921 HI708_write_cmos_sensor(0x12, 0xF0);\r
1922 HI708_write_cmos_sensor(0x13, 0x03);\r
1923 HI708_write_cmos_sensor(0x44, 0x80);\r
1924 HI708_write_cmos_sensor(0x45, 0x80);\r
1925\r
1926 HI708_write_cmos_sensor(0x47, 0x7f);\r
1927 //HI708_write_cmos_sensor(0x03, 0x13);\r
1928 // HI708_write_cmos_sensor(0x20, 0x07);\r
1929 //HI708_write_cmos_sensor(0x21, 0x07);\r
1930\r
1931\r
1932 }\r
1933 break;\r
1934 case MEFFECT_SEPIA:\r
1935 {\r
1936 HI708_write_cmos_sensor(0x03, 0x10);\r
1937 HI708_write_cmos_sensor(0x11, 0x03);\r
1938 HI708_write_cmos_sensor(0x12, 0x23);\r
1939 HI708_write_cmos_sensor(0x13, 0x00);\r
1940 HI708_write_cmos_sensor(0x44, 0x6c);\r
1941 HI708_write_cmos_sensor(0x45, 0x9a);\r
1942\r
1943 HI708_write_cmos_sensor(0x47, 0x7f);\r
1944 // HI708_write_cmos_sensor(0x03, 0x13);\r
1945 // HI708_write_cmos_sensor(0x20, 0x07);\r
1946 //HI708_write_cmos_sensor(0x21, 0x07);\r
1947 \r
1948\r
1949 } \r
1950 break; \r
1951 case MEFFECT_NEGATIVE:\r
1952 {\r
1953 HI708_write_cmos_sensor(0x03, 0x10);\r
1954 HI708_write_cmos_sensor(0x11, 0x03);\r
1955 HI708_write_cmos_sensor(0x12, 0x08);\r
1956 HI708_write_cmos_sensor(0x13, 0x00);\r
1957 HI708_write_cmos_sensor(0x14, 0x00);\r
1958 }\r
1959 break; \r
1960 case MEFFECT_SEPIAGREEN: \r
1961 {\r
1962 HI708_write_cmos_sensor(0x03, 0x10);\r
1963 HI708_write_cmos_sensor(0x11, 0x03);\r
1964 HI708_write_cmos_sensor(0x12, 0x03);\r
1965 //HI708_write_cmos_sensor(0x40, 0x00);\r
1966 HI708_write_cmos_sensor(0x13, 0x00);\r
1967 HI708_write_cmos_sensor(0x44, 0x30);\r
1968 HI708_write_cmos_sensor(0x45, 0x50);\r
1969 } \r
1970 break;\r
1971 case MEFFECT_SEPIABLUE:\r
1972 {\r
1973 HI708_write_cmos_sensor(0x03, 0x10);\r
1974 HI708_write_cmos_sensor(0x11, 0x03);\r
1975 HI708_write_cmos_sensor(0x12, 0x03);\r
1976 //HI708_write_cmos_sensor(0x40, 0x00);\r
1977 HI708_write_cmos_sensor(0x13, 0x00);\r
1978 HI708_write_cmos_sensor(0x44, 0xb0);\r
1979 HI708_write_cmos_sensor(0x45, 0x40);\r
1980 } \r
1981 break; \r
1982 case MEFFECT_MONO: \r
1983 {\r
1984 HI708_write_cmos_sensor(0x03, 0x10);\r
1985 HI708_write_cmos_sensor(0x11, 0x03);\r
1986 HI708_write_cmos_sensor(0x12, 0x03);\r
1987 //HI708_write_cmos_sensor(0x40, 0x00);\r
1988 HI708_write_cmos_sensor(0x44, 0x80);\r
1989 HI708_write_cmos_sensor(0x45, 0x80);\r
1990 }\r
1991 break;\r
1992 default:\r
1993 return KAL_FALSE;\r
1994 }\r
1995\r
1996 return KAL_TRUE;\r
1997} /* HI708_set_param_effect */\r
1998\r
1999/*************************************************************************\r
2000* FUNCTION\r
2001* HI708_set_param_banding\r
2002*\r
2003* DESCRIPTION\r
2004* banding setting.\r
2005*\r
2006* PARAMETERS\r
2007* none\r
2008*\r
2009* RETURNS\r
2010* None\r
2011*\r
2012* GLOBALS AFFECTED\r
2013*\r
2014*************************************************************************/\r
2015BOOL HI708_set_param_banding(UINT16 para)\r
2016{\r
2017 SENSORDB("[Enter]HI708 set_param_banding func:para = %d\n",para);\r
2018\r
2019 if(HI708_sensor.banding == para) return KAL_TRUE;\r
2020\r
2021 spin_lock(&hi708_yuv_drv_lock);\r
2022 HI708_sensor.banding = para;\r
2023 spin_unlock(&hi708_yuv_drv_lock);\r
2024\r
2025 switch (para)\r
2026 {\r
2027 case AE_FLICKER_MODE_50HZ:\r
2028 {\r
2029 HI708_write_cmos_sensor(0x03,0x20);\r
2030 HI708_write_cmos_sensor(0x10,0x1c);\r
2031 HI708_write_cmos_sensor(0x18,0x38);\r
2032 //BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
2033 HI708_write_cmos_sensor(0x83, 0x01);\r
2034 HI708_write_cmos_sensor(0x84, 0xbc);\r
2035 HI708_write_cmos_sensor(0x85, 0x56);//15fps\r
2036 //END <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
2037 HI708_write_cmos_sensor(0x88, 0x01);\r
2038 HI708_write_cmos_sensor(0x89, 0xbc);\r
2039 HI708_write_cmos_sensor(0x8A, 0x56);//50HZ\r
2040\r
2041 HI708_write_cmos_sensor(0x18, 0x30);\r
2042 HI708_write_cmos_sensor(0x10, 0x9c);\r
2043 }\r
2044 break;\r
2045 case AE_FLICKER_MODE_60HZ:\r
2046 {\r
2047 HI708_write_cmos_sensor(0x03,0x20);\r
2048 HI708_write_cmos_sensor(0x10,0x0c);\r
2049 HI708_write_cmos_sensor(0x18,0x38);\r
2050 //BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
2051 HI708_write_cmos_sensor(0x83, 0x01);\r
2052 HI708_write_cmos_sensor(0x84, 0xc0);\r
2053 HI708_write_cmos_sensor(0x85, 0x3e);//15fps\r
2054 HI708_write_cmos_sensor(0x86, 0x00);\r
2055 HI708_write_cmos_sensor(0x87, 0xfa);\r
2056 //END <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan\r
2057 HI708_write_cmos_sensor(0x88, 0x01);\r
2058 HI708_write_cmos_sensor(0x89, 0xc0);\r
2059 HI708_write_cmos_sensor(0x8A, 0x3e);//60HZ\r
2060\r
2061 HI708_write_cmos_sensor(0x18, 0x30);\r
2062 HI708_write_cmos_sensor(0x10, 0x8c);\r
2063 }\r
2064 break;\r
2065 default:\r
2066 {\r
2067 HI708_write_cmos_sensor(0x03,0x20);\r
2068 HI708_write_cmos_sensor(0x10,0x1c);\r
2069 HI708_write_cmos_sensor(0x18,0x38);\r
2070 //BEGIN <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
2071 HI708_write_cmos_sensor(0x83, 0x01);\r
2072 HI708_write_cmos_sensor(0x84, 0xbc);\r
2073 HI708_write_cmos_sensor(0x85, 0x56);//15fps\r
2074 //END <> <20130922> <improve the camera experience that before to capture the next photo, the screen lighten instantly> panzaoyan \r
2075 HI708_write_cmos_sensor(0x88, 0x01);\r
2076 HI708_write_cmos_sensor(0x89, 0xbc);\r
2077 HI708_write_cmos_sensor(0x8A, 0x56);//50HZ\r
2078\r
2079 HI708_write_cmos_sensor(0x18, 0x30);\r
2080 HI708_write_cmos_sensor(0x10, 0x9c);\r
2081 }\r
2082 }\r
2083 \r
2084 return KAL_TRUE;\r
2085} /* HI708_set_param_banding */\r
2086\r
2087\r
2088\r
2089\r
2090/*************************************************************************\r
2091* FUNCTION\r
2092* HI708_set_param_exposure\r
2093*\r
2094* DESCRIPTION\r
2095* exposure setting.\r
2096*\r
2097* PARAMETERS\r
2098* none\r
2099*\r
2100* RETURNS\r
2101* None\r
2102*\r
2103* GLOBALS AFFECTED\r
2104*\r
2105*************************************************************************/\r
2106BOOL HI708_set_param_exposure(UINT16 para)\r
2107{\r
2108 SENSORDB("[Enter]HI708 set_param_exposure func:para = %d\n",para);\r
2109\r
2110 if(HI708_sensor.exposure == para) return KAL_TRUE;\r
2111\r
2112 spin_lock(&hi708_yuv_drv_lock);\r
2113 HI708_sensor.exposure = para;\r
2114 spin_unlock(&hi708_yuv_drv_lock);\r
2115\r
2116 HI708_write_cmos_sensor(0x03,0x10);\r
2117 HI708_write_cmos_sensor(0x12,HI708_read_cmos_sensor(0x12)|0x10);\r
2118 switch (para)\r
2119 {\r
2120 /*GIONEE: malp 20130625 add for CR00828155 start*/\r
2121 case AE_EV_COMP_20: //+2 EV\r
2122 HI708_write_cmos_sensor(0x40,0x30);\r
2123 break; \r
2124 /*GIONEE: malp 20130625 add for CR00828155 end*/\r
2125 case AE_EV_COMP_13: //+1.3 EV\r
2126 HI708_write_cmos_sensor(0x40,0x20);\r
2127 break; \r
2128 case AE_EV_COMP_10: //+1 EV\r
2129 HI708_write_cmos_sensor(0x40,0x15);\r
2130 break; \r
2131 case AE_EV_COMP_07: //+0.7 EV\r
2132 HI708_write_cmos_sensor(0x40,0x10);\r
2133 break; \r
2134 case AE_EV_COMP_03: // +0.3 EV \r
2135 HI708_write_cmos_sensor(0x40,0x05); \r
2136 break; \r
2137 case AE_EV_COMP_00: // +0 EV\r
2138 HI708_write_cmos_sensor(0x40,0x88);//90//96 wangc modified for reducing previewer brightness at 2012-10-24\r
2139\r
2140 break; \r
2141 case AE_EV_COMP_n03: // -0.3 EV\r
2142 HI708_write_cmos_sensor(0x40,0x95);//98//a3\r
2143 \r
2144 break; \r
2145 case AE_EV_COMP_n07: // -0.7 EV \r
2146 HI708_write_cmos_sensor(0x40,0xa0); \r
2147 break; \r
2148 case AE_EV_COMP_n10: //-1 EV\r
2149 HI708_write_cmos_sensor(0x40,0xa5);\r
2150 break;\r
2151 case AE_EV_COMP_n13: // -1.3 EV\r
2152 HI708_write_cmos_sensor(0x40,0xb0);\r
2153 break;\r
2154 /*GIONEE: malp 20130625 add for CR00828155 start*/\r
2155 case AE_EV_COMP_n20: //-2 EV\r
2156 HI708_write_cmos_sensor(0x40,0xc0);\r
2157 break;\r
2158 /*GIONEE: malp 20130625 add for CR00828155 end*/\r
2159 default:\r
2160 return FALSE;\r
2161 }\r
2162\r
2163 return TRUE; \r
2164} /* HI708_set_param_exposure */\r
2165\r
2166void HI708_set_AE_mode(UINT32 iPara)\r
2167{\r
2168 UINT8 temp_AE_reg = 0;\r
2169 SENSORDB("HI708_set_AE_mode = %d E \n",iPara);\r
2170 HI708_write_cmos_sensor(0x03,0x20);\r
2171 temp_AE_reg = HI708_read_cmos_sensor(0x10);\r
2172\r
2173 if (AE_MODE_OFF == iPara)\r
2174 {\r
2175 // turn off AEC/AGC\r
2176 HI708_write_cmos_sensor(0x10,temp_AE_reg &~ 0x10);\r
2177 } \r
2178 else\r
2179 {\r
2180 HI708_write_cmos_sensor(0x10,temp_AE_reg | 0x10);\r
2181 }\r
2182}\r
2183UINT32 HI708YUVSensorSetting(FEATURE_ID iCmd, UINT32 iPara)\r
2184{\r
2185 SENSORDB("[Enter]HI708YUVSensorSetting func:cmd = %d\n",iCmd);\r
2186\r
2187 switch (iCmd) \r
2188 {\r
2189 case FID_SCENE_MODE: //auto mode or night mode\r
6fa3eb70
S
2190 if (iPara == SCENE_MODE_OFF)//auto mode\r
2191 {\r
2192 HI708_night_mode(FALSE); \r
2193 }\r
2194 else if (iPara == SCENE_MODE_NIGHTSCENE)//night mode\r
2195 {\r
2196 HI708_night_mode(TRUE); \r
2197 } \r
6fa3eb70
S
2198 break; \r
2199 case FID_AWB_MODE:\r
2200 HI708_set_param_wb(iPara);\r
2201 break;\r
2202 case FID_COLOR_EFFECT:\r
2203 HI708_set_param_effect(iPara);\r
2204 break;\r
4b9e9796 2205 case FID_AE_EV: \r
6fa3eb70 2206 HI708_set_param_exposure(iPara);\r
6fa3eb70 2207 break;\r
4b9e9796 2208 case FID_AE_FLICKER: \r
6fa3eb70 2209 HI708_set_param_banding(iPara);\r
6fa3eb70
S
2210 break;\r
2211 case FID_ZOOM_FACTOR:\r
2212 spin_lock(&hi708_yuv_drv_lock);\r
2213 HI708_zoom_factor = iPara; \r
2214 spin_unlock(&hi708_yuv_drv_lock);\r
2215 break; \r
2216 case FID_AE_SCENE_MODE: \r
2217 HI708_set_AE_mode(iPara);\r
2218 break; \r
2219 default:\r
2220 break;\r
2221 }\r
2222 return TRUE;\r
2223} /* HI708YUVSensorSetting */\r
2224\r
2225UINT32 HI708YUVSetVideoMode(UINT16 u2FrameRate)\r
2226{\r
2227/* spin_lock(&hi708_yuv_drv_lock);\r
2228 HI708_sensor.MPEG4_Video_mode = KAL_TRUE;\r
2229 spin_unlock(&hi708_yuv_drv_lock);\r
2230 SENSORDB("[Enter]HI708 Set Video Mode:FrameRate= %d\n",u2FrameRate);\r
2231 SENSORDB("HI708_sensor.video_mode = %d\n",HI708_sensor.MPEG4_Video_mode);\r
2232\r
2233 // if(u2FrameRate == 30) u2FrameRate = 20;\r
2234 //u2FrameRate = 12;\r
2235 \r
2236 spin_lock(&hi708_yuv_drv_lock);\r
2237 HI708_sensor.fix_framerate = u2FrameRate * 10;\r
2238 spin_unlock(&hi708_yuv_drv_lock);\r
2239 \r
2240 if(HI708_sensor.fix_framerate <= 300 )\r
2241 {\r
2242 HI708_Fix_Video_Frame_Rate(HI708_sensor.fix_framerate); \r
2243 }\r
2244 else \r
2245 {\r
2246 SENSORDB("Wrong Frame Rate"); \r
2247 }\r
2248 \r
2249 return TRUE;\r
2250*/\r
2251}\r
2252\r
2253void HI708GetAFMaxNumFocusAreas(UINT32 *pFeatureReturnPara32)\r
2254{ \r
2255 *pFeatureReturnPara32 = 0; \r
2256 SENSORDB("HI708GetAFMaxNumFocusAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32);\r
2257}\r
2258\r
2259void HI708GetAEMaxNumMeteringAreas(UINT32 *pFeatureReturnPara32)\r
2260{ \r
2261 *pFeatureReturnPara32 = 0; \r
2262 SENSORDB("HI708GetAEMaxNumMeteringAreas *pFeatureReturnPara32 = %d\n", *pFeatureReturnPara32); \r
2263}\r
2264\r
2265void HI708GetExifInfo(UINT32 exifAddr)\r
2266{\r
2267 SENSOR_EXIF_INFO_STRUCT* pExifInfo = (SENSOR_EXIF_INFO_STRUCT*)exifAddr;\r
2268 pExifInfo->FNumber = 28;\r
2269 pExifInfo->AEISOSpeed = AE_ISO_100;\r
2270 pExifInfo->AWBMode = HI708_sensor.wb;\r
2271 pExifInfo->CapExposureTime = 0;\r
2272 pExifInfo->FlashLightTimeus = 0;\r
2273 pExifInfo->RealISOValue = AE_ISO_100;\r
2274}\r
2275\r
2276/*****add by zero *********/\r
2277UINT32 HI708SetTestPatternMode(kal_bool bEnable)\r
2278{\r
2279 printk("zero %s\n ",__func__);\r
2280 HI708_Set_Mirror_Flip(IMAGE_NORMAL);\r
2281}\r
2282/*******end*************/\r
2283\r
2284UINT32 HI708FeatureControl(MSDK_SENSOR_FEATURE_ENUM FeatureId,\r
2285 UINT8 *pFeaturePara,UINT32 *pFeatureParaLen)\r
2286{\r
2287 //UINT16 u2Temp = 0; \r
2288 UINT16 *pFeatureReturnPara16=(UINT16 *) pFeaturePara;\r
2289 UINT16 *pFeatureData16=(UINT16 *) pFeaturePara;\r
2290 UINT32 *pFeatureReturnPara32=(UINT32 *) pFeaturePara;\r
2291 UINT32 *pFeatureData32=(UINT32 *) pFeaturePara;\r
2292 MSDK_SENSOR_CONFIG_STRUCT *pSensorConfigData=(MSDK_SENSOR_CONFIG_STRUCT *) pFeaturePara;\r
2293 MSDK_SENSOR_REG_INFO_STRUCT *pSensorRegData=(MSDK_SENSOR_REG_INFO_STRUCT *) pFeaturePara;\r
2294 SENSORDB("HHL [Enter]:HI708 Feature Control func:FeatureId = %d\n",FeatureId);\r
2295\r
2296 switch (FeatureId)\r
2297 {\r
2298 case SENSOR_FEATURE_GET_RESOLUTION:\r
2299 *pFeatureReturnPara16++=HI708_IMAGE_SENSOR_FULL_WIDTH;\r
2300 *pFeatureReturnPara16=HI708_IMAGE_SENSOR_FULL_HEIGHT;\r
2301 *pFeatureParaLen=4;\r
2302 break;\r
2303 case SENSOR_FEATURE_GET_PERIOD:\r
2304 *pFeatureReturnPara16++=HI708_IMAGE_SENSOR_PV_WIDTH;//+HI708_sensor.pv_dummy_pixels;\r
2305 *pFeatureReturnPara16=HI708_IMAGE_SENSOR_PV_HEIGHT;//+HI708_sensor.pv_dummy_lines;\r
2306 *pFeatureParaLen=4;\r
2307 break;\r
2308 case SENSOR_FEATURE_GET_PIXEL_CLOCK_FREQ:\r
2309 //*pFeatureReturnPara32 = HI708_sensor_pclk/10;\r
2310 *pFeatureParaLen=4;\r
2311 break;\r
2312 case SENSOR_FEATURE_SET_ESHUTTER:\r
2313\r
2314 break;\r
2315 case SENSOR_FEATURE_SET_NIGHTMODE:\r
2316 HI708_night_mode((BOOL) *pFeatureData16);\r
2317 break;\r
2318 case SENSOR_FEATURE_SET_GAIN:\r
2319 break; \r
2320 case SENSOR_FEATURE_SET_FLASHLIGHT:\r
2321 break;\r
2322 case SENSOR_FEATURE_SET_ISP_MASTER_CLOCK_FREQ:\r
2323 break;\r
2324 case SENSOR_FEATURE_SET_REGISTER:\r
2325 HI708_write_cmos_sensor(pSensorRegData->RegAddr, pSensorRegData->RegData);\r
2326 break;\r
2327 case SENSOR_FEATURE_GET_REGISTER:\r
2328 pSensorRegData->RegData = HI708_read_cmos_sensor(pSensorRegData->RegAddr);\r
2329 break;\r
2330 case SENSOR_FEATURE_GET_CONFIG_PARA:\r
2331 memcpy(pSensorConfigData, &HI708SensorConfigData, sizeof(MSDK_SENSOR_CONFIG_STRUCT));\r
2332 *pFeatureParaLen=sizeof(MSDK_SENSOR_CONFIG_STRUCT);\r
2333 break;\r
2334 case SENSOR_FEATURE_SET_CCT_REGISTER:\r
2335 case SENSOR_FEATURE_GET_CCT_REGISTER:\r
2336 case SENSOR_FEATURE_SET_ENG_REGISTER:\r
2337 case SENSOR_FEATURE_GET_ENG_REGISTER:\r
2338 case SENSOR_FEATURE_GET_REGISTER_DEFAULT:\r
2339 case SENSOR_FEATURE_CAMERA_PARA_TO_SENSOR:\r
2340 case SENSOR_FEATURE_SENSOR_TO_CAMERA_PARA:\r
2341 case SENSOR_FEATURE_GET_GROUP_INFO:\r
2342 case SENSOR_FEATURE_GET_ITEM_INFO:\r
2343 case SENSOR_FEATURE_SET_ITEM_INFO:\r
2344 case SENSOR_FEATURE_GET_ENG_INFO:\r
2345 break;\r
2346 case SENSOR_FEATURE_GET_GROUP_COUNT:\r
2347 // *pFeatureReturnPara32++=0;\r
2348 //*pFeatureParaLen=4;\r
2349 break; \r
2350\r
2351 case SENSOR_FEATURE_GET_LENS_DRIVER_ID:\r
2352 // get the lens driver ID from EEPROM or just return LENS_DRIVER_ID_DO_NOT_CARE\r
2353 // if EEPROM does not exist in camera module.\r
2354 *pFeatureReturnPara32=LENS_DRIVER_ID_DO_NOT_CARE;\r
2355 *pFeatureParaLen=4;\r
2356 break;\r
2357 case SENSOR_FEATURE_SET_YUV_CMD:\r
2358 HI708YUVSensorSetting((FEATURE_ID)*pFeatureData32, *(pFeatureData32+1));\r
2359 break; \r
2360 case SENSOR_FEATURE_SET_VIDEO_MODE:\r
2361 HI708YUVSetVideoMode(*pFeatureData16);\r
2362 break; \r
2363 case SENSOR_FEATURE_CHECK_SENSOR_ID:\r
2364 HI708_GetSensorID(pFeatureData32); \r
2365 break; \r
2366 case SENSOR_FEATURE_GET_AF_MAX_NUM_FOCUS_AREAS:\r
2367 HI708GetAFMaxNumFocusAreas(pFeatureReturnPara32); \r
2368 *pFeatureParaLen=4;\r
2369 break; \r
2370 case SENSOR_FEATURE_GET_AE_MAX_NUM_METERING_AREAS:\r
2371 HI708GetAEMaxNumMeteringAreas(pFeatureReturnPara32); \r
2372 *pFeatureParaLen=4;\r
2373 break; \r
2374 case SENSOR_FEATURE_GET_EXIF_INFO:\r
2375 SENSORDB("SENSOR_FEATURE_GET_EXIF_INFO\n");\r
2376 SENSORDB("EXIF addr = 0x%x\n",*pFeatureData32); \r
2377 HI708GetExifInfo(*pFeatureData32);\r
2378 break; \r
2379 case SENSOR_FEATURE_SET_TEST_PATTERN: \r
2380 HI708SetTestPatternMode((BOOL)*pFeatureData16); //add by zero \r
2381 break; \r
2382 default:\r
2383 break; \r
2384 }\r
2385 return ERROR_NONE;\r
2386} /* HI708FeatureControl() */\r
2387\r
2388\r
2389SENSOR_FUNCTION_STRUCT SensorFuncHI708=\r
2390{\r
2391 HI708Open,\r
2392 HI708GetInfo,\r
2393 HI708GetResolution,\r
2394 HI708FeatureControl,\r
2395 HI708Control,\r
2396 HI708Close\r
2397};\r
2398\r
2399UINT32 HI708_YUV_SensorInit(PSENSOR_FUNCTION_STRUCT *pfFunc)\r
2400{\r
2401\r
2402 /* To Do : Check Sensor status here */\r
2403 if (pfFunc!=NULL)\r
2404 *pfFunc=&SensorFuncHI708;\r
2405\r
2406 return ERROR_NONE;\r
2407} /* SensorInit() */\r
2408\r
2409\r