#ifndef _ISP_PARAM_H_ #define _ISP_PARAM_H_ #ifdef __cplusplus extern "C" { #endif #include "osal/string.h" #include "sys_config.h" typedef void *(*ispcfg_malloc)(int size); typedef void (*ispcfg_free)(void *ptr); #define NUM_CURVES 5 #define LUT_SIZE 64 #define ISPCFG_MAGIC 0xb103 #define BV2RAWNR_ARRAY_NUM (11) #define BV2YUVNR_ARRAY_NUM ( 6) #define BV2CSUPP_ARRAY_NUM ( 3) #define LOCAL_HUE_SAT_COLOR ( 9) #define BV2COLENH_ARRAY_NUM ( 8) #define BV2GAMMA_ARRAY_NUM ( 8) enum awb_meas_mode{ AWB_MEAS_MODE_YUV = 0, AWB_MEAS_MODE_RGB = 1, AWB_MEAS_MODE_YUV_NEW = 2, }; enum awb_config_mode { AWB_MODE_MANUAL = 0, AWB_MODE_AUTO = 1, }; enum awb_gain_type { AWB_GAIN_TYPE_AWB = 0, AWB_GAIN_TYPE_RGB = 1, AWB_GAIN_TYPE_BOTH = 2, }; enum awb_formula_type{ AWB_FORMULA_SRC, AWB_FORMULA_DIFF, }; enum isp_info_src_type { ISP_INFO_SRC_TYPE_CODE_PARAM = 0, ISP_INFO_SRC_TYPE_CODE_DOC, ISP_INFO_SRC_TYPE_TUNNING, }; struct isp_func_cfg { uint32 test_pattern_en : 1, // 0 dma_flush_en : 1, ifa_table_en : 1, blc_en : 1, lsc_en : 1, af_en : 1, // 5 dehaze_en : 1, dpc_en : 1, bnr_en : 1, gic_en : 1, awb_en : 1, // 10 ccm_en : 1, y_gamma_en : 1, rgb_gamma_en : 1, sharpen_en : 1, ynr_en : 1, // 15 cnr_en : 1, ae_en : 1, hist_en : 1, ce_en : 1, md_en : 1, // 20 csupp_en : 1, luma_ca_en : 1, adj_hue_en : 1, lsc_tab_en : 1, // 25 input_format : 1, reserved : 2; }; #define AWB_CLIP_MAX_SECTION 8 typedef struct hgisp_awb_constraint { // awbclip uint32 section_num; uint32 color_temp[AWB_CLIP_MAX_SECTION]; float sec_line_slope[AWB_CLIP_MAX_SECTION]; float sec_line_offset[AWB_CLIP_MAX_SECTION]; float sec_line_sqrtk2add1[AWB_CLIP_MAX_SECTION]; float center_line_slope[AWB_CLIP_MAX_SECTION - 1]; float center_line_offset[AWB_CLIP_MAX_SECTION - 1]; float lower_line_slope[AWB_CLIP_MAX_SECTION - 1]; float lower_line_offset[AWB_CLIP_MAX_SECTION - 1]; float upper_line_slope[AWB_CLIP_MAX_SECTION - 1]; float upper_line_offset[AWB_CLIP_MAX_SECTION - 1]; float corner_limit[AWB_CLIP_MAX_SECTION]; }AWB_CONSTRAINT; typedef struct hgisp_awb_coarse_constraint { float coarse_min_bg, coarse_lb_bg, coarse_rt_bg, coarse_max_bg; float coarse_min_rg, coarse_lb_rg, coarse_rt_rg, coarse_max_rg; }AWB_COARSE_CONSTRAINT; typedef struct { // channel r gr gb b uint16 default_gain[4]; uint16 awb_min_gain[4]; uint16 awb_max_gain[4]; // awb coarse polygon constraint AWB_COARSE_CONSTRAINT coarse_constraint; AWB_CONSTRAINT constraint; }_Sensor_AWB; typedef struct hgisp_cfg_awb { uint32 cr_target : 16, cb_target : 16; uint32 front_cr_val : 8, back_cr_val : 8, cons_cr_max : 8, cons_cr_min : 8; uint32 front_cb_val : 8, back_cb_val : 8, cons_cb_max : 8, cons_cb_min : 8; uint32 front_uv_sum : 8, back_uv_sum : 8, cons_uv_max : 8, cons_uv_min : 8; uint32 back_cb_max : 8, back_cr_max : 8, back_uv_max : 8, reserved1 : 8; uint32 back_cb_min : 8, back_cr_min : 8, back_uv_min : 8, reserved2 : 8; int32 lock_hi_thr : 8, lock_lo_thr : 8, reversed0 : 16; uint32 coarse_scale : 8, coarse_thr : 8, fine_step : 8, stable_thr : 8; uint32 cbcr_thr : 8, awb_cent_cons_en : 8, awb_back_cons_en : 8, reserved3 : 8; uint32 awb_auto_en : 4, awb_fine_cons_en : 4, awb_meas_mode : 3, awb_gain_type : 3, awb_formula : 2, awb_wp_max : 8, awb_wp_min : 8; uint32 awb_r_max : 8, awb_g_max : 8, awb_b_max : 8, awb_precision : 4, awb_coarse_cons_en : 4; uint16 manual_gain[4]; float awb_back_wp_min_ratio; uint32 awb_crop_pixel_start_v : 16, awb_crop_pixel_start_h : 16; uint32 awb_crop_pixel_end_v : 16, awb_crop_pixel_end_h : 16; _Sensor_AWB sensor_awb; }TYPE_HGISP_CFG_AWB; typedef struct { float wdr_bv[8]; // bv分段点, 用于控制每段的wdr_max_ns_slope, float max_ns_slope[8]; // 每段bv, 允许的最大的noise floor映射的斜率, 设置范围[1.0~3.0] float max_shadow_slope[8]; // 每段bv, 允许的最大的shadow映射的斜率, 设置范围[1.0~1.5] }_Sensor_WDR; typedef struct hgisp_cfg_wdr { uint32 auto_noise_floor_out : 8, // auto_noise_floor_out : 打开自动计算噪声抑制输出控制点功能 wdr_en:是否使能wdr wdr_en : 8, //WDR使能,isp tuning时需要设0 dynamic_gamma_en : 8, //动态y_gamma使能,isp tuning时需要设0 y_gamma_opt : 8; //0是自动y_gamma,1,2,3,4,5是选择曲线 float temporal_smooth_alpha; // 帧间平滑控制, alpha越小,帧间亮度越稳定,但对场景变化响应越慢。典型值范围: 0.05 ~ 0.2 uint16 noise_floor; // 噪声抑制输入控制点 uint16 noise_floor_out; // 噪声抑制输出控制点 uint16 shadow_boost_target; // 暗部提亮的目标值(10 bit空间) uint16 highlight_compress_target; // 高光压缩的目标值(10 bit空间) float min_ns_percentile; // 用于自动计算噪声抑制输出控制点, 获取指定最小百分位处的噪声的统计值 float max_ns_percentile; // 用于自动计算噪声抑制输出控制点, 获取指定最大百分位处的噪声的统计值 _Sensor_WDR sensor_wdr; } TYPE_HGISP_CFG_WDR; typedef struct { float row_time_us; uint32 max_analog_gain : 16, min_analog_gain : 16; uint32 max_exposure_line : 16, min_exposure_line : 16; uint32 default_exposure_line : 16, expo_frame_interval : 8, min_frame_vb : 8; float to_day_bv; float to_night_bv; uint8 dark_scene_target_lut[2]; uint8 hs_scene_limit_lut[2]; float dark_scene_bv_lut[2]; float hs_scene_bv_lut[2]; float lowlight_lsb_bv_lut[8]; uint8 lowlight_lsb_gain_lut[8]; uint32 curr_fps : 16, max_frame_length : 16; }_Sensor_AE; typedef struct hgisp_cfg_ae { uint32 luma_target : 16, luma_weight_sum : 16; uint8 luma_weight[25]; uint8 exposure_alpha, reserved1, reserved2; uint32 ae_lock_cnt : 8, ae_lock_tolerance : 8, ae_manual_en : 8, reduce_fps_en : 8; uint32 lowlight_lsb_gain_en : 8, lowlight_lsb_gain_4hi_fps : 8, lowlight_lsb_gain_4lo_fps : 8, hist_hs_bin_thr : 8; float hist_upper_hs_pixel_ratio; // [0, 1] »ý·ÖÖ±·½Í¼ÁÁ²¿Ö¸¶¨Î»ÖõÄÏñËØÊýÁ¿, ÓÃÓÚµ÷ÕûAEÄ¿±êÖµ¡£ float hist_upper_pixel_ratio; // not use float hist_lower_pixel_ratio; // not use uint8 abl_luma_target_max; uint8 dark_pos_thr_max; uint8 abl_hist_thr[2]; float abl_diff_ratio; uint32 abl_dark_pos_diff_thr : 8, // [0,61] ablÆØ¹âËø¶¨ãÐÖµ2£ºµ±µ÷Õûµ½ºÏÊÊÆØ¹âºó£¬Èç¹û°µÇøÈ¨ÖØÖµ±ä»¯Ð¡ÓÚ´ËãÐÖµ £¬abl Target½«Ëø¶¨£¬±£³Ö²»±ä¡£ abl_bright_pos_diff_thr : 8, // [0,61] ablÆØ¹âËø¶¨ãÐÖµ3£ºµ±µ÷Õûµ½ºÏÊÊÆØ¹âºó£¬Èç¹ûÁÁÇøÈ¨ÖØÖµ±ä»¯Ð¡ÓÚ´ËãÐÖµ £¬abl Target½«Ëø¶¨£¬±£³Ö²»±ä¡£ reserved3 : 16; float bright_pixel_high_ratio; float bright_pixel_sub_ratio; // [0, 1] Ö±·½Í¼ÁÁÏñËØÊý×ÔÊÊÓ¦Öµ£¨%£©¡£ float dark_pixel_low_ratio; float dark_pixel_high_ratio; uint32 abl_dark_pos_low_wthr : 8, // [0,61] abl°µÇøÎ»ÖÃÈ¨ÖØ×îСãÐÖµ¡£ abl_dark_pos_add_wthr : 8, // [0,61] abl°µÇøÎ»ÖÃÈ¨ÖØ×ÔÊÊÓ¦Öµ¡£ reversed4 : 16; float bright_pos_adjust_ratio; uint32 aoe_bright_pos_wthr : 8, // [0,61] aoeÁÁÇøÎ»ÖÃÈ¨ÖØãÐÖµ¡£ aoe_dark_pos_wthr : 8, // [0,61] aoe°µÇøÎ»ÖÃÈ¨ÖØãÐÖµ¡£ abl_bv_gain_sel : 8, // ablÅжÏÑ¡Ôñ£º 0£ºÔöÒæ£» 1£ºbv reserved5 : 8; float abl_expo_line_low_ratio; float abl_expo_line_high_ratio; uint32 abl_expo_gain_low_thr; // [0, ana_gain_max] ablÔöÒæÅжϡ£ uint32 abl_expo_gain_high_thr; // [0, ana_gain_max] ablÔöÒæÅжϡ£ float abl_bv_thr[2]; float aoe_bv_thr[2]; uint16 aoe_expo_gain_thr[2]; // [0, ana_gain_max] aoeÔöÒæÅжϡ£ uint32 stg_mode : 8, // ×Ô¶¯ÆØ¹â²ßÂÔ 0£º¸ß¹âÓÅÏÈ£» 1£ºµÍ¹âÓÅÏÈ stg_max_offset : 8, // fix(0,16,8), ÖµÔ½´ó£¬roi¶ÔÈ¨ÖØµÄÓ°ÏìÔ½´ó¡£ stg_ratio_slope : 16; // fix(0,8,0)£¬ roi¶ÔÈ¨ÖØÓ°ÏìµÄ×î´ó³Ì¶È uint32 ae_crop_start_v : 16, ae_crop_start_h : 16; // need to reduce 1. uint32 ae_crop_size_v : 16, ae_crop_size_h : 16; // NO need to reduce 1. uint32 hist_crop_start_v : 16, hist_crop_start_h : 16; // NO need to reduce 1. uint32 hist_crop_end_v : 16, hist_crop_end_h : 16; // NO need to reduce 1. _Sensor_AE sensor_ae; } TYPE_HGISP_CFG_AE; typedef struct { int16 c00, c01, c02, c10, c11, c12, c20, c21, c22, c30, c31, c32; }_Sensor_CCM; typedef struct { uint16 gr, gb, r, b; }_Sensor_BLC; typedef struct hgisp_md_param { uint32 win_start_h : 16, win_start_v : 16; uint32 win_end_h : 16, win_end_v : 16; uint32 frame_value : 16, block_value : 8, frame_interval : 8; }_Sensor_MD; typedef struct { uint32 adj_by_bv : 8, reversed : 24; float bv[BV2GAMMA_ARRAY_NUM]; uint8 y_alpha[BV2GAMMA_ARRAY_NUM]; uint8 rgb_alpha[BV2GAMMA_ARRAY_NUM]; }_Sensor_GAMMA_BV; typedef struct hgisp_csc_param { uint32 rgb2yuv_gamut : 8, yuv2rgb_in_gamut : 8, yuv2rgb_out_gamut : 8, rgb2yuv_range : 8; uint32 yuv2rgb_in_range : 8, yuv2rgb_out_range : 8, y_gamma_alpha : 8, rgb_gamma_alpha : 8; _Sensor_GAMMA_BV *gamma_alpha_map; }_Sensor_CSC; typedef struct hgisp_dpc_param { uint32 static_psram_addr; uint32 white_threshold : 8, black_threshold : 8, sensitivity_value : 8, white_threshold_min : 8; uint32 black_threshold_min : 8, dynamic_white_strength : 4, dynamic_black_strength : 4, reserved0 : 16; }_Sensor_DPC; typedef struct { uint8 U_luma_thr_lo, U_luma_slop_lo, U_luma_shfb_lo, U_luma_gmin_lo; uint8 U_luma_thr_hi, U_luma_slop_hi, U_luma_shfb_hi, U_luma_gmin_hi; uint8 V_luma_thr_lo, V_luma_slop_lo, V_luma_shfb_lo, V_luma_gmin_lo; uint8 V_luma_thr_hi, V_luma_slop_hi, V_luma_shfb_hi, V_luma_gmin_hi; uint8 chroma_thr_lo, chroma_slop_lo, chroma_shfb_lo, chroma_gmin_lo; }_Sensor_CSUPP; typedef struct { uint32 filt_alpha : 8, shrink_thr : 8, filt_clip_hi : 8, filt_clip_lo : 8; uint32 sp_thr2 : 8, sp_thr1 : 8, enha_clip_hi : 8, enha_clip_lo : 8; uint32 e1 : 8, e2 : 8, e3 : 8, reserved0 : 8; uint32 k0 : 8, k1 : 8, k2 : 8, k3 : 8; uint32 y1 : 8, y2 : 8, y3 : 8, reserved1 : 8; int32 filt_w11 : 16, filt_w12 : 16; int32 filt_w13 : 16, filt_w21 : 16; int32 filt_w22 : 16, filt_w23 : 16; int32 filt_w31 : 16, filt_w32 : 16; int32 filt_w33 : 16, reserved2 : 16; uint32 filt_type : 8, filt_sbit : 8, lpf_scale : 8, reserved3 : 8; uint8 strength_lut[2]; uint8 reserved4, reserved5; float strength_bv_lut[2]; }_Sensor_SHARP; typedef struct { uint8 y_thr_tal0,y_thr_tal1,y_thr_tal2,y_thr_tal3,y_thr_tal4,y_thr_tal5,y_thr_tal6,y_thr_tal7; uint8 y_alfa, c_alfa, y_win_size, reserved0; }_Sensor_YUVNR; typedef struct { float bv; int16 hue, reserved0; uint8 luma, contrast, saturation, reserved1; }_Sensor_COLENH_BV; typedef struct { uint8 yuv_range; // narrow : 0 full : 1 uint8 luma; // range: 0 ~ 100 uint8 contrast; // range: 0 ~ 100 uint8 saturation; // range: 0 ~ 100 int16 hue; // range: -180 ~ 180' int16 reserved0; int16 ce_in_ofs_y, ce_in_ofs_cb, ce_in_ofs_cr; // range: -128 ~ 128 int16 ce_out_ofs_y, ce_out_ofs_cb, ce_out_ofs_cr; // range: -128 ~ 128 uint32 adj_by_bv_en : 1, reserved1 : 31; _Sensor_COLENH_BV *bv2colenh_map; }_Sensor_COLENH; typedef struct { _Sensor_COLENH sensor_ce; _Sensor_COLENH_BV bv2colenh_map[BV2COLENH_ARRAY_NUM]; }_Sensor_BV2COLENH; typedef struct { float bv; uint8 bnr_range_weight_index; uint16 bnr_invksigma; uint8 bnr_intensity_threshold; uint8 yuvnr_idx; uint8 csupp_idx; uint8 h264_3dnr_lev; uint8 h264_3dnr_en; }_Sensor_BV2NR; typedef struct { uint32 *p_lsc_tbl; }_Sensor_LSC; typedef struct{ float bv; uint32 packed_lut[LUT_SIZE]; } _Sensor_YGAMMA; typedef struct { _Sensor_YGAMMA local_ygamma_map[NUM_CURVES]; }_Sensor_YGAMMA_MAP; typedef struct { uint16 region_lower, region_center, region_upper, hue_value, sat_value, reserved0; } _Sensor_LHS; struct hgisp_head_info { uint16 magic_num , version , sensor_flag , sensor_num; uint16 basic_size, param_size, y_gamma_size, rgb_gamma_size, lsc_size; uint16 basic_crc , param_crc , y_gamma_crc , rgb_gamma_crc , lsc_crc ; }; typedef struct { uint32 bv3dnr : 8, change : 8, reserved0 : 16; _Sensor_BV2NR bv2rawnr_map[BV2RAWNR_ARRAY_NUM]; _Sensor_YUVNR bv2yuvnr_map[BV2YUVNR_ARRAY_NUM]; _Sensor_CSUPP bv2csupp_map[BV2CSUPP_ARRAY_NUM]; }_Sensor_NR; typedef struct { uint8 w_thres, w_slope, w_str, mu_thres, mu_slope, reserved0, reserved1, reserved2; }_Sensor_GIC; typedef struct { _Sensor_LHS local_hue_sat_map[LOCAL_HUE_SAT_COLOR]; }_Sensor_LHS_MAP; struct hgisp_param_info { struct isp_func_cfg enable_param; TYPE_HGISP_CFG_AWB awb_param; struct hgisp_cfg_ae cfg_ae; _Sensor_CCM ccm_param; _Sensor_BLC blc_param; _Sensor_MD md_param; _Sensor_CSC csc_param; _Sensor_GAMMA_BV gamma_param; _Sensor_DPC dpc_param; _Sensor_BV2COLENH ce_param; _Sensor_SHARP sharp_param; _Sensor_NR nr_param; _Sensor_GIC gic_param; _Sensor_LHS_MAP lhs_param; TYPE_HGISP_CFG_WDR config_wdr; ispcfg_malloc malloc; ispcfg_free free; _Sensor_YGAMMA_MAP y_gamma; uint32 *rgb_gamma; uint32 *lsc_tbl; }; struct hgisp_basic_info { uint32 sensor_name[5]; uint32 mirror : 8, reverse : 8, curr_mirror : 8, curr_reverse : 8; uint32 img_operation : 8, reserved : 24; uint32 sensor_size_v : 16, sensor_size_h : 16; uint32 input_size_v : 16, input_size_h : 16; uint32 input_size_startv : 16, input_size_starth : 16; uint32 crop_size_v : 16, crop_size_h : 16; uint32 crop_size_startv : 16, crop_size_starth : 16; uint32 bayer_type : 8, input_type : 8, format_type : 8, sensor_index : 8; uint32 init_addr; uint32 offset; }; struct hgisp_sensor_info { uint32 info_src; struct hgisp_head_info head_info; struct hgisp_basic_info sensor_basic; struct hgisp_param_info sensor_param; }; struct hgisp_sensor_init { struct hgisp_sensor_info sensor_info[ISP_SUPPORT_SENSOR_MAX_NUM]; }; void *isp_sensor_param_load(uint16 *buff); #ifdef __cplusplus } #endif #endif