Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
mt9f002.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016 Freek van Tienen <freek.v.tienen@gmail.com>
3 *
4 * This file is part of Paparazzi.
5 *
6 * Paparazzi is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * Paparazzi is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with paparazzi; see the file COPYING. If not, see
18 * <http://www.gnu.org/licenses/>.
19 *
20 */
21
27#include "std.h"
28#include "mt9f002.h"
29#include "mt9f002_regs.h"
30#include "isp/libisp.h"
33
34#include <stdio.h>
35#include <unistd.h>
36#include <fcntl.h>
37#include <sys/ioctl.h>
38#include <linux/i2c-dev.h>
39#include <linux/videodev2.h>
40
41#include "generated/airframe.h"
42#ifdef BOARD_DISCO
43#include "boards/disco.h"
44#else
45#include "boards/bebop.h"
46#endif
47
48#define PRINT(string,...) fprintf(stderr, "[MT9F002->%s()] " string,__FUNCTION__ , ##__VA_ARGS__)
49
50#if MT9F002_VERBOSE
51#define VERBOSE_PRINT PRINT
52#else
53#define VERBOSE_PRINT(...)
54#endif
55
56// The sequencing of the pixel array is controlled by the x_addr_start, y_addr_start,
57// x_addr_end, and y_addr_end registers. For both parallel and serial HiSPi interfaces, the
58// output image size is controlled by the x_output_size and y_output_size registers.
59
60// Horizontal Mirror
61// Vertical Flip
62
68#ifndef MT9F002_TARGET_EXPOSURE
69#define MT9F002_TARGET_EXPOSURE 30
70#endif
71
72/* Set the colour balance gains */
73#ifndef MT9F002_GAIN_GREEN1
74#define MT9F002_GAIN_GREEN1 2.0
75#endif
76
77#ifndef MT9F002_GAIN_GREEN2
78#define MT9F002_GAIN_GREEN2 2.0
79#endif
80
81#ifndef MT9F002_GAIN_RED
82#define MT9F002_GAIN_RED 1.4
83#endif
84
85#ifndef MT9F002_GAIN_BLUE
86#define MT9F002_GAIN_BLUE 2.7
87#endif
88
89/* Camera structure */
91 .output_size = {
94 },
95 .sensor_size = {
98 },
99 .crop = {
100 .x = 0,
101 .y = 0,
104 },
105 .dev_name = "/dev/video1",
106 .subdev_name = "/dev/v4l-subdev1",
107 .format = V4L2_PIX_FMT_UYVY,
108 .subdev_format = V4L2_MBUS_FMT_SGRBG10_1X10,
109 .buf_cnt = 5,
110 .filters = VIDEO_FILTER_ISP,
111 .cv_listener = NULL,
112 .fps = MT9F002_TARGET_FPS,
113 .camera_intrinsics = {
114 .focal_x = MT9F002_FOCAL_X,
115 .focal_y = MT9F002_FOCAL_Y,
116 .center_x = MT9F002_CENTER_X,
117 .center_y = MT9F002_CENTER_Y,
118 .Dhane_k = MT9F002_DHANE_K,
119 }
120};
121
122/* Initialize MT9F002 chipset (Front camera) */
164
172
176static void write_reg(struct mt9f002_t *mt, uint16_t addr, uint32_t val, uint8_t len)
177{
178 mt->i2c_trans.buf[0] = addr >> 8;
179 mt->i2c_trans.buf[1] = addr & 0xFF;
180
181 // Fix signdness based on length
182 if (len == 1) {
183 mt->i2c_trans.buf[2] = val & 0xFF;
184 } else if (len == 2) {
185 mt->i2c_trans.buf[2] = (val >> 8) & 0xFF;
186 mt->i2c_trans.buf[3] = val & 0xFF;
187 } else if (len == 4) {
188 mt->i2c_trans.buf[2] = (val >> 24) & 0xFF;
189 mt->i2c_trans.buf[3] = (val >> 16) & 0xFF;
190 mt->i2c_trans.buf[4] = (val >> 8) & 0xFF;
191 mt->i2c_trans.buf[5] = val & 0xFF;
192 } else {
193 PRINT("Write_reg with incorrect length %d\r\n", len);
194 }
195
196 // Transmit the buffer
197 i2c_blocking_transmit(mt->i2c_periph, &mt->i2c_trans, MT9F002_ADDRESS, len + 2);
198}
199
203static uint32_t read_reg(struct mt9f002_t *mt, uint16_t addr, uint8_t len)
204{
205 uint32_t ret = 0;
206 mt->i2c_trans.buf[0] = addr >> 8;
207 mt->i2c_trans.buf[1] = addr & 0xFF;
208
209 // Transmit the buffer and receive back
210 i2c_blocking_transceive(mt->i2c_periph, &mt->i2c_trans, MT9F002_ADDRESS, 2, len);
211
212 /* Fix signdness */
213 for (uint8_t i = 0; i < len; i++) {
214 ret |= mt->i2c_trans.buf[len - i - 1] << (8 * i);
215 }
216 return ret;
217}
218
222static inline void mt9f002_mipi_stage1(struct mt9f002_t *mt)
223{
226
228 if (mt->interface == MT9F002_HiSPi) {
229 serialFormat = (3 << 8) | 2; // 2 Serial lanes
230 } else {
231 serialFormat = (2 << 8) | 2; // 2 Serial lanes
232 }
234 uint32_t dataFormat = (8 << 8) | 8; // 8 Bits pixel depth
236
237 write_reg(mt, MT9F002_MFR_3D00, 0x0435, 2);
238 write_reg(mt, MT9F002_MFR_3D02, 0x435D, 2);
239 write_reg(mt, MT9F002_MFR_3D04, 0x6698, 2);
240 write_reg(mt, MT9F002_MFR_3D06, 0xFFFF, 2);
241 write_reg(mt, MT9F002_MFR_3D08, 0x7783, 2);
242 write_reg(mt, MT9F002_MFR_3D0A, 0x101B, 2);
243 write_reg(mt, MT9F002_MFR_3D0C, 0x732C, 2);
244 write_reg(mt, MT9F002_MFR_3D0E, 0x4230, 2);
245 write_reg(mt, MT9F002_MFR_3D10, 0x5881, 2);
246 write_reg(mt, MT9F002_MFR_3D12, 0x5C3A, 2);
247 write_reg(mt, MT9F002_MFR_3D14, 0x0140, 2);
248 write_reg(mt, MT9F002_MFR_3D16, 0x2300, 2);
249 write_reg(mt, MT9F002_MFR_3D18, 0x815F, 2);
250 write_reg(mt, MT9F002_MFR_3D1A, 0x6789, 2);
251 write_reg(mt, MT9F002_MFR_3D1C, 0x5920, 2);
252 write_reg(mt, MT9F002_MFR_3D1E, 0x0C20, 2);
253 write_reg(mt, MT9F002_MFR_3D20, 0x21C0, 2);
254 write_reg(mt, MT9F002_MFR_3D22, 0x4684, 2);
255 write_reg(mt, MT9F002_MFR_3D24, 0x4892, 2);
256 write_reg(mt, MT9F002_MFR_3D26, 0x1A00, 2);
257 write_reg(mt, MT9F002_MFR_3D28, 0xBA4C, 2);
258 write_reg(mt, MT9F002_MFR_3D2A, 0x8D48, 2);
259 write_reg(mt, MT9F002_MFR_3D2C, 0x4641, 2);
260 write_reg(mt, MT9F002_MFR_3D2E, 0x408C, 2);
261 write_reg(mt, MT9F002_MFR_3D30, 0x4784, 2);
262 write_reg(mt, MT9F002_MFR_3D32, 0x4A87, 2);
263 write_reg(mt, MT9F002_MFR_3D34, 0x561A, 2);
264 write_reg(mt, MT9F002_MFR_3D36, 0x00A5, 2);
265 write_reg(mt, MT9F002_MFR_3D38, 0x1A00, 2);
266 write_reg(mt, MT9F002_MFR_3D3A, 0x5693, 2);
267 write_reg(mt, MT9F002_MFR_3D3C, 0x4D8D, 2);
268 write_reg(mt, MT9F002_MFR_3D3E, 0x4A47, 2);
269 write_reg(mt, MT9F002_MFR_3D40, 0x4041, 2);
270 write_reg(mt, MT9F002_MFR_3D42, 0x8200, 2);
271 write_reg(mt, MT9F002_MFR_3D44, 0x24B7, 2);
272 write_reg(mt, MT9F002_MFR_3D46, 0x0024, 2);
273 write_reg(mt, MT9F002_MFR_3D48, 0x8D4F, 2);
274 write_reg(mt, MT9F002_MFR_3D4A, 0x831A, 2);
275 write_reg(mt, MT9F002_MFR_3D4C, 0x00B4, 2);
276 write_reg(mt, MT9F002_MFR_3D4E, 0x4684, 2);
277 write_reg(mt, MT9F002_MFR_3D50, 0x49CE, 2);
278 write_reg(mt, MT9F002_MFR_3D52, 0x4946, 2);
279 write_reg(mt, MT9F002_MFR_3D54, 0x4140, 2);
280 write_reg(mt, MT9F002_MFR_3D56, 0x9247, 2);
281 write_reg(mt, MT9F002_MFR_3D58, 0x844B, 2);
282 write_reg(mt, MT9F002_MFR_3D5A, 0xCE4B, 2);
283 write_reg(mt, MT9F002_MFR_3D5C, 0x4741, 2);
284 write_reg(mt, MT9F002_MFR_3D5E, 0x502F, 2);
285 write_reg(mt, MT9F002_MFR_3D60, 0xBD3A, 2);
286 write_reg(mt, MT9F002_MFR_3D62, 0x5181, 2);
287 write_reg(mt, MT9F002_MFR_3D64, 0x5E73, 2);
288 write_reg(mt, MT9F002_MFR_3D66, 0x7C0A, 2);
289 write_reg(mt, MT9F002_MFR_3D68, 0x7770, 2);
290 write_reg(mt, MT9F002_MFR_3D6A, 0x8085, 2);
291 write_reg(mt, MT9F002_MFR_3D6C, 0x6A82, 2);
292 write_reg(mt, MT9F002_MFR_3D6E, 0x6742, 2);
293 write_reg(mt, MT9F002_MFR_3D70, 0x8244, 2);
294 write_reg(mt, MT9F002_MFR_3D72, 0x831A, 2);
295 write_reg(mt, MT9F002_MFR_3D74, 0x0099, 2);
296 write_reg(mt, MT9F002_MFR_3D76, 0x44DF, 2);
297 write_reg(mt, MT9F002_MFR_3D78, 0x1A00, 2);
298 write_reg(mt, MT9F002_MFR_3D7A, 0x8542, 2);
299 write_reg(mt, MT9F002_MFR_3D7C, 0x8567, 2);
300 write_reg(mt, MT9F002_MFR_3D7E, 0x826A, 2);
301 write_reg(mt, MT9F002_MFR_3D80, 0x857C, 2);
302 write_reg(mt, MT9F002_MFR_3D82, 0x6B80, 2);
303 write_reg(mt, MT9F002_MFR_3D84, 0x7000, 2);
304 write_reg(mt, MT9F002_MFR_3D86, 0xB831, 2);
305 write_reg(mt, MT9F002_MFR_3D88, 0x40BE, 2);
306 write_reg(mt, MT9F002_MFR_3D8A, 0x6700, 2);
307 write_reg(mt, MT9F002_MFR_3D8C, 0x0CBD, 2);
308 write_reg(mt, MT9F002_MFR_3D8E, 0x4482, 2);
309 write_reg(mt, MT9F002_MFR_3D90, 0x7898, 2);
310 write_reg(mt, MT9F002_MFR_3D92, 0x7480, 2);
311 write_reg(mt, MT9F002_MFR_3D94, 0x5680, 2);
312 write_reg(mt, MT9F002_MFR_3D96, 0x9755, 2);
313 write_reg(mt, MT9F002_MFR_3D98, 0x8057, 2);
314 write_reg(mt, MT9F002_MFR_3D9A, 0x8056, 2);
315 write_reg(mt, MT9F002_MFR_3D9C, 0x9256, 2);
316 write_reg(mt, MT9F002_MFR_3D9E, 0x8057, 2);
317 write_reg(mt, MT9F002_MFR_3DA0, 0x8055, 2);
318 write_reg(mt, MT9F002_MFR_3DA2, 0x817C, 2);
319 write_reg(mt, MT9F002_MFR_3DA4, 0x969B, 2);
320 write_reg(mt, MT9F002_MFR_3DA6, 0x56A6, 2);
321 write_reg(mt, MT9F002_MFR_3DA8, 0x44BE, 2);
322 write_reg(mt, MT9F002_MFR_3DAA, 0x000C, 2);
323 write_reg(mt, MT9F002_MFR_3DAC, 0x867A, 2);
324 write_reg(mt, MT9F002_MFR_3DAE, 0x9474, 2);
325 write_reg(mt, MT9F002_MFR_3DB0, 0x8A79, 2);
326 write_reg(mt, MT9F002_MFR_3DB2, 0x9367, 2);
327 write_reg(mt, MT9F002_MFR_3DB4, 0xBF6A, 2);
328 write_reg(mt, MT9F002_MFR_3DB6, 0x816C, 2);
329 write_reg(mt, MT9F002_MFR_3DB8, 0x8570, 2);
330 write_reg(mt, MT9F002_MFR_3DBA, 0x836C, 2);
331 write_reg(mt, MT9F002_MFR_3DBC, 0x826A, 2);
332 write_reg(mt, MT9F002_MFR_3DBE, 0x8245, 2);
333 write_reg(mt, MT9F002_MFR_3DC0, 0xFFFF, 2);
334 write_reg(mt, MT9F002_MFR_3DC2, 0xFFD6, 2);
335 write_reg(mt, MT9F002_MFR_3DC4, 0x4582, 2);
336 write_reg(mt, MT9F002_MFR_3DC6, 0x6A82, 2);
337 write_reg(mt, MT9F002_MFR_3DC8, 0x6C83, 2);
338 write_reg(mt, MT9F002_MFR_3DCA, 0x7000, 2);
339 write_reg(mt, MT9F002_MFR_3DCC, 0x8024, 2);
340 write_reg(mt, MT9F002_MFR_3DCE, 0xB181, 2);
341 write_reg(mt, MT9F002_MFR_3DD0, 0x6859, 2);
342 write_reg(mt, MT9F002_MFR_3DD2, 0x732B, 2);
343 write_reg(mt, MT9F002_MFR_3DD4, 0x4030, 2);
344 write_reg(mt, MT9F002_MFR_3DD6, 0x4982, 2);
345 write_reg(mt, MT9F002_MFR_3DD8, 0x101B, 2);
346 write_reg(mt, MT9F002_MFR_3DDA, 0x4083, 2);
347 write_reg(mt, MT9F002_MFR_3DDC, 0x6785, 2);
348 write_reg(mt, MT9F002_MFR_3DDE, 0x3A00, 2);
349 write_reg(mt, MT9F002_MFR_3DE0, 0x8820, 2);
350 write_reg(mt, MT9F002_MFR_3DE2, 0x0C59, 2);
351 write_reg(mt, MT9F002_MFR_3DE4, 0x8546, 2);
352 write_reg(mt, MT9F002_MFR_3DE6, 0x8348, 2);
353 write_reg(mt, MT9F002_MFR_3DE8, 0xD04C, 2);
354 write_reg(mt, MT9F002_MFR_3DEA, 0x8B48, 2);
355 write_reg(mt, MT9F002_MFR_3DEC, 0x4641, 2);
356 write_reg(mt, MT9F002_MFR_3DEE, 0x4083, 2);
357 write_reg(mt, MT9F002_MFR_3DF0, 0x1A00, 2);
358 write_reg(mt, MT9F002_MFR_3DF2, 0x8347, 2);
359 write_reg(mt, MT9F002_MFR_3DF4, 0x824A, 2);
360 write_reg(mt, MT9F002_MFR_3DF6, 0x9A56, 2);
361 write_reg(mt, MT9F002_MFR_3DF8, 0x1A00, 2);
362 write_reg(mt, MT9F002_MFR_3DFA, 0x951A, 2);
363 write_reg(mt, MT9F002_MFR_3DFC, 0x0056, 2);
364 write_reg(mt, MT9F002_MFR_3DFE, 0x914D, 2);
365 write_reg(mt, MT9F002_MFR_3E00, 0x8B4A, 2);
366 write_reg(mt, MT9F002_MFR_3E02, 0x4700, 2);
367 write_reg(mt, MT9F002_MFR_3E04, 0x0300, 2);
368 write_reg(mt, MT9F002_MFR_3E06, 0x2492, 2);
369 write_reg(mt, MT9F002_MFR_3E08, 0x0024, 2);
370 write_reg(mt, MT9F002_MFR_3E0A, 0x8A1A, 2);
371 write_reg(mt, MT9F002_MFR_3E0C, 0x004F, 2);
372 write_reg(mt, MT9F002_MFR_3E0E, 0xB446, 2);
373 write_reg(mt, MT9F002_MFR_3E10, 0x8349, 2);
374 write_reg(mt, MT9F002_MFR_3E12, 0xB249, 2);
375 write_reg(mt, MT9F002_MFR_3E14, 0x4641, 2);
376 write_reg(mt, MT9F002_MFR_3E16, 0x408B, 2);
377 write_reg(mt, MT9F002_MFR_3E18, 0x4783, 2);
378 write_reg(mt, MT9F002_MFR_3E1A, 0x4BDB, 2);
379 write_reg(mt, MT9F002_MFR_3E1C, 0x4B47, 2);
380 write_reg(mt, MT9F002_MFR_3E1E, 0x4180, 2);
381 write_reg(mt, MT9F002_MFR_3E20, 0x502B, 2);
382 write_reg(mt, MT9F002_MFR_3E22, 0x4C3A, 2);
383 write_reg(mt, MT9F002_MFR_3E24, 0x4180, 2);
384 write_reg(mt, MT9F002_MFR_3E26, 0x737C, 2);
385 write_reg(mt, MT9F002_MFR_3E28, 0xD124, 2);
386 write_reg(mt, MT9F002_MFR_3E2A, 0x9068, 2);
387 write_reg(mt, MT9F002_MFR_3E2C, 0x8A20, 2);
388 write_reg(mt, MT9F002_MFR_3E2E, 0x2170, 2);
389 write_reg(mt, MT9F002_MFR_3E30, 0x8081, 2);
390 write_reg(mt, MT9F002_MFR_3E32, 0x6A67, 2);
391 write_reg(mt, MT9F002_MFR_3E34, 0x4257, 2);
392 write_reg(mt, MT9F002_MFR_3E36, 0x5544, 2);
393 write_reg(mt, MT9F002_MFR_3E38, 0x8644, 2);
394 write_reg(mt, MT9F002_MFR_3E3A, 0x9755, 2);
395 write_reg(mt, MT9F002_MFR_3E3C, 0x5742, 2);
396 write_reg(mt, MT9F002_MFR_3E3E, 0x676A, 2);
397 write_reg(mt, MT9F002_MFR_3E40, 0x807D, 2);
398 write_reg(mt, MT9F002_MFR_3E42, 0x3180, 2);
399 write_reg(mt, MT9F002_MFR_3E44, 0x7000, 2);
400 write_reg(mt, MT9F002_MFR_3E46, 0x0000, 2);
401 write_reg(mt, MT9F002_MFR_3E48, 0x0000, 2);
402 write_reg(mt, MT9F002_MFR_3E4A, 0x0000, 2);
403 write_reg(mt, MT9F002_MFR_3E4C, 0x0000, 2);
404 write_reg(mt, MT9F002_MFR_3E4E, 0x0000, 2);
405 write_reg(mt, MT9F002_MFR_3E50, 0x0000, 2);
406 write_reg(mt, MT9F002_MFR_3E52, 0x0000, 2);
407 write_reg(mt, MT9F002_MFR_3E54, 0x0000, 2);
408 write_reg(mt, MT9F002_MFR_3E56, 0x0000, 2);
409 write_reg(mt, MT9F002_MFR_3E58, 0x0000, 2);
410 write_reg(mt, MT9F002_MFR_3E5A, 0x0000, 2);
411 write_reg(mt, MT9F002_MFR_3E5C, 0x0000, 2);
412 write_reg(mt, MT9F002_MFR_3E5E, 0x0000, 2);
413 write_reg(mt, MT9F002_MFR_3E60, 0x0000, 2);
414 write_reg(mt, MT9F002_MFR_3E62, 0x0000, 2);
415 write_reg(mt, MT9F002_MFR_3E64, 0x0000, 2);
416 write_reg(mt, MT9F002_MFR_3E66, 0x0000, 2);
417 write_reg(mt, MT9F002_MFR_3E68, 0x0000, 2);
418 write_reg(mt, MT9F002_MFR_3E6A, 0x0000, 2);
419 write_reg(mt, MT9F002_MFR_3E6C, 0x0000, 2);
420 write_reg(mt, MT9F002_MFR_3E6E, 0x0000, 2);
421 write_reg(mt, MT9F002_MFR_3E70, 0x0000, 2);
422 write_reg(mt, MT9F002_MFR_3E72, 0x0000, 2);
423 write_reg(mt, MT9F002_MFR_3E74, 0x0000, 2);
424 write_reg(mt, MT9F002_MFR_3E76, 0x0000, 2);
425 write_reg(mt, MT9F002_MFR_3E78, 0x0000, 2);
426 write_reg(mt, MT9F002_MFR_3E7A, 0x0000, 2);
427 write_reg(mt, MT9F002_MFR_3E7C, 0x0000, 2);
428 write_reg(mt, MT9F002_MFR_3E7E, 0x0000, 2);
429 write_reg(mt, MT9F002_MFR_3E80, 0x0000, 2);
430 write_reg(mt, MT9F002_MFR_3E82, 0x0000, 2);
431 write_reg(mt, MT9F002_MFR_3E84, 0x0000, 2);
432 write_reg(mt, MT9F002_MFR_3E86, 0x0000, 2);
433 write_reg(mt, MT9F002_MFR_3E88, 0x0000, 2);
434 write_reg(mt, MT9F002_MFR_3E8A, 0x0000, 2);
435 write_reg(mt, MT9F002_MFR_3E8C, 0x0000, 2);
436 write_reg(mt, MT9F002_MFR_3E8E, 0x0000, 2);
437 write_reg(mt, MT9F002_MFR_3E90, 0x0000, 2);
438 write_reg(mt, MT9F002_MFR_3E92, 0x0000, 2);
439 write_reg(mt, MT9F002_MFR_3E94, 0x0000, 2);
440 write_reg(mt, MT9F002_MFR_3E96, 0x0000, 2);
441 write_reg(mt, MT9F002_MFR_3E98, 0x0000, 2);
442 write_reg(mt, MT9F002_MFR_3E9A, 0x0000, 2);
443 write_reg(mt, MT9F002_MFR_3E9C, 0x0000, 2);
444 write_reg(mt, MT9F002_MFR_3E9E, 0x0000, 2);
445 write_reg(mt, MT9F002_MFR_3EA0, 0x0000, 2);
446 write_reg(mt, MT9F002_MFR_3EA2, 0x0000, 2);
447 write_reg(mt, MT9F002_MFR_3EA4, 0x0000, 2);
448 write_reg(mt, MT9F002_MFR_3EA6, 0x0000, 2);
449 write_reg(mt, MT9F002_MFR_3EA8, 0x0000, 2);
450 write_reg(mt, MT9F002_MFR_3EAA, 0x0000, 2);
451 write_reg(mt, MT9F002_MFR_3EAC, 0x0000, 2);
452 write_reg(mt, MT9F002_MFR_3EAE, 0x0000, 2);
453 write_reg(mt, MT9F002_MFR_3EB0, 0x0000, 2);
454 write_reg(mt, MT9F002_MFR_3EB2, 0x0000, 2);
455 write_reg(mt, MT9F002_MFR_3EB4, 0x0000, 2);
456 write_reg(mt, MT9F002_MFR_3EB6, 0x0000, 2);
457 write_reg(mt, MT9F002_MFR_3EB8, 0x0000, 2);
458 write_reg(mt, MT9F002_MFR_3EBA, 0x0000, 2);
459 write_reg(mt, MT9F002_MFR_3EBC, 0x0000, 2);
460 write_reg(mt, MT9F002_MFR_3EBE, 0x0000, 2);
461 write_reg(mt, MT9F002_MFR_3EC0, 0x0000, 2);
462 write_reg(mt, MT9F002_MFR_3EC2, 0x0000, 2);
463 write_reg(mt, MT9F002_MFR_3EC4, 0x0000, 2);
464 write_reg(mt, MT9F002_MFR_3EC6, 0x0000, 2);
465 write_reg(mt, MT9F002_MFR_3EC8, 0x0000, 2);
466 write_reg(mt, MT9F002_MFR_3ECA, 0x0000, 2);
467 write_reg(mt, MT9F002_MFR_3176, 0x4000, 2);
468 write_reg(mt, MT9F002_MFR_317C, 0xA00A, 2);
469 write_reg(mt, MT9F002_MFR_3EE6, 0x0000, 2);
470 write_reg(mt, MT9F002_MFR_3ED8, 0xE0E0, 2);
471 write_reg(mt, MT9F002_MFR_3EE8, 0x0001, 2);
472 write_reg(mt, MT9F002_SMIA_TEST, 0x0005, 2);
473}
474
478static inline void mt9f002_mipi_stage2(struct mt9f002_t *mt)
479{
480 write_reg(mt, MT9F002_SMIA_TEST, 0x0045, 2);
481}
482
486static inline void mt9f002_mipi_stage3(struct mt9f002_t *mt)
487{
488 write_reg(mt, MT9F002_EXTRA_DELAY, 0x0000, 2);
490 write_reg(mt, MT9F002_MFR_3EDC, 0x68CF, 2);
491 write_reg(mt, MT9F002_MFR_3EE2, 0xE363, 2);
492}
493
497static inline void mt9f002_parallel_stage1(struct mt9f002_t *mt)
498{
499 write_reg(mt, MT9F002_RESET_REGISTER , 0x0010, 2);
500 write_reg(mt, MT9F002_GLOBAL_GAIN , 0x1430, 2);
501 write_reg(mt, MT9F002_RESET_REGISTER , 0x0010, 2);
502 write_reg(mt, MT9F002_RESET_REGISTER , 0x0010, 2);
503 write_reg(mt, MT9F002_RESET_REGISTER , 0x0010, 2);
504 write_reg(mt, MT9F002_DAC_LD_14_15 , 0xE525, 2);
577 write_reg(mt, MT9F002_DAC_LD_14_15 , 0xE525, 2);
578 write_reg(mt, MT9F002_DATA_PEDESTAL_ , 0x00A8, 2);
579 write_reg(mt, MT9F002_RESET_REGISTER , 0x0090, 2);
580 write_reg(mt, MT9F002_SERIAL_FORMAT , 0x0301, 2);
581 write_reg(mt, MT9F002_RESET_REGISTER , 0x1090, 2);
582 write_reg(mt, MT9F002_SMIA_TEST , 0x0845, 2);
583 write_reg(mt, MT9F002_RESET_REGISTER , 0x1080, 2);
585 write_reg(mt, MT9F002_RESET_REGISTER , 0x9080, 2);
587 write_reg(mt, MT9F002_RESET_REGISTER , 0x10C8, 2);
589}
590
594static inline void mt9f002_parallel_stage2(struct mt9f002_t *mt)
595{
597 write_reg(mt, MT9F002_READ_MODE, 0x0041, 2);
598
599 write_reg(mt, MT9F002_READ_MODE , 0x04C3, 2);
600 write_reg(mt, MT9F002_READ_MODE , 0x04C3, 2);
605 write_reg(mt, MT9F002_DAC_LD_28_29 , 0x0047, 2);
608 write_reg(mt, MT9F002_DARK_CONTROL3 , 0x0020, 2);
609 write_reg(mt, MT9F002_DAC_LD_24_25 , 0x6349, 2);
611 write_reg(mt, MT9F002_RESET_REGISTER , 0x90C8, 2);
614 write_reg(mt, MT9F002_DAC_LD_28_29 , 0x0047, 2);
615 write_reg(mt, MT9F002_DAC_LD_30_31 , 0x15F0, 2);
616 write_reg(mt, MT9F002_DAC_LD_30_31 , 0x15F0, 2);
617 write_reg(mt, MT9F002_DAC_LD_30_31 , 0x15F0, 2);
618 write_reg(mt, MT9F002_DAC_LD_28_29 , 0x0047, 2);
619 write_reg(mt, MT9F002_DAC_LD_28_29 , 0x0047, 2);
620 write_reg(mt, MT9F002_RESET_REGISTER , 0x10C8, 2);
621 //write_reg(mt, MT9F002_RESET_REGISTER , 0x14C8, 2); // reset bad frame
623 write_reg(mt, MT9F002_DIGITAL_TEST, 0x0000 , 2);
624 //write_reg(mt, MT9F002_DATAPATH_SELECT , 0xd881, 2); // permanent line valid
626 write_reg(mt, MT9F002_MASK_CORRUPTED_FRAMES , 0x0001, 1); // 0 output corrupted frame, 1 mask them
627}
628
632static inline void mt9f002_set_pll(struct mt9f002_t *mt)
633{
634 // Update registers
635 write_reg(mt, MT9F002_VT_PIX_CLK_DIV , mt->vt_pix_clk_div, 2);
636 write_reg(mt, MT9F002_VT_SYS_CLK_DIV , mt->vt_sys_clk_div, 2);
637 write_reg(mt, MT9F002_PRE_PLL_CLK_DIV, mt->pre_pll_clk_div, 2);
638 write_reg(mt, MT9F002_PLL_MULTIPLIER , mt->pll_multiplier, 2);
639 write_reg(mt, MT9F002_OP_PIX_CLK_DIV , mt->op_pix_clk_div, 2);
640 write_reg(mt, MT9F002_OP_SYS_CLK_DIV , mt->op_sys_clk_div, 2);
641
643 write_reg(mt, MT9F002_SMIA_TEST, (smia & 0xFFBF) | (mt->shift_vt_pix_clk_div << 6), 2); // shift_vt_pix_clk_div
644
646 row_speed = (row_speed & 0xFFF8) | (mt->rowSpeed_2_0 & 0x07); // rowSpeed_2_0
647 row_speed = (row_speed & 0xF8FF) | ((mt->row_speed_10_8 & 0x07) << 8); // row_speed_10_8
648 row_speed = (row_speed & (~0x70)) | (0x2 << 4); // Change opclk_delay
650
651 // Compute clocks
652 mt->vt_pix_clk = mt->input_clk_freq * (float)mt->pll_multiplier * (float)(1 + mt->shift_vt_pix_clk_div)
653 / ((float)mt->pre_pll_clk_div * (float)mt->vt_sys_clk_div * (float)mt->vt_pix_clk_div);
654 mt->op_pix_clk = mt->input_clk_freq * (float)mt->pll_multiplier
655 / ((float)mt->pre_pll_clk_div * (float)mt->op_sys_clk_div * (float)mt->op_pix_clk_div);
656}
657
658// set the frame rate of the camera
660{
661 //Set the blanking configuration
662 if (mt->x_odd_inc > 1) {
663 if (mt->y_odd_inc > 1) {
664 /* Binning XY */
670 } else {
671 /* Binning X */
677 }
678 } else {
682 if (mt->output_scaler > 1) {
683 /* Scaler mode */
686 } else {
687 /* Normal mode */
690 }
691 }
692
695
696 float subsamplingX_factor = (float)(1 + mt->x_odd_inc) / 2.0f; // See page 52
697 float subsamplingY_factor = (float)(1 + mt->y_odd_inc) / 2.0f; // See page 52
698
699 /* Calculate minimum line length based on p. 53 */
700 // line length based on window width
703
704 // must be strictly longer than min length set in the min_line_length_pck register
706
707 // row time must be strictly larger than the time needed for the FIFO to output the data
708 if (mt->interface == MT9F002_MIPI || mt->interface == MT9F002_HiSPi) {
709 // 2 lanes, pll clocks
711 (mt->output_width * mt->vt_pix_clk / mt->op_pix_clk / 2) + mt9f002_blanking.min_line_fifo_pck + 1);
712 } else {
713 // pll clocks
715 (mt->output_width * mt->vt_pix_clk / mt->op_pix_clk) + mt9f002_blanking.min_line_fifo_pck + 1);
716 }
717
718 /* Do some magic to get it to work with P7 ISP (with horizontal blanking) */
719 uint32_t clkRatio_num = mt->op_sys_clk_div * mt->op_pix_clk_div * mt->row_speed_10_8 * (1 + mt->shift_vt_pix_clk_div);
720 uint32_t clkRatio_den = mt->vt_sys_clk_div * mt->vt_pix_clk_div;
721
722 /* Divide by the GCD to find smallest ratio */
726
727 /* Calculate minimum horizontal blanking, since fpga line_length must be divisible by 2 */
729 if ((clkRatio_den % 2) != 0) {
731 }
732
733 /* Fix fpga correction based on min horizontal blanking */
736 }
737 mt->line_length = min_line_length;
738
739 /* Calculate minimum frame length lines */
743 // frame time is limited by total number of rows (EQ 10)
745 mt->frame_length = min_frame_length;
746
747 /* Calculate FPS we get using these minimums (Maximum FPS) */
748 mt->real_fps = mt->vt_pix_clk * 1e6 / (float)(mt->line_length * mt->frame_length);
749 VERBOSE_PRINT("Maximum FPS: %0.3f\n", mt->real_fps);
750
751 /* Check if we need to downscale the FPS and bruteforce better solution */
752 if (mt->target_fps > 0 && mt->target_fps < mt->real_fps) {
753 float min_fps_err = mt->real_fps - mt->target_fps;
754 float new_fps = mt->real_fps;
755
756 // Go through all possible line lengths
758 // Go through all possible frame lengths
760 new_fps = mt->vt_pix_clk * 1000000 / (float)(ll * fl);
761
762 // Calculate FPS error and save if it is better
763 float fps_err = new_fps - mt->target_fps;
764
765 // Stop searching if FPS is lower or equal
766 if (fps_err < 0) {
767 break;
768 }
769
770 if (fps_err < min_fps_err) {
772 mt->line_length = ll;
773 mt->frame_length = fl;
774 mt->real_fps = new_fps;
775 }
776 }
777
778 // Calculate if next step is still needed (since we only need to go one step below target_fps)
779 new_fps = mt->vt_pix_clk * 1000000 / (float)(ll * min_frame_length);
780
781 // Stop searching if FPS is lower or equal
782 if (new_fps - mt->target_fps <= 0.f) {
783 break;
784 }
785 }
786 }
787
788 VERBOSE_PRINT("Set FPS: %0.3f\n", mt->vt_pix_clk * 1000000 / (float)(mt->line_length * mt->frame_length));
789
790 /* Actually set the calculated values */
791 write_reg(mt, MT9F002_LINE_LENGTH_PCK, mt->line_length, 2);
792 write_reg(mt, MT9F002_FRAME_LENGTH_LINES, mt->frame_length, 2);
793}
794
800{
801 /* Fetch minimum and maximum integration times */
807
808 /* Compute fine and coarse integration time */
809 uint32_t integration = mt->target_exposure * mt->vt_pix_clk * 1000;
810 uint16_t coarse_integration = integration / mt->line_length;
811 uint16_t fine_integration = integration % mt->line_length;
812
813 /* Make sure fine integration is inside bounds */
817
820
821 // Check if lower case is invalid (take upper coarse)
825 }
826 // Check if upper case is invalid (take lower coarse)
830 }
831 // Both are good
832 else {
833 // Calculate error to decide which is better
836
837 if (upper_error < lower_error) {
840 } else {
843 }
844 }
845 }
846
847 /* Fix saturations */
850
851 /* Set the registers */
852 mt->real_exposure = (float)(coarse_integration * mt->line_length + fine_integration) / (mt->vt_pix_clk * 1000);
855}
856
860static uint16_t mt9f002_calc_gain(float gain)
861{
862 // Check if gain is valid
863 if (gain < 1.0) {
864 gain = 1.0;
865 }
866
867 // Calculation of colamp, analg3 and digital gain based on table 19 p56
869 if (gain < 1.50) {
870 // This is not recommended
871 colamp_gain = 0;
872 analog_gain3 = 0;
873 digital_gain = 1;
874 } else if (gain < 3.0) {
875 colamp_gain = 1;
876 analog_gain3 = 0;
877 digital_gain = 1;
878 } else if (gain < 6.0) {
879 colamp_gain = 2;
880 analog_gain3 = 0;
881 digital_gain = 1;
882 } else if (gain < 16.0) {
883 colamp_gain = 3;
884 analog_gain3 = 0;
885 digital_gain = 1;
886 } else if (gain < 32.0) {
887 colamp_gain = 3;
888 analog_gain3 = 0;
889 digital_gain = 2;
890 } else {
891 colamp_gain = 3;
892 analog_gain3 = 0;
893 digital_gain = 4;
894 }
895
896 // Calculate gain 2 (fine gain)
897 uint16_t analog_gain2 = gain / (float)digital_gain / (float)(1 << colamp_gain) / (float)(1 << analog_gain3) * 64.0;
898 Bound(analog_gain2, 1, 127);
899
900 return (analog_gain2 & 0x7F) | ((analog_gain3 & 0x7) << 7) | ((colamp_gain & 0x3) << 10) | ((digital_gain & 0xF) << 12);
901}
902
903// settings to update resolution, color and exposure
907
908
919
921{
922 struct v4l2_rect crop, rect;
923 unsigned int x_odd_inc, y_odd_inc;
924 unsigned int hratio, vratio;
925 unsigned int width, height;
926 unsigned int ratio;
927 unsigned int xMultiple;
928 unsigned int div_res;
929 static const uint8_t xy_odd_inc_tab[] = {1, 1, 3, 3, 7, 7, 7, 7, 15};
930
931 crop.left = mt->offset_x;
932 crop.top = mt->offset_y;
933 crop.width = mt->sensor_width;
934 crop.height = mt->sensor_height;
935
936 VERBOSE_PRINT("Requested output - width: %i, height: %i\n", mt->output_width, mt->output_height);
937 VERBOSE_PRINT("Requested crop - top: %i, left: %i, width: %i, height: %i\n", crop.top, crop.left, crop.width,
938 crop.height);
939
940 /* Clamp the crop rectangle boundaries and Align them to a multiple of 2
941 * pixels to ensure a GRBG Bayer pattern.
942 */
943 rect.width = Clip(Align(crop.width, 4), 1, CFG_MT9F002_PIXEL_ARRAY_WIDTH);
944 rect.height = Clip(Align(crop.height, 4), 1, CFG_MT9F002_PIXEL_ARRAY_HEIGHT);
945
946 /* Clamp the width and height to avoid dividing by zero. */
947 width = Clip(Align(mt->output_width, 2), Max((int32_t)rect.width / 8, CFG_MT9F002_WINDOW_WIDTH_MIN), (int32_t)rect.width);
948 height = Clip(Align(mt->output_height, 2), Max((int32_t)rect.height / 8, CFG_MT9F002_WINDOW_HEIGHT_MIN), (int32_t)rect.height);
949
950 /* Calculate binning / skipping, we enforce that binning in X and Y are the same */
951 div_res = Min(rect.width / width, rect.height / height);
952 div_res = Clip(div_res, 1, 4);
953 x_odd_inc = xy_odd_inc_tab[div_res];
954 y_odd_inc = xy_odd_inc_tab[div_res];
955
956 /* Calculate remaining scaling not handled by binning / skipping */
957 hratio = (rect.width / ((x_odd_inc + 1) / 2) * MT9F002_SCALER_N) / width;
958 vratio = (rect.height / ((y_odd_inc + 1) / 2) * MT9F002_SCALER_N) / height;
959 ratio = Min(hratio, vratio);
960
961 /* Check ratio */
962 if (ratio > CFG_SCALER_M_MAX) {
963 /* Fix ratio to maximum and adjust the crop window */
964 ratio = CFG_SCALER_M_MAX;
965 }
966
967 rect.width = mt->output_width * ratio * ((x_odd_inc + 1) / 2) / MT9F002_SCALER_N;
968 rect.height = mt->output_height * ratio * ((y_odd_inc + 1) / 2) / MT9F002_SCALER_N;
969
970 VERBOSE_PRINT("Calculated skipping - x: %i, y: %i\n", x_odd_inc, y_odd_inc);
971 VERBOSE_PRINT("Calculated scaler - %i/%i = %0.3f\n", MT9F002_SCALER_N, ratio, MT9F002_SCALER_N / ((float)ratio));
972
973 // center crop to same as requested
974 rect.left = crop.left + ((int32_t)crop.width - (int32_t)rect.width) / 2;
975 rect.top = crop.top + ((int32_t)crop.height - (int32_t)rect.height) / 2;
976
977 rect.left = Min(rect.left, CFG_MT9F002_PIXEL_ARRAY_WIDTH - (int32_t)rect.width);
981
982 /* Align left offset to 8 */
983 xMultiple = 8 * ((x_odd_inc + 1) / 2);
984 rect.left = Align(rect.left, (int32_t)xMultiple);
985
986 /* Align top offset to 2 */
987 rect.top = Align(rect.top, 4);
988
989 /* Update crop */
990 crop = rect;
991 VERBOSE_PRINT("Granted crop - top: %i, left: %i, width: %i, height: %i\n", crop.top, crop.left, crop.width,
992 crop.height);
993 VERBOSE_PRINT("Granted output - width: %i, height: %i\n", width, height);
994
995 /* Update values */
996 mt->output_scaler = ratio;
997 mt->x_odd_inc = x_odd_inc;
998 mt->y_odd_inc = y_odd_inc;
999
1000 mt->offset_x = crop.left;
1001 mt->offset_y = crop.top;
1002 mt->sensor_width = crop.width;
1003 mt->sensor_height = crop.height;
1004}
1005
1007{
1008 /* Set window pos */
1011 write_reg(mt, MT9F002_X_ADDR_END, Min(mt->offset_x + mt->sensor_width - 1, CFG_MT9F002_X_ADDR_MAX), 2);
1012 write_reg(mt, MT9F002_Y_ADDR_END, Min(mt->offset_y + mt->sensor_height - 1, CFG_MT9F002_Y_ADDR_MAX), 2);
1013
1014 /* Set output resolution */
1015 write_reg(mt, MT9F002_X_OUTPUT_SIZE, mt->output_width, 2);
1016 write_reg(mt, MT9F002_Y_OUTPUT_SIZE, mt->output_height, 2);
1017
1018 /* scaler */
1019 if (mt->output_scaler > 1) {
1020 /* enable scaling mode */
1022 write_reg(mt, MT9F002_DATAPATH_SELECT, 0xd8b0, 2); // bayer resampling
1023 write_reg(mt, MT9F002_SCALE_M, mt->output_scaler, 2);
1024 }
1025
1026 /* Binning / Skipping */
1027 if (mt->x_odd_inc > 1 || mt->x_odd_inc > 1) {
1028 write_reg(mt, MT9F002_READ_MODE, 0x0441, 2);
1029 } else {
1030 write_reg(mt, MT9F002_READ_MODE, 0x0041, 2);
1031 }
1032 write_reg(mt, MT9F002_X_ODD_INC, mt->x_odd_inc, 2);
1033 write_reg(mt, MT9F002_Y_ODD_INC, mt->y_odd_inc, 2);
1034
1035 return;
1036}
1037
1043{
1044 /* Reset the device */
1045 //TODO???
1046
1047 /* Setup i2c transaction */
1048 mt->i2c_trans.status = I2CTransDone;
1049
1050 /* Software reset */
1052 usleep(1000000); // Wait for one second
1053
1054 /* Based on the interface configure stage 1 */
1055 if (mt->interface == MT9F002_MIPI || mt->interface == MT9F002_HiSPi) {
1057 } else {
1059 }
1060
1061 /* Set the PLL based on Input clock and wanted clock frequency */
1063
1064 /* Calculate binning/skipping/scaling for requested sensor domain and output resolution */
1066
1067 /* Based on the interface configure stage 2 */
1068 if (mt->interface == MT9F002_MIPI || mt->interface == MT9F002_HiSPi) {
1070 } else {
1072 }
1073
1075
1076 /* Update blanking (based on FPS) */
1078
1079 /* Update statistics window (inside of cropped sensor area)*/
1080 isp_request_statistics_yuv_window(0, mt->sensor_width, 0, mt->sensor_height, 1, 1);
1081
1082 /* Update exposure (based on target_exposure) */
1084
1085 /* Update gains for the different pixel colors */
1087
1088 /* Based on the interface configure stage 3 */
1089 if (mt->interface == MT9F002_MIPI || mt->interface == MT9F002_HiSPi) {
1091 }
1092
1093 /* Turn the stream on */
1094 write_reg(mt, MT9F002_MODE_SELECT, 0x01, 1);
1095
1096 VERBOSE_PRINT("MT9F002 initialized\n");
1097}
1098
1100{
1101 mt->gain_red = MT9F002_GAIN_RED;
1102 mt->gain_blue = MT9F002_GAIN_BLUE;
1103 mt->gain_green1 = MT9F002_GAIN_GREEN1;
1104 mt->gain_green2 = MT9F002_GAIN_GREEN2;
1106}
1107
1109{
1110 mt->target_exposure = MT9F002_TARGET_EXPOSURE;
1112}
1113
1114/* Handler for propagating user resolution change so the camera
1115 *
1116 */
1138
1143
1148
#define UNUSED(x)
#define Min(x, y)
Definition esc_dshot.c:109
bool i2c_blocking_transceive(struct i2c_periph *p, struct i2c_transaction *t, uint8_t s_addr, uint8_t len_w, uint16_t len_r)
Submit a write/read transaction and wait for it to complete.
Definition i2c.c:281
bool i2c_blocking_transmit(struct i2c_periph *p, struct i2c_transaction *t, uint8_t s_addr, uint8_t len)
Submit a write only transaction and wait for it to complete.
Definition i2c.c:237
@ I2CTransDone
transaction set to done by user level
Definition i2c.h:59
uint32_t int32_gcd(uint32_t a, uint32_t b)
uint16_t w
The width.
Definition image.h:87
int isp_request_statistics_yuv_window(uint16_t x_start, uint16_t x_end, uint16_t y_start, uint16_t y_end, uint16_t x_odd_inc, uint16_t y_odd_inc)
Definition libisp.c:214
uint16_t foo
Definition main_demo5.c:58
#define VERBOSE_PRINT(...)
Definition mt9f002.c:53
struct mt9f002_t mt9f002
Definition mt9f002.c:123
static void mt9f002_parallel_stage1(struct mt9f002_t *mt)
Configure stage 1 for parallel connection.
Definition mt9f002.c:497
void mt9f002_reset_exposure(struct mt9f002_t *mt)
Definition mt9f002.c:1108
static uint16_t mt9f002_calc_gain(float gain)
Calculate the gain based on value of 1.0 -> 63.50.
Definition mt9f002.c:860
static void mt9f002_mipi_stage1(struct mt9f002_t *mt)
Configure stage 1 for both MiPi and HiSPi connection.
Definition mt9f002.c:222
uint16_t min_line_blanking_pck
Definition mt9f002.c:166
#define MT9F002_GAIN_RED
Definition mt9f002.c:82
void mt9f002_set_gains(struct mt9f002_t *mt)
Sets the GreenR, Blue, Red and GreenB gains.
Definition mt9f002.c:912
static void mt9f002_mipi_stage3(struct mt9f002_t *mt)
Configure stage 3 for both MiPi and HiSPi connection.
Definition mt9f002.c:486
static void mt9f002_parallel_stage2(struct mt9f002_t *mt)
Configure stage 2 for parallel connection.
Definition mt9f002.c:594
static void mt9f002_set_blanking(struct mt9f002_t *mt)
Definition mt9f002.c:659
uint16_t fine_integration_time_max_margin
Definition mt9f002.c:170
uint16_t min_line_length_pck
Definition mt9f002.c:167
#define MT9F002_GAIN_BLUE
Definition mt9f002.c:86
#define MT9F002_GAIN_GREEN1
Definition mt9f002.c:74
uint16_t fine_integration_time_min
Definition mt9f002.c:169
static uint32_t read_reg(struct mt9f002_t *mt, uint16_t addr, uint8_t len)
Read multiple bytes from a register.
Definition mt9f002.c:203
void mt9f002_init(struct mt9f002_t *mt)
Initialisation of the Aptina MT9F002 CMOS sensor (front camera)
Definition mt9f002.c:1042
float mt9f002_send_color
Definition mt9f002.c:905
static void mt9f002_set_pll(struct mt9f002_t *mt)
Set the PLL registers based on config.
Definition mt9f002.c:632
static void mt9f002_calc_resolution(struct mt9f002_t *mt)
Definition mt9f002.c:920
struct blanking_t mt9f002_blanking
float mt9f002_send_resolution
Definition mt9f002.c:904
static void mt9f002_mipi_stage2(struct mt9f002_t *mt)
Configure stage 2 for both MiPi and HiSPi connection.
Definition mt9f002.c:478
#define MT9F002_TARGET_EXPOSURE
Exposure of the front camera of the bebop.
Definition mt9f002.c:69
void mt9f002_setting_update_resolution(float in UNUSED)
Definition mt9f002.c:1117
static void write_reg(struct mt9f002_t *mt, uint16_t addr, uint32_t val, uint8_t len)
Write multiple bytes to a single register.
Definition mt9f002.c:176
void mt9f002_setting_update_exposure(float in UNUSED)
Definition mt9f002.c:1144
void mt9f002_set_exposure(struct mt9f002_t *mt)
Set the exposure configuration Depends on the blanking (and therefore the FPS)
Definition mt9f002.c:799
struct video_config_t front_camera
Definition mt9f002.c:90
float mt9f002_send_exposure
Definition mt9f002.c:906
void mt9f002_reset_color(struct mt9f002_t *mt)
Definition mt9f002.c:1099
#define MT9F002_GAIN_GREEN2
Definition mt9f002.c:78
static void mt9f002_set_resolution(struct mt9f002_t *mt)
Definition mt9f002.c:1006
uint16_t min_line_fifo_pck
Definition mt9f002.c:168
#define PRINT(string,...)
Definition mt9f002.c:48
void mt9f002_setting_update_color(float in UNUSED)
Definition mt9f002.c:1139
Initialization and configuration of the MT9F002 CMOS Chip.
#define MT9F002_CENTER_X
Definition mt9f002.h:116
uint16_t op_sys_clk_div
Fixed PLL config from calculator tool.
Definition mt9f002.h:141
float target_exposure
Target exposure time in ms.
Definition mt9f002.h:152
#define MT9F002_OFFSET_X
Definition mt9f002.h:91
enum mt9f002_interface interface
Interface used to connect.
Definition mt9f002.h:134
uint16_t op_pix_clk_div
Fixed PLL config from calculator tool.
Definition mt9f002.h:140
uint8_t x_odd_inc
X increment for subsampling (1,3,7,15,31 accepted)
Definition mt9f002.h:171
#define CFG_MT9F002_X_ADDR_MIN
Definition mt9f002.h:40
#define MT9F002_DHANE_K
Definition mt9f002.h:122
#define CFG_MT9F002_Y_ADDR_MIN
Definition mt9f002.h:42
float gain_red
Gain for the Red pixels [1., 63.50].
Definition mt9f002.h:157
uint16_t offset_x
Offset from left in pixels.
Definition mt9f002.h:165
#define CFG_MT9F002_WINDOW_HEIGHT_MIN
Definition mt9f002.h:37
float gain_green2
Gain for the GreenB pixels [1., 63.50].
Definition mt9f002.h:158
float target_fps
FPS wanted.
Definition mt9f002.h:150
uint16_t output_width
Output width.
Definition mt9f002.h:160
float set_zoom
Image zoom set point.
Definition mt9f002.h:177
#define CFG_MT9F002_PIXEL_ARRAY_WIDTH
Definition mt9f002.h:39
#define MT9F002_ZOOM
Definition mt9f002.h:101
float gain_green1
Gain for the GreenR pixels [1., 63.50].
Definition mt9f002.h:155
uint8_t shift_vt_pix_clk_div
Fixed PLL config from calculator tool.
Definition mt9f002.h:142
float set_offset_y
Signed fractional offset from centre of image of original sensor [-0.5,0.5].
Definition mt9f002.h:179
#define CFG_SCALER_M_MAX
Definition mt9f002.h:35
@ MT9F002_PARALLEL
Parallel type connection.
Definition mt9f002.h:129
@ MT9F002_HiSPi
HiSPi type connection.
Definition mt9f002.h:128
@ MT9F002_MIPI
MIPI type connection.
Definition mt9f002.h:127
#define MT9F002_CENTER_Y
Definition mt9f002.h:119
uint16_t pre_pll_clk_div
Fixed PLL config from calculator tool.
Definition mt9f002.h:138
uint16_t output_height
Output height.
Definition mt9f002.h:161
#define MT9F002_FOCAL_Y
Definition mt9f002.h:113
uint8_t row_speed_10_8
Fixed PLL config from calculator tool.
Definition mt9f002.h:144
uint8_t rowSpeed_2_0
Fixed PLL config from calculator tool.
Definition mt9f002.h:143
uint16_t offset_y
Offset from top in pixels.
Definition mt9f002.h:166
uint8_t y_odd_inc
Y increment for subsampling (1,3,7,15,31 accepted)
Definition mt9f002.h:172
uint16_t vt_sys_clk_div
Fixed PLL config from calculator tool.
Definition mt9f002.h:137
float gain_blue
Gain for the Blue pixels [1., 63.50].
Definition mt9f002.h:156
#define MT9F002_OUTPUT_WIDTH
Definition mt9f002.h:82
#define CFG_MT9F002_WINDOW_WIDTH_MIN
Definition mt9f002.h:36
#define CFG_MT9F002_PIXEL_ARRAY_HEIGHT
Definition mt9f002.h:38
uint16_t sensor_width
Definition mt9f002.h:168
uint16_t output_scaler
Output scaler.
Definition mt9f002.h:162
uint16_t vt_pix_clk_div
Fixed PLL config from calculator tool.
Definition mt9f002.h:136
#define CFG_MT9F002_Y_ADDR_MAX
Definition mt9f002.h:43
#define CFG_MT9F002_X_ADDR_MAX
Definition mt9f002.h:41
uint16_t pll_multiplier
Fixed PLL config from calculator tool.
Definition mt9f002.h:139
uint16_t sensor_height
Definition mt9f002.h:169
float set_offset_x
Signed fractional offset from centre of image of original sensor [-0.5,0.5].
Definition mt9f002.h:178
#define MT9F002_OFFSET_Y
Definition mt9f002.h:96
#define MT9F002_TARGET_FPS
Definition mt9f002.h:105
#define MT9F002_FOCAL_X
Definition mt9f002.h:110
#define MT9F002_OUTPUT_HEIGHT
Definition mt9f002.h:85
#define MT9F002_MFR_3EC4
#define MT9F002_MFR_3E3A
#define MT9F002_MFR_3D96
#define MT9F002_MFR_3E62
#define MT9F002_MFR_3EAE
#define MT9F002_MFR_3DDC
#define MT9F002_MFR_3E2C
#define MT9F002_MFR_3DBE
#define MT9F002_MFR_3E58
#define MT9F002_MFR_3EDC
#define MT9F002_MFR_3DE4
#define MT9F002_MFR_3E00
#define MT9F002_MFR_3D24
#define MT9F002_MFR_3E0C
#define MT9F002_GREEN1_GAIN
#define MT9F002_MFR_3E88
#define MT9F002_RED_GAIN
#define MT9F002_MFR_3E4E
#define MT9F002_MFR_3DC4
#define MT9F002_COLUMN_CORRECTION
#define MT9F002_MFR_3E08
#define MT9F002_MFR_3D4C
#define MT9F002_OP_PIX_CLK_DIV
#define MT9F002_MFR_3DB6
#define MT9F002_MFR_3D26
#define MT9F002_MFR_3EC2
#define MT9F002_MFR_3D3A
#define MT9F002_MFR_3D8E
#define MT9F002_MFR_3E28
#define MT9F002_MFR_3DCC
#define MT9F002_MFR_3DB2
#define MT9F002_MFR_3D4E
#define MT9F002_MFR_3D0C
#define MT9F002_MFR_3EAC
#define MT9F002_MFR_3DE0
#define MT9F002_MFR_3E32
#define MT9F002_MFR_3E48
#define MT9F002_MFR_3D6E
#define MT9F002_MFR_3D92
#define MT9F002_MFR_3DD4
#define MT9F002_MFR_3D48
#define MT9F002_MFR_3EB4
#define MT9F002_MFR_3DDA
#define MT9F002_MFR_3DAA
#define MT9F002_MFR_3EB6
#define MT9F002_MFR_3ED8
#define MT9F002_MFR_3D00
#define MT9F002_DATA_PEDESTAL_
#define MT9F002_MFR_3E92
#define MT9F002_MFR_3D46
#define MT9F002_MFR_3D50
#define MT9F002_MFR_3E10
#define MT9F002_MFR_3DBC
#define MT9F002_MFR_3D5E
#define MT9F002_MFR_3E9C
#define MT9F002_MFR_3E80
#define MT9F002_MFR_3E24
#define MT9F002_X_OUTPUT_SIZE
#define MT9F002_MFR_3E4A
#define MT9F002_MFR_3D2C
#define MT9F002_MFR_3DFA
#define MT9F002_DATAPATH_SELECT
#define MT9F002_MFR_3D16
#define MT9F002_MFR_3DBA
#define MT9F002_COARSE_INTEGRATION_TIME_MAX_MARGIN
#define MT9F002_MFR_3E6E
#define MT9F002_MFR_3D74
#define MT9F002_MFR_3EB2
#define MT9F002_EXTRA_DELAY
#define MT9F002_MFR_3D88
#define MT9F002_PRE_PLL_CLK_DIV
#define MT9F002_MFR_3E72
#define MT9F002_MFR_3D22
#define MT9F002_MFR_3D72
#define MT9F002_MFR_3EC0
#define MT9F002_MFR_3D44
#define MT9F002_MFR_3DFC
#define MT9F002_ROW_SPEED
#define MT9F002_CPP_DATA_FORMAT
#define MT9F002_MFR_3DAC
#define MT9F002_MFR_3DE6
#define MT9F002_MFR_3D0E
#define MT9F002_MFR_3DC8
#define MT9F002_MFR_3D7E
#define MT9F002_MFR_3D8A
#define MT9F002_OP_SYS_CLK_DIV
#define MT9F002_MFR_3E06
#define MT9F002_MFR_3D9A
#define MT9F002_SCALING_MODE
#define MT9F002_MFR_3DF2
#define MT9F002_MFR_3E12
#define MT9F002_GLOBAL_GAIN
#define MT9F002_MFR_3D42
#define MT9F002_GREEN2_GAIN
#define MT9F002_MFR_3EA6
#define MT9F002_MFR_3DDE
#define MT9F002_RESET_REGISTER
#define MT9F002_MFR_3DF6
#define MT9F002_MFR_3E8E
#define MT9F002_DAC_LD_14_15
#define MT9F002_MFR_3E84
#define MT9F002_MFR_3E9A
#define MT9F002_MFR_3DCE
#define MT9F002_DAC_LD_24_25
#define MT9F002_MFR_3DEE
#define MT9F002_MFR_3E7C
#define MT9F002_MFR_3DA8
#define MT9F002_MFR_3E1E
#define MT9F002_MFR_3E0A
#define MT9F002_MFR_3E3E
#define MT9F002_MFR_3D52
#define MT9F002_X_ADDR_END
#define MT9F002_MFR_3E52
#define MT9F002_Y_ODD_INC
#define MT9F002_MFR_3D68
#define MT9F002_FRAME_LENGTH_MAX
Definition mt9f002_regs.h:8
#define MT9F002_MFR_3D86
#define MT9F002_MFR_3DC2
#define MT9F002_DIGITAL_TEST
#define MT9F002_CTX_WR_DATA_REG
#define MT9F002_MFR_3E76
#define MT9F002_MFR_3E90
#define MT9F002_MFR_3EE6
#define MT9F002_X_ADDR_START
#define MT9F002_MFR_3E5E
#define MT9F002_MFR_3E26
#define MT9F002_READ_MODE
#define MT9F002_DAC_LD_28_29
#define MT9F002_MFR_3D60
#define MT9F002_MFR_3E8A
#define MT9F002_MFR_3EAA
#define MT9F002_MFR_3D7C
#define MT9F002_MFR_3D06
#define MT9F002_MFR_3E46
#define MT9F002_MFR_3E1C
#define MT9F002_MFR_3DA4
#define MT9F002_MFR_3E6A
#define MT9F002_MFR_3E20
#define MT9F002_MFR_3ECA
#define MT9F002_ADDRESS
Definition mt9f002_regs.h:4
#define MT9F002_MFR_3E38
#define MT9F002_MFR_3E82
#define MT9F002_MFR_3DA6
#define MT9F002_MFR_3D7A
#define MT9F002_MFR_3EBE
#define MT9F002_MFR_3E64
#define MT9F002_MFR_3D08
#define MT9F002_ANALOG_CONTROL5
#define MT9F002_FINE_INTEGRATION_TIME_
#define MT9F002_MFR_3E94
#define MT9F002_MFR_3E68
#define MT9F002_SMIA_TEST
#define MT9F002_MFR_3EC6
#define MT9F002_LINE_LENGTH_PCK
#define MT9F002_FRAME_LENGTH_LINES
#define MT9F002_MFR_3E9E
#define MT9F002_MFR_3EA2
#define MT9F002_MFR_3D76
#define MT9F002_SERIAL_FORMAT
#define MT9F002_MFR_3D78
#define MT9F002_MFR_3DC6
#define MT9F002_MFR_3D02
#define MT9F002_MFR_3D38
#define MT9F002_MFR_3E56
#define MT9F002_MFR_3E0E
#define MT9F002_MFR_3E04
#define MT9F002_MFR_3E78
#define MT9F002_MFR_3E5A
#define MT9F002_MFR_3D4A
#define MT9F002_ANALOG_CONTROL7
#define MT9F002_MFR_3EE8
#define MT9F002_VT_SYS_CLK_DIV
#define MT9F002_MFR_3D20
#define MT9F002_MFR_3D18
#define MT9F002_MFR_3DF8
#define MT9F002_BLUE_GAIN
#define MT9F002_MFR_3DF4
#define MT9F002_MFR_3DB4
#define MT9F002_ANALOG_CONTROL4
#define MT9F002_MFR_3E7E
#define MT9F002_MFR_3D2E
#define MT9F002_MIN_FRAME_BLANKING_LINES
#define MT9F002_MFR_3E6C
#define MT9F002_VT_PIX_CLK_DIV
#define MT9F002_MFR_3E36
#define MT9F002_MFR_3D82
#define MT9F002_MFR_3D1C
#define MT9F002_MFR_3E98
#define MT9F002_MFR_3DD6
#define MT9F002_MFR_3D6C
#define MT9F002_MFR_3D70
#define MT9F002_MFR_3D5C
#define MT9F002_MFR_3D56
#define MT9F002_MFR_3D3E
#define MT9F002_MFR_3D8C
#define MT9F002_MFR_3DA2
#define MT9F002_MFR_3D36
#define MT9F002_MFR_3DD8
#define MT9F002_MFR_3D1A
#define MT9F002_MFR_3D9C
#define MT9F002_MFR_3E30
#define MT9F002_MFR_3D04
#define MT9F002_MFR_3EA8
#define MT9F002_MFR_3E14
#define MT9F002_MFR_3D34
#define MT9F002_MFR_3E4C
#define MT9F002_MFR_3D66
#define MT9F002_MFR_3DEC
#define MT9F002_MFR_3E5C
#define MT9F002_MODE_SELECT
#define MT9F002_MFR_3EA0
#define MT9F002_MFR_3D3C
#define MT9F002_MFR_3E42
#define MT9F002_MFR_3DA0
#define MT9F002_MFR_3E54
#define MT9F002_MFR_3DF0
#define MT9F002_MFR_3E34
#define MT9F002_MFR_3D54
#define MT9F002_MFR_3E22
#define MT9F002_MFR_3D2A
#define MT9F002_Y_ADDR_END
#define MT9F002_MFR_3E18
#define MT9F002_MFR_3E7A
#define MT9F002_MFR_3D40
#define MT9F002_MFR_3DB0
#define MT9F002_MFR_3D98
#define MT9F002_MFR_317C
#define MT9F002_MFR_3DD0
#define MT9F002_MFR_3D90
#define MT9F002_PLL_MULTIPLIER
#define MT9F002_MFR_3DD2
#define MT9F002_MFR_3D58
#define MT9F002_MFR_3DFE
#define MT9F002_MFR_3E8C
#define MT9F002_DAC_LD_30_31
#define MT9F002_MFR_3E02
#define MT9F002_SCALER_N
Definition mt9f002_regs.h:6
#define MT9F002_MFR_3D10
#define MT9F002_SCALE_M
#define MT9F002_MFR_3E70
#define MT9F002_MFR_3DAE
#define MT9F002_MFR_3D14
#define MT9F002_MFR_3E16
#define MT9F002_MFR_3E2A
#define MT9F002_MFR_3D28
#define MT9F002_MFR_3D30
#define MT9F002_MFR_3DE2
#define MT9F002_MFR_3D9E
#define MT9F002_DARK_CONTROL3
#define MT9F002_MFR_3E44
#define MT9F002_MFR_3D62
#define MT9F002_MFR_3176
#define MT9F002_MFR_3DE8
#define MT9F002_MFR_3E86
#define MT9F002_MFR_3E2E
#define MT9F002_MFR_3E60
#define MT9F002_MFR_3E50
#define MT9F002_MFR_3EC8
#define MT9F002_MFR_3E3C
#define MT9F002_MFR_3EB8
#define MT9F002_MFR_3EA4
#define MT9F002_MASK_CORRUPTED_FRAMES
#define MT9F002_COARSE_INTEGRATION_TIME_MIN
#define MT9F002_MFR_3E74
#define MT9F002_MFR_3E1A
#define MT9F002_MFR_3E66
#define MT9F002_MFR_3D32
#define MT9F002_MFR_3DCA
#define MT9F002_MFR_3D84
#define MT9F002_Y_ADDR_START
#define MT9F002_MFR_3D94
#define MT9F002_MFR_3D0A
#define MT9F002_MFR_3DC0
#define MT9F002_SOFTWARE_RESET
#define MT9F002_MFR_3D80
#define MT9F002_MFR_3DB8
#define MT9F002_MFR_3EB0
#define MT9F002_MFR_3D6A
#define MT9F002_MFR_3D5A
#define MT9F002_Y_OUTPUT_SIZE
#define MT9F002_CTX_CONTROL_REG
#define MT9F002_X_ODD_INC
#define MT9F002_COARSE_INTEGRATION_TIME
#define MT9F002_MFR_3E96
#define MT9F002_MFR_3D1E
#define MT9F002_MFR_3DEA
#define MT9F002_MFR_3E40
#define MT9F002_MFR_3EE2
#define MT9F002_MFR_3D64
#define MT9F002_MFR_3EBA
#define MT9F002_MFR_3D12
#define MT9F002_MFR_3EBC
#define MT9F002_LINE_LENGTH_MAX
Definition mt9f002_regs.h:7
Paparazzi fixed point algebra.
uint16_t val[TCOUPLE_NB]
#define VIDEO_FILTER_ISP
Enable ISP.
struct img_size_t output_size
Output image size.
V4L2 device settings.
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
int int32_t
Typedef defining 32 bit int type.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.