高通camera驱动分析 (4)

sensor工作时更新曝光设定需要操作许多寄存器(曝光时间,每帧行数,增益),这些必须在同一帧完成更新。这些寄存器都有双buffer,并具有按组更新的功能。表现为所有相关寄存器一起完成更新。

地址0x0104就是寄存器GRP_PARAM_HOLD的地址,当其寄存器的值设为1时,写入的寄存器数据被暂存的buffer寄存器中。

3.3 、Grouphold off设置

当寄存器GRP_PARAM_HOLD的值为0时,所需要寄存器的值会被同时更新,参数的变化会在同一帧生效。

3.4、 启动输出设置

MIPI数据包必须以在SoT(Start of Transmission)和EoT(End of Transmission)之间发送。根据参考手册7.1,在正确的时间设定寄存器MODE_SEL(地址0x0100)为1时,开始进行数据输出。

启动数据输出流程分为两种情况:
情况1:在上电之后
(1)准备上电序列时序
(2)PLL锁相环参数设置
(3)初始化设置
(4)设置读取模式(起始/结束位置,大小,曝光时间,gain值)
(5)设置MIPI接口参数
(6)设置寄存器MODE_SEL的值为1,准备数据输出
在经过MIPI唤醒时间和初始化时间之后,开始输出第一帧图像数据。

情况2:在经过一次数据输出之后
(1)设置寄存器MODE_SEL的值为0,进入待命状态
(2)等待MIPI的FE package
(3)设置下一次数据输出模式
(4)设置寄存器MODE_SEL的值为1,准备数据输出
在经过MIPI唤醒时间和初始化时间之后,开始输出第一帧图像数据。

3.5、停止输出配置

在正确的时间设定MODE_SEL为0时,结束数据传输。

4、曝光设置

4.1 、曝光寄存器地址

结构体msm_sensor_exp_gain_info_t定义在sensor_lib.c中:
struct msm_sensor_exp_gain_info_t {
uint16_t  coarse_int_time_addr; //粗曝光时间寄存器地址
uint16_t  global_gain_addr; //模拟增益寄存器地址
uint16_t  vert_offset; //曝光行偏置
};

粗曝光时间单位为lines,用于计算曝光时间,计算关系如下:

Tsh = Tline * (COARSE_INTEG_TIME + FINE_INTEG_TIME / LINE_LENGTH_PCK)

其中细曝光时间单位为pixels,是定值,其寄存器为只读寄存器。Tline为行曝光时间,为时间单位。计算如下:

Tline = LINE_LENGTH_PCK * VTPXCK_period


曝光行偏置用于设定以下关系:

COARSE_INTEG_TIME ≤ frame_length_lines – vert_offset


4.2、 AEC参数设置

结构体sensor_aec_data_t定义在sensor_lib.h中:
typedef enum {
  SENSOR_MODE_SNAPSHOT,//快照模式
  SENSOR_MODE_RAW_SNAPSHOT,//raw图快照模式
  SENSOR_MODE_PREVIEW,//预览模式
  SENSOR_MODE_VIDEO,//视频录像模式
  SENSOR_MODE_VIDEO_HD,//高清视频录像模式
  SENSOR_MODE_HFR_60FPS,//60帧率HFR模式
  SENSOR_MODE_HFR_90FPS,//90帧率 HFR模式
  SENSOR_MODE_HFR_120FPS,//120帧率HFR模式
  SENSOR_MODE_HFR_150FPS,//150帧率HFR模式
  SENSOR_MODE_ZSL,//零秒快拍
  SENSOR_MODE_INVALID,//非法
} sensor_mode_t;


typedef struct {
  sensor_mode_t op_mode; //sensor 模式
  uint32_t pixels_per_line;//每一帧每一行多少个pixels
  uint32_t lines_per_frame;        //每一帧多少行
  uint32_t pclk;//vt_pixel_clk
  uint32_t max_fps;//最大帧率
  float digital_gain;//数字增益
  float stored_digital_gain;
  float max_gain;//最大数字增益
  uint32_t max_linecount;//最大曝光行数

} sensor_aec_data_t;

4.3 、曝光增益gain值设置

AEC算法中模拟增益gain用于曝光计算,实际上必须把gain转换成寄存器gain去设置sensor。以下是imx230的gain转换函数:

模拟增益real_gain值的范围是1至8, 对应到reg_gain的范围为0到448。real_gain与reg_gain的关系为:
real_gain = 512 / (512 - reg_gain)

结构体sensor_exposure_info_t定义在sensor_lib.h中:
typedef struct {
uint16_t  reg_gain; //寄存器gain值
uint16_t  line_count; //曝光行数
float digital_gain;
float sensor_real_gain;//sensor的模拟gain值
float sensor_digital_gain;        //sensor的数字gain值
} sensor_exposure_info_t;

5、镜头参数设置

结构体sensor_lens_info_t定义在sensor_lib.c中:
typedef struct {
float focal_length;//焦距
float pix_size;//像素大小
float f_number;        //光圈
float total_f_dist;
float hor_view_angle;//水平视角
float ver_view_angle;//垂直视角
} sensor_lens_info_t;

6、Chromatix参数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsdsz.html