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参数