IMX219 Driver changed to adapt quick camera sensor change.

master
gaurav 2022-07-06 23:49:46 +02:00
parent 2452050cf7
commit e952f1734b
3 changed files with 108 additions and 225 deletions

View File

@ -95,18 +95,16 @@ static const imx219_reg_t mode_default[]={ //default register settings, Resoluti
};
image_sensor_config_t *sensor_config;
imgsensor_mode_t *sensor_config;
static image_sensor_config_t sensor_config_2LANE = {
.sensor_mode = 0x01,
.mode_640x480_30 = { //200Mhz 2Lane 311040 312000
static imgsensor_mode_t sensor_config_2LANE[] = {
{ //200Mhz 2Lane
.pix_clk_mul = 0x2E,
.pix_clk_div = 0x4, //only 4 or 5 or 8 or 10
.integration = 1725 - 4, //must be < (linelength- 4) to maintain frame rate by framelength or integration time will slow frame rate
.integration = 258 - 4, //must be < (linelength- 4) to maintain frame rate by framelength or integration time will slow frame rate
.gain = 0x70,
.linelength = 3448, //Warning! This value need to be either 0xD78 or 0xDE7 regardless of frame size and FPS, other values will result undefined and ununderstanable issues in image
.framelength = 1725, //decided how long is frame, basically frame rate with pix clock, it has second priority to integration time. absolute minimum is 255 for imx219
.framelength = 258, //decided how long is frame, basically frame rate with pix clock, it has second priority to integration time. absolute minimum is 255 for imx219
.startx = 1000,
.starty = 750,
.endx = 2280,
@ -114,44 +112,13 @@ static image_sensor_config_t sensor_config_2LANE = {
.width = 640,
.height = 480, //each frame will have two extra line to compensate for debayer crop
.binning = 2,
.fps = 200,
.test_pattern = 0
},
.mode_640x480_200 = { //200fps with 2 lane and 200MHz mipi
.pix_clk_mul = 0x2E,
.pix_clk_div = 0x4,
.integration = 258 - 4,
.gain = 0x70,
.linelength = 3448,
.framelength = 258,
.startx = 1000,
.starty = 750,
.endx = 2280,
.endy = 1715,
.width = 640,
.height = 480,
.binning = 2,
.test_pattern = 0
},
.mode_1280x720_30 = { //200Mhz 2 lane
.pix_clk_mul = 0x2E,
.pix_clk_div = 0x4,
.integration = 1720 - 4,
.gain = 0x80,
.linelength = 3448,
.framelength = 1720,
.startx = 4,
.starty = 4,
.endx = 0xA27,
.endy = 0x6EB,
.width = 1280,
.height = 720,
.binning = 0,
.test_pattern = 0
},
.mode_1280x720_60 = { //200Mhz mipi 2 lane 927360
{ //200Mhz mipi 2 lane
.pix_clk_mul = 0x2E,
.pix_clk_div = 0x4,
.integration = 862 - 4,
@ -165,10 +132,11 @@ static image_sensor_config_t sensor_config_2LANE = {
.width = 1280,
.height = 720,
.binning = 0,
.fps = 60,
.test_pattern = 0
},
.mode_1920x1080_30 = { //200Mhz 2Lane 2082240
{ //200Mhz 2Lane
.pix_clk_mul = 0x20,
.pix_clk_div = 0x4,
.integration = 1200 - 4,
@ -182,27 +150,12 @@ static image_sensor_config_t sensor_config_2LANE = {
.width = 1920,
.height = 1080,
.binning = 0,
.fps = 30,
.test_pattern = 0
},
.mode_640x128_600 = { //200Mhz 2LANE 82944
.pix_clk_mul = 0x2D,
.pix_clk_div = 0x4,
.integration = 84 - 4,
.gain = 200,
.linelength = 0xD78,
.framelength = 84,
.startx = 1320,
.starty = 990,
.endx = 2600,
.endy = 1609,
.width = 640,
.height = 128,
.binning = 2,
.test_pattern = 0
},
.mode_640x80_900 = { //200Mhz 2Lane 51840
{ //200Mhz 2Lane
.pix_clk_mul = 0x2D,
.pix_clk_div = 0x4,
.integration = 56 - 4,
@ -216,10 +169,11 @@ static image_sensor_config_t sensor_config_2LANE = {
.width = 640,
.height = 80,
.binning = 2,
.fps = 900,
.test_pattern = 0
},
.mode_3280x2464_7 = { //200Mhz 2 Lane 3055360
{ //200Mhz 2 Lane
.pix_clk_mul = 0x12,
.pix_clk_div = 0x4,
.integration = 2670 - 4,
@ -233,22 +187,39 @@ static image_sensor_config_t sensor_config_2LANE = {
.width = 3280,
.height = 2464,
.binning = 0,
.fps = 5,
.test_pattern = 0
},
{ //200Mhz 2 Lane
.pix_clk_mul = 0x12,
.pix_clk_div = 0x4,
.integration = 2670 - 4,
.gain = 200,
.linelength = 0xD78, //3448
.framelength = 2670,
.startx = 0,
.starty = 0,
.endx = 3279,
.endy = 2463,
.width = 3280,
.height = 2464,
.binning = 0,
.fps = 7,
.test_pattern = 0
},
};
static image_sensor_config_t sensor_config_4LANE = {
.sensor_mode = 0x01,
.mode_640x480_30 = {
static imgsensor_mode_t sensor_config_4LANE[] = {
{
.pix_clk_mul = 0x53,
.pix_clk_div = 0x4, //only 4 or 5 or 8 or 10
.integration = 3209 - 4, //must be < (linelength- 4) to maintain frame rate by framelength or integration time will slow frame rate
.integration = 481 - 4, //must be < (linelength- 4) to maintain frame rate by framelength or integration time will slow frame rate
.gain = 0x70,
.linelength = 3448, //Warning! This value need to be either 0xD78 or 0xDE7 regardless of frame size and FPS, other values will result undefined and ununderstanable issues in image
.framelength = 3209,
.framelength = 481,
.startx = 1000,
.starty = 750,
.endx = 2280,
@ -256,58 +227,11 @@ static image_sensor_config_t sensor_config_4LANE = {
.width = 640,
.height = 482, //each frame will have two extra line to compensate for debayer crop
.binning = 2,
.test_pattern = 0
},
.mode_640x480_200 = {
.pix_clk_mul = 0x53,
.pix_clk_div = 0x4,
.integration = 481 - 4,
.gain = 0x70,
.linelength = 3448,
.framelength = 481,
.startx = 1000,
.starty = 750,
.endx = 2280,
.endy = 1715,
.width = 640,
.height = 482,
.binning = 2,
.fps = 200,
.test_pattern = 0
},
.mode_1280x720_30 = {
.pix_clk_mul = 0x58,
.pix_clk_div = 0x4,
.integration = 3402 - 10,
.gain = 0x80,
.linelength = 3448,
.framelength = 3402,
.startx = 4,
.starty = 4,
.endx = 0xA27,
.endy = 0x6EB,
.width = 1280,
.height = 722,
.binning = 0,
.test_pattern = 0
},
.mode_1280x720_60 = {
.pix_clk_mul = 0x58,
.pix_clk_div = 0x4,
.integration = 1701 - 4,
.gain = 0x80,
.linelength = 0xD78,
.framelength = 1701,
.startx = 0x2A8,
.starty = 0x2B4,
.endx = 0xA27,
.endy = 0x6EB,
.width = 1280,
.height = 722,
.binning = 0,
.test_pattern = 0
},
.mode_1280x720_120 = { //Camera output @120
{ //Camera output @120
.pix_clk_mul = 0x58,
.pix_clk_div = 0x4,
.integration = 850 - 4,
@ -321,25 +245,11 @@ static image_sensor_config_t sensor_config_4LANE = {
.width = 1280,
.height = 722,
.binning = 0,
.fps = 120,
.test_pattern = 0
},
.mode_1920x1080_30 = { //camera output 1920x1080 @30FPS
.pix_clk_mul = 0x50,
.pix_clk_div = 0x5,
.integration = 2474 - 4,
.gain = 0x80,
.linelength = 0xD78,
.framelength = 2474,
.startx = 0x2A8,
.starty = 0x2B4,
.endx = 0xA27,
.endy = 0x6EB,
.width = 1920,
.height = 1082,
.binning = 0,
.test_pattern = 0
},
.mode_1920x1080_60 = { //camera output 1920x1080 @60FPS
{ //camera output 1920x1080 @60FPS
.pix_clk_mul = 0x50,
.pix_clk_div = 0x5,
.integration = 1237 - 4,
@ -353,26 +263,10 @@ static image_sensor_config_t sensor_config_4LANE = {
.width = 1920,
.height = 1082,
.binning = 0,
.fps = 60,
.test_pattern = 0
},
.mode_640x128_682 = { //camera output 640x128 pixel @682 FPS
.pix_clk_mul = 0x53,
.pix_clk_div = 0x4,
.integration = 141 - 4,
.gain = 200,
.linelength = 0xD78,
.framelength = 141,
.startx = 1320,
.starty = 990,
.endx = 2600,
.endy = 1609,
.width = 640,
.height = 128,
.binning = 2,
.test_pattern = 0
},
.mode_640x80_1000 = { //camera output 640x80 pixel @1000 FPS
{ //camera output 640x80 pixel @1000 FPS
.pix_clk_mul = 0x53,
.pix_clk_div = 0x4,
.integration = 96 - 4,
@ -386,9 +280,11 @@ static image_sensor_config_t sensor_config_4LANE = {
.width = 640,
.height = 80,
.binning = 2,
.fps = 1000,
.test_pattern = 0
},
.mode_3280x2464_15 = { //full frame 3280x2464 @15FPS
{ //full frame 3280x2464 @15FPS
.pix_clk_mul = 0x31,
.pix_clk_div = 0x5,
.integration = 3031 - 4,
@ -402,8 +298,29 @@ static image_sensor_config_t sensor_config_4LANE = {
.width = 3280,
.height = 2464,
.binning = 0,
.fps = 5,
.test_pattern = 0
},
{ //full frame 3280x2464 @15FPS
.pix_clk_mul = 0x31,
.pix_clk_div = 0x5,
.integration = 3031 - 4,
.gain = 200,
.linelength = 0xD78,
.framelength = 3031,
.startx = 0,
.starty = 0,
.endx = 3279,
.endy = 2463,
.width = 3280,
.height = 2464,
.binning = 0,
.fps = 15,
.test_pattern = 0
},
};
@ -513,72 +430,49 @@ void sensor_handle_uvc_control(uint8_t frame_index, uint32_t interval)
{
switch(frame_index)
{
case FRAME_640x480:
case FRAME_MODE0:
{
if (interval == INTERVAL_30)
if (interval == INTERVAL_MODE0)
{
selected_img_mode = &sensor_config->mode_640x480_30;
selected_img_mode = &sensor_config[0];
}
else if(interval == INTERVAL_200)
}
break;
case FRAME_MODE1:
{
if (interval == INTERVAL_MODE1)
{
selected_img_mode = &sensor_config->mode_640x480_200;
selected_img_mode = &sensor_config[1];
}
}
break;
case FRAME_MODE2:
{
if (interval == INTERVAL_MODE2)
{
selected_img_mode = &sensor_config[2];
}
}
break;
case FRAME_1280x720:
case FRAME_MODE3:
{
if (interval == INTERVAL_30)
{
selected_img_mode = &sensor_config->mode_1280x720_30;
}
else if(interval == INTERVAL_60)
{
selected_img_mode = &sensor_config->mode_1280x720_60;
}
else if(interval == INTERVAL_120)
{
//selected_img_mode = &sensor_config->mode_1280x720_120;
selected_img_mode = &sensor_config->mode_1280x720_60;
}
}
break;
case FRAME_1920x1080:
{
if (interval == INTERVAL_30)
{
selected_img_mode = &sensor_config->mode_1920x1080_30;
}
else if(interval == INTERVAL_60)
{
//selected_img_mode = &sensor_config->mode_1920x1080_60;
selected_img_mode = &sensor_config->mode_1920x1080_30;
}
}
break;
case FRAME_3280x2464:
{
if (interval == INTERVAL_7)
if (interval == INTERVAL_MODE3)
{
//selected_img_mode = &sensor_config->mode_3280x2464_15;
selected_img_mode = &sensor_config->mode_3280x2464_7;
selected_img_mode = &sensor_config[3];
}
}
break;
case FRMAE_640x128:
case FRAME_MODE4:
{
if (interval == INTERVAL_682)
if (interval == INTERVAL_MODE4_MIN)
{
selected_img_mode = &sensor_config->mode_640x128_682;
selected_img_mode = &sensor_config[4];
}
}
break;
case FRMAE_640x80:
{
if (interval == INTERVAL_1000)
else if (interval == INTERVAL_MODE4)
{
selected_img_mode = &sensor_config->mode_640x80_1000;
selected_img_mode = &sensor_config[5];
}
}
break;
@ -644,7 +538,7 @@ void sensor_configure_mode(imgsensor_mode_t * mode)
sensor_i2c_write(REG_BINNING_H, 0x00);
sensor_i2c_write(REG_BINNING_V, 0x00);
}
camera_stream_on(sensor_config->sensor_mode);
camera_stream_on(1);
}
uint8_t SensorI2cBusTest (void)
@ -677,8 +571,12 @@ void SensorInit (void)
//CyU3PDebugPrint (4, "Reg 0x%x val 0x%x\n", (mode_default + i)->address, (mode_default + i)->val);
sensor_i2c_write((mode_default + i)->address, (mode_default + i)->val);
}
sensor_config = &sensor_config_2LANE;
sensor_configure_mode(&sensor_config->mode_1280x720_30);
#if LANES == 2
sensor_config = sensor_config_2LANE;
#else
sensor_config = sensor_config_4LANE;
#endif
sensor_configure_mode(&sensor_config_2LANE[5]);
}
uint8_t SensorGetBrightness (void)

View File

@ -6,6 +6,9 @@
#include <stdbool.h>
#include "sensor_imx219.h"
#define LANES 2
#define SENSOR_ADDR_WR 0x20 /* Slave address used to write sensor registers. */
#define SENSOR_ADDR_RD 0x21 /* Slave address used to read from sensor registers. */
#define I2C_SLAVEADDR_MASK 0xFE /* Mask to get actual I2C slave address value without direction bit. */
@ -133,30 +136,11 @@ typedef struct imgsensor_mode_struct_s {
uint16_t height;
uint16_t framerate;
uint8_t binning;
uint8_t fps;
uint8_t test_pattern;
} imgsensor_mode_t;
/* SENSOR PRIVATE STRUCT FOR CONSTANT*/
typedef struct image_sensor_config_s {
uint8_t sensor_mode;
imgsensor_mode_t mode_640x480_30; //640x480 30fps
imgsensor_mode_t mode_1280x720_30; //1280x720 30fps
imgsensor_mode_t mode_1280x720_60; //1280x720 60fps
imgsensor_mode_t mode_1280x720_120; //1280x720 120fps
imgsensor_mode_t mode_1920x1080_30; //1920x1080 30fps
imgsensor_mode_t mode_1920x1080_60; //1920x1080 60fps
imgsensor_mode_t mode_640x480_200;
imgsensor_mode_t mode_640x128_682;
imgsensor_mode_t mode_640x128_600;
imgsensor_mode_t mode_640x80_900;
imgsensor_mode_t mode_640x80_1000;
imgsensor_mode_t mode_3280x2464_15;
imgsensor_mode_t mode_3280x2464_7;
} image_sensor_config_t;
#define LANES 2
#if LANES == 2
#define SENSOR_MODE0_WIDTH (unsigned int)640
@ -177,7 +161,7 @@ typedef struct image_sensor_config_s {
#define SENSOR_MODE4_WIDTH (unsigned int)3280
#define SENSOR_MODE4_HEIGHT (unsigned int)2464
#define SENSOR_MODE4_MIN (unsigned int)5
#define SENSOR_MODE4_FPS_MIN (unsigned int)5
#define SENSOR_MODE4_FPS (unsigned int)15
#else
@ -199,7 +183,7 @@ typedef struct image_sensor_config_s {
#define SENSOR_MODE4_WIDTH (unsigned int)3280
#define SENSOR_MODE4_HEIGHT (unsigned int)2464
#define SENSOR_MODE4_MIN (unsigned int)10
#define SENSOR_MODE4_FPS_MIN (unsigned int)10
#define SENSOR_MODE4_FPS (unsigned int)30
#endif

View File

@ -13,7 +13,8 @@
#include <cyu3socket.h>
#include "uvc.h"
#include "sensor_imx219.h"
//#include "sensor_imx219.h"
#include "sensor_imx477.h"
#include "camera_ptzcontrol.h"
#include "cyfxgpif2config.h"
#include "uvc_settings.h"
@ -1430,7 +1431,7 @@ UVCHandleProcessingUnitRqts (
{
exposure_val = CY_U3P_MAKEWORD(glEp0Buffer[1], glEp0Buffer[0]);
sensor_set_exposure (exposure_val);
//sensor_set_exposure (exposure_val);
}
break;
default: