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