244 lines
6.9 KiB
C
Executable File
244 lines
6.9 KiB
C
Executable File
/*
|
|
Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
|
|
*/
|
|
|
|
#ifndef OT_COMMON_AE_H
|
|
#define OT_COMMON_AE_H
|
|
|
|
#include "ot_type.h"
|
|
#include "ot_debug.h"
|
|
#include "ot_common_isp.h"
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#endif /* End of #ifdef __cplusplus */
|
|
|
|
#define OT_AE_LIB_NAME "ot_ae_lib"
|
|
|
|
/* ae ctrl cmd */
|
|
typedef enum {
|
|
OT_ISP_AE_DEBUG_ATTR_SET,
|
|
OT_ISP_AE_DEBUG_ATTR_GET,
|
|
|
|
OT_ISP_AE_CTRL_BUTT,
|
|
} ot_isp_ae_ctrl_cmd;
|
|
|
|
typedef struct {
|
|
td_u32 max_int_time;
|
|
td_u32 min_int_time;
|
|
td_u32 max_a_gain;
|
|
td_u32 min_a_gain;
|
|
td_u32 max_d_gain;
|
|
td_u32 min_d_gain;
|
|
td_u32 max_isp_d_gain;
|
|
td_u32 min_isp_d_gain;
|
|
td_u32 max_sys_gain;
|
|
td_u32 min_sys_gain;
|
|
td_u32 compensation;
|
|
td_u32 ev_bias;
|
|
td_bool manual_exposure_en;
|
|
td_bool manual_time_en;
|
|
td_bool manual_again_en;
|
|
td_bool manual_dgain_en;
|
|
td_bool manual_isp_dgain_en;
|
|
td_u32 manual_exposure_lines;
|
|
td_u32 manual_again;
|
|
td_u32 manual_dgain;
|
|
td_u32 manual_isp_dgain;
|
|
td_u32 ae_weights[(OT_ISP_AE_ZONE_ROW) * (OT_ISP_AE_ZONE_COLUMN)];
|
|
} ot_isp_ae_dbg_attr;
|
|
|
|
typedef struct {
|
|
td_u32 frm_num_bgn;
|
|
td_u32 full_lines;
|
|
td_u32 int_time;
|
|
td_u32 short_int_time;
|
|
td_u32 med_int_time;
|
|
td_u32 long_int_time;
|
|
td_u32 again;
|
|
td_u32 dgain;
|
|
td_u32 isp_dgain;
|
|
td_u32 iris_fno_lin;
|
|
td_u64 exposure;
|
|
td_u32 increment;
|
|
td_s32 hist_error;
|
|
td_s32 hist_ori_average;
|
|
td_s32 luma_offset;
|
|
td_u32 iso;
|
|
td_u32 exp_ratio;
|
|
td_u32 over_exp_ratio;
|
|
td_u32 over_exp_ratio_filter;
|
|
} ot_isp_ae_dbg_status;
|
|
|
|
|
|
/* sensor's interface to ae
|
|
* eg: 0.35db, enAccuType=OT_ISP_AE_ACCURACY_DB, f32Accuracy=0.35
|
|
* and the multiply of 0.35db is power(10, (0.35/20))
|
|
* eg: 1/16, 2/16, 3/16 multiplies, enAccuType=OT_ISP_AE_ACCURACY_LINEAR, f32Accuracy=0.0625
|
|
* eg: 1,2,4,8,16 multiplies, enAccuType=OT_ISP_AE_ACCURACY_DB, f32Accuracy=6
|
|
*/
|
|
typedef enum {
|
|
OT_ISP_AE_ACCURACY_DB = 0,
|
|
OT_ISP_AE_ACCURACY_LINEAR,
|
|
OT_ISP_AE_ACCURACY_TABLE,
|
|
|
|
OT_ISP_AE_ACCURACY_BUTT,
|
|
} ot_isp_ae_accuracy_type;
|
|
|
|
typedef struct {
|
|
ot_isp_ae_accuracy_type accu_type;
|
|
float accuracy;
|
|
float offset;
|
|
} ot_isp_ae_accuracy;
|
|
|
|
typedef struct {
|
|
td_bool quick_start_enable;
|
|
td_u8 black_frame_num;
|
|
td_bool ir_mode_en;
|
|
td_u32 init_exposure_ir;
|
|
td_u32 iso_thr_ir;
|
|
td_u16 ir_cut_delay_time;
|
|
} ot_isp_quick_start_param;
|
|
|
|
typedef struct {
|
|
td_u8 ae_compensation;
|
|
|
|
td_u32 lines_per500ms;
|
|
td_u32 flicker_freq;
|
|
td_float fps;
|
|
td_u32 hmax_times; /* unit is ns */
|
|
td_u32 init_exposure;
|
|
td_u32 init_int_time;
|
|
td_u32 init_again;
|
|
td_u32 init_dgain;
|
|
td_u32 init_isp_dgain;
|
|
td_u32 init_ae_speed;
|
|
td_u32 init_ae_tolerance;
|
|
|
|
td_u32 full_lines_std;
|
|
td_u32 full_lines_max;
|
|
td_u32 full_lines;
|
|
td_u32 binning_full_lines;
|
|
td_u32 max_int_time; /* RW;unit is line */
|
|
td_u32 min_int_time;
|
|
td_u32 max_int_time_target;
|
|
td_u32 min_int_time_target;
|
|
ot_isp_ae_accuracy int_time_accu;
|
|
|
|
td_u32 max_again;
|
|
td_u32 min_again;
|
|
td_u32 max_again_target;
|
|
td_u32 min_again_target;
|
|
ot_isp_ae_accuracy again_accu;
|
|
|
|
td_u32 max_dgain;
|
|
td_u32 min_dgain;
|
|
td_u32 max_dgain_target;
|
|
td_u32 min_dgain_target;
|
|
ot_isp_ae_accuracy dgain_accu;
|
|
|
|
td_u32 max_isp_dgain_target;
|
|
td_u32 min_isp_dgain_target;
|
|
td_u32 isp_dgain_shift;
|
|
|
|
td_u32 max_int_time_step;
|
|
td_bool max_time_step_enable;
|
|
td_u32 max_inc_time_step[OT_ISP_WDR_MAX_FRAME_NUM];
|
|
td_u32 max_dec_time_step[OT_ISP_WDR_MAX_FRAME_NUM];
|
|
td_u32 lf_max_short_time;
|
|
td_u32 lf_min_exposure;
|
|
|
|
ot_isp_ae_route ae_route_attr;
|
|
td_bool ae_route_ex_valid;
|
|
ot_isp_ae_route_ex ae_route_attr_ex;
|
|
|
|
ot_isp_ae_route ae_route_sf_attr;
|
|
ot_isp_ae_route_ex ae_route_sf_attr_ex;
|
|
|
|
td_u16 man_ratio_enable;
|
|
td_u32 arr_ratio[OT_ISP_EXP_RATIO_NUM];
|
|
|
|
ot_isp_iris_type iris_type;
|
|
ot_isp_piris_attr piris_attr;
|
|
ot_isp_iris_f_no max_iris_fno; /* RW; Range:[0, 10]; Format:4.0;
|
|
Max F number of Piris's aperture, it's related to the specific iris */
|
|
ot_isp_iris_f_no min_iris_fno; /* RW; Range:[0, 10]; Format:4.0;
|
|
Min F number of Piris's aperture, it's related to the specific iris */
|
|
|
|
ot_isp_ae_strategy ae_exp_mode;
|
|
|
|
td_u16 iso_cal_coef;
|
|
td_u8 ae_run_interval;
|
|
td_u32 exp_ratio_max;
|
|
td_u32 exp_ratio_min;
|
|
td_bool diff_gain_support;
|
|
ot_isp_quick_start_param quick_start;
|
|
ot_isp_prior_frame prior_frame;
|
|
td_bool ae_gain_sep_cfg;
|
|
td_bool lhcg_support;
|
|
td_u32 sns_lhcg_exp_ratio;
|
|
} ot_isp_ae_sensor_default;
|
|
|
|
typedef struct {
|
|
ot_isp_fswdr_mode fswdr_mode;
|
|
} ot_isp_ae_fswdr_attr;
|
|
|
|
typedef struct {
|
|
td_u32 reg_addr;
|
|
td_u32 reg_value;
|
|
} ot_isp_ae_param_reg;
|
|
|
|
typedef struct {
|
|
td_u32 tar_fps;
|
|
td_u32 exp_time;
|
|
td_u32 exp_again;
|
|
td_u32 exp_dgain;
|
|
td_u32 exp_isp_dgain;
|
|
ot_isp_ae_param_reg time_reg[10]; /* 10 */
|
|
ot_isp_ae_param_reg again_reg[10]; /* 10 */
|
|
ot_isp_ae_param_reg dgain_reg[10]; /* 10 */
|
|
} ot_isp_ae_convert_param;
|
|
|
|
typedef struct {
|
|
td_u32 int_time_min[OT_ISP_WDR_MAX_FRAME_NUM];
|
|
td_u32 int_time_max[OT_ISP_WDR_MAX_FRAME_NUM];
|
|
td_u32 pre_int_time[OT_ISP_WDR_MAX_FRAME_NUM];
|
|
} ot_isp_ae_int_time_range;
|
|
|
|
typedef struct {
|
|
td_s32 (*pfn_cmos_get_ae_default)(ot_vi_pipe vi_pipe, ot_isp_ae_sensor_default *ae_sns_dft);
|
|
|
|
/* the function of sensor set fps */
|
|
td_void (*pfn_cmos_fps_set)(ot_vi_pipe vi_pipe, td_float f32_fps, ot_isp_ae_sensor_default *ae_sns_dft);
|
|
td_void (*pfn_cmos_slow_framerate_set)(ot_vi_pipe vi_pipe, td_u32 full_lines, ot_isp_ae_sensor_default *ae_sns_dft);
|
|
|
|
/* while isp notify ae to update sensor regs, ae call these funcs. */
|
|
td_void (*pfn_cmos_inttime_update)(ot_vi_pipe vi_pipe, td_u32 int_time);
|
|
td_void (*pfn_cmos_gains_update)(ot_vi_pipe vi_pipe, td_u32 again, td_u32 dgain);
|
|
|
|
td_void (*pfn_cmos_again_calc_table)(ot_vi_pipe vi_pipe, td_u32 *again_lin, td_u32 *again_db);
|
|
td_void (*pfn_cmos_dgain_calc_table)(ot_vi_pipe vi_pipe, td_u32 *dgain_lin, td_u32 *dgain_db);
|
|
|
|
td_void (*pfn_cmos_get_inttime_max)(ot_vi_pipe vi_pipe, td_u16 man_ratio_enable, td_u32 *ratio,
|
|
ot_isp_ae_int_time_range *int_time, td_u32 *lf_max_int_time);
|
|
|
|
/* long frame mode set */
|
|
td_void (*pfn_cmos_ae_fswdr_attr_set)(ot_vi_pipe vi_pipe, ot_isp_ae_fswdr_attr *ae_fswdr_attr);
|
|
td_void (*pfn_cmos_ae_quick_start_status_set)(ot_vi_pipe vi_pipe, td_bool quick_start_status);
|
|
td_void (*pfn_cmos_exp_param_convert)(ot_vi_pipe vi_pipe, ot_isp_ae_convert_param *exp_param);
|
|
} ot_isp_ae_sensor_exp_func;
|
|
|
|
typedef struct {
|
|
ot_isp_ae_sensor_exp_func sns_exp;
|
|
} ot_isp_ae_sensor_register;
|
|
|
|
#ifdef __cplusplus
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* End of #ifdef __cplusplus */
|
|
|
|
#endif
|