展锐平台的camera sensor驱动代码设计解析(1)
展锐平台的camera sensor驱动代码设计解析(2)
展锐平台的camera sensor驱动代码设计解析(3)

Camera驱动的基本配置及文件路径说明

  1. 驱动的配置在路径:\device\sprd\platform\board\camera\sensor_config.xml
  2. 驱动代码的路径在:\vendor\sprd\modules\libcamera\sensor\sensor_drv\classic下,里面有各个sensor厂商的驱动,比如Galaxycore,Superpix,Samsung等。

驱动.h文件的配置解析

宏定义解释

#define VENDOR_NUM 1
#define SENSOR_NAME "ov8856"#define I2C_SLAVE_ADDR 0x6c /* 8bit slave address*/#define ov8856_PID_ADDR 0x300B
#define ov8856_PID_VALUE 0x88
#define ov8856_VER_ADDR 0x300C
#define ov8856_VER_VALUE 0x5A

VENDOR_NUM :表示一个模组厂的配置
SENSOR_NAME :表示打印语句的配置
I2C_SLAVE_ADDR :表示sensor的i2c地址,一般是8bit地址。

/* effective sensor output image size */
/* effective sensor output image size */
#define VIDEO_WIDTH 1280
#define VIDEO_HEIGHT 720
#define PREVIEW_WIDTH 1632
#define PREVIEW_HEIGHT 1224
#define SNAPSHOT_WIDTH 3264
#define SNAPSHOT_HEIGHT 2448/*Raw Trim parameters*/
#define VIDEO_TRIM_X 0
#define VIDEO_TRIM_Y 0
#define VIDEO_TRIM_W 1280
#define VIDEO_TRIM_H 720
#define PREVIEW_TRIM_X 0
#define PREVIEW_TRIM_Y 0
#define PREVIEW_TRIM_W 1632
#define PREVIEW_TRIM_H 1224
#define SNAPSHOT_TRIM_X 0
#define SNAPSHOT_TRIM_Y 0
#define SNAPSHOT_TRIM_W 3264
#define SNAPSHOT_TRIM_H 2448

这个是sensor的配置的尺寸,最大的是full size,preview使用的是binning size,1280X720是给slow motion使用

/*Mipi output*/
#define LANE_NUM 2
#define RAW_BITS 10#define VIDEO_MIPI_PER_LANE_BPS 776     /* 2*Mipi clk */
#define PREVIEW_MIPI_PER_LANE_BPS 776   /* 2*Mipi clk */
#define SNAPSHOT_MIPI_PER_LANE_BPS 1272 /* 2*Mipi clk *//*line time unit: ns*/
#define VIDEO_LINE_TIME 13416
#define PREVIEW_LINE_TIME 26833
#define SNAPSHOT_LINE_TIME 13416/* frame length*/
#define VIDEO_FRAME_LENGTH 963
#define PREVIEW_FRAME_LENGTH 1246
#define SNAPSHOT_FRAME_LENGTH 2496/* please ref your spec */
#define FRAME_OFFSET 6
#define SENSOR_MAX_GAIN 0x7c0 // x15.5 A gain
#define SENSOR_BASE_GAIN 0x80
#define SENSOR_MIN_SHUTTER 6

如上配置对sensor厂提供的regsetting非常重要,一定要确认正确,
LANE_NUM: 表示4组data lane,
RAW_BITS:表示sensor输出10bit的raw数据。
*LANE_BPS:表示三个尺寸的bps,单位是M,
LINE_TIME:表示三个尺寸的linetime,这个需要sensor厂给出,要确保正确,单位是ns。
FRAME_LENGTH: 表示三个尺寸的frame length,这三个帧长也需要确认正确,正常情况下帧长乘linetime应该是那个尺寸regsetting的最大帧率的一帧的时间。
FRAME_OFFSET: 表示帧偏,这个表示帧长和shutter的最小差值,属于sensor的特性,需要原厂给出。
BASE_GAIN和MAX_GAIN:表示sensor的gain可放大倍数,这个需要sensor厂确认,后面进行写gain的函数需要用到。
MIN_SHUTTER:表示最小曝光行,也是需要sensor原厂提供。

/* please ref your spec* 1 : average binning* 2 : sum-average binning* 4 : sum binning*/
#define BINNING_FACTOR 1/* please ref spec* 1: sensor auto caculate* 0: driver caculate*/
/* sensor parameters end *//* isp parameters, please don't change it*/
#define ISP_BASE_GAIN 0x80/* please don't change it */
#define EX_MCLK 24

BINNING_FACTOR是为了shutter值的计算,主要是为了full size和binning size的曝光时间计算,如果是真实的binning,此值配置为1.另外,ispbase gain为平台的128,EX_MCLK为mclk的配置,24的单位为M,但有个问题是,这里只有24是准的,其他的配置可能不准确,必须的使用示波器测试。

sensor的基本初始化配置

/*==============================================================================* Description:* register setting*============================================================================*/static const SENSOR_REG_T ov8856_init_setting[] = {/*2lan init settingclk_in = 24MHzmipi_clk =388MHzresolution =1632*1224fps = 30line_time = 3864/144000000  smin_line = 6ob_value = 64ob_value @ max_gain  =  64 @ 15.5bayer pattern=BGGR*/{0x0103, 0x01}, {0x0100, 0x00}, {0x0300, 0x04}, {0x0302, 0x61},{0x0303, 0x00}, {0x031e, 0x0c}, {0x3000, 0x00}, {0x300e, 0x00},{0x3010, 0x00}, {0x3015, 0x84}, {0x3018, 0x32}, {0x3021, 0x23},{0x3033, 0x24}, {0x3500, 0x00}, {0x3501, 0x4c}, {0x3502, 0xe0},{0x3503, 0x78}, {0x3505, 0x83}, {0x3508, 0x01}, {0x3509, 0x80},{0x350c, 0x00}, {0x350d, 0x80}, {0x350e, 0x04}, {0x350f, 0x00},{0x3510, 0x00}, {0x3511, 0x02}, {0x3512, 0x00}, {0x3600, 0x72},{0x3601, 0x40}, {0x3602, 0x30}, {0x3610, 0xc5}, {0x3611, 0x58},{0x3612, 0x5c}, {0x3613, 0xca}, {0x3614, 0x60}, {0x3628, 0xff},{0x3629, 0xff}, {0x362a, 0xff}, {0x3633, 0x10}, {0x3634, 0x10},{0x3635, 0x10}, {0x3636, 0x10}, {0x364a, 0x0f}, {0x3663, 0x08}, {0x3669, 0x34},{0x366e, 0x08}, {0x3706, 0x86}, {0x370b, 0x7e}, {0x3714, 0x27},{0x3730, 0x12}, {0x3733, 0x10}, {0x3764, 0x00}, {0x3765, 0x00},{0x3769, 0x62}, {0x376a, 0x2a}, {0x376b, 0x30}, {0x3780, 0x00},{0x3781, 0x24}, {0x3782, 0x00}, {0x3783, 0x23}, {0x3798, 0x2f},{0x37a1, 0x60}, {0x37a8, 0x6a}, {0x37ab, 0x3f}, {0x37c2, 0x14},{0x37c3, 0xf1}, {0x37c9, 0x80}, {0x37cb, 0x16}, {0x37cc, 0x16},{0x37cd, 0x16}, {0x37ce, 0x16}, {0x3800, 0x00}, {0x3801, 0x00},{0x3802, 0x00}, {0x3803, 0x0c}, {0x3804, 0x0c}, {0x3805, 0xdf},{0x3806, 0x09}, {0x3807, 0xa3}, {0x3808, 0x06}, {0x3809, 0x60},{0x380a, 0x04}, {0x380b, 0xc8}, {0x380c, 0x0f}, {0x380d, 0x18},{0x380e, 0x04}, {0x380f, 0xde}, {0x3810, 0x00}, {0x3811, 0x08},{0x3812, 0x00}, {0x3813, 0x02}, {0x3814, 0x03}, {0x3815, 0x01},{0x3816, 0x00}, {0x3817, 0x00}, {0x3818, 0x00}, {0x3819, 0x00},{0x3820, 0x90}, {0x3821, 0x67}, {0x382a, 0x03}, {0x382b, 0x01},{0x3830, 0x06}, {0x3836, 0x02}, {0x3862, 0x04}, {0x3863, 0x08},{0x3cc0, 0x33}, {0x3d85, 0x17}, {0x3d8c, 0x73}, {0x3d8d, 0xde},{0x4001, 0xe0}, {0x4003, 0x40}, {0x4008, 0x00}, {0x4009, 0x05},{0x400a, 0x00}, {0x400b, 0x84}, {0x400f, 0x80}, {0x4010, 0xf0},{0x4011, 0xff}, {0x4012, 0x02}, {0x4013, 0x01}, {0x4014, 0x01},{0x4015, 0x01}, {0x4042, 0x00}, {0x4043, 0x80}, {0x4044, 0x00},{0x4045, 0x80}, {0x4046, 0x00}, {0x4047, 0x80}, {0x4048, 0x00},{0x4049, 0x80}, {0x4041, 0x03}, {0x404c, 0x20}, {0x404d, 0x00},{0x404e, 0x20}, {0x4203, 0x80}, {0x4307, 0x30}, {0x4317, 0x00},{0x4503, 0x08}, {0x4601, 0x80}, {0x4800, 0x44}, {0x4816, 0x53},{0x481b, 0x58}, {0x481f, 0x27}, {0x4837, 0x14}, {0x483c, 0x0f},{0x484b, 0x05}, {0x5000, 0x77}, {0x5001, 0x0a}, {0x5004, 0x04},{0x502e, 0x03}, {0x5030, 0x41}, {0x5795, 0x00}, {0x5796, 0x10},{0x5797, 0x10}, {0x5798, 0x73}, {0x5799, 0x73}, {0x579a, 0x00},{0x579b, 0x28}, {0x579c, 0x00}, {0x579d, 0x16}, {0x579e, 0x06},{0x579f, 0x20}, {0x57a0, 0x04}, {0x57a1, 0xa0}, {0x5780, 0x14},{0x5781, 0x0f}, {0x5782, 0x44}, {0x5783, 0x02}, {0x5784, 0x01},{0x5785, 0x01}, {0x5786, 0x00}, {0x5787, 0x04}, {0x5788, 0x02},{0x5789, 0x0f}, {0x578a, 0xfd}, {0x578b, 0xf5}, {0x578c, 0xf5},{0x578d, 0x03}, {0x578e, 0x08}, {0x578f, 0x0c}, {0x5790, 0x08},{0x5791, 0x04}, {0x5792, 0x00}, {0x5793, 0x52}, {0x5794, 0xa3},{0x59f8, 0x3d}, {0x5a08, 0x02}, {0x5b00, 0x02}, {0x5b01, 0x10},{0x5b02, 0x03}, {0x5b03, 0xcf}, {0x5b05, 0x6c}, {0x5e00, 0x00},
//{0x0100, 0x01},#ifdef FEATURE_OTP // enable lsc otp
// otp LSC_en
#else
// otp LSC_disable
#endif
};

preview binning尺寸模式的寄存器配置

static const SENSOR_REG_T ov8856_preview_setting[] = {/*2lan binning setting"clk_in = 24MHzmipi_clk =388MHzresolution =1632*1224fps = 30line_time = 3864/144000000  smin_line = 6ob_value = 64ob_value @ max_gain  =  64 @ 15.5bayer pattern=BGGR*/{0x0100, 0x00}, {0x0300, 0x04}, {0x0302, 0x61}, {0x3501, 0x4c},{0x3502, 0xe0}, {0x364a, 0x0f}, {0x366e, 0x08}, {0x3714, 0x27}, {0x37c2, 0x14},{0x3801, 0x00}, {0x3802, 0x00}, {0x3803, 0x0c}, {0x3804, 0x0c},{0x3805, 0xdf}, {0x3806, 0x09}, {0x3807, 0xa3}, {0x3808, 0x06},{0x3809, 0x60}, {0x380a, 0x04}, {0x380b, 0xc8}, {0x380c, 0x0f},{0x380d, 0x18}, {0x380e, 0x04}, {0x380f, 0xde}, {0x3811, 0x08},{0x3813, 0x02}, {0x3814, 0x03}, {0x3820, 0x90}, {0x3821, 0x67},{0x382a, 0x03}, {0x4009, 0x05}, {0x4837, 0x14}, {0x5795, 0x00},{0x5796, 0x10}, {0x5797, 0x10}, {0x5798, 0x73}, {0x5799, 0x73},{0x579b, 0x28}, {0x579d, 0x16}, {0x579e, 0x06}, {0x579f, 0x20},{0x57a0, 0x04}, {0x57a1, 0xa0},
//{0x0100, 0x01},
#ifdef IMAGE_NORMAL_MIRROR{0x3820, 0x90}, {0x3821, 0x67}, {0x502e, 0x03}, {0x5001, 0x0a},{0x5004, 0x04}, {0x376b, 0x30},
#endif
#ifdef IMAGE_H_MIRROR{0x3820, 0x90}, {0x3821, 0x61}, {0x502e, 0x03}, {0x5001, 0x0a},{0x5004, 0x00}, {0x376b, 0x30},
#endif
#ifdef IMAGE_V_MIRROR{0x3820, 0x96}, {0x3821, 0x67}, {0x502e, 0x00}, {0x5001, 0x0e},{0x5004, 0x04}, {0x376b, 0x36},
#endif
#ifdef IMAGE_HV_MIRROR{0x3820, 0xd6}, // 0x96},{0x3821, 0x21}, // 0x61},{0x502e, 0x00}, {0x5001, 0x0e}, {0x5004, 0x00}, {0x376b, 0x36},
#endif};

snapshot full 尺寸模式的寄存器配置

static const SENSOR_REG_T ov8856_snapshot_setting[] = {/*2lan full sizeclk_in = 24MHzmipi_clk =636MHzresolution =3264*2448fps = 30line_time = 1932/144000000  smin_line = 6ob_value = 64ob_value @ max_gain  =  64 @ 15.5bayer pattern=BGGR*/{0x0100, 0x00}, {0x0300, 0x00}, {0x0302, 0x35}, {0x3501, 0x9a},{0x3502, 0x20}, {0x364a, 0x0f}, {0x366e, 0x10}, {0x3714, 0x23}, {0x37c2, 0x04},{0x3801, 0x00}, {0x3802, 0x00}, {0x3803, 0x0c}, {0x3804, 0x0c},{0x3805, 0xdf}, {0x3806, 0x09}, {0x3807, 0xa3}, {0x3808, 0x0c},{0x3809, 0xc0}, {0x380a, 0x09}, {0x380b, 0x90}, {0x380c, 0x07},{0x380d, 0x8c}, {0x380e, 0x09}, {0x380f, 0xc0}, {0x3811, 0x10},{0x3813, 0x04}, {0x3814, 0x01}, {0x3820, 0x80}, {0x3821, 0x46},{0x382a, 0x01}, {0x4009, 0x0b}, {0x4837, 0x0c}, {0x5795, 0x02},{0x5796, 0x20}, {0x5797, 0x20}, {0x5798, 0xd5}, {0x5799, 0xd5},{0x579b, 0x50}, {0x579d, 0x2c}, {0x579e, 0x0c}, {0x579f, 0x40},{0x57a0, 0x09}, {0x57a1, 0x40},
//{0x0100, 0x01},
#ifdef IMAGE_NORMAL_MIRROR{0x3820, 0x80}, {0x3821, 0x46}, {0x502e, 0x03}, {0x5001, 0x0a},{0x5004, 0x04}, {0x376b, 0x30},
#endif
#ifdef IMAGE_H_MIRROR{0x3820, 0x80}, {0x3821, 0x40}, {0x502e, 0x03}, {0x5001, 0x0a},{0x5004, 0x00}, {0x376b, 0x30},
#endif
#ifdef IMAGE_V_MIRROR{0x3820, 0x86}, {0x3821, 0x46}, {0x502e, 0x00}, {0x5001, 0x0e},{0x5004, 0x04}, {0x376b, 0x36},
#endif
#ifdef IMAGE_HV_MIRROR{0x3820, 0xc6}, // 86},{0x3821, 0x00}, // 0x40},{0x502e, 0x00}, {0x5001, 0x0e}, {0x5004, 0x00}, {0x376b, 0x36},
#endif};

video尺寸模式的寄存器配置

static const SENSOR_REG_T ov8856_video_setting[] = {/*2lan slow motion"clk_in = 24MHzmipi_clk =388MHzresolution =1280*720fps = 90line_time = 1932/144000000  smin_line =6ob_value = 64ob_value @ max_gain  =  64 @ 15.5bayer pattern=BGGR*/{0x0100, 0x00}, {0x0300, 0x04}, {0x0302, 0x61}, {0x3501, 0x32},{0x3502, 0xc0}, {0x364a, 0x0f}, {0x366e, 0x08}, {0x3714, 0x27}, {0x37c2, 0x14},{0x3801, 0xe0}, {0x3802, 0x01}, {0x3803, 0xbc}, {0x3804, 0x0b},{0x3805, 0xff}, {0x3806, 0x07}, {0x3807, 0xf3}, {0x3808, 0x05},{0x3809, 0x00}, {0x380a, 0x02}, {0x380b, 0xd0}, {0x380c, 0x07},{0x380d, 0x8c}, {0x380e, 0x03}, {0x380f, 0x3c}, {0x3811, 0x48},{0x3813, 0x26}, {0x3814, 0x03}, {0x3820, 0x90}, {0x3821, 0x67},{0x382a, 0x03}, {0x4009, 0x05}, {0x4837, 0x14}, {0x5795, 0x00},{0x5796, 0x10}, {0x5797, 0x10}, {0x5798, 0x73}, {0x5799, 0x73},{0x579b, 0x00}, {0x579d, 0x00}, {0x579e, 0x05}, {0x579f, 0xa0},{0x57a0, 0x03}, {0x57a1, 0x20},
//{0x0100, 0x01},
#ifdef IMAGE_NORMAL_MIRROR{0x3820, 0x90}, {0x3821, 0x67}, {0x502e, 0x03}, {0x5001, 0x0a},{0x5004, 0x04}, {0x376b, 0x30},
#endif
#ifdef IMAGE_H_MIRROR{0x3820, 0x90}, {0x3821, 0x61}, {0x502e, 0x03}, {0x5001, 0x0a},{0x5004, 0x00}, {0x376b, 0x30},
#endif
#ifdef IMAGE_V_MIRROR{0x3820, 0x96}, {0x3821, 0x67}, {0x502e, 0x00}, {0x5001, 0x0e},{0x5004, 0x04}, {0x376b, 0x36},
#endif
#ifdef IMAGE_HV_MIRROR{0x3820, 0xd6}, // 0x96},{0x3821, 0x21}, // 0x61},{0x502e, 0x00}, {0x5001, 0x0e}, {0x5004, 0x00}, {0x376b, 0x36},
#endif};

resolution配置

static struct sensor_res_tab_info s_ov8856_resolution_tab_raw[VENDOR_NUM] = {{.module_id = MODULE_SUNNY,.reg_tab ={{ADDR_AND_LEN_OF_ARRAY(ov8856_init_setting), PNULL, 0, .width = 0,.height = 0, .xclk_to_sensor = EX_MCLK,.image_format = SENSOR_IMAGE_FORMAT_RAW},{ADDR_AND_LEN_OF_ARRAY(ov8856_video_setting), PNULL, 0,.width = VIDEO_WIDTH, .height = VIDEO_HEIGHT,.xclk_to_sensor = EX_MCLK, .image_format = SENSOR_IMAGE_FORMAT_RAW},{ADDR_AND_LEN_OF_ARRAY(ov8856_preview_setting), PNULL, 0,.width = PREVIEW_WIDTH, .height = PREVIEW_HEIGHT,.xclk_to_sensor = EX_MCLK, .image_format = SENSOR_IMAGE_FORMAT_RAW},{ADDR_AND_LEN_OF_ARRAY(ov8856_snapshot_setting), PNULL, 0,.width = SNAPSHOT_WIDTH, .height = SNAPSHOT_HEIGHT,.xclk_to_sensor = EX_MCLK, .image_format = SENSOR_IMAGE_FORMAT_RAW}}}/*If there are multiple modules,please add here*/
};

这个在打开的时候,会将这个sensor相关的resolution配置获得给到oem层,当需要哪个尺寸的时候,就会通过尺寸相对应的进行模式的配置,需要说明一下的是,在open的时候,初始化会最先设置initsetting,到了上层下发config尺寸匹配才会选择性的选择上面三个resolution配置。

trim_tab配置

static SENSOR_TRIM_T s_ov8856_resolution_trim_tab[VENDOR_NUM] = {{.module_id = MODULE_SUNNY,.trim_info ={{0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0}},{.trim_start_x = VIDEO_TRIM_X,.trim_start_y = VIDEO_TRIM_Y,.trim_width = VIDEO_TRIM_W,.trim_height = VIDEO_TRIM_H,.line_time = VIDEO_LINE_TIME,.bps_per_lane = VIDEO_MIPI_PER_LANE_BPS,.frame_line = VIDEO_FRAME_LENGTH,.scaler_trim = {.x = VIDEO_TRIM_X,.y = VIDEO_TRIM_Y,.w = VIDEO_TRIM_W,.h = VIDEO_TRIM_H}},{.trim_start_x = PREVIEW_TRIM_X,.trim_start_y = PREVIEW_TRIM_Y,.trim_width = PREVIEW_TRIM_W,.trim_height = PREVIEW_TRIM_H,.line_time = PREVIEW_LINE_TIME,.bps_per_lane = PREVIEW_MIPI_PER_LANE_BPS,.frame_line = PREVIEW_FRAME_LENGTH,.scaler_trim = {.x = PREVIEW_TRIM_X,.y = PREVIEW_TRIM_Y,.w = PREVIEW_TRIM_W,.h = PREVIEW_TRIM_H}},{.trim_start_x = SNAPSHOT_TRIM_X,.trim_start_y = SNAPSHOT_TRIM_Y,.trim_width = SNAPSHOT_TRIM_W,.trim_height = SNAPSHOT_TRIM_H,.line_time = SNAPSHOT_LINE_TIME,.bps_per_lane = SNAPSHOT_MIPI_PER_LANE_BPS,.frame_line = SNAPSHOT_FRAME_LENGTH,.scaler_trim = {.x = SNAPSHOT_TRIM_X,.y = SNAPSHOT_TRIM_Y,.w = SNAPSHOT_TRIM_W,.h = SNAPSHOT_TRIM_H}},}}/*If there are multiple modules,please add here*/};

trim_tab是各个模式下sensor这边对dcam的接口配置,需要配置到平台dcam的寄存器,Trim跟跟上面的resolution最好是需要一一对应,第一组为什么会是全0,那是因为initsetting不是真正出数据,所以不需要配置DCAM,其中前面trim_start_x等为dcam从sensor crop的起始点和尺寸,Line_time也需要对应尺寸的line time,bps也是对应尺寸的bps,这些前面已经讲过,为原厂提供,frame length也是需相对应的帧长。最后的scaler为从trim那边进行crop的尺寸。

static SENSOR_REG_T ov8856_shutter_reg[] = {{0x3502, 0x00}, {0x3501, 0x00}, {0x3500, 0x00},
};static struct sensor_i2c_reg_tab ov8856_shutter_tab = {.settings = ov8856_shutter_reg, .size = ARRAY_SIZE(ov8856_shutter_reg),
};static SENSOR_REG_T ov8856_again_reg[] = {{0x320a, 0x01},{0x3208, 0x01},{0x3508, 0x00},{0x3509, 0x00},};static struct sensor_i2c_reg_tab ov8856_again_tab = {.settings = ov8856_again_reg, .size = ARRAY_SIZE(ov8856_again_reg),
};static SENSOR_REG_T ov8856_dgain_reg[] = {{0x5019, 0x00}, {0x501a, 0x00}, {0x501b, 0x00}, {0x501c, 0x00},{0x501d, 0x00}, {0x501e, 0x00}, {0x501f, 0x00}, {0x5020, 0x00},{0x3208, 0x11}, {0x3208, 0xA1},};static struct sensor_i2c_reg_tab ov8856_dgain_tab = {.settings = ov8856_dgain_reg, .size = ARRAY_SIZE(ov8856_dgain_reg),
};static SENSOR_REG_T ov8856_frame_length_reg[] = {{0x380e, 0x00}, {0x380f, 0x00},
};static struct sensor_i2c_reg_tab ov8856_frame_length_tab = {.settings = ov8856_frame_length_reg,.size = ARRAY_SIZE(ov8856_frame_length_reg),
};static struct sensor_aec_i2c_tag ov8856_aec_info = {.slave_addr = (I2C_SLAVE_ADDR >> 1),.addr_bits_type = SENSOR_I2C_REG_16BIT,.data_bits_type = SENSOR_I2C_VAL_8BIT,.shutter = &ov8856_shutter_tab,.again = &ov8856_again_tab,.dgain = &ov8856_dgain_tab,.frame_length = &ov8856_frame_length_tab,
};

以上几个是sensor的again,dgain,shutter值寄存器及framelength寄存器配置,在后面的.c文件中的函数需要用到,这里特别需要注意的是这个里面的初始值一定要是正确的,可以前面的宏定义及跟setting中的对应,如果setting中没有配置,这里的配置需要确认好正确。

模组的静态信息

static SENSOR_STATIC_INFO_T s_ov8856_static_info[VENDOR_NUM] = {{.module_id = MODULE_SUNNY,.static_info = {.f_num = 220,.focal_length = 242,.max_fps = 30,.max_adgain = 16 * 2,.ois_supported = 0,.pdaf_supported = 0,.exp_valid_frame_num = 1,.clamp_level = 64,.adgain_valid_frame_num = 0,.fov_info = {{3.656f, 2.742f}, 2.560f}}}/*If there are multiple modules,please add here*/
};

结构体SENSOR_STATIC_INFO_T 主要是对一些sensor模组的静态信息的配置,比如光圈大小,焦距长度,fov,如果有pdaf需要在这里配置类型等,fov也是在这里配置,但其实帧率因为还有其他函数获得,这里理论上是没有效的。

帧率

static SENSOR_MODE_FPS_INFO_T s_ov8856_mode_fps_info[VENDOR_NUM] = {{.module_id = MODULE_SUNNY,{.is_init = 0,{{SENSOR_MODE_COMMON_INIT, 0, 1, 0, 0},{SENSOR_MODE_PREVIEW_ONE, 0, 1, 0, 0},{SENSOR_MODE_SNAPSHOT_ONE_FIRST, 0, 1, 0, 0},{SENSOR_MODE_SNAPSHOT_ONE_SECOND, 0, 1, 0, 0},{SENSOR_MODE_SNAPSHOT_ONE_THIRD, 0, 1, 0, 0},{SENSOR_MODE_PREVIEW_TWO, 0, 1, 0, 0},{SENSOR_MODE_SNAPSHOT_TWO_FIRST, 0, 1, 0, 0},{SENSOR_MODE_SNAPSHOT_TWO_SECOND, 0, 1, 0, 0},{SENSOR_MODE_SNAPSHOT_TWO_THIRD, 0, 1, 0, 0}}}}/*If there are multiple modules,please add here*/
};

结构体SENSOR_MODE_FPS_INFO_T 主要是配置高帧率相关,设置标志量,主要是给到算法使用

电气相关

static struct sensor_module_info s_ov8856_module_info_tab[VENDOR_NUM] = {{.module_id = MODULE_SUNNY,.module_info = {.major_i2c_addr = 0x20 >> 1,.minor_i2c_addr = 0x6c >> 1,.reg_addr_value_bits = SENSOR_I2C_REG_16BIT |SENSOR_I2C_VAL_8BIT |SENSOR_I2C_FREQ_400,.avdd_val = SENSOR_AVDD_2800MV,.iovdd_val = SENSOR_AVDD_1800MV,.dvdd_val = SENSOR_AVDD_1200MV,.image_pattern = SENSOR_IMAGE_PATTERN_RAWRGB_B,.preview_skip_num = 1,.capture_skip_num = 1,.flash_capture_skip_num = 6,.mipi_cap_skip_num = 0,.preview_deci_num = 0,.video_preview_deci_num = 0,.threshold_eb = 0,.threshold_mode = 0,.threshold_start = 0,.threshold_end = 0,.sensor_interface ={.type = SENSOR_INTERFACE_TYPE_CSI2,.bus_width = LANE_NUM,.pixel_width = RAW_BITS,.is_loose = 0,},.change_setting_skip_num = 1,.horizontal_view_angle = 65,.vertical_view_angle = 60}}/*If there are multiple modules,please add here*/
};

结构体s_ov8856_module_info_tab是sensor的电气相关的主要结构体,针对平台进行配置,首先是module_id,这个是需要模组的区分,也是广角等逻辑id的驱动配置,另外的话是i2c地址配置,这里需要注意的是这个地址是7bit地址,另外就是三路电源,及rgb顺序。下面的其他配置基本不能修改,包括预览拍照丢帧,下面的配置可以参考使用默认值,不需要修改,因为修改可能导致一些意想不到的错误,从而使问题查找困难。另外需要注意的是如果是raw14的raw图抓取,需要配置is_loose=2.

SENSOR_INFO_T

static struct sensor_ic_ops s_ov8856_ops_tab;
struct sensor_raw_info *s_ov8856_mipi_raw_info_ptr =&s_ov8856_mipi_raw_info;/*==============================================================================* Description:* sensor all info* please modify this variable acording your spec*============================================================================*/
SENSOR_INFO_T g_ov8856_mipi_raw_info = {.hw_signal_polarity = SENSOR_HW_SIGNAL_PCLK_P | SENSOR_HW_SIGNAL_VSYNC_P |SENSOR_HW_SIGNAL_HSYNC_P,.environment_mode = SENSOR_ENVIROMENT_NORMAL | SENSOR_ENVIROMENT_NIGHT,.image_effect = SENSOR_IMAGE_EFFECT_NORMAL |SENSOR_IMAGE_EFFECT_BLACKWHITE | SENSOR_IMAGE_EFFECT_RED |SENSOR_IMAGE_EFFECT_GREEN | SENSOR_IMAGE_EFFECT_BLUE |SENSOR_IMAGE_EFFECT_YELLOW | SENSOR_IMAGE_EFFECT_NEGATIVE |SENSOR_IMAGE_EFFECT_CANVAS,.wb_mode = 0,.step_count = 7,.reset_pulse_level = SENSOR_LOW_PULSE_RESET,.reset_pulse_width = 50,.power_down_level = SENSOR_LOW_LEVEL_PWDN,.identify_count = 1,.identify_code = {{.reg_addr = ov8856_PID_ADDR,.reg_value = ov8856_PID_VALUE},{.reg_addr = ov8856_VER_ADDR,.reg_value = ov8856_VER_VALUE}},.source_width_max = SNAPSHOT_WIDTH,.source_height_max = SNAPSHOT_HEIGHT,.name = (cmr_s8 *)SENSOR_NAME,.image_format = SENSOR_IMAGE_FORMAT_RAW,.module_info_tab = s_ov8856_module_info_tab,.module_info_tab_size = ARRAY_SIZE(s_ov8856_module_info_tab),.resolution_tab_info_ptr = s_ov8856_resolution_tab_raw,.sns_ops = &s_ov8856_ops_tab,.raw_info_ptr = &s_ov8856_mipi_raw_info_ptr,.video_tab_info_ptr = NULL,.sensor_version_info = (cmr_s8 *)"ov8856_v1",
};

结构体g_ov8856_mipi_raw_info 是驱动的核心,是对sensor的一些特性配置,包括帧行pclk的极性,环境模式,图像的影响等,这些都是默认配置,不建议做任何修改。需要注意的是reset和power down的配置,需要和power_on函数中对应起来,拉高拉低需要对应,还有就是full size,这个也需要配置正确,因为这个位置是auto detect的尺寸大小。后面的就是对其结构体和函数接口的指针,所有的接口都在这个结构体中。

展锐平台的camera sensor驱动代码设计解析(2)相关推荐

  1. qualcomm的camera马达驱动代码分析

    前言: 主要给大家介绍基于高通平台的camera马达驱动的编写过程,此过程会涉及到手机对焦功能实现的原理以及如何通过I2C子系统实现数据传输等过程. 一.手机自动对焦原理 手机自动对焦功能是通过将摄像 ...

  2. 展锐平台的温控策略介绍

    这里以UDX710为例介绍下展锐平台的温控策略,展锐其他平台也类似. 1. UDX710芯片内部有6颗 Thermal sensor,相关位置信息如表 1-1. 2. 温度读取: 在控制台下通过 ca ...

  3. 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(一)】

    概述 移远的展锐平台5G模组是基于展锐udx710平台开发的5G模组,在华为被禁,MH5000-31无法继续使用后,这个成了国产5G模组的独苗了. 目前移远出了多款展锐的5G模组,RG500U-CN, ...

  4. 展锐平台PIN码输错三次后提醒PUK输入

    要求:不同的卡要记录输入错误此时,指定错误次数后准确提醒输入PUK错误: 问题分析:1.展锐平台提供的SIM卡的认证统计错误次数以及认证后上报错误码,都是通过服务器异步上报的(各自有认证和异步回调的函 ...

  5. 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(五)-几种工作模式的区别】

    前面介绍过网卡模式和路由模式的使用,接下来就详细介绍下两种方式的使用区别. 网卡模式 网卡模式下,上位机获取的是网络侧分的IP地址,以Windows为例,安装好Windows的驱动程序后,电脑USB接 ...

  6. 展锐平台userdebug版本关闭ylog

    展锐平台userdebug版本中,把ylog默认关闭,并且不影响休眠. 展锐平台分两部分,上层ylog apk以及ylog进程. ylog apk部分源码在:vendor/sprd/platform/ ...

  7. 展锐UDX710:LAN7800 PHY驱动调试

    展锐UDX710:LAN7800 PHY驱动调试 1. 前期准备 1.1 调试环境 1.2 预置条件 1.3 硬件连接 2. 驱动适配 2.1 开启内核驱动支持 2.2 驱动加载验证 2.3 配置网络 ...

  8. 展锐平台如何从modem log 中查看终端支持的GEA算法能力

    展锐平台如何从modem log 中查看终端支持的GEA算法能力 可在以下两个message中查看 1.691195-1 14:23:22.922 – – -> ATTACH_REQUEST 0 ...

  9. Camera sensor驱动

    转自: http://blog.163.com/ac952_hmz/blog/static/947915132012101287284/ 驱动者,三分硬件,三分格式,四分软件.      在手机中,我 ...

最新文章

  1. Linux设置开机启动
  2. C语言的成绩查询系统,c语言 成绩查询系统
  3. 二阶传递函数的推导及几种求解方法的比较
  4. java排列组合算法优缺点,一招彻底弄懂!
  5. 有关UIView、subview的几个基础知识点-IOS开发 (实例)
  6. mybaits.xml文件约束,头部
  7. 华为NP课程笔记13-PIM
  8. 大话数据结构 前言
  9. spring-boot集成kafka(包含zookeeper和kafka的下载介绍)
  10. 2021-2027全球与中国X射线检测系统市场现状及未来发展趋势
  11. 总结在CentOS7上搭建CUDA10+cudnn7的Tensorflow-gpu环境的经验
  12. 孙鑫 VC++深入详解——学习笔记
  13. 如何使用PDF编辑器中文版删除PDF页码
  14. 为什么程序员 996 会猝死,而老板 007 却不会? ​
  15. 基于VMWare虚拟机搭建Linux集群
  16. Dynamics CRM 中 Xrm.Page.getControl('name').getValue() 和 Xrm.Page.getAttribute('name').getValue() 的区别
  17. 如何比较两个内容相似的Word文档
  18. 晨曦记账本快速搜索收支账的基础操作
  19. 码云上最棒的Java管理后台系统
  20. 蓝桥杯 分巧克力 python组

热门文章

  1. hexo加入留言功能
  2. 微信新版也搞事情,一个小工具搞定
  3. MICAD2022正式成为MICCAI Society官方支持会议
  4. Mysql-创建数据库和数据表时指定编码格式
  5. JSON JSON Schema
  6. 各大在线地图,使用的经纬度坐标为什么都精确到小数点之后第六位?
  7. Git:查看本地分支基于哪个分支创建
  8. 三国志战略版:乐进再获加强_更新解读
  9. 伟大的Hessian!
  10. php域名端口号获取,js获取当前域名和端口号以及完整URL