Sapphire SoC DS Sapphire SoC UG Sapphire HP SoC DS Sapphire HP SoC UG RISC-V Embedded IDE UG Board Support Package
Loading...
Searching...
No Matches
IMX708.c
Go to the documentation of this file.
1
2// Copyright (C) 2013-2026 Efinix Inc. All rights reserved.
3// Full license header bsp/efinix/EfxSapphireSocRV64/include/LICENSE.MD
5
6#include <stdio.h>
7#include "bsp.h"
8#include "cam/device/IMX708.h"
9
10
20
21/*----------------------------------------------------------------------------*/
22/* Register Definition */
23/*----------------------------------------------------------------------------*/
24
25#define IMX708_MODE_SELECT 0x0100
26#define IMX708_ACTIVE 0x01
27#define IMX708_SLEEP 0x00
28
29/* Default initial pixel rate, will get updated for each mode. */
30#define IMX708_cam_initIAL_PIXEL_RATE 590000000
31
32#define IMX708_REG_BASE_SPC_GAINS_L 0x7b10
33#define IMX708_REG_BASE_SPC_GAINS_R 0x7c00
34
35/* QBC Re-mosaic broken line correction registers */
36#define IMX708_LPF_INTENSITY_EN 0xC428
37#define IMX708_LPF_INTENSITY_ENABLED 0x00
38#define IMX708_LPF_INTENSITY_DISABLED 0x01
39#define IMX708_LPF_INTENSITY 0xC429
40
41/* Test Pattern Control */
42#define IMX708_REG_TEST_PATTERN 0x0600
43#define IMX708_TEST_PATTERN_DISABLE 0
44#define IMX708_TEST_PATTERN_SOLID_COLOR 1
45#define IMX708_TEST_PATTERN_COLOR_BARS 2
46#define IMX708_TEST_PATTERN_GREY_COLOR 3
47#define IMX708_TEST_PATTERN_PN9 4
48
49/* Test pattern colour components */
50#define IMX708_REG_TEST_PATTERN_R 0x0602
51#define IMX708_REG_TEST_PATTERN_GR 0x0604
52#define IMX708_REG_TEST_PATTERN_B 0x0606
53#define IMX708_REG_TEST_PATTERN_GB 0x0608
54#define IMX708_TEST_PATTERN_COLOUR_MIN 0
55#define IMX708_TEST_PATTERN_COLOUR_MAX 0x0fff
56#define IMX708_TEST_PATTERN_COLOUR_STEP 1
57
58#define IMX708_REG_BASE_SPC_GAINS_L 0x7b10
59#define IMX708_REG_BASE_SPC_GAINS_R 0x7c00
60
61/* HDR exposure ratio (long:med == med:short) */
62#define IMX708_HDR_EXPOSURE_RATIO 2
63#define IMX708_REG_MID_EXPOSURE 0x3116
64#define IMX708_REG_SHT_EXPOSURE 0x0224
65#define IMX708_REG_MID_ANALOG_GAIN 0x3118
66#define IMX708_REG_SHT_ANALOG_GAIN 0x0216
67
68/* Exposure control */
69#define IMX708_REG_EXPOSURE 0x0202
70#define IMX708_EXPOSURE_OFFSET 48
71#define IMX708_EXPOSURE_DEFAULT 0x640
72#define IMX708_EXPOSURE_STEP 1
73#define IMX708_EXPOSURE_MIN 1
74#define IMX708_EXPOSURE_MAX (IMX708_FRAME_LENGTH_MAX - IMX708_EXPOSURE_OFFSET)
75
76/* Analog gain control */
77#define IMX708_REG_ANALOG_GAIN 0x0204
78#define IMX708_ANA_GAIN_MIN 112
79#define IMX708_ANA_GAIN_MAX 960
80#define IMX708_ANA_GAIN_STEP 1
81#define IMX708_ANA_GAIN_DEFAULT IMX708_ANA_GAIN_MIN
82
83/* Digital gain control */
84#define IMX708_REG_DIGITAL_GAIN 0x020e
85#define IMX708_DGTL_GAIN_MIN 0x0100
86#define IMX708_DGTL_GAIN_MAX 0xffff
87#define IMX708_DGTL_GAIN_DEFAULT 0x0100
88#define IMX708_DGTL_GAIN_STEP 1
89
90
95
96static const struct imx708_reg mode_common_regs[] = {
97 {0x0100, 0x00},
98 {0x0136, 0x18},
99 {0x0137, 0x00},
100 {0x33F0, 0x02},
101 {0x33F1, 0x05},
102 {0x3062, 0x00},
103 {0x3063, 0x12},
104 {0x3068, 0x00},
105 {0x3069, 0x12},
106 {0x306A, 0x00},
107 {0x306B, 0x30},
108 {0x3076, 0x00},
109 {0x3077, 0x30},
110 {0x3078, 0x00},
111 {0x3079, 0x30},
112 {0x5E54, 0x0C},
113 {0x6E44, 0x00},
114 {0xB0B6, 0x01},
115 {0xE829, 0x00},
116 {0xF001, 0x08},
117 {0xF003, 0x08},
118 {0xF00D, 0x10},
119 {0xF00F, 0x10},
120 {0xF031, 0x08},
121 {0xF033, 0x08},
122 {0xF03D, 0x10},
123 {0xF03F, 0x10},
124 {0x0112, 0x0A},
125 {0x0113, 0x0A},
126 {0x0114, 0x01},
127 {0x0B8E, 0x01},
128 {0x0B8F, 0x00},
129 {0x0B94, 0x01},
130 {0x0B95, 0x00},
131 {0x3400, 0x01},
132 {0x3478, 0x01},
133 {0x3479, 0x1c},
134 {0x3091, 0x01},
135 {0x3092, 0x00},
136 {0x3419, 0x00},
137 {0xBCF1, 0x02},
138 {0x3094, 0x01},
139 {0x3095, 0x01},
140 {0x3362, 0x00},
141 {0x3363, 0x00},
142 {0x3364, 0x00},
143 {0x3365, 0x00},
144 {0x0138, 0x01},
145};
146
147static const struct imx708_reg mode_1920x1080_cropped_regs[] = {
148 {0x0342, 0x1D}, // LINE_LENGTH
149 {0x0343, 0x10}, // LINE_LENGTH
150
151 // 50 FPS
152// {0x0340, 0x06}, // FRAME_LENGTH
153// {0x0341, 0x40}, // FRAME_LENGTH
154
155 // 30 FPS
156 {0x0340, 0x0A}, // FRAME_LENGTH
157 {0x0341, 0x6B}, // FRAME_LENGTH
158
159 {0x0344, 0x00}, // X_ADD_STAR
160 {0x0345, 0x00}, // X_ADD_STAR
161 {0x0346, 0x00}, // Y_ADD_STAR
162 {0x0347, 0x00}, // Y_ADD_STAR
163 {0x0348, 0x11}, // X_ADD_END_A
164 {0x0349, 0xFF}, // X_ADD_END_A
165 {0x034A, 0X0A}, // Y_ADD_END_A
166 {0x034B, 0x1F}, // Y_ADD_END_A
167 {0x0220, 0x62},
168 {0x0222, 0x01},
169 {0x0900, 0x00},
170 {0x0901, 0x11},
171 {0x0902, 0x0A},
172 {0x3200, 0x01},
173 {0x3201, 0x01},
174 {0x32D5, 0x01},
175 {0x32D6, 0x00},
176 {0x32DB, 0x01},
177 {0x32DF, 0x00},
178 {0x350C, 0x00},
179 {0x350D, 0x00},
180 {0x0408, 0x00},
181 {0x0409, 0x00},
182 {0x040A, 0x00},
183 {0x040B, 0x00},
184 {0x040C, 0x07}, // X_OUTPUT_SIZE
185 {0x040D, 0x80}, // X_OUTPUT_SIZE
186 {0x040E, 0x04}, // Y_OUTPUT_SIZE
187 {0x040F, 0x38}, // Y_OUTPUT_SIZE
188 {0x034C, 0x07}, // X_OUTPUT_SIZE
189 {0x034D, 0x80}, // X_OUTPUT_SIZE
190 {0x034E, 0x04}, // Y_OUTPUT_SIZE
191 {0x034F, 0x38}, // Y_OUTPUT_SIZE
192 {0x0301, 0x05},
193 {0x0303, 0x02},
194 {0x0305, 0x02},
195 {0x0306, 0x00},
196 {0x0307, 0x7C},
197 {0x030B, 0x02},
198 {0x030D, 0x04},
199 {0x0310, 0x01},
200 {0x3CA0, 0x00},
201 {0x3CA1, 0x64},
202 {0x3CA4, 0x00},
203 {0x3CA5, 0x00},
204 {0x3CA6, 0x00},
205 {0x3CA7, 0x00},
206 {0x3CAA, 0x00},
207 {0x3CAB, 0x00},
208 {0x3CB8, 0x00},
209 {0x3CB9, 0x08},
210 {0x3CBA, 0x00},
211 {0x3CBB, 0x00},
212 {0x3CBC, 0x00},
213 {0x3CBD, 0x3C},
214 {0x3CBE, 0x00},
215 {0x3CBF, 0x00},
216 {0x0202, 0x03}, // EXPOSURE
217 {0x0203, 0x20}, // EXPOSURE
218 {0x0224, 0x01},
219 {0x0225, 0xF4},
220 {0x3116, 0x01},
221 {0x3117, 0xF4},
222 {0x0204, 0x03}, // ANALOGUE GAIN
223 {0x0205, 0x20}, // ANALOGUE GAIN
224 {0x0216, 0x00},
225 {0x0217, 0x00},
226 {0x0218, 0x01},
227 {0x0219, 0x00},
228 {0x020E, 0x03}, // DIGITAL GAIN
229 {0x020F, 0x00}, // DIGITAL GAIN
230 {0x3118, 0x00},
231 {0x3119, 0x00},
232 {0x311A, 0x01},
233 {0x311B, 0x00},
234 {0x341a, 0x00},
235 {0x341b, 0x00},
236 {0x341c, 0x00},
237 {0x341d, 0x00},
238 {0x341e, 0x01},
239 {0x341f, 0x20},
240 {0x3420, 0x00},
241 {0x3421, 0xd8},
242 {0x3366, 0x00},
243 {0x3367, 0x00},
244 {0x3368, 0x00},
245 {0x3369, 0x00},
246};
247
248static const struct imx708_reg mode_2x2binned_1920x1080_regs[] = {
249 {0x0342, 0x1D}, // LINE LENGTH
250 {0x0343, 0x10}, // LINE LENGTH
251
252//23 FPS
253// {0x0340, 0x0A}, // FRAME LENGTH
254// {0x0341, 0x3F}, // FRAME LENGTH
255
256//50 FPS
257 {0x0340, 0x05}, // FRAME LENGTH
258 {0x0341, 0x20}, // FRAME LENGTH
259 {0x0344, 0x01}, // X_START
260 {0x0345, 0x80}, // X_START
261 {0x0346, 0x00}, // Y_START
262 {0x0347, 0xD8}, // Y_START
263 {0x0348, 0x10}, // X_END
264 {0x0349, 0x7F}, // X_END
265 {0x034A, 0X09}, // Y_END
266 {0x034B, 0x47}, // Y_END
267 {0x0220, 0x62},
268 {0x0222, 0x00},
269 {0x0900, 0x01},
270 {0x0901, 0x22},
271 {0x0902, 0x08},
272 {0x3200, 0x41},
273 {0x3201, 0x41},
274 {0x32D5, 0x00},
275 {0x32D6, 0x00},
276 {0x32DB, 0x01},
277 {0x32DF, 0x00},
278 {0x350C, 0x00},
279 {0x350D, 0x00},
280 {0x0408, 0x00},
281 {0x0409, 0x00},
282 {0x040A, 0x00},
283 {0x040B, 0x00},
284 {0x040C, 0x07}, // X_OUT_SIZE
285 {0x040D, 0x80}, // X_OUT_SIZE
286 {0x040E, 0x04}, // Y_OUT_SIZE
287 {0x040F, 0x38}, // Y_OUT_SIZE
288 {0x034C, 0x07}, // X_OUT_SIZE
289 {0x034D, 0x80}, // X_OUT_SIZE
290 {0x034E, 0x04}, // Y_OUT_SIZE
291 {0x034F, 0x38}, // Y_OUT_SIZE
292 {0x0301, 0x05},
293 {0x0303, 0x02},
294 {0x0305, 0x02},
295 {0x0306, 0x00},
296 {0x0307, 0x7A},
297 {0x030B, 0x02},
298 {0x030D, 0x04},
299 {0x0310, 0x01},
300 {0x3CA0, 0x00},
301 {0x3CA1, 0x3C},
302 {0x3CA4, 0x00},
303 {0x3CA5, 0x3C},
304 {0x3CA6, 0x00},
305 {0x3CA7, 0x00},
306 {0x3CAA, 0x00},
307 {0x3CAB, 0x00},
308 {0x3CB8, 0x00},
309 {0x3CB9, 0x1C},
310 {0x3CBA, 0x00},
311 {0x3CBB, 0x08},
312 {0x3CBC, 0x00},
313 {0x3CBD, 0x1E},
314 {0x3CBE, 0x00},
315 {0x3CBF, 0x0A},
316 {0x0202, 0x03}, // EXPOSURE
317 {0x0203, 0x13}, // EXPOSURE
318 {0x0224, 0x20},
319 {0x0225, 0xF4},
320 {0x3116, 0x01},
321 {0x3117, 0xF4},
322 {0x0204, 0x03}, // ANALOGUE GAIN
323 {0x0205, 0x84}, // ANALOGUE GAIN
324 {0x0216, 0x00},
325 {0x0217, 0x70},
326 {0x0218, 0x01},
327 {0x0219, 0x00},
328 {0x020E, 0x01}, // DIGITAL GAIN
329 {0x020F, 0x00}, // DIGITAL GAIN
330 {0x3118, 0x00},
331 {0x3119, 0x70},
332 {0x311A, 0x01},
333 {0x311B, 0x00},
334 {0x341a, 0x00},
335 {0x341b, 0x00},
336 {0x341c, 0x00},
337 {0x341d, 0x00},
338 {0x341e, 0x00},
339 {0x341f, 0x90},
340 {0x3420, 0x00},
341 {0x3421, 0x6c},
342 {0x3366, 0x00},
343 {0x3367, 0x00},
344 {0x3368, 0x00},
345 {0x3369, 0x00},
346};
347
348static const struct imx708_reg mode_hdr_1920x1080_regs[] = {
349 {0x0342, 0x14}, // LINE LENGTH
350 {0x0343, 0x60}, // LINE LENGTH
351 {0x0340, 0x09}, // FRAME LENGTH
352 {0x0341, 0xB5}, // FRAME LENGTH
353 {0x0344, 0x01}, // X_START
354 {0x0345, 0x80}, // X_START
355 {0x0346, 0x00}, // Y_START
356 {0x0347, 0xD8}, // Y_START
357 {0x0348, 0x10}, // X_END
358 {0x0349, 0x7F}, // X_END
359 {0x034A, 0X09}, // Y_END
360 {0x034B, 0x47}, // Y_END
361 {0x0220, 0x01},
363 {0x0900, 0x00},
364 {0x0901, 0x11},
365 {0x0902, 0x0A},
366 {0x3200, 0x01},
367 {0x3201, 0x01},
368 {0x32D5, 0x00},
369 {0x32D6, 0x00},
370 {0x32DB, 0x01},
371 {0x32DF, 0x00},
372 {0x350C, 0x00},
373 {0x350D, 0x00},
374 {0x0408, 0x00},
375 {0x0409, 0x00},
376 {0x040A, 0x00},
377 {0x040B, 0x00},
378 {0x040C, 0x07}, // X_OUT_SIZE
379 {0x040D, 0x80}, // X_OUT_SIZE
380 {0x040E, 0x04}, // Y_OUT_SIZE
381 {0x040F, 0x38}, // Y_OUT_SIZE
382 {0x034C, 0x07}, // X_OUT_SIZE
383 {0x034D, 0x80}, // X_OUT_SIZE
384 {0x034E, 0x04}, // Y_OUT_SIZE
385 {0x034F, 0x38}, // Y_OUT_SIZE
386 {0x0301, 0x05},
387 {0x0303, 0x02},
388 {0x0305, 0x02},
389 {0x0306, 0x00},
390 {0x0307, 0xA2},
391 {0x030B, 0x02},
392 {0x030D, 0x04},
393 {0x030E, 0x01},
394 {0x030F, 0x2C},
395 {0x0310, 0x01},
396 {0x3CA0, 0x00},
397 {0x3CA1, 0x00},
398 {0x3CA4, 0x00},
399 {0x3CA5, 0x00},
400 {0x3CA6, 0x00},
401 {0x3CA7, 0x28},
402 {0x3CAA, 0x00},
403 {0x3CAB, 0x00},
404 {0x3CB8, 0x00},
405 {0x3CB9, 0x30},
406 {0x3CBA, 0x00},
407 {0x3CBB, 0x00},
408 {0x3CBC, 0x00},
409 {0x3CBD, 0x32},
410 {0x3CBE, 0x00},
411 {0x3CBF, 0x00},
412 {0x0202, 0x0B}, // EXPOSURE
413 {0x0203, 0xA4}, // EXPOSURE
414 {0x0224, 0x02}, // SHORT EXPOSURE
415 {0x0225, 0xE9}, // SHORT EXPOSURE
416 {0x3116, 0x05}, // MID EXPOSURE
417 {0x3117, 0xD2}, // MID EXPOSURE
418 {0x0204, 0x03}, // ANALOGUE GAIN
419 {0x0205, 0x84}, // ANALOGUE GAIN
420 {0x0216, 0x03}, // SHORT EXPOSURE ANALOG GAIN
421 {0x0217, 0x84}, // SHORT EXPOSURE ANALOG GAIN
422 {0x0218, 0x01},
423 {0x0219, 0x00},
424 {0x020E, 0x01}, // DIGITAL GAIN
425 {0x020F, 0x00}, // DIGITAL GAIN
426 {0x3118, 0x03}, // MID EXPOSURE ANALOG GAIN
427 {0x3119, 0x84}, // MID EXPOSURE ANALOG GAIN
428 {0x311A, 0x01},
429 {0x311B, 0x00},
430 {0x341a, 0x00},
431 {0x341b, 0x00},
432 {0x341c, 0x00},
433 {0x341d, 0x00},
434 {0x341e, 0x00},
435 {0x341f, 0x90},
436 {0x3420, 0x00},
437 {0x3421, 0x6c},
438 {0x3360, 0x01},
439 {0x3361, 0x01},
440 {0x3366, 0x09},
441 {0x3367, 0x00},
442 {0x3368, 0x05},
443 {0x3369, 0x10},
444};
445
457
458/* Default PDAF pixel correction gains */
459static const u8 pdaf_gains[2][9] = {
460 { 0x4c, 0x4c, 0x4c, 0x46, 0x3e, 0x38, 0x35, 0x35, 0x35 },
461 { 0x35, 0x35, 0x35, 0x38, 0x3e, 0x46, 0x4c, 0x4c, 0x4c }
462};
463
464/* 450MHz is the nominal "default" link frequency */
465static const struct imx708_reg link_450Mhz_regs[] = {
466 {0x030E, 0x01},
467 {0x030F, 0x2c},
468};
469
470static const struct imx708_reg link_447Mhz_regs[] = {
471 {0x030E, 0x01},
472 {0x030F, 0x2a},
473};
474
475static const struct imx708_reg link_453Mhz_regs[] = {
476 {0x030E, 0x01},
477 {0x030F, 0x2e},
478};
479
480#define DW9807_I2C_ADDRESS 0x0C << 1
481
482#define DW9807_MAX_FOCUS_POS 1023
483/*
484 * This sets the minimum granularity for the focus positions.
485 * A value of 1 gives maximum accuracy for a desired focus position.
486 */
487#define DW9807_FOCUS_STEPS 1
488/*
489 * This acts as the minimum granularity of lens movement.
490 * Keep this value power of 2, so the control steps can be
491 * uniformly adjusted for gradual lens movement, with desired
492 * number of control steps.
493 */
494#define DW9807_CTRL_STEPS 16
495#define DW9807_CTRL_DELAY_US 1000
496
497#define DW9807_CTL_ADDR 0x02
498/*
499 * DW9807 separates two registers to control the VCM position.
500 * One for MSB value, another is LSB value.
501 */
502#define DW9807_MSB_ADDR 0x03
503#define DW9807_LSB_ADDR 0x04
504#define DW9807_STATUS_ADDR 0x05
505#define DW9807_MODE_ADDR 0x06
506#define DW9807_RESONANCE_ADDR 0x07
507
508#define DW9807_PW_MIN_DELAY_US 100
509#define DW9807_PW_DELAY_RANGE_US 10
510
511#define DW9807_ACTIVE 0x00
512#define DW9807_SLEEP 0x01
513
514/* -----------------------------------------------------------------------------*/
515/* CAM: Plug & Play Driver
516/* -----------------------------------------------------------------------------*/
518{
519 .cam_init = IMX708_cam_init,
520 .cam_startStreaming = IMX708_startStreaming,
521 .cam_stopStreaming = IMX708_stopStreaming,
522};
523
524
525
527{
528 for (int i = 0; i < sizeof(mode_common_regs)/sizeof(mode_common_regs[0]); i++) {
529 cam_writeReg(cam,mode_common_regs[i].address,mode_common_regs[i].val);
530 }
531}
532
534{
535 // MODE
536 // 0 : 1920 x 1080 cropped, 50FPS
537 // 1 : 1920 x 1080 2x2 binned, 60 FPS
538 // 2 : 1920 x 1080 HDR, 50 FPS
539
540 if (mode == 0) {
541 for (int i = 0; i < sizeof(mode_1920x1080_cropped_regs)/sizeof(mode_1920x1080_cropped_regs[0]); i++) {
542 cam_writeReg(cam,mode_1920x1080_cropped_regs[i].address,mode_1920x1080_cropped_regs[i].val);
543 }
544 }
545
546 else if (mode == 1) {
547 for (int i = 0; i < sizeof(mode_2x2binned_1920x1080_regs)/sizeof(mode_2x2binned_1920x1080_regs[0]); i++) {
548 cam_writeReg(cam,mode_2x2binned_1920x1080_regs[i].address,mode_2x2binned_1920x1080_regs[i].val);
549 }
550 }
551
552 else if (mode == 2) {
553 for (int i = 0; i < sizeof(mode_hdr_1920x1080_regs)/sizeof(mode_hdr_1920x1080_regs[0]); i++) {
554 cam_writeReg(cam,mode_hdr_1920x1080_regs[i].address,mode_hdr_1920x1080_regs[i].val);
555 }
556 }
557
558}
559
561{
562 for (int i = 0; i < sizeof(link_450Mhz_regs)/sizeof(link_450Mhz_regs[0]); i++) {
563 cam_writeReg(cam,link_450Mhz_regs[i].address,link_450Mhz_regs[i].val);
564 }
565}
566
572
574{
575 for (int i = 0; i < 54 ;i++) {
576 cam_writeReg(cam,IMX708_REG_BASE_SPC_GAINS_L + i, pdaf_gains[0][i%9]);
577 cam_writeReg(cam,IMX708_REG_BASE_SPC_GAINS_R + i, pdaf_gains[1][i%9]);
578 }
579}
580
582{
583 cam_writeReg(cam,IMX708_REG_EXPOSURE, (val & 0xFF00) >> 8);
584 cam_writeReg(cam,IMX708_REG_EXPOSURE + 1, val & 0xFF);
585}
586
588{
591
594
595 cam_writeReg(cam,IMX708_REG_ANALOG_GAIN , (val & 0xFF00) >> 8);
596 cam_writeReg(cam,IMX708_REG_ANALOG_GAIN + 1 , val & 0xFF);
597
598}
599
612
613
615{
616 i2c_instance_t *inst = cam->inst;
617 // Turn on actuator
620 i2c_txNackBlocking(inst);
621 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
623 i2c_txNackBlocking(inst);
624 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
626 i2c_txNackBlocking(inst);
628}
629
630
632{
633 i2c_instance_t *inst = cam->inst;
634 // Turn off actuator
637 i2c_txNackBlocking(inst);
638 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
640 i2c_txNackBlocking(inst);
641 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
643 i2c_txNackBlocking(inst);
645}
646
648{
649 i2c_instance_t *inst = cam->inst;
650 if (focus_step >= DW9807_MAX_FOCUS_POS)
651 focus_step = DW9807_MAX_FOCUS_POS;
652 else if (focus_step <= 0)
653 focus_step = 0;
654
657 i2c_txNackBlocking(inst);
658 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
660 i2c_txNackBlocking(inst);
661 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
662 i2c_txByte(inst, (focus_step >> 8) & 0x03);
663 i2c_txNackBlocking(inst);
664 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
666
669 i2c_txNackBlocking(inst);
670 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
672 i2c_txNackBlocking(inst);
673 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
674 i2c_txByte(inst, focus_step & 0xFF);
675 i2c_txNackBlocking(inst);
676 BSP_ASSERT(i2c_rxAck(inst),"Failed to Assert!\n");
678}
679
685
691
693{
694
696
698
700
701 IMX708_ConfigFormat(cam, 1);
702
704
706
708
709 IMX708_SetFocusStep(cam ,700);
710
712
713 LOG_INFO(DBG_MOD_CAM, "Camera Init Done !\n");
714 return CAM_OK;
715}
716
#define IMX708_ANA_GAIN_MIN
Definition IMX708.c:78
#define IMX708_REG_ANALOG_GAIN
Definition IMX708.c:77
#define DW9807_CTL_ADDR
Definition IMX708.c:497
#define IMX708_LPF_INTENSITY_EN
Definition IMX708.c:36
#define DW9807_ACTIVE
Definition IMX708.c:511
#define DW9807_LSB_ADDR
Definition IMX708.c:503
#define IMX708_REG_EXPOSURE
Definition IMX708.c:69
#define DW9807_SLEEP
Definition IMX708.c:512
#define IMX708_ACTIVE
Definition IMX708.c:26
#define IMX708_REG_DIGITAL_GAIN
Definition IMX708.c:84
#define IMX708_HDR_EXPOSURE_RATIO
Definition IMX708.c:62
void IMX708_ConfigQuadBayerRemosaicAdjustment(cam_instance_t *cam)
Definition IMX708.c:567
#define IMX708_REG_BASE_SPC_GAINS_L
Definition IMX708.c:32
#define DW9807_MSB_ADDR
Definition IMX708.c:502
#define IMX708_LPF_INTENSITY
Definition IMX708.c:39
#define IMX708_MODE_SELECT
Definition IMX708.c:25
#define IMX708_DGTL_GAIN_MAX
Definition IMX708.c:86
#define DW9807_I2C_ADDRESS
Definition IMX708.c:480
#define IMX708_DGTL_GAIN_MIN
Definition IMX708.c:85
#define IMX708_LPF_INTENSITY_ENABLED
Definition IMX708.c:37
#define IMX708_SLEEP
Definition IMX708.c:27
#define IMX708_REG_BASE_SPC_GAINS_R
Definition IMX708.c:33
#define IMX708_ANA_GAIN_MAX
Definition IMX708.c:79
#define DW9807_MAX_FOCUS_POS
Definition IMX708.c:482
imx708 Driver API definitions. This file provides data structures and APIs for controlling the imx708...
cam_status_t
CAM Status List.
Definition cam.h:60
@ CAM_OK
Successful Operation *‍/.
Definition cam.h:61
void cam_writeReg(cam_instance_t *cam, u16 reg, u8 data)
Write Data to specific register in camera.
Definition cam.c:19
struct cam_instance cam_instance_t
Forward declaration of CAM instance.
Definition cam.h:107
#define LOG_INFO(debug, fmt,...)
Definition debug.h:237
#define BSP_ASSERT(cond, msg)
Definition debug.h:236
#define DBG_MOD_CAM
Camera.
Definition debug.h:110
void i2c_startMasterBlocking(i2c_instance_t *inst)
Initiate start condition for I2C master mode and waits until the operation is complete.
Definition i2c.c:89
void i2c_txByte(i2c_instance_t *inst, u8 byte)
Transmits a byte of data over I2C.
Definition i2c.c:132
u32 i2c_rxAck(i2c_instance_t *inst)
Reads data from I2C receive data register.
Definition i2c.c:179
void i2c_txNackBlocking(i2c_instance_t *inst)
Sends an NACK signal over the I2C bus and waits until the transmission is complete.
Definition i2c.c:163
void i2c_stopMasterBlocking(i2c_instance_t *inst)
Initiate stop condition for I2C master mode and waits until the operation is complete.
Definition i2c.c:105
const cam_api_t IMX708_DRIVER
IMX708 Driver Instance. Point your generic RTC pointer to this structure to use the IMX708 hardware.
Definition IMX708.c:517
void IMX708_OnActuator(cam_instance_t *cam)
Enable Lens Actuator (VCM).
Definition IMX708.c:614
cam_status_t IMX708_cam_init(cam_instance_t *cam)
Initialize Camera Sequence.
Definition IMX708.c:692
void IMX708_SetPdafGain(cam_instance_t *cam)
Set PDAF (Phase Detection Auto Focus) Gain.
Definition IMX708.c:573
void IMX708_SetExposure(cam_instance_t *cam, u16 val)
Set Exposure Time.
Definition IMX708.c:581
void IMX708_SetAnalogueGain(cam_instance_t *cam, u16 val)
Set Analog Gain.
Definition IMX708.c:587
void IMX708_OffActuator(cam_instance_t *cam)
Disable Lens Actuator (VCM).
Definition IMX708.c:631
cam_status_t IMX708_startStreaming(cam_instance_t *cam)
Start Stream Video.
Definition IMX708.c:680
void IMX708_ConfigFormat(cam_instance_t *cam, u8 mode)
Configure Sensor Output Format.
Definition IMX708.c:533
void IMX708_ConfigLinkFreq(cam_instance_t *cam)
Configure MIPI Link Frequency.
Definition IMX708.c:560
cam_status_t IMX708_stopStreaming(cam_instance_t *cam)
Stop Stream Video.
Definition IMX708.c:686
void IMX708_SetDigitalGain(cam_instance_t *cam, u16 val)
Set Digital Gain.
Definition IMX708.c:600
void IMX708_SetFocusStep(cam_instance_t *cam, u32 focus_step)
Set Focus Position (DAC Value).
Definition IMX708.c:647
void IMX708_ConfigCommon(cam_instance_t *cam)
Apply Common Configuration.
Definition IMX708.c:526
u32 output_width
Definition IMX708.c:448
u32 vblank_min
Definition IMX708.c:451
u32 output_height
Definition IMX708.c:449
struct imx708_reg * regs
Definition IMX708.c:447
u32 exposure_lines_step
Definition IMX708.c:455
u32 vblank_default
Definition IMX708.c:452
u32 line_length_pix
Definition IMX708.c:450
u32 pxiel_rate
Definition IMX708.c:453
u32 exposure_lines_min
Definition IMX708.c:454
CAM API structure.
Definition cam.h:113
i2c_instance_t * inst
Pointer to I2C instance *‍/.
Definition cam.h:128
I2C instance. Holds the software registers and hardware pointer.
Definition i2c.h:259
u16 address
Definition IMX708.c:92
uint8_t u8
Definition type.h:26
uint16_t u16
Definition type.h:24
uint32_t u32
Definition type.h:22