38#include <linux/i2c-dev.h>
39#include <linux/videodev2.h>
41#include "generated/airframe.h"
48#define PRINT(string,...) fprintf(stderr, "[MT9F002->%s()] " string,__FUNCTION__ , ##__VA_ARGS__)
51#define VERBOSE_PRINT PRINT
53#define VERBOSE_PRINT(...)
68#ifndef MT9F002_TARGET_EXPOSURE
69#define MT9F002_TARGET_EXPOSURE 30
73#ifndef MT9F002_GAIN_GREEN1
74#define MT9F002_GAIN_GREEN1 2.0
77#ifndef MT9F002_GAIN_GREEN2
78#define MT9F002_GAIN_GREEN2 2.0
81#ifndef MT9F002_GAIN_RED
82#define MT9F002_GAIN_RED 1.4
85#ifndef MT9F002_GAIN_BLUE
86#define MT9F002_GAIN_BLUE 2.7
105 .dev_name =
"/dev/video1",
106 .subdev_name =
"/dev/v4l-subdev1",
113 .camera_intrinsics = {
126 .input_clk_freq = (26 / 2),
178 mt->i2c_trans.buf[0] = addr >> 8;
179 mt->i2c_trans.buf[1] = addr & 0xFF;
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;
193 PRINT(
"Write_reg with incorrect length %d\r\n", len);
206 mt->i2c_trans.buf[0] = addr >> 8;
207 mt->i2c_trans.buf[1] = addr & 0xFF;
213 for (
uint8_t i = 0; i < len; i++) {
214 ret |=
mt->i2c_trans.buf[len - i - 1] << (8 * i);
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);
662 if (
mt->x_odd_inc > 1) {
663 if (
mt->y_odd_inc > 1) {
682 if (
mt->output_scaler > 1) {
748 mt->real_fps =
mt->vt_pix_clk * 1
e6 / (
float)(
mt->line_length *
mt->frame_length);
752 if (
mt->target_fps > 0 &&
mt->target_fps <
mt->real_fps) {
772 mt->line_length =
ll;
773 mt->frame_length =
fl;
788 VERBOSE_PRINT(
"Set FPS: %0.3f\n",
mt->vt_pix_clk * 1000000 / (
float)(
mt->line_length *
mt->frame_length));
874 }
else if (gain < 3.0) {
878 }
else if (gain < 6.0) {
882 }
else if (gain < 16.0) {
886 }
else if (gain < 32.0) {
923 unsigned int x_odd_inc, y_odd_inc;
925 unsigned int width, height;
931 crop.left =
mt->offset_x;
932 crop.top =
mt->offset_y;
933 crop.width =
mt->sensor_width;
934 crop.height =
mt->sensor_height;
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,
970 VERBOSE_PRINT(
"Calculated skipping - x: %i, y: %i\n", x_odd_inc, y_odd_inc);
991 VERBOSE_PRINT(
"Granted crop - top: %i, left: %i, width: %i, height: %i\n", crop.top, crop.left, crop.width,
993 VERBOSE_PRINT(
"Granted output - width: %i, height: %i\n", width, height);
996 mt->output_scaler = ratio;
997 mt->x_odd_inc = x_odd_inc;
998 mt->y_odd_inc = y_odd_inc;
1000 mt->offset_x = crop.left;
1001 mt->offset_y = crop.top;
1002 mt->sensor_width = crop.width;
1003 mt->sensor_height = crop.height;
1019 if (
mt->output_scaler > 1) {
1027 if (
mt->x_odd_inc > 1 ||
mt->x_odd_inc > 1) {
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.
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.
@ I2CTransDone
transaction set to done by user level
uint32_t int32_gcd(uint32_t a, uint32_t b)
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)
#define VERBOSE_PRINT(...)
static void mt9f002_parallel_stage1(struct mt9f002_t *mt)
Configure stage 1 for parallel connection.
void mt9f002_reset_exposure(struct mt9f002_t *mt)
static uint16_t mt9f002_calc_gain(float gain)
Calculate the gain based on value of 1.0 -> 63.50.
static void mt9f002_mipi_stage1(struct mt9f002_t *mt)
Configure stage 1 for both MiPi and HiSPi connection.
uint16_t min_line_blanking_pck
void mt9f002_set_gains(struct mt9f002_t *mt)
Sets the GreenR, Blue, Red and GreenB gains.
static void mt9f002_mipi_stage3(struct mt9f002_t *mt)
Configure stage 3 for both MiPi and HiSPi connection.
static void mt9f002_parallel_stage2(struct mt9f002_t *mt)
Configure stage 2 for parallel connection.
static void mt9f002_set_blanking(struct mt9f002_t *mt)
uint16_t fine_integration_time_max_margin
uint16_t min_line_length_pck
#define MT9F002_GAIN_BLUE
#define MT9F002_GAIN_GREEN1
uint16_t fine_integration_time_min
static uint32_t read_reg(struct mt9f002_t *mt, uint16_t addr, uint8_t len)
Read multiple bytes from a register.
void mt9f002_init(struct mt9f002_t *mt)
Initialisation of the Aptina MT9F002 CMOS sensor (front camera)
static void mt9f002_set_pll(struct mt9f002_t *mt)
Set the PLL registers based on config.
static void mt9f002_calc_resolution(struct mt9f002_t *mt)
struct blanking_t mt9f002_blanking
float mt9f002_send_resolution
static void mt9f002_mipi_stage2(struct mt9f002_t *mt)
Configure stage 2 for both MiPi and HiSPi connection.
#define MT9F002_TARGET_EXPOSURE
Exposure of the front camera of the bebop.
void mt9f002_setting_update_resolution(float in UNUSED)
static void write_reg(struct mt9f002_t *mt, uint16_t addr, uint32_t val, uint8_t len)
Write multiple bytes to a single register.
void mt9f002_setting_update_exposure(float in UNUSED)
void mt9f002_set_exposure(struct mt9f002_t *mt)
Set the exposure configuration Depends on the blanking (and therefore the FPS)
struct video_config_t front_camera
float mt9f002_send_exposure
void mt9f002_reset_color(struct mt9f002_t *mt)
#define MT9F002_GAIN_GREEN2
static void mt9f002_set_resolution(struct mt9f002_t *mt)
uint16_t min_line_fifo_pck
#define PRINT(string,...)
void mt9f002_setting_update_color(float in UNUSED)
Initialization and configuration of the MT9F002 CMOS Chip.
uint16_t op_sys_clk_div
Fixed PLL config from calculator tool.
float target_exposure
Target exposure time in ms.
enum mt9f002_interface interface
Interface used to connect.
uint16_t op_pix_clk_div
Fixed PLL config from calculator tool.
uint8_t x_odd_inc
X increment for subsampling (1,3,7,15,31 accepted)
#define CFG_MT9F002_X_ADDR_MIN
#define CFG_MT9F002_Y_ADDR_MIN
float gain_red
Gain for the Red pixels [1., 63.50].
uint16_t offset_x
Offset from left in pixels.
#define CFG_MT9F002_WINDOW_HEIGHT_MIN
float gain_green2
Gain for the GreenB pixels [1., 63.50].
float target_fps
FPS wanted.
uint16_t output_width
Output width.
float set_zoom
Image zoom set point.
#define CFG_MT9F002_PIXEL_ARRAY_WIDTH
float gain_green1
Gain for the GreenR pixels [1., 63.50].
uint8_t shift_vt_pix_clk_div
Fixed PLL config from calculator tool.
float set_offset_y
Signed fractional offset from centre of image of original sensor [-0.5,0.5].
@ MT9F002_PARALLEL
Parallel type connection.
@ MT9F002_HiSPi
HiSPi type connection.
@ MT9F002_MIPI
MIPI type connection.
uint16_t pre_pll_clk_div
Fixed PLL config from calculator tool.
uint16_t output_height
Output height.
uint8_t row_speed_10_8
Fixed PLL config from calculator tool.
uint8_t rowSpeed_2_0
Fixed PLL config from calculator tool.
uint16_t offset_y
Offset from top in pixels.
uint8_t y_odd_inc
Y increment for subsampling (1,3,7,15,31 accepted)
uint16_t vt_sys_clk_div
Fixed PLL config from calculator tool.
float gain_blue
Gain for the Blue pixels [1., 63.50].
#define MT9F002_OUTPUT_WIDTH
#define CFG_MT9F002_WINDOW_WIDTH_MIN
#define CFG_MT9F002_PIXEL_ARRAY_HEIGHT
uint16_t output_scaler
Output scaler.
uint16_t vt_pix_clk_div
Fixed PLL config from calculator tool.
#define CFG_MT9F002_Y_ADDR_MAX
#define CFG_MT9F002_X_ADDR_MAX
uint16_t pll_multiplier
Fixed PLL config from calculator tool.
float set_offset_x
Signed fractional offset from centre of image of original sensor [-0.5,0.5].
#define MT9F002_TARGET_FPS
#define MT9F002_OUTPUT_HEIGHT
#define MT9F002_GREEN1_GAIN
#define MT9F002_COLUMN_CORRECTION
#define MT9F002_OP_PIX_CLK_DIV
#define MT9F002_DATA_PEDESTAL_
#define MT9F002_X_OUTPUT_SIZE
#define MT9F002_DATAPATH_SELECT
#define MT9F002_COARSE_INTEGRATION_TIME_MAX_MARGIN
#define MT9F002_EXTRA_DELAY
#define MT9F002_PRE_PLL_CLK_DIV
#define MT9F002_ROW_SPEED
#define MT9F002_CPP_DATA_FORMAT
#define MT9F002_OP_SYS_CLK_DIV
#define MT9F002_SCALING_MODE
#define MT9F002_GLOBAL_GAIN
#define MT9F002_GREEN2_GAIN
#define MT9F002_RESET_REGISTER
#define MT9F002_DAC_LD_14_15
#define MT9F002_DAC_LD_24_25
#define MT9F002_X_ADDR_END
#define MT9F002_Y_ODD_INC
#define MT9F002_FRAME_LENGTH_MAX
#define MT9F002_DIGITAL_TEST
#define MT9F002_CTX_WR_DATA_REG
#define MT9F002_X_ADDR_START
#define MT9F002_READ_MODE
#define MT9F002_DAC_LD_28_29
#define MT9F002_ANALOG_CONTROL5
#define MT9F002_FINE_INTEGRATION_TIME_
#define MT9F002_SMIA_TEST
#define MT9F002_LINE_LENGTH_PCK
#define MT9F002_FRAME_LENGTH_LINES
#define MT9F002_SERIAL_FORMAT
#define MT9F002_ANALOG_CONTROL7
#define MT9F002_VT_SYS_CLK_DIV
#define MT9F002_BLUE_GAIN
#define MT9F002_ANALOG_CONTROL4
#define MT9F002_MIN_FRAME_BLANKING_LINES
#define MT9F002_VT_PIX_CLK_DIV
#define MT9F002_MODE_SELECT
#define MT9F002_Y_ADDR_END
#define MT9F002_PLL_MULTIPLIER
#define MT9F002_DAC_LD_30_31
#define MT9F002_DARK_CONTROL3
#define MT9F002_MASK_CORRUPTED_FRAMES
#define MT9F002_COARSE_INTEGRATION_TIME_MIN
#define MT9F002_Y_ADDR_START
#define MT9F002_SOFTWARE_RESET
#define MT9F002_Y_OUTPUT_SIZE
#define MT9F002_CTX_CONTROL_REG
#define MT9F002_X_ODD_INC
#define MT9F002_COARSE_INTEGRATION_TIME
#define MT9F002_LINE_LENGTH_MAX
Paparazzi fixed point algebra.
#define VIDEO_FILTER_ISP
Enable ISP.
struct img_size_t output_size
Output image size.
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.