【Camera专题】Camera驱动源码全解析_下

1、手把手撸一份驱动 到 点亮 Camera
2、Camera dtsi 完全解析
3、Camera驱动源码全解析上
4、Camera驱动源码全解析下
上篇文章分析了C文件函数的实现,本文继续分析h文件的配置信息。

推荐文章:
MIPI CSI2学习(一):说一说MIPI CSI2
高通camera驱动分析

一、h文件中配置信息分析

1.sensor增益的宏定义

/* OVXXX Regs */
#define OVXXX_DATA_PEDESTAL            0x40 /* 10bit value */

#define OVXXX_DIG_GAIN_GLOBAL_ADDR     0x350a //数字增益地址

#define OVXXX_MIN_AGAIN_REG_VAL        0x100 /* 1.0x */

/* OVXXX_MAX_AGAIN_REG_VAL is 0x7FF, 2047, 15.99x
 * use max analog again 15.5x here
  模拟增益
 */
#define OVXXX_MAX_AGAIN_REG_VAL       0xF80 /* 15.5x */

#define OVXXX_MIN_DGAIN_REG_VAL        0x400 /* 1.0x */
#define OVXXX_MAX_DGAIN_REG_VAL        0x800 /* 2.0x */

#define OVXXX_MAX_DGAIN_DECIMATOR      1024

/* OVXXX FORMULAS */
#define OVXXX_MIN_AGAIN    1.0
#define OVXXX_MAX_AGAIN    15.0

#define OVXXX_MIN_DGAIN    (OVXXX_MIN_DGAIN_REG_VAL / 1024)
#define OVXXX_MAX_DGAIN    (OVXXX_MAX_DGAIN_REG_VAL / 1024)

#define OVXXX_MIN_GAIN (OVXXX_MIN_AGAIN * OVXXX_MIN_DGAIN)
#define OVXXX_MAX_GAIN (OVXXX_MAX_AGAIN * OVXXX_MAX_DGAIN)

#define OVXXX_MAX_LINECOUNT (65535-8)

参照sensor规格书或者咨询fae,配置:

  1. sensor数字增益最大和最小值
  2. sensor模拟增益最大和最小值
  3. sensor最大曝光lince_cnt

2.Sensor寄存器控制

2.1 sensor帧的输出和关闭

#define START_REG_ARRAY \
{ \
   {0x0100, 0x01, 0x00}, \
}
#define STOP_REG_ARRAY \
{ \
   {0x0100, 0x00, 0x00}, \
}
/* Sensor Handler */
static sensor_lib_t sensor_lib_ptr =
{
  .start_settings =
  {
    .reg_setting_a = START_REG_ARRAY,
    .addr_type = CAMERA_I2C_WORD_ADDR,
    .data_type = CAMERA_I2C_BYTE_DATA,
    .delay = 0,
  },
  .stop_settings =
  {
    .reg_setting_a = STOP_REG_ARRAY,
    .addr_type = CAMERA_I2C_WORD_ADDR,
    .data_type = CAMERA_I2C_BYTE_DATA,
    .delay = 0,
  },
}

sensor以流的方式 输出帧.

  • start_settings – Register set to command the sensor to start streaming out frames.
    MIPI 数据包通过传输开始 (SoT) 和传输结束 (EoT) 来定界
    SoT – LP11→LP01→LP00
    EoT – LP00→LP11
  • stop_settings – Register set to command the sensor to stop streaming out frames
    应通过停止数据流设置将传感器的时钟和数据通道置于 LP11 状态。设置错误可导致 MIPI
    摄像头与 MSM 的同步不一致。

2.2 开启sensor 端的group 功能

//开启
#define GROUPON_REG_ARRAY \
{ \
    {0x3208, 0x00, 0x00}, \
}
//关闭
#define GROUPOFF_REG_ARRAY \
{ \
    {0x3208, 0x10, 0x00}, \
    {0x3208, 0xa0, 0x00}, \
}

  .groupon_settings =
  {
    .reg_setting_a = GROUPON_REG_ARRAY,
    .addr_type = CAMERA_I2C_WORD_ADDR,
    .data_type = CAMERA_I2C_BYTE_DATA,
    .delay = 0,
  },
  .groupoff_settings =
  {
    .reg_setting_a = GROUPOFF_REG_ARRAY,
    .addr_type = CAMERA_I2C_WORD_ADDR,
    .data_type = CAMERA_I2C_BYTE_DATA,
    .delay = 0,
  },

开启sensor 端的group 功能,将曝光(line),gain等打包,保证在同一帧进去生效

  • groupon_setting – Register set to command the sensor to set group parameter hold logic.
  • groupoff_settings – Register set to command the sensor to release group parameter hold logic.

2.3 sensor嵌入式数据

/* Sensor Handler */
static sensor_lib_t sensor_lib_ptr =
{
  .embedded_data_enable_settings =
  {
    .reg_setting_a = {},
    .addr_type = 0,
    .data_type = 0,
    .delay = 0,
  },
  .embedded_data_disable_settings =
  {
    .reg_setting_a = {},
    .addr_type = 0,
    .data_type = 0,
    .delay = 0,
  },
}
  • embedded_data_enable_settings
    Register set to command the sensor to enable streaming out of embedded data.
  • embedded_data_disable_settings
    Register set to command the sensor to disable streaming out of embedded data.

2.4 sensor初始化相关寄存器

#define INIT_0_REG_ARRAY \
{ \
    {0x0103, 0x01, 0x10}, \
    {0x0303, 0x01, 0x00}, \
···
}
/* Sensor Handler */
static sensor_lib_t sensor_lib_ptr =
{
  .init_settings_array =
  {
    .reg_settings =
    {
      {
        .reg_setting_a = INIT_0_REG_ARRAY,
        .addr_type = CAMERA_I2C_WORD_ADDR,
        .data_type = CAMERA_I2C_BYTE_DATA,
        .delay = 0,
      },
    },
    .size = 1,
  },
}

2.5 sensor分辨率相关寄存器

 /* 2400W@30fps 1120Mbps/lane */
#define RES0_REG_ARRAY \
{ \
    {0x0303, 0x01, 0x00}, \
    {0x0305, 0x46, 0x00}, \
···
}

 /* 1200W@30fps 1120Mbps/lane */
#define RES1_REG_ARRAY \
{ \
    {0x0303, 0x01, 0x00}, \
    {0x0305, 0x46, 0x00}, \
···
}
  .res_settings_array =
  {
    .reg_settings =
    {
      /* Res 0 */
      {
        .reg_setting_a = RES0_REG_ARRAY,
        .addr_type = CAMERA_I2C_WORD_ADDR,
        .data_type = CAMERA_I2C_BYTE_DATA,
        .delay = 0,
      },
      /* Res 1 */
      {
        .reg_setting_a = RES1_REG_ARRAY,
        .addr_type = CAMERA_I2C_WORD_ADDR,
        .data_type = CAMERA_I2C_BYTE_DATA,
        .delay = 0,
      },
    .size = 2,
  },

以上的sensor寄存器配置一般有fae厂商提供,驱动工程师尽可能的掌握相关寄存器代表的含义。
如控制宽高、帧率、曝光等等寄存器

3.sensor_slave_info结构体分析

3.1 Sensor slave 信息

  .sensor_slave_info =
  {
    .sensor_name = "OXXXX",
    .slave_addr = 0x6c,
    .i2c_freq_mode = SENSOR_I2C_MODE_FAST,
    .addr_type = CAMERA_I2C_WORD_ADDR,//16个字节
    .sensor_id_info =
    {
      .sensor_id_reg_addr = 0x300b,
      .sensor_id = 0x0D42,
    },
     .power_setting_array =
    {
      .power_setting_a =
      {
        ···
      }
      .size = 7,
      .power_down_setting_a =
      {
       ···
      }
      .size = 7,
   },   
  • sensor_name :sensor名称

  • slave_addr :I2C地址

  • i2c_freq_mode :i2c传输速率
    SENSOR_I2C_MODE_STANDARD for 100 KHz
    SENSOR_I2C_MODE_FAST for 400 KHz
    SENSOR_I2C_MODE_CUSTOM for custom configuration in dtsi.
    SENSOR_I2C_MODE_FAST_PLUS for 1 MHz

  • sensor_id_info:sensor id信息


我们只用到16位,因此
sensor_id_reg_addr = 0x300b,
sensor_id = 0x0D42,

  • power_setting_array:sensor上下电
    CAMERA_POW_SEQ_CLK,
    CAMERA_POW_SEQ_GPIO,
    CAMERA_POW_SEQ_VREG,
    CAMERA_POW_SEQ_I2C_MUX,
    CAMERA_POW_SEQ_I2C,
    需要注意的点是:
    GPIO和VERG这2种方式不要配置错误,否则会造成I2C通信失败。
    上下电时序按照sensor规格书

3.2 Sensor 输出参数

  .sensor_output =
  {
    .output_format = SENSOR_BAYER,
    .connection_mode = SENSOR_MIPI_CSI,
    .raw_output = SENSOR_10_BIT_DIRECT,
    .filter_arrangement = SENSOR_BGGR,
  },
  • output_format = SENSOR_BAYER
    sensor raw图像格式为:BAYER (SENSOR_BAYER)

  • connection_mode = SENSOR_MIPI_CSI
    数据传输接口为MIPI(串行)
    另一种方式: Parallel(并行)接口,基本不用了。

  • .raw_output = SENSOR_10_BIT_DIRECT,
    raw数据:1个像素10bit

  • .filter_arrangement = SENSOR_BGGR,
    The bayer颜色模式,有如下几种:
    (SENSOR_BGGR, SENSOR_RGGB, SENSOR_RGBG, SENSOR_BGRG)


    颜色模式配置错误会导致图像偏色异常。

3.3 sensor 宽高寄存器地址

  .output_reg_addr =
  {
    .x_output = 0x3808,
    .y_output = 0x380A,
    .line_length_pclk = 0x380C,
    .frame_length_lines = 0x380E,
  },
  • x_output – 有效宽度
  • y_output – 有效高度
  • line_length_pclk – 包含消隐的宽度 -对应Hsync
  • frame_length_lines – 包含消隐的高度 -对应Vsync

曝光时间以行长为单位; PCLK以Hz为单位;
行长以周期数为单位,帧长以行长数为单位;其中周期数就是频率
T 周期以ms为单位;
f 频率以Hz为单位;
f = 1 / T;

可以参考这篇文章:
camera曝光和帧率_songqiangzmt的博客

3.4 曝光寄存器地址

  .exp_gain_info =
  {
    .coarse_int_time_addr = 0x3500,
    .global_gain_addr = 0x3508,
    .vert_offset = 8,
  },
  • coarse_int_time_addr 曝光时间地址
  • global_gain_addr sensor增益地址
  • vert_offset
    曝光行数上限,曝光行数任何情况下都应小于 frame_length_lines 减去vert_offset

3.5 曝光信息

  .aec_info =
  {
    .min_gain = 1.0,
    .max_gain = 15.5,
    .max_analog_gain = 15.5,
    .max_linecount = 0xffff-8,
  },
  • min_gain:最小模拟增益
  • max_gain:最大模拟增益
  • max_analog_gain : 最大数字增益
  • max_linecount – 最大曝光时间
    最大曝光时间跟寄存器有关。

比如这里又3个寄存器,每个寄存器是8bit:
max_linecount = 0x ff ff -8


3.6 跳帧设置

  .sensor_num_frame_skip = 2,
  .sensor_num_HDR_frame_skip = 2,
  .sensor_max_pipeline_frame_delay = 2,
  .sensor_num_fast_aec_frame_skip = 2,
  • sensor_num_frame_skip sensor启动时跳过几帧
  • sensor_num_HDR_frame_skip HDR模式启动时跳过几帧
  • sensor_max_pipeline_frame_delay pipeline最大延迟几帧
  • sensor_num_fast_aec_frame_skip 设置使用fast AEC时要跳过的帧数

3.7 sensor_property

  .sensor_property =
  {
    .pix_size = 1.0,
    .sensing_method = SENSOR_SMETHOD_ONE_CHIP_COLOR_AREA_SENSOR,
    .crop_factor = 1.0,
  },

暂时没弄清楚

3.8 有效像素

  .pixel_array_size_info =
  {
    .active_array_size =
    {
      .width =  3264,
      .height = 2448,
    },
    .left_dummy = 0,
    .right_dummy = 0,
    .top_dummy = 0,
    .bottom_dummy = 0,
  },
  • active_array_size:有效像素
  • left_dummy:Sets sensor buffer between effective and active pixel array on the left side
    其他同理

3.9 sensor暗电流信息

  .color_level_info =
  {
    .white_level = 1023,
    .r_pedestal = 64,
    .gr_pedestal = 64,
    .gb_pedestal = 64,
    .b_pedestal = 64,
  },
  • white_level
    将传感器DAC的值设置为白色。 这通常是DAC可以输出的最大可能值(RAW10为1023)

  • r_pedestal
    – Sets black level/data pedestal for red channel. The value is for RAW10 data. For
    RAW12 multiply by 4

  • gr_pedestal
    – Sets black level/data pedestal for green (on red line) channel. The value is for
    RAW10 data. For RAW12 multiply by 4

  • gb_pedestal
    – Sets black level/data pedestal for green (on blue line) channel. The value is for
    RAW10 data. For RAW12 multiply by 4

  • b_pedestal
    b_pedestal – Sets black level/data pedestal for blue channel. The value is for RAW10 data. For
    RAW12 multiply by 4.

这里指的是暗电流值,
一般来说 raw8 都是 16, raw10为 16x4=64, raw12 =16x4x4

3.10 sensor 数据流信息


  .sensor_stream_info_array =
  {
    .sensor_stream_info =
    {
      {
        .vc_cfg_size = 1,
        .vc_cfg =
        {
          {
            .cid = 0,
            .dt = CSI_RAW10,
            .decode_format = CSI_DECODE_10BIT
          },
        },
        .pix_data_fmt =
        {
          SENSOR_BAYER,
        },
      },
    },
    .size = 1,
  },

传感器可以流式传输许多不同的数据类型(DT)
该数据被包装在不同的流中。 在一个流中,可以有一个或多个不同的DT。 一种虚拟通道(VC)分配给每个流。 DT和VC的组合应为唯一,并分配了一个通道ID(CID)。
有关如何指定CID的要求/限制。 当前的MIPI CSI_Rx支持四个VC,每个VC最多可以有四个CID,如下表所示。

  • vc_cfg_size :设置当前流中有多少数据类型
  • cid:设置当前数据的唯一通道ID(CID)
  • dt:设置当前数据类型
#define CSI_EMBED_DATA        0x12
#define CSI_RESERVED_DATA_0   0x13
#define CSI_YUV422_8          0x1E
#define CSI_RAW8              0x2A
#define CSI_RAW10             0x2B
#define CSI_RAW12             0x2C
#define CSI_RAW14             0x2D
#define CSI_DPCM6             0x32
#define CSI_DPCM8             0x30
  • decode_format : 设置当前流中数据的格式
#define CSI_DECODE_6BIT           0
#define CSI_DECODE_8BIT           1
#define CSI_DECODE_10BIT          2
#define CSI_DECODE_12BIT          3
#define CSI_DECODE_14BIT          8
#define CSI_DECODE_DPCM_10_8_10   5
#define CSI_DECODE_DPCM_10_6_10   4
  • pix_data_fmt:sensor输出格式
147typedef enum {
148  SENSOR_BAYER,
149  SENSOR_YCBCR,
150  SENSOR_GREY,
151  SENSOR_META,
152  SENSOR_BAYER_SVHDR,
153  SENSOR_BAYER_SVHDR_SUBFRAME
154} sensor_output_format_t;

4.测试图案配置

传感器可能具有内置的pattern generator。 通过设置专用寄存器,传感器可以将生成的图案输出。

.test_pattern_info =
  {
    .test_pattern_settings =
    {
      {
        .mode = SENSOR_TEST_PATTERN_OFF,//关闭测试模式
        .settings =
        {
          .reg_setting_a =
          {
            {0x5080, 0x00, 0x00},
          },
          .addr_type = CAMERA_I2C_WORD_ADDR,
          .data_type = CAMERA_I2C_BYTE_DATA,
          .delay = 0,
        }
      },
      {
        .mode = SENSOR_TEST_PATTERN_COLOR_BARS,//color bar 测试
        .settings =
        {
          .reg_setting_a =
          {
            {0x5080, 0x80, 0x00},
          },
          .addr_type = CAMERA_I2C_WORD_ADDR,
          .data_type = CAMERA_I2C_BYTE_DATA,
          .delay = 0,
        },
      },
    },
      {
        .mode = SENSOR_TEST_PATTERN_COLOR_BARS_FADE_TO_GRAY,
        .settings =
        {
          .reg_setting_a =
          {
            {0x5080, 0x84, 0x00},
          },
          .addr_type = CAMERA_I2C_WORD_ADDR,
          .data_type = CAMERA_I2C_BYTE_DATA,
          .delay = 0,
        },
      },
    },
    .size = 3,
//对于纯色测试图案模式,我们可以设置帧的颜色。
    .solid_mode_addr =
    {
      .r_addr = 0,
      .gr_addr = 0,
      .gb_addr = 0,
      .b_addr = 0,
    },
  },

当出现图像异常时,可以使用此功能看看sensor本身输出是否有问题。


5. sensor分辨率

  .out_info_array =
  {
    .out_info =
    {
     /* Res 0 */
     {
      .x_output = 3264,
      .y_output = 2448,
      .line_length_pclk = 1176,
      .frame_length_lines = 3196,
      .vt_pixel_clk = 112754800,
      .op_pixel_clk = 448000000,
      .binning_factor = 1,
      .binning_method = 0,
      .min_fps = 7.5,
      .max_fps = 30,
      .mode = SENSOR_DEFAULT_MODE,
      .offset_x = 0,
      .offset_y = 0,
      .scale_factor = 1.000,
      .is_pdaf_supported = 1,
      .data_rate = 1120000000ULL * 4,
     },
  • x_output:有效宽度

  • y_output:有效高度

  • line_length_pclk:行长。
    设置传感器每行输出的像素总数,包括有效像素和水平消隐。

  • frame_length_lines:帧长。

  • vt_pixel_clk:视频计时时钟值。
    该值由sensor内部PLL模块生成。 通过外部时钟(EXTCLK)频率和PLL设置计算其值。 sensor使用此时钟执行多个内部任务,其值控制多个传感器参数-快门/曝光时间,帧速率,传感器内部ISP处理等

  • op_pixel_clk:表示要设置 VFE 时钟,需要通过 MIPI 通道从摄像头获取的数据量。
    op_pixel_clk = (传感器总数据传输速率) / 每个像素的位数
    例如,如果 MIPI DDR 时钟值(MIPI 摄像头传感器时钟通道的速度)为 300 MHz,且
    传感器在 4 条通道上传输数据,每个通道的数据传输速率为 600 MHz。从而,总的数
    据传输速率为 2400 MHz。对于每像素 10 位的 Bayer 数据,这相当于 op_pixel_clk 值
    为 2400/10 = 240 MHz。这些值必须按照传感器技术规范赋值。
    这些值可基于为摄像头传感器配置的寄存器设置进行计算

  • binning_factor:binning模式
    1 for no binning, 2 for V 1/2 H 1/2 binning and so on

  • **binning_method **:binning方式
    0 for average, 1 for addition (summed)

binning_factor主要是用来控制拍照亮度跟预览亮度一致的,当然也可以解决预览噪点过大的问题!
3A算法里,曝光时间 snap_exp_time *= (float)(binning_multiplier);

3A源码

/* Step 2 Calculate Snapshot Exposure Time */
snap_exp_time = (real_gain * preview_exp_time) / snap_sensor_gain;
snap_exp_time *= (float)(binning_multiplier);

赋值源码


关键日志:


  • mode:sensor 模式
SENSOR_DEFAULT_MODE – Normal sensor modes – preview, video, snapshot, ZSL, etc.
SENSOR_HFR_MODE – High frame rate mode – modes with a frame rate greater than 30 fps are
used for high-speed video recording.
SENSOR_HDR_MODE – High Dynamic Range (HDR) mode – use for HDR video and image
recording.
  • offset_x:水平偏移

  • offset_y:垂直偏移

  • scale_factor:sensor缩放,其值必须是1或者更大

  • data_rate:传输数据量 = op_pixel_clk * 10bit

6.CSI参数配置

  .csi_params =
  {
    .lane_cnt = 4,
    .settle_cnt = 0x14,
    .is_csi_3phase = 0,
  },

CSI :Camera Serial Interface 定义了一个位于处理器和摄像模组之间的高速串行接口

  • lane_cnt:设置硬件CSI2通道数,几lane用于数据传输

  • settle_cnt:稳定计数,该值须和 sensor 的特性匹配, 保证 sensor 的 MIPI 传输和 MSM 的 MIPI 接收能同步.

为使CSI_Tx(传感器)和CRI_Rx(设备)正常工作,需要一段时间它们之间需要同步。
此时间在此处设置为计时器时钟滴答数。 它必须介于公式计算的MIN和MAX值之间
MIN [Settle count * T(Timer clock)] > T(HS_SETTLE)_MIN
MAX [Settle count * T(Timer clock)] < T(HS-PREPARE)+T(HS_ZERO) - 4*T(Timer clock)

settle_cnt(即稳定计数)– 必须根据传感器输出特性配置该值,以确保传感器的 PHY
发送器与 MSM 的 PHY 接收器无障碍同步。
对于 28 nm 以及更小的 MSM 芯片,使用以下公式计算稳定计数:
settle_cnt = T(HS_SETTLE)_avg /T(TIMER_CLK),
其中 T(HS_SETTLE)_avg = (T(HS_SETTLE)_min + T(HS_SETTLE)_max) / 2,如传
感器数据表所指示

7. CSID configuration

 .csid_lut_params_array =
  {
    .lut_params =
    {
      /* Res 0 */
      {
        .num_cid = 1,
        .vc_cfg_a =
        {
          {
            .cid = 0,
            .dt = CSI_RAW10,
            .decode_format = CSI_DECODE_10BIT
          },
        },
      },
    .size=1,
  },
  • num_cid:设置当前模式数据流中唯一CID的数量
  • cid:设置当前数据的唯一通道ID(CID)
  • dt:设置当前数据类型
  • decode_format : 设置当前流中数据的格式

8.sensor 裁剪配置

  .crop_params_array =
  {
    .crop_params =
    {
      /* Res 0 */
      {
        .top_crop = 0,
        .bottom_crop = 0,
        .left_crop = 0,
        .right_crop = 0,
      },
}
  • top_crop:上边缘裁剪
    其他以此类推

9.曝光函数配置

  .exposure_func_table =
  {
    .sensor_calculate_exposure = sensor_calculate_exposure,
    .sensor_fill_exposure_array = sensor_fill_exposure_array,
  },
  • sensor_calculate_exposure
    用于计算下一次曝光配置的曝光时间和增益。

  • sensor_fill_exposure_array
    用于准备下一次曝光配置的数组。

10.meta data配置

  .meta_data_out_info_array =
  {
    .meta_data_out_info =
    {
      {
        .width = 0,//宽
        .height = 0,//高
        .stats_type = 0,//数据类型
      },
    },
    .size = 0,
  },
  • stats_type:数据类型
    typedef enum sensor_stats_types {
    HDR_STATS,
    PD_STATS,
    STAGGERED_HDR_FRAME,
    FLICKER_STATS,
    } sensor_stats_type_t;

11. HDR AWB 配置

  .awb_func_table =
  {
    .sensor_fill_awb_array = 0,
    .awb_table_size = 0,
  },

如果sensor可以直接流式传输HDR帧,该函数才有用。

  • sensor_fill_awb_array:填充HDR对应的寄存器和地址
  • awb_table_size: 必须与sensor_fill_awb_array中设置的寄存器数匹配

12 sensor rolloff 设置

  .rolloff_config =
  {
    .enable = FALSE,
    .full_size_info =
    {
      .full_size_width = 0,
      .full_size_height = 0,
      .full_size_left_crop = 0,
      .full_size_top_crop = 0,
    },
  },

这里的 rolloff compensations = Lens Shading Correction (LSC)
有些sensor可以自己内部做lsc补偿。rolloff_config就是用了配置sensor的这些信息。

  • **enable **:设置标志(TRUE / FALSE)是否使用传感器LSC补偿。

  • full_size_info
    full_size_width :设置可以使用的LSC表的宽度。
    full_size_height :设置可以使用的LSC表的高度。
    full_size_left_crop – Sets the crop on left size, between sensor array and LSC table.
    full_size_top_crop – Sets the crop on top size, between sensor array and LSC table.

注意:如果你使用了sensor LSC补偿,平台端 lsc补偿就要关闭,否则双倍补偿,可能会造成图片失真。

12.曝光延迟配置

   .app_delay = {
    [SENSOR_DELAY_EXPOSURE] = 0,
    [SENSOR_DELAY_ANALOG_SENSOR_GAIN] = 0,
    [SENSOR_DELAY_DIGITAL_SENSOR_GAIN] = 0,
    [SENSOR_DELAY_ISP_GAIN] = 0,
  },

typedef enum {
SENSOR_DELAY_EXPOSURE, /* delay for exposure/
SENSOR_DELAY_ANALOG_SENSOR_GAIN, /
delay for sensor analog gain/
SENSOR_DELAY_DIGITAL_SENSOR_GAIN, /
delay for sensor digital gain/
SENSOR_DELAY_ISP_GAIN, /
delay for sensor ISP (error) gain*/
SENSOR_DELAY_MAX,
} sensor_delay_type_t;

SENSOR_DELAY_EXPOSURE – Sets the exposure of frame N at frame N + delay
SENSOR_DELAY_ANALOG_SENSOR_GAIN – Sets the analog gain register at frame N + delay
SENSOR_DELAY_DIGITAL_SENSOR_GAIN – Sets the digital gain register at frame N + delay
SENSOR_DELAY_ISP_GAIN – Passes the isp digital gain to the isp module at frame N + delay

如果出现ae闪烁问题,可以尝试修改延迟,让gain和expose同步。

13. ADC readout time

  .adc_readout_time = 0,

This is the readout time (in nanoseconds) of the sensor’s analog-to-digital converter. Usually it is
the minimum line time when the sensor is running at the maximum pixel clock.
NOTE: This is the sensor module’s own information. Refer to the sensor vendor for more information

14.噪声系数

  .noise_coeff = {
    .gradient_S = 3.738032e-06,
    .offset_S = 3.651935e-04,
    .gradient_O = 6.396835e-11,
    .offset_O = -2.968624e-04,
  },

noise_coeff 小波里用来定义噪声的模板
噪声系数模型: N(x) = sqrt(Sx + O)

这些参数一般由tunning团队修改。

15.PDAF 配置

  .pdaf_config =
  {
#ifndef FLIP_MIRROR
    #include "xxxx_pdaf.h"
#else
   #include "xxxx_pdaf_flip_mirror.h"
#endif
  },

16.XML配置

关于角度

  • <MountAngle>90</MountAngle>
    kernel中dtsi文件也配置了角度:qcom,mount-angle = <90>;
    但是优先生效的是xml里配置的<MountAngle>90</MountAngle>;
    源码流程:
sensor_init_xml_probe
|
sensor_xml_util_get_camera_probe_config(&xmlConfig, "CameraModuleConfig")
该函数把xm信息读出来赋值给xmlConfig
|
sensor_probe(module_ctrl, sd_fd, camera_cfg.sensor_name,NULL,&xmlConfig,FALSE,FALSE);
    |
    translate_sensor_slave_info(slave_info,···)
    把xml信息赋值给slave_info变量
    |
    /* Pass slave information to kernel and probe */
     memset(&cfg, 0, sizeof(cfg));
    cfg.cfgtype = CFG_SINIT_PROBE;
    cfg.cfg.setting = slave_info;
    //通过IOCTL指令:VIDIOC_MSM_SENSOR_INIT_CFG调用到内核
    if (ioctl(fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg) < 0) {
    SINFO("[%s]CFG_SINIT_PROBE failed",sensor_name);
    ret = FALSE;
    goto ERROR;
    }
    |
    msm_sensor_driver_probe
    最终调用的内核函数

注意:
如果<MountAngle>360</MountAngle>;这个值配置成360度,那么以dtsi配置的角度为准。

源码:


关于帧率
https://www.cnblogs.com/ZHJEE/p/10351155.html

继续当一名咸鱼( ̄︶ ̄)!

Stay hungry,Stay foolish!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270