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) {
 
 
enum I2CTransactionStatus i2c_blocking_transmit(struct i2c_periph *p, struct i2c_transaction *t, uint8_t s_addr, uint8_t len, float timeout)
Submit a write only transaction and wait for it to complete.
enum I2CTransactionStatus i2c_blocking_transceive(struct i2c_periph *p, struct i2c_transaction *t, uint8_t s_addr, uint8_t len_w, uint16_t len_r, float timeout)
Submit a write/read 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.