• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2022 Beken Corporation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include <driver/int.h>
16 #include <os/mem.h>
17 #include <driver/gpio.h>
18 #include <driver/gpio_types.h>
19 #include <driver/jpeg_enc.h>
20 #include <driver/jpeg_enc_types.h>
21 #include <driver/dvp_camera.h>
22 #include <driver/dvp_camera_types.h>
23 
24 #include <driver/i2c.h>
25 
26 #define GC0328C_WRITE_ADDRESS (0x42)
27 #define GC0328C_READ_ADDRESS (0x43)
28 #define GC0328C_CHIP_ID (0x9D)
29 
30 #define TAG "gc0328c"
31 #define LOGI(...) BK_LOGI(TAG, ##__VA_ARGS__)
32 
33 
34 #define SENSOR_I2C_RERAD(reg, value)  cb->read_uint8((GC0328C_WRITE_ADDRESS >> 1), reg, value)
35 #define SENSOR_I2C_WRITE(reg, value)  cb->write_uint8((GC0328C_WRITE_ADDRESS >> 1), reg, value)
36 
37 // gc0328c_DEV
38 const uint8_t sensor_gc0328c_init_talbe[][2] =
39 {
40 	{0xFE, 0x80},
41 	{0xFE, 0x80},
42 	{0xFC, 0x16},
43 	{0xFC, 0x16},
44 	{0xFC, 0x16},
45 	{0xFC, 0x16},
46 	{0xF1, 0x00},
47 	{0xF2, 0x00},
48 	{0xFE, 0x00},
49 	{0x4F, 0x00},
50 	{0x03, 0x00},
51 	{0x04, 0xC0},
52 	{0x42, 0x00},
53 	{0x77, 0x5A},
54 	{0x78, 0x40},
55 	{0x79, 0x56},
56 	{0xFE, 0x00},
57 	{0x0D, 0x01},
58 	{0x0E, 0xE8},//480 + 8
59 	{0x0F, 0x02},
60 	{0x10, 0x88},//640 + 8
61 	{0x09, 0x00},
62 	{0x0A, 0x00},
63 	{0x0B, 0x00},
64 	{0x0C, 0x00},
65 	{0x16, 0x00},
66 	{0x17, 0x14},
67 	{0x18, 0x0E},
68 	{0x19, 0x06},
69 	{0x1B, 0x48},
70 	{0x1F, 0xC8},
71 	{0x20, 0x01},
72 	{0x21, 0x78},
73 	{0x22, 0xB0},
74 	{0x23, 0x04},
75 	{0x24, 0x16},
76 	{0x26, 0x00},
77 	{0x50, 0x01},
78 	{0x70, 0x45},
79 	{0x05, 0x00},
80 	{0x06, 0xDE},
81 	{0x07, 0x00},
82 	{0x08, 0xA7},
83 	{0xFE, 0x01},
84 	{0x29, 0x00},
85 	{0x2A, 0x83},
86 	{0x2B, 0x02},
87 	{0x2C, 0x8F},
88 	{0x2D, 0x02},
89 	{0x2E, 0x8F},
90 	{0x2F, 0x02},
91 	{0x30, 0x8F},
92 	{0x31, 0x02},
93 	{0x32, 0x8F},
94 	{0xFE, 0x00},
95 	{0xFE, 0x01},
96 	{0x50, 0x00},
97 	{0x4F, 0x00},
98 	{0x4C, 0x01},
99 	{0x4F, 0x00},
100 	{0x4F, 0x00},
101 	{0x4F, 0x00},
102 	{0x4F, 0x00},
103 	{0x4F, 0x00},
104 	{0x4D, 0x30},
105 	{0x4E, 0x04},
106 	{0x4E, 0x04},
107 	{0x4E, 0x04},
108 	{0x4E, 0x04},
109 	{0x4E, 0x04},
110 	{0x4E, 0x04},
111 	{0x4E, 0x04},
112 	{0x4E, 0x04},
113 	{0x4E, 0x04},
114 	{0x4E, 0x04},
115 	{0x4E, 0x04},
116 	{0x4E, 0x04},
117 	{0x4E, 0x04},
118 	{0x4E, 0x04},
119 	{0x4E, 0x04},
120 	{0x4E, 0x04},
121 	{0x4D, 0x40},
122 	{0x4E, 0x04},
123 	{0x4E, 0x04},
124 	{0x4E, 0x04},
125 	{0x4E, 0x04},
126 	{0x4E, 0x04},
127 	{0x4E, 0x04},
128 	{0x4E, 0x04},
129 	{0x4E, 0x04},
130 	{0x4E, 0x04},
131 	{0x4E, 0x04},
132 	{0x4E, 0x04},
133 	{0x4E, 0x04},
134 	{0x4E, 0x04},
135 	{0x4E, 0x04},
136 	{0x4E, 0x04},
137 	{0x4E, 0x04},
138 	{0x4D, 0x50},
139 	{0x4E, 0x04},
140 	{0x4E, 0x04},
141 	{0x4E, 0x04},
142 	{0x4E, 0x04},
143 	{0x4E, 0x04},
144 	{0x4E, 0x04},
145 	{0x4E, 0x04},
146 	{0x4E, 0x04},
147 	{0x4E, 0x04},
148 	{0x4E, 0x04},
149 	{0x4E, 0x04},
150 	{0x4E, 0x04},
151 	{0x4E, 0x04},
152 	{0x4E, 0x04},
153 	{0x4E, 0x04},
154 	{0x4E, 0x04},
155 	{0x4D, 0x60},
156 	{0x4E, 0x04},
157 	{0x4E, 0x04},
158 	{0x4E, 0x04},
159 	{0x4E, 0x04},
160 	{0x4E, 0x04},
161 	{0x4E, 0x04},
162 	{0x4E, 0x04},
163 	{0x4E, 0x04},
164 	{0x4E, 0x04},
165 	{0x4E, 0x04},
166 	{0x4E, 0x04},
167 	{0x4E, 0x04},
168 	{0x4E, 0x04},
169 	{0x4E, 0x04},
170 	{0x4E, 0x04},
171 	{0x4E, 0x04},
172 	{0x4D, 0x70},
173 	{0x4E, 0x04},
174 	{0x4E, 0x04},
175 	{0x4E, 0x04},
176 	{0x4E, 0x04},
177 	{0x4E, 0x04},
178 	{0x4E, 0x04},
179 	{0x4E, 0x04},
180 	{0x4E, 0x04},
181 	{0x4E, 0x04},
182 	{0x4E, 0x04},
183 	{0x4E, 0x04},
184 	{0x4E, 0x04},
185 	{0x4E, 0x04},
186 	{0x4E, 0x04},
187 	{0x4E, 0x04},
188 	{0x4E, 0x04},
189 	{0x4F, 0x01},
190 	{0x50, 0x88},
191 	{0xFE, 0x00},
192 	{0xFE, 0x00},
193 	{0x27, 0xB7},
194 	{0x28, 0x7F},
195 	{0x29, 0x20},
196 	{0x33, 0x20},
197 	{0x34, 0x20},
198 	{0x35, 0x20},
199 	{0x36, 0x20},
200 	{0x32, 0x08},
201 	{0x3B, 0x00},
202 	{0x3C, 0x00},
203 	{0x3D, 0x00},
204 	{0x3E, 0x00},
205 	{0x47, 0x00},
206 	{0x48, 0x00},
207 	{0x40, 0x7F},
208 	{0x41, 0x26},
209 	{0x42, 0xFB},
210 	{0x44, 0x02},
211 	{0x45, 0x00},
212 	{0x46, 0x03},
213 	{0x4F, 0x01},
214 	{0x4B, 0x01},
215 	{0x50, 0x01},
216 	{0x7E, 0x0A},
217 	{0x7F, 0x03},
218 	{0x81, 0x15},
219 	{0x82, 0x90},
220 	{0x83, 0x02},
221 	{0x84, 0xE5},
222 	{0x90, 0x2C},
223 	{0x92, 0x02},
224 	{0x94, 0x02},
225 	{0x95, 0x35},
226 	{0xD1, 0x24},
227 	{0xD2, 0x24},
228 	{0xD3, 0x40},
229 	{0xDD, 0xD3},
230 	{0xDE, 0x38},
231 	{0xE4, 0x88},
232 	{0xE5, 0x40},
233 	{0xD7, 0x0E},
234 	{0xFE, 0x00},
235 	{0xBF, 0x0E},
236 	{0xC0, 0x1C},
237 	{0xC1, 0x34},
238 	{0xC2, 0x48},
239 	{0xC3, 0x5A},
240 	{0xC4, 0x6E},
241 	{0xC5, 0x80},
242 	{0xC6, 0x9C},
243 	{0xC7, 0xB4},
244 	{0xC8, 0xC7},
245 	{0xC9, 0xD7},
246 	{0xCA, 0xE3},
247 	{0xCB, 0xED},
248 	{0xCC, 0xF2},
249 	{0xCD, 0xF8},
250 	{0xCE, 0xFD},
251 	{0xCF, 0xFF},
252 	{0xFE, 0x00},
253 	{0x63, 0x00},
254 	{0x64, 0x05},
255 	{0x65, 0x0B},
256 	{0x66, 0x19},
257 	{0x67, 0x2E},
258 	{0x68, 0x40},
259 	{0x69, 0x54},
260 	{0x6A, 0x66},
261 	{0x6B, 0x86},
262 	{0x6C, 0xA7},
263 	{0x6D, 0xC6},
264 	{0x6E, 0xE4},
265 	{0x6F, 0xFF},
266 	{0xFE, 0x01},
267 	{0x18, 0x02},
268 	{0xFE, 0x00},
269 	{0x97, 0x30},
270 	{0x98, 0x00},
271 	{0x9B, 0x60},
272 	{0x9C, 0x60},
273 	{0xA4, 0x50},
274 	{0xA8, 0x80},
275 	{0xAA, 0x40},
276 	{0xA2, 0x23},
277 	{0xAD, 0x28},
278 	{0xFE, 0x01},
279 	{0x9C, 0x00},
280 	{0x9E, 0xC0},
281 	{0x9F, 0x40},
282 	{0xFE, 0x01},
283 	{0x08, 0xA0},
284 	{0x09, 0xE8},
285 	{0x10, 0x08},
286 	{0x11, 0x21},
287 	{0x12, 0x11},
288 	{0x13, 0x45},
289 	{0x15, 0xFC},
290 	{0x18, 0x02},
291 	{0x21, 0xF0},
292 	{0x22, 0x60},
293 	{0x23, 0x30},
294 	{0x25, 0x00},
295 	{0x24, 0x14},
296 	{0x3D, 0x80},
297 	{0x3E, 0x40},
298 	{0xFE, 0x01},
299 	{0x51, 0x88},
300 	{0x52, 0x12},
301 	{0x53, 0x80},
302 	{0x54, 0x60},
303 	{0x55, 0x01},
304 	{0x56, 0x02},
305 	{0x58, 0x00},
306 	{0x5B, 0x02},
307 	{0x5E, 0xA4},
308 	{0x5F, 0x8A},
309 	{0x61, 0xDC},
310 	{0x62, 0xDC},
311 	{0x70, 0xFC},
312 	{0x71, 0x10},
313 	{0x72, 0x10},
314 	{0x73, 0x20},
315 	{0x74, 0x20},
316 	{0x75, 0x01},
317 	{0x76, 0x00},
318 	{0x77, 0x40},
319 	{0x78, 0x70},
320 	{0x79, 0x00},
321 	{0x7B, 0x00},
322 	{0x7C, 0x71},
323 	{0x7D, 0x00},
324 	{0x80, 0x70},
325 	{0x81, 0x58},
326 	{0x82, 0x98},
327 	{0x83, 0x60},
328 	{0x84, 0x58},
329 	{0x85, 0x50},
330 	{0xFE, 0x00},
331 	{0xFE, 0x01},
332 	{0xC0, 0x10},
333 	{0xC1, 0x0C},
334 	{0xC2, 0x0A},
335 	{0xC6, 0x0E},
336 	{0xC7, 0x0B},
337 	{0xC8, 0x0A},
338 	{0xBA, 0x26},
339 	{0xBB, 0x1C},
340 	{0xBC, 0x1D},
341 	{0xB4, 0x23},
342 	{0xB5, 0x1C},
343 	{0xB6, 0x1A},
344 	{0xC3, 0x00},
345 	{0xC4, 0x00},
346 	{0xC5, 0x00},
347 	{0xC9, 0x00},
348 	{0xCA, 0x00},
349 	{0xCB, 0x00},
350 	{0xBD, 0x00},
351 	{0xBE, 0x00},
352 	{0xBF, 0x00},
353 	{0xB7, 0x07},
354 	{0xB8, 0x05},
355 	{0xB9, 0x05},
356 	{0xA8, 0x07},
357 	{0xA9, 0x06},
358 	{0xAA, 0x00},
359 	{0xAB, 0x04},
360 	{0xAC, 0x00},
361 	{0xAD, 0x02},
362 	{0xAE, 0x0D},
363 	{0xAF, 0x05},
364 	{0xB0, 0x00},
365 	{0xB1, 0x07},
366 	{0xB2, 0x03},
367 	{0xB3, 0x00},
368 	{0xA4, 0x00},
369 	{0xA5, 0x00},
370 	{0xA6, 0x00},
371 	{0xA7, 0x00},
372 	{0xA1, 0x3C},
373 	{0xA2, 0x50},
374 	{0xFE, 0x00},
375 	{0xB1, 0x12},
376 	{0xB2, 0xF5},
377 	{0xB3, 0xFE},
378 	{0xB4, 0xE0},
379 	{0xB5, 0x15},
380 	{0xB6, 0xC8},
381 	{0xFE, 0x01},
382 	{0x50, 0x00},
383 	{0xFE, 0x01},
384 	{0x4F, 0x00},
385 	{0x4C, 0x01},
386 	{0x4F, 0x00},
387 	{0x4F, 0x00},
388 	{0x4F, 0x00},
389 	{0x4D, 0x34},
390 	{0x4E, 0x04},
391 	{0x4E, 0x04},
392 	{0x4E, 0x02},
393 	{0x4E, 0x02},
394 	{0x4D, 0x44},
395 	{0x4E, 0x04},
396 	{0x4E, 0x04},
397 	{0x4E, 0x04},
398 	{0x4D, 0x53},
399 	{0x4E, 0x08},
400 	{0x4E, 0x08},
401 	{0x4E, 0x04},
402 	{0x4E, 0x04},
403 	{0x4D, 0x65},
404 	{0x4E, 0x04},
405 	{0x4D, 0x73},
406 	{0x4E, 0x20},
407 	{0x4D, 0x83},
408 	{0x4E, 0x20},
409 	{0x4F, 0x01},
410 	{0x50, 0x88},
411 	{0xFE, 0x10},
412 	//  {0xFE, 0x00},
413 	{0xF1, 0x07},
414 	{0xF2, 0x01},
415 	{0xFE, 0x00},
416 };
417 
418 const uint8_t sensor_gc0328c_5pfs_talbe[][2] =
419 {
420 	// all AEC_EXP_LEVEL_X set to 0xa3c = 2620
421 	{0xFE, 0x01}, // page p1
422 
423 	{0x2B, 0x0a}, // AEC_EXP_LEVEL_0 [11:8]
424 	{0x2C, 0x3c}, // AEC_EXP_LEVEL_0 [7:0]
425 
426 	{0x2D, 0x0a}, // AEC_EXP_LEVEL_1
427 	{0x2E, 0x3c},
428 
429 	{0x2F, 0x0a}, // AEC_EXP_LEVEL_2
430 	{0x30, 0x3c},
431 
432 	{0x31, 0x0a}, // AEC_EXP_LEVEL_3
433 	{0x32, 0x3c},
434 
435 	//{0x33,0x2a},  // AEC_EXP_MIN
436 	//{0x34,0x3c},
437 };
438 
439 const uint8_t sensor_gc0328c_10pfs_talbe[][2] =
440 {
441 	// all AEC_EXP_LEVEL_X set to 0x51e = 1310
442 	{0xFE, 0x01}, // page p1
443 
444 	{0x2B, 0x05}, // AEC_EXP_LEVEL_0 [11:8]
445 	{0x2C, 0x1e}, // AEC_EXP_LEVEL_0 [7:0]
446 
447 	{0x2D, 0x05}, // AEC_EXP_LEVEL_1
448 	{0x2E, 0x1e},
449 
450 	{0x2F, 0x05}, // AEC_EXP_LEVEL_2
451 	{0x30, 0x1e},
452 
453 	{0x31, 0x05}, // AEC_EXP_LEVEL_3
454 	{0x32, 0x1e},
455 
456 	//{0x33,0x25},  // // AEC_EXP_MIN
457 	//{0x34,0x1e},
458 };
459 
460 const uint8_t sensor_gc0328c_20pfs_talbe[][2] =
461 {
462 	// all AEC_EXP_LEVEL_X set to 0x28f = 655
463 	{0xFE, 0x01}, // page p1
464 
465 	{0x2B, 0x02}, // AEC_EXP_LEVEL_0 [11:8]
466 	{0x2C, 0x8f}, // AEC_EXP_LEVEL_0 [7:0]
467 
468 	{0x2D, 0x02}, // AEC_EXP_LEVEL_1
469 	{0x2E, 0x8f},
470 
471 	{0x2F, 0x02}, // AEC_EXP_LEVEL_2
472 	{0x30, 0x8f},
473 
474 	{0x31, 0x02}, // AEC_EXP_LEVEL_3
475 	{0x32, 0x8f},
476 
477 	//{0x33,0x22},  // // AEC_EXP_MIN
478 	//{0x34,0x8f},
479 };
480 
481 const uint8_t sensor_gc0328c_25pfs_talbe[][2] =
482 {
483 	{0x05, 0x01},
484 	{0x06, 0x0a},
485 	{0x07, 0x00},
486 	{0x08, 0x0c},
487 	{0xFE, 0x01},
488 	{0x29, 0x00},
489 	{0x2A, 0x7d},
490 	{0x2B, 0x01},
491 	{0x2C, 0xf4},
492 	{0x2D, 0x01},
493 	{0x2E, 0xf4},
494 	{0x2F, 0x01},
495 	{0x30, 0xf4},
496 	{0x31, 0x01},
497 	{0x32, 0xf4},
498 };
499 
500 const uint8_t sensor_gc0328c_30pfs_talbe[][2] =
501 {
502 	{0x05, 0x00},
503 	{0x06, 0x6a},
504 	{0x07, 0x00},
505 	{0x08, 0x0c},
506 	{0xFE, 0x01},
507 	{0x29, 0x00},
508 	{0x2A, 0x96},
509 	{0x2B, 0x01},
510 	{0x2C, 0xc2},
511 	{0x2D, 0x01},
512 	{0x2E, 0xc2},
513 	{0x2F, 0x01},
514 	{0x30, 0xc2},
515 	{0x31, 0x01},
516 	{0x32, 0xc2},
517 };
518 
519 const uint8_t sensor_gc0328c_WQVGA_480_272_talbe[][2] =
520 {
521 #if (GC_QVGA_USE_SUBSAMPLE == 1)
522 	{0xFE, 0x00},
523 	{0x59, 0x11},
524 #endif
525 
526 	{0xFE, 0x00},
527 	{0x50, 0x01},
528 	{0x51, 0x00},
529 	{0x52, 0x00},
530 	{0x53, 0x00},
531 	{0x54, 0x00},
532 
533 	{0x55, 0x01},
534 	{0x56, 0x10},
535 	{0x57, 0x01},
536 	{0x58, 0xe0},
537 };
538 
539 const uint8_t sensor_gc0328c_QVGA_320_240_talbe[][2] =
540 {
541 #if (GC_QVGA_USE_SUBSAMPLE == 0) // crop window mode
542 	{0xFE, 0x00},
543 	{0x50, 0x01},
544 	{0x51, 0x00},
545 	{0x52, 0x78},
546 	{0x53, 0x00},
547 	{0x54, 0xa0},
548 
549 	{0x55, 0x00},
550 	{0x56, 0xf0},
551 	{0x57, 0x01},
552 	{0x58, 0x40},
553 #else
554 	// subsample mode
555 	{0xFE, 0x00},
556 	{0x59, 0x22},
557 
558 	{0xFE, 0x00},
559 	{0x50, 0x01},
560 	{0x51, 0x00},
561 	{0x52, 0x00},
562 	{0x53, 0x00},
563 	{0x54, 0x00},
564 #endif
565 
566 	{0x55, 0x00},
567 	{0x56, 0xf0},
568 	{0x57, 0x01},
569 	{0x58, 0x40},
570 };
571 
572 const uint8_t sensor_gc0328c_VGA_320_480_talbe[][2] =
573 {
574 #if (GC_QVGA_USE_SUBSAMPLE == 1)
575 	{0xFE, 0x00},
576 	{0x59, 0x11},
577 #endif
578 
579 	{0xFE, 0x00},
580 	{0x50, 0x01},
581 	{0x51, 0x00},
582 	{0x52, 0x00},
583 	{0x53, 0x00},
584 	{0x54, 0x00},
585 
586 	{0x55, 0x01},
587 	{0x56, 0xe0},
588 	{0x57, 0x01},
589 	{0x58, 0x40},
590 };
591 
592 const uint8_t sensor_gc0328c_VGA_480_320_talbe[][2] =
593 {
594 #if (GC_QVGA_USE_SUBSAMPLE == 1)
595 	{0xFE, 0x00},
596 	{0x59, 0x11},
597 #endif
598 
599 	{0xFE, 0x00},
600 	{0x50, 0x01},
601 	{0x51, 0x00},
602 	{0x52, 0x00},
603 	{0x53, 0x00},
604 	{0x54, 0x00},
605 
606 	{0x55, 0x01},
607 	{0x56, 0x40},
608 	{0x57, 0x01},
609 	{0x58, 0xe0},
610 };
611 
612 
613 const uint8_t sensor_gc0328c_VGA_640_480_talbe[][2] =
614 {
615 #if (GC_QVGA_USE_SUBSAMPLE == 1)
616 	{0xFE, 0x00},
617 	{0x59, 0x11},
618 #endif
619 
620 	{0xFE, 0x00},
621 	{0x50, 0x01},
622 	{0x51, 0x00},
623 	{0x52, 0x00},
624 	{0x53, 0x00},
625 	{0x54, 0x00},
626 
627 	{0x55, 0x01},
628 	{0x56, 0xe0},
629 	{0x57, 0x02},
630 	{0x58, 0x80},
631 };
632 
633 
gc0328c_detect(const dvp_camera_i2c_callback_t * cb)634 bool gc0328c_detect(const dvp_camera_i2c_callback_t *cb)
635 {
636 	uint8_t data = 0;
637 
638 	SENSOR_I2C_RERAD(0xF0, &data);
639 
640 	LOGI("%s, id: 0x%02X\n", __func__, data);
641 
642 	if (data == GC0328C_CHIP_ID)
643 	{
644 		LOGI("%s success\n", __func__);
645 		return true;
646 	}
647 
648 	return false;
649 }
650 
651 
gc0328c_init(const dvp_camera_i2c_callback_t * cb)652 int gc0328c_init(const dvp_camera_i2c_callback_t *cb)
653 {
654 	uint32_t size = sizeof(sensor_gc0328c_init_talbe) / 2, i;
655 
656 	LOGI("%s\n", __func__);
657 
658 	for (i = 0; i < size; i++)
659 	{
660 		SENSOR_I2C_WRITE(sensor_gc0328c_init_talbe[i][0], sensor_gc0328c_init_talbe[i][1]);
661 	}
662 
663 	return 0;
664 }
665 
666 
gc0328c_set_ppi(const dvp_camera_i2c_callback_t * cb,media_ppi_t ppi)667 int gc0328c_set_ppi(const dvp_camera_i2c_callback_t *cb, media_ppi_t ppi)
668 {
669 	uint32_t size, i;
670 	int ret = -1;
671 
672 	LOGI("%s\n", __func__);
673 
674 	switch (ppi)
675 	{
676 		case PPI_320X240:
677 		{
678 			size = sizeof(sensor_gc0328c_QVGA_320_240_talbe) / 2;
679 
680 			for (i = 0; i < size; i++)
681 			{
682 				SENSOR_I2C_WRITE(sensor_gc0328c_QVGA_320_240_talbe[i][0],
683 				                 sensor_gc0328c_QVGA_320_240_talbe[i][1]);
684 			}
685 
686 			ret = 0;
687 		}
688 		break;
689 		case PPI_320X480:
690 		{
691 			size = sizeof(sensor_gc0328c_VGA_320_480_talbe) / 2;
692 
693 			for (i = 0; i < size; i++)
694 			{
695 				SENSOR_I2C_WRITE(sensor_gc0328c_VGA_320_480_talbe[i][0],
696 				                 sensor_gc0328c_VGA_320_480_talbe[i][1]);
697 			}
698 
699 			ret = 0;
700 		}
701 		break;
702 
703 		case PPI_480X272:
704 		{
705 			size = sizeof(sensor_gc0328c_WQVGA_480_272_talbe) / 2;
706 
707 			for (i = 0; i < size; i++)
708 			{
709 				SENSOR_I2C_WRITE(sensor_gc0328c_WQVGA_480_272_talbe[i][0],
710 				                 sensor_gc0328c_WQVGA_480_272_talbe[i][1]);
711 			}
712 
713 			ret = 0;
714 		}
715 		break;
716 
717 		case PPI_480X320:
718 		{
719 			size = sizeof(sensor_gc0328c_VGA_480_320_talbe) / 2;
720 
721 			for (i = 0; i < size; i++)
722 			{
723 				SENSOR_I2C_WRITE(sensor_gc0328c_VGA_480_320_talbe[i][0],
724 				                 sensor_gc0328c_VGA_480_320_talbe[i][1]);
725 			}
726 
727 			ret = 0;
728 		}
729 		break;
730 
731 		case PPI_640X480:
732 		{
733 			size = sizeof(sensor_gc0328c_VGA_640_480_talbe) / 2;
734 
735 			for (i = 0; i < size; i++)
736 			{
737 				SENSOR_I2C_WRITE(sensor_gc0328c_VGA_640_480_talbe[i][0],
738 				                 sensor_gc0328c_VGA_640_480_talbe[i][1]);
739 			}
740 
741 			ret = 0;
742 		}
743 		break;
744 
745 		case PPI_800X600:
746 		case PPI_1280X720:
747 		default:
748 			break;
749 
750 	}
751 
752 	return ret;
753 }
754 
gc0328c_set_fps(const dvp_camera_i2c_callback_t * cb,sensor_fps_t fps)755 int gc0328c_set_fps(const dvp_camera_i2c_callback_t *cb, sensor_fps_t fps)
756 {
757 	uint32_t size, i;
758 	int ret = -1;
759 
760 	LOGI("%s\n", __func__);
761 
762 	switch (fps)
763 	{
764 		case FPS5:
765 		{
766 			size = sizeof(sensor_gc0328c_5pfs_talbe) / 2;
767 
768 			for (i = 0; i < size; i++)
769 			{
770 				SENSOR_I2C_WRITE(sensor_gc0328c_5pfs_talbe[i][0],
771 				                 sensor_gc0328c_5pfs_talbe[i][1]);
772 			}
773 
774 			ret = 0;
775 		}
776 		break;
777 		case FPS10:
778 		{
779 			size = sizeof(sensor_gc0328c_10pfs_talbe) / 2;
780 
781 			for (i = 0; i < size; i++)
782 			{
783 				SENSOR_I2C_WRITE(sensor_gc0328c_10pfs_talbe[i][0],
784 				                 sensor_gc0328c_10pfs_talbe[i][1]);
785 			}
786 
787 			ret = 0;
788 		}
789 		break;
790 		case FPS15:
791 			break;
792 		case FPS20:
793 		{
794 			size = sizeof(sensor_gc0328c_20pfs_talbe) / 2;
795 
796 			for (i = 0; i < size; i++)
797 			{
798 				SENSOR_I2C_WRITE(sensor_gc0328c_20pfs_talbe[i][0],
799 				                 sensor_gc0328c_20pfs_talbe[i][1]);
800 			}
801 
802 			ret = 0;
803 		}
804 		break;
805 		case FPS25:
806 		{
807 			size = sizeof(sensor_gc0328c_25pfs_talbe) / 2;
808 
809 			for (i = 0; i < size; i++)
810 			{
811 				SENSOR_I2C_WRITE(sensor_gc0328c_25pfs_talbe[i][0],
812 				                 sensor_gc0328c_25pfs_talbe[i][1]);
813 			}
814 
815 			ret = 0;
816 		}
817 		break;
818 		case FPS30:
819 		{
820 			size = sizeof(sensor_gc0328c_30pfs_talbe) / 2;
821 
822 			for (i = 0; i < size; i++)
823 			{
824 				SENSOR_I2C_WRITE(sensor_gc0328c_30pfs_talbe[i][0],
825 				                 sensor_gc0328c_30pfs_talbe[i][1]);
826 			}
827 
828 			ret = 0;
829 		}
830 		break;
831 	}
832 
833 	return ret;
834 }
835 
836 
837 const dvp_sensor_config_t dvp_sensor_gc0328c =
838 {
839 	.name = "gc0328c",
840 	.clk = JPEG_96M_MCLK_24M,
841 	/* default config */
842 	.def_ppi = PPI_640X480,
843 	.def_fps = FPS20,
844 	/* capability config */
845 	.fps_cap = FPS5 | FPS10 | FPS20 | FPS25 | FPS30,
846 	.ppi_cap = PPI_CAP_320X240 | PPI_CAP_320X480 | PPI_CAP_480X272 | PPI_CAP_640X480 | PPI_CAP_480X320,
847 	.id = ID_GC0328C,
848 	.address = (GC0328C_WRITE_ADDRESS >> 1),
849 	.init = gc0328c_init,
850 	.detect = gc0328c_detect,
851 	.set_ppi = gc0328c_set_ppi,
852 	.set_fps = gc0328c_set_fps,
853 };
854 
855