Files

2065 lines
86 KiB
C
Executable File

#include "config.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "xmedia_type.h"
#include "xmedia_isp.h"
#include "xmedia_errcode.h"
#include "isp_def.h"
#include "hal_isp.h"
#include "i2c_dev.h"
#include "reserved_mem.h"
typedef union
{
struct
{
unsigned int reg_blc1_enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 31; /* [31 : 1] */
} bits;
unsigned int u32;
} u_blc1_ch0_blc1000;
typedef union
{
struct
{
unsigned int reg_blc1_global_offset_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_blc1_global_offset_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_blc1_ch0_blc1001;
typedef union
{
struct
{
unsigned int reg_blc1_global_offset_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_blc1_global_offset_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_blc1_ch0_blc1002;
typedef union
{
struct
{
unsigned int reg_blc1_enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 31; /* [31 : 1] */
} bits;
unsigned int u32;
} u_blc1_ch1_blc1000;
typedef union
{
struct
{
unsigned int reg_blc1_global_offset_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_blc1_global_offset_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_blc1_ch1_blc1001;
typedef union
{
struct
{
unsigned int reg_blc1_global_offset_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_blc1_global_offset_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_blc1_ch1_blc1002;
typedef union
{
struct
{
unsigned int enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 31; /* [31 : 1] */
} bits;
unsigned int u32;
} u_dgn1_ch0_hreg000;
typedef union
{
struct
{
unsigned int digital_gain_0 : 16; /* [15 : 0] */
unsigned int digital_gain_1 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_dgn1_ch0_dgn1001;
typedef union
{
struct
{
unsigned int digital_gain_2 : 16; /* [15 : 0] */
unsigned int digital_gain_3 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_dgn1_ch0_dgn1002;
typedef union
{
struct
{
unsigned int blc_in_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_in_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch0_dgn1003;
typedef union
{
struct
{
unsigned int blc_in_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_in_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch0_dgn1004;
typedef union
{
struct
{
unsigned int blc_out_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_out_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch0_dgn1005;
typedef union
{
struct
{
unsigned int blc_out_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_out_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch0_dgn1006;
typedef union
{
struct
{
unsigned int enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 31; /* [31 : 1] */
} bits;
unsigned int u32;
} u_dgn1_ch1_hreg000;
typedef union
{
struct
{
unsigned int digital_gain_0 : 16; /* [15 : 0] */
unsigned int digital_gain_1 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_dgn1_ch1_dgn1001;
typedef union
{
struct
{
unsigned int digital_gain_2 : 16; /* [15 : 0] */
unsigned int digital_gain_3 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_dgn1_ch1_dgn1002;
typedef union
{
struct
{
unsigned int blc_in_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_in_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch1_dgn1003;
typedef union
{
struct
{
unsigned int blc_in_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_in_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch1_dgn1004;
typedef union
{
struct
{
unsigned int blc_out_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_out_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch1_dgn1005;
typedef union
{
struct
{
unsigned int blc_out_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int blc_out_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn1_ch1_dgn1006;
typedef union
{
struct
{
unsigned int reg_aac_initial_sram_enable : 1; /* [0 : 0] */
unsigned int reserved_3 : 3; /* [3 : 1] */
unsigned int reg_aac_ae_cfa_enable : 1; /* [4 : 4] */
unsigned int reserved_2 : 11; /* [15 : 5] */
unsigned int reg_aac_ae_cfa_tile_num_col : 5; /* [20 : 16] */
unsigned int reserved_1 : 3; /* [23 : 21] */
unsigned int reg_aac_ae_cfa_tile_num_row : 4; /* [27 : 24] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be000;
typedef union
{
struct
{
unsigned int reg_aac_ae_cfa_tile_col_start : 12; /* [11 : 00] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_aac_ae_cfa_tile_row_start : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be001;
typedef union
{
struct
{
unsigned int reg_aac_ae_cfa_tile_num_all : 16; /* [15 : 00] */
unsigned int reserved_0 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_aac_be002;
typedef union
{
struct
{
unsigned int reg_aac_ae_cfa_tile_width : 9; /* [08 : 00] */
unsigned int reserved_2 : 7; /* [15 : 9] */
unsigned int reg_aac_ae_cfa_tile_height : 9; /* [24 : 16] */
unsigned int reserved_1 : 3; /* [27 : 25] */
unsigned int reg_aac_ae_stat_location : 2; /* [29 : 28] */
unsigned int reserved_0 : 2; /* [31 : 30] */
} bits;
unsigned int u32;
} u_aac_be003;
typedef union
{
struct
{
unsigned int reg_aac_hist_enable : 1; /* [00 : 00] */
unsigned int reg_aac_hist_area_mode : 1; /* [01 : 01] */
unsigned int reg_aac_hist_fourmode : 2; /* [03 : 02] */
unsigned int reg_aac_hist_single_color_bin : 2; /* [05 : 04] */
unsigned int reg_aac_hist_sqrtmode : 1; /* [06 : 06] */
unsigned int reg_aac_ae_cfa_tile_sqrtmode : 1; /* [07 : 07] */
unsigned int reg_aac_ae_cfa_tile_area : 20; /* [27 : 08] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be004;
typedef union
{
struct
{
unsigned int reg_aac_af_enable : 1; /* [00 : 00] */
unsigned int reserved_2 : 15; /* [15 : 1] */
unsigned int reg_aac_af_tile_num_col : 5; /* [20 : 16] */
unsigned int reserved_1 : 3; /* [23 : 21] */
unsigned int reg_aac_af_tile_num_row : 4; /* [27 : 24] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be005;
typedef union
{
struct
{
unsigned int reg_aac_af_tile_col_start : 12; /* [11 : 00] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_aac_af_tile_row_start : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be006;
typedef union
{
struct
{
unsigned int reg_aac_af_tile_width : 9; /* [08 : 00] */
unsigned int reserved_2 : 7; /* [15 : 9] */
unsigned int reg_aac_af_tile_height : 9; /* [24 : 16] */
unsigned int reserved_1 : 3; /* [27 : 25] */
unsigned int reg_aac_af_stat_location : 2; /* [29 : 28] */
unsigned int reserved_0 : 2; /* [31 : 30] */
} bits;
unsigned int u32;
} u_aac_be007;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_mode : 1; /* [00 : 00] */
unsigned int reg_aac_flt1_hor_stage_en_0 : 1; /* [01 : 01] */
unsigned int reg_aac_flt1_hor_stage_en_1 : 1; /* [02 : 02] */
unsigned int reg_aac_flt1_hor_stage_en_2 : 1; /* [03 : 03] */
unsigned int reg_aac_flt2_hor_mode : 1; /* [04 : 04] */
unsigned int reg_aac_flt2_hor_stage_en_0 : 1; /* [05 : 05] */
unsigned int reg_aac_flt2_hor_stage_en_1 : 1; /* [06 : 06] */
unsigned int reg_aac_flt2_hor_stage_en_2 : 1; /* [07 : 07] */
unsigned int reg_aac_af_hlt_thresh : 10; /* [17 : 08] */
unsigned int reserved_0 : 14; /* [31 : 18] */
} bits;
unsigned int u32;
} u_aac_be008;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_gain_0 : 10; /* [09 : 00] */
unsigned int reserved_1 : 6; /* [15 : 10] */
unsigned int reg_aac_flt1_hor_gain_1 : 10; /* [25 : 16] */
unsigned int reserved_0 : 6; /* [31 : 26] */
} bits;
unsigned int u32;
} u_aac_be009;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_gain_2 : 10; /* [09 : 00] */
unsigned int reserved_1 : 6; /* [15 : 10] */
unsigned int reg_aac_flt1_hor_gain_3 : 10; /* [25 : 16] */
unsigned int reserved_0 : 6; /* [31 : 26] */
} bits;
unsigned int u32;
} u_aac_be010;
typedef union
{
struct
{
unsigned int reg_aac_af_pre_filter_enable : 1; /* [00 : 00] */
unsigned int reserved_7 : 3; /* [03 : 01] */
unsigned int reg_aac_flt1_hor_forward_coeff_0 : 3; /* [06 : 04] */
unsigned int reserved_6 : 1; /* [07 : 07] */
unsigned int reg_aac_flt1_hor_forward_coeff_1 : 3; /* [10 : 08] */
unsigned int reserved_5 : 1; /* [11 : 11] */
unsigned int reg_aac_flt1_hor_forward_coeff_2 : 3; /* [14 : 12] */
unsigned int reserved_4 : 1; /* [15 : 15] */
unsigned int reg_aac_flt1_hor_forward_coeff_3 : 3; /* [18 : 16] */
unsigned int reserved_3 : 1; /* [19 : 19] */
unsigned int reg_aac_flt1_hor_forward_coeff_4 : 3; /* [22 : 20] */
unsigned int reserved_2 : 1; /* [23 : 23] */
unsigned int reg_aac_flt1_hor_forward_coeff_5 : 3; /* [26 : 24] */
unsigned int reserved_1 : 1; /* [27 : 27] */
unsigned int reg_aac_flt1_hor_forward_coeff_6 : 3; /* [30 : 28] */
unsigned int reserved_0 : 1; /* [31 : 31] */
} bits;
unsigned int u32;
} u_aac_be011;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_forward_coeff_7 : 3; /* [02 : 00] */
unsigned int reserved_1 : 1; /* [03 : 03] */
unsigned int reg_aac_flt1_hor_forward_coeff_8 : 3; /* [06 : 04] */
unsigned int reserved_0 : 25; /* [31 : 07] */
} bits;
unsigned int u32;
} u_aac_be012;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_backward_coeff_0 : 10; /* [09 : 00] */
unsigned int reserved_1 : 2; /* [11 : 10] */
unsigned int reg_aac_flt1_hor_backward_coeff_1 : 10; /* [21 : 12] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be013;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_backward_coeff_2 : 10; /* [09 : 00] */
unsigned int reserved_1 : 2; /* [11 : 10] */
unsigned int reg_aac_flt1_hor_backward_coeff_3 : 10; /* [21 : 12] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be014;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_backward_coeff_4 : 10; /* [09 : 00] */
unsigned int reserved_1 : 2; /* [11 : 10] */
unsigned int reg_aac_flt1_hor_backward_coeff_5 : 10; /* [21 : 12] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be015;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_coring_en : 1; /* [00 : 00] */
unsigned int reserved_0 : 3; /* [03 : 01] */
unsigned int reg_aac_flt1_hor_coring_th : 12; /* [15 : 04] */
unsigned int reg_aac_flt1_hor_coring_slp : 4; /* [19 : 16] */
unsigned int reg_aac_flt1_hor_coring_lmt : 12; /* [31 : 20] */
} bits;
unsigned int u32;
} u_aac_be016;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_bias_offset : 15; /* [14 : 00] */
unsigned int reserved_1 : 1; /* [15 : 15] */
unsigned int reg_aac_flt1_hor_thresh : 14; /* [29 : 16] */
unsigned int reserved_0 : 2; /* [31 : 30] */
} bits;
unsigned int u32;
} u_aac_be017;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_gain_0 : 10; /* [09 : 00] */
unsigned int reserved_1 : 6; /* [15 : 10] */
unsigned int reg_aac_flt2_hor_gain_1 : 10; /* [25 : 16] */
unsigned int reserved_0 : 6; /* [31 : 26] */
} bits;
unsigned int u32;
} u_aac_be018;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_gain_2 : 10; /* [09 : 00] */
unsigned int reserved_1 : 6; /* [15 : 10] */
unsigned int reg_aac_flt2_hor_gain_3 : 10; /* [25 : 16] */
unsigned int reserved_0 : 6; /* [31 : 26] */
} bits;
unsigned int u32;
} u_aac_be019;
typedef union
{
struct
{
unsigned int reserved_7 : 4; /* [03 : 00] */
unsigned int reg_aac_flt2_hor_forward_coeff_0 : 3; /* [06 : 04] */
unsigned int reserved_6 : 1; /* [07 : 07] */
unsigned int reg_aac_flt2_hor_forward_coeff_1 : 3; /* [10 : 08] */
unsigned int reserved_5 : 1; /* [11 : 11] */
unsigned int reg_aac_flt2_hor_forward_coeff_2 : 3; /* [14 : 12] */
unsigned int reserved_4 : 1; /* [15 : 15] */
unsigned int reg_aac_flt2_hor_forward_coeff_3 : 3; /* [18 : 16] */
unsigned int reserved_3 : 1; /* [19 : 19] */
unsigned int reg_aac_flt2_hor_forward_coeff_4 : 3; /* [22 : 20] */
unsigned int reserved_2 : 1; /* [23 : 23] */
unsigned int reg_aac_flt2_hor_forward_coeff_5 : 3; /* [26 : 24] */
unsigned int reserved_1 : 1; /* [27 : 27] */
unsigned int reg_aac_flt2_hor_forward_coeff_6 : 3; /* [30 : 28] */
unsigned int reserved_0 : 1; /* [31 : 31] */
} bits;
unsigned int u32;
} u_aac_be020;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_forward_coeff_7 : 3; /* [02 : 00] */
unsigned int reserved_1 : 1; /* [03 : 03] */
unsigned int reg_aac_flt2_hor_forward_coeff_8 : 3; /* [06 : 04] */
unsigned int reserved_0 : 25; /* [31 : 07] */
} bits;
unsigned int u32;
} u_aac_be021;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_backward_coeff_0 : 10; /* [09 : 00] */
unsigned int reserved_1 : 2; /* [11 : 10] */
unsigned int reg_aac_flt2_hor_backward_coeff_1 : 10; /* [21 : 12] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be022;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_backward_coeff_2 : 10; /* [09 : 00] */
unsigned int reserved_1 : 2; /* [11 : 10] */
unsigned int reg_aac_flt2_hor_backward_coeff_3 : 10; /* [21 : 12] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be023;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_backward_coeff_4 : 10; /* [09 : 00] */
unsigned int reserved_1 : 2; /* [11 : 10] */
unsigned int reg_aac_flt2_hor_backward_coeff_5 : 10; /* [21 : 12] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be024;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_coring_en : 1; /* [00 : 00] */
unsigned int reserved_0 : 3; /* [03 : 01] */
unsigned int reg_aac_flt2_hor_coring_th : 12; /* [15 : 04] */
unsigned int reg_aac_flt2_hor_coring_slp : 4; /* [19 : 16] */
unsigned int reg_aac_flt2_hor_coring_lmt : 12; /* [31 : 20] */
} bits;
unsigned int u32;
} u_aac_be025;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_bias_offset : 15; /* [14 : 00] */
unsigned int reserved_1 : 1; /* [15 : 15] */
unsigned int reg_aac_flt2_hor_thresh : 14; /* [29 : 16] */
unsigned int reserved_0 : 2; /* [31 : 30] */
} bits;
unsigned int u32;
} u_aac_be026;
typedef union
{
struct
{
unsigned int reg_aac_flt1_ver_gain_0 : 6; /* [05 : 00] */
unsigned int reserved_2 : 2; /* [07 : 06] */
unsigned int reg_aac_flt1_ver_gain_1 : 6; /* [13 : 08] */
unsigned int reserved_1 : 2; /* [15 : 14] */
unsigned int reg_aac_flt1_ver_gain_2 : 6; /* [21 : 16] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be027;
typedef union
{
struct
{
unsigned int reg_aac_flt2_ver_gain_0 : 6; /* [05 : 00] */
unsigned int reserved_2 : 2; /* [07 : 06] */
unsigned int reg_aac_flt2_ver_gain_1 : 6; /* [13 : 08] */
unsigned int reserved_1 : 2; /* [15 : 14] */
unsigned int reg_aac_flt2_ver_gain_2 : 6; /* [21 : 16] */
unsigned int reserved_0 : 10; /* [31 : 22] */
} bits;
unsigned int u32;
} u_aac_be028;
typedef union
{
struct
{
unsigned int reg_aac_flt1_ver_coring_en : 1; /* [00 : 00] */
unsigned int reserved_0 : 3; /* [03 : 01] */
unsigned int reg_aac_flt1_ver_coring_th : 12; /* [15 : 04] */
unsigned int reg_aac_flt1_ver_coring_slp : 4; /* [19 : 16] */
unsigned int reg_aac_flt1_ver_coring_lmt : 12; /* [31 : 20] */
} bits;
unsigned int u32;
} u_aac_be029;
typedef union
{
struct
{
unsigned int reg_aac_flt2_ver_coring_en : 1; /* [00 : 00] */
unsigned int reserved_0 : 3; /* [03 : 01] */
unsigned int reg_aac_flt2_ver_coring_th : 12; /* [15 : 04] */
unsigned int reg_aac_flt2_ver_coring_slp : 4; /* [19 : 16] */
unsigned int reg_aac_flt2_ver_coring_lmt : 12; /* [31 : 20] */
} bits;
unsigned int u32;
} u_aac_be030;
typedef union
{
struct
{
unsigned int reg_aac_fv1_hor_weight : 5; /* [04 : 00] */
unsigned int reserved_3 : 3; /* [7 : 5] */
unsigned int reg_aac_fv2_hor_weight : 5; /* [12 : 08] */
unsigned int reserved_2 : 3; /* [15 : 13] */
unsigned int reg_aac_fv1_ver_weight : 5; /* [20 : 16] */
unsigned int reserved_1 : 3; /* [23 : 21] */
unsigned int reg_aac_fv2_ver_weight : 5; /* [28 : 24] */
unsigned int reserved_0 : 3; /* [31 : 29] */
} bits;
unsigned int u32;
} u_aac_be031;
typedef union
{
struct
{
unsigned int reg_aac_flt1_ver_thresh : 14; /* [13 : 0] */
unsigned int reserved_1 : 2; /* [15 : 14] */
unsigned int reg_aac_flt2_ver_thresh : 14; /* [29 : 16] */
unsigned int reserved_0 : 2; /* [31 : 30] */
} bits;
unsigned int u32;
} u_aac_be032;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_enable : 1; /* [00 : 00] */
unsigned int reserved_3 : 3; /* [03 : 01] */
unsigned int reg_aac_awb_stat_location : 2; /* [05 : 04] */
unsigned int reserved_2 : 10; /* [15 : 06] */
unsigned int reg_aac_awb_cfa_tile_num_col : 5; /* [20 : 16] */
unsigned int reserved_1 : 3; /* [23 : 21] */
unsigned int reg_aac_awb_cfa_tile_num_row : 5; /* [28 : 24] */
unsigned int reserved_0 : 3; /* [31 : 29] */
} bits;
unsigned int u32;
} u_aac_be033;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_tile_col_start : 12; /* [11 : 00] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_aac_awb_cfa_tile_row_start : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be034;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_tile_min_thresh : 16; /* [15 : 00] */
unsigned int reg_aac_awb_cfa_tile_max_thresh : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_aac_be035;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_tile_width : 8; /* [07 : 00] */
unsigned int reg_aac_awb_cfa_tile_height : 8; /* [15 : 08] */
unsigned int reg_aac_awb_cfa_tile_num_all : 14; /* [29 : 16] */
unsigned int reserved_0 : 2; /* [31 : 30] */
} bits;
unsigned int u32;
} u_aac_be036;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_tile_max_r_g : 12; /* [11 : 00] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_aac_awb_cfa_tile_min_r_g : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be037;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_tile_max_b_g : 12; /* [11 : 00] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_aac_awb_cfa_tile_min_b_g : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be038;
typedef union
{
struct
{
unsigned int reg_aac_awb_cfa_pseudo_y_wgt_0 : 4; /* [03 : 00] */
unsigned int reserved_3 : 4; /* [7 : 4] */
unsigned int reg_aac_awb_cfa_pseudo_y_wgt_1 : 4; /* [11 : 08] */
unsigned int reserved_2 : 4; /* [15 : 12] */
unsigned int reg_aac_awb_cfa_pseudo_y_wgt_2 : 4; /* [19 : 16] */
unsigned int reserved_1 : 4; /* [23 : 20] */
unsigned int reg_aac_awb_cfa_pseudo_y_wgt_3 : 4; /* [27 : 24] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be039;
typedef union
{
struct
{
unsigned int reg_aac_ae_cfa_tile_domain_wt_0 : 4; /* [3 : 0] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_1 : 4; /* [7 : 4] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_2 : 4; /* [11 : 8] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_3 : 4; /* [15 : 12] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_4 : 4; /* [19 : 16] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_5 : 4; /* [23 : 20] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_6 : 4; /* [27 : 24] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_7 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_ae_cfa_tile_domain_wt;
typedef union
{
struct
{
unsigned int reg_aac_ae_cfa_tile_domain_wt_248 : 4; /* [3 : 0] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_249 : 4; /* [7 : 4] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_250 : 4; /* [11 : 8] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_251 : 4; /* [15 : 12] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_252 : 4; /* [19 : 16] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_253 : 4; /* [23 : 20] */
unsigned int reg_aac_ae_cfa_tile_domain_wt_254 : 4; /* [27 : 24] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_ae_cfa_tile_domain_wt_254;
typedef union
{
struct
{
unsigned int reg_aac_af_tone_curve_lut_0 : 10; /* [09 : 00] */
unsigned int reserved_1 : 6; /* [15 : 10] */
unsigned int reg_aac_af_tone_curve_lut_1 : 10; /* [25 : 16] */
unsigned int reserved_0 : 6; /* [31 : 26] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_af_tone_curve_lut;
typedef union
{
struct
{
unsigned int reg_aac_flt1_hor_gain_curve_0 : 8; /* [07 : 00] */
unsigned int reg_aac_flt1_hor_gain_curve_1 : 8; /* [15 : 08] */
unsigned int reg_aac_flt1_hor_gain_curve_2 : 8; /* [23 : 16] */
unsigned int reg_aac_flt1_hor_gain_curve_3 : 8; /* [31 : 24] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_flt1_hor_gain_curve;
typedef union
{
struct
{
unsigned int reg_aac_flt1_ver_gain_curve_0 : 8; /* [07 : 00] */
unsigned int reg_aac_flt1_ver_gain_curve_1 : 8; /* [15 : 08] */
unsigned int reg_aac_flt1_ver_gain_curve_2 : 8; /* [23 : 16] */
unsigned int reg_aac_flt1_ver_gain_curve_3 : 8; /* [31 : 24] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_flt1_ver_gain_curve;
typedef union
{
struct
{
unsigned int reg_aac_flt2_hor_gain_curve_0 : 8; /* [07 : 00] */
unsigned int reg_aac_flt2_hor_gain_curve_1 : 8; /* [15 : 08] */
unsigned int reg_aac_flt2_hor_gain_curve_2 : 8; /* [23 : 16] */
unsigned int reg_aac_flt2_hor_gain_curve_3 : 8; /* [31 : 24] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_flt2_hor_gain_curve;
typedef union
{
struct
{
unsigned int reg_aac_flt2_ver_gain_curve_0 : 8; /* [07 : 00] */
unsigned int reg_aac_flt2_ver_gain_curve_1 : 8; /* [15 : 08] */
unsigned int reg_aac_flt2_ver_gain_curve_2 : 8; /* [23 : 16] */
unsigned int reg_aac_flt2_ver_gain_curve_3 : 8; /* [31 : 24] */
} bits;
unsigned int u32;
} u_aac_be_reg_aac_flt2_ver_gain_curve;
typedef union
{
struct
{
unsigned int reg_blc2_enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 31; /* [31 : 1] */
} bits;
unsigned int u32;
} u_blc2000;
typedef union
{
struct
{
unsigned int reg_blc2_global_offset_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_blc2_global_offset_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_blc2001;
typedef union
{
struct
{
unsigned int reg_blc2_global_offset_2 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_blc2_global_offset_3 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_blc2002;
typedef union
{
struct
{
unsigned int reg_dgn2_enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 15; /* [15 : 1] */
unsigned int reg_dgn2_multiplier_single : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_dgn2_hreg000;
typedef union
{
struct
{
unsigned int reg_dgn3_enable : 1; /* [0 : 0] */
unsigned int reserved_0 : 31; /* [31 : 1] */
} bits;
unsigned int u32;
} u_dgn3_hreg000;
typedef union
{
struct
{
unsigned int reg_dgn3_multiplier_4ch_0 : 12; /* [11 : 0] */
unsigned int reserved_1 : 4; /* [15 : 12] */
unsigned int reg_dgn3_multiplier_4ch_1 : 12; /* [27 : 16] */
unsigned int reserved_0 : 4; /* [31 : 28] */
} bits;
unsigned int u32;
} u_dgn3_reg_dgn3_multiplier_4ch;
typedef union
{
struct
{
unsigned int reg_cds422_enable : 1; /* [0 : 0] */
unsigned int reserved_1 : 1; /* [1 : 1] */
unsigned int reg_cds422_param_0 : 7; /* [8 : 2] */
unsigned int reg_cds422_param_1 : 7; /* [15 : 9] */
unsigned int reserved_0 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_cds_h000;
typedef union
{
struct
{
unsigned int reg_cds_enable : 1; /* [0 : 0] */
unsigned int reg_cds_type : 1; /* [1 : 1] */
unsigned int reg_cds_param_0 : 7; /* [8 : 2] */
unsigned int reg_cds_param_1 : 7; /* [15 : 9] */
unsigned int reserved_0 : 16; /* [31 : 16] */
} bits;
unsigned int u32;
} u_cds_v000;
typedef struct {
volatile u_blc1_ch0_blc1000 blc1_ch0_blc1000 ;/*0x420*/
volatile u_blc1_ch0_blc1001 blc1_ch0_blc1001 ;/*0x424*/
volatile u_blc1_ch0_blc1002 blc1_ch0_blc1002 ;/*0x428*/
} u_blc1_ch0_regs;
#define ISP_BE_BLC1_CH0_NOR_REGS_NUM 3
typedef struct {
volatile u_blc1_ch1_blc1000 blc1_ch1_blc1000 ;/*0x440*/
volatile u_blc1_ch1_blc1001 blc1_ch1_blc1001 ;/*0x444*/
volatile u_blc1_ch1_blc1002 blc1_ch1_blc1002 ;/*0x448*/
} u_blc1_ch1_regs;
#define ISP_BE_BLC1_CH1_NOR_REGS_NUM 3
typedef struct {
volatile u_dgn1_ch0_hreg000 dgn1_ch0_hreg000 ;/*0x460*/
volatile u_dgn1_ch0_dgn1001 dgn1_ch0_digital_gain[2] ;/*0x464*/
volatile u_dgn1_ch0_dgn1003 dgn1_ch0_blc_in[2] ;/*0x46c*/
volatile u_dgn1_ch0_dgn1005 dgn1_ch0_blc_out[2] ;/*0x474*/
} u_dgn1_ch0_regs;
#define ISP_BE_DGN1_CH0_NOR_REGS_NUM 7
typedef struct {
volatile u_dgn1_ch1_hreg000 dgn1_ch1_hreg000 ;/*0x480*/
volatile u_dgn1_ch1_dgn1001 dgn1_ch1_digital_gain[2] ;/*0x484*/
volatile u_dgn1_ch1_dgn1003 dgn1_ch1_blc_in[2] ;/*0x48c*/
volatile u_dgn1_ch1_dgn1005 dgn1_ch1_blc_out[2] ;/*0x494*/
} u_dgn1_ch1_regs;
#define ISP_BE_DGN1_CH1_NOR_REGS_NUM 7
typedef struct {
volatile u_aac_be000 aac_be000 ;/*0x4c0*/
volatile u_aac_be001 aac_be001 ;/*0x4c4*/
volatile u_aac_be002 aac_be002 ;/*0x4c8*/
volatile u_aac_be003 aac_be003 ;/*0x4cc*/
volatile u_aac_be004 aac_be004 ;/*0x4d0*/
volatile u_aac_be005 aac_be005 ;/*0x4d4*/
// volatile u_aac_be006 aac_be006 ;/*0x4d8*/
// volatile u_aac_be007 aac_be007 ;/*0x4dc*/
// volatile u_aac_be008 aac_be008 ;/*0x4e0*/
// volatile u_aac_be009 flt1_hor_gain[2] ;/*0x4e4*/
// volatile u_aac_be011 aac_be011 ;/*0x4ec*/
// volatile u_aac_be012 aac_be012 ;/*0x4f0*/
// volatile u_aac_be013 flt1_hor_backward_coeff[3] ;/*0x4f4*/
// volatile u_aac_be016 aac_be016 ;/*0x500*/
// volatile u_aac_be017 aac_be017 ;/*0x504*/
// volatile u_aac_be018 flt2_hor_gain[2] ;/*0x508*/
// volatile u_aac_be020 aac_be020 ;/*0x510*/
// volatile u_aac_be021 aac_be021 ;/*0x514*/
// volatile u_aac_be022 flt2_hor_backward_coeff[3] ;/*0x518*/
// volatile u_aac_be025 aac_be025 ;/*0x524*/
// volatile u_aac_be026 aac_be026 ;/*0x528*/
// volatile u_aac_be027 aac_be027 ;/*0x52c*/
// volatile u_aac_be028 aac_be028 ;/*0x530*/
// volatile u_aac_be029 aac_be029 ;/*0x534*/
// volatile u_aac_be030 aac_be030 ;/*0x538*/
// volatile u_aac_be031 aac_be031 ;/*0x53c*/
// volatile u_aac_be032 aac_be032 ;/*0x540*/
volatile u_aac_be033 aac_be033 ;/*0x544*/
volatile u_aac_be034 aac_be034 ;/*0x548*/
volatile u_aac_be035 aac_be035 ;/*0x54c*/
volatile u_aac_be036 aac_be036 ;/*0x550*/
volatile u_aac_be037 aac_be037 ;/*0x554*/
volatile u_aac_be038 aac_be038 ;/*0x558*/
volatile u_aac_be039 aac_be039 ;/*0x55c*/
volatile u_aac_be_reg_aac_ae_cfa_tile_domain_wt
aac_be_reg_aac_ae_cfa_tile_domain_wt[32];/*0x560*/
// volatile u_aac_be_reg_aac_af_tone_curve_lut aac_be_reg_aac_af_tone_curve_lut[16];/*0x5e0*/
// volatile u_aac_be_reg_aac_flt1_hor_gain_curve aac_be_reg_aac_flt1_hor_gain_curve[4];/*0x620*/
// volatile u_aac_be_reg_aac_flt1_ver_gain_curve aac_be_reg_aac_flt1_ver_gain_curve[4];/*0x630*/
// volatile u_aac_be_reg_aac_flt2_hor_gain_curve aac_be_reg_aac_flt2_hor_gain_curve[4];/*0x640*/
// volatile u_aac_be_reg_aac_flt2_ver_gain_curve aac_be_reg_aac_flt2_ver_gain_curve[4];/*0x650*/
} u_aac_be_regs;
#define ISP_BE_AAC_BE_NOR_REGS_NUM 40
#define ISP_BE_AAC_LUT_REGS_NUM ISP_BE_REGS_AAC_AE_WEIGHT_LUT_LENGTH
typedef struct {
volatile u_blc2000 blc2000 ;/*0x1420*/
volatile u_blc2001 blc2_global_offset[2] ;/*0x1424*/
} u_blc2_regs;
#define ISP_BE_BLC2_NOR_REGS_NUM 3
typedef struct {
volatile u_dgn2_hreg000 dgn2_hreg000 ;/*0x1460*/
} u_dgn2_regs;
#define ISP_BE_DGN2_NOR_REGS_NUM 1
typedef struct {
volatile u_dgn3_hreg000 dgn3_hreg000 ;/*0x1480*/
volatile u_dgn3_reg_dgn3_multiplier_4ch dgn3_multiplier_4ch[2] ;/*0x1484*/
} u_dgn3_regs;
#define ISP_BE_DGN3_NOR_REGS_NUM 3
typedef struct {
volatile u_cds_h000 cds_h000 ;/*0x2040*/
} u_cds_h_regs;
#define ISP_BE_CDS_H_NOR_REGS_NUM 1
typedef struct {
volatile u_cds_v000 cds_v000 ;/*0x2320*/
} u_cds_v_regs;
#define ISP_BE_CDS_V_NOR_REGS_NUM 1
typedef struct {
u_blc1_ch0_regs blc1_ch0;
u_blc1_ch1_regs blc1_ch1;
u_dgn1_ch0_regs dgn1_ch0;
u_dgn1_ch1_regs dgn1_ch1;
u_aac_be_regs aac;
u_blc2_regs blc2;
u_dgn2_regs dgn2;
u_dgn3_regs dgn3;
u_cds_h_regs cds_h;
u_cds_v_regs cds_v;
} xmedia_isp_regs;
#define ISP_BE_BASE_ADDR 0x11200000
#define ISP_BE_PUBLIC_BASE_ADDR (ISP_BE_BASE_ADDR + 0x0)
#define ISP_BE_CTRL_BASE_ADDR (ISP_BE_BASE_ADDR + 0x120)
#define ISP_BE_COMM_BASE_ADDR (ISP_BE_BASE_ADDR + 0x160)
#define ISP_BE_FPN_BASE_ADDR (ISP_BE_BASE_ADDR + 0x400)
#define ISP_BE_BLC1_CH0_BASE_ADDR (ISP_BE_BASE_ADDR + 0x420)
#define ISP_BE_BLC1_CH1_BASE_ADDR (ISP_BE_BASE_ADDR + 0x440)
#define ISP_BE_DGN1_CH0_BASE_ADDR (ISP_BE_BASE_ADDR + 0x460)
#define ISP_BE_DGN1_CH1_BASE_ADDR (ISP_BE_BASE_ADDR + 0x480)
#define ISP_BE_BPC_CH0_BASE_ADDR (ISP_BE_BASE_ADDR + 0x4a0)
#define ISP_BE_AAC_BE_BASE_ADDR (ISP_BE_BASE_ADDR + 0x4c0)
#define ISP_BE_HDR_BASE_ADDR (ISP_BE_BASE_ADDR + 0x660)
#define ISP_BE_EXPANDER_BASE_ADDR (ISP_BE_BASE_ADDR + 0x6c0)
#define ISP_BE_COMP_BASE_ADDR (ISP_BE_BASE_ADDR + 0x900)
#define ISP_BE_NLM_BASE_ADDR (ISP_BE_BASE_ADDR + 0x920)
#define ISP_BE_DCMP_BASE_ADDR (ISP_BE_BASE_ADDR + 0x13e0)
#define ISP_BE_BLC2_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1400)
#define ISP_BE_LSC_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1420)
#define ISP_BE_DGN2_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1440)
#define ISP_BE_DGN3_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1460)
#define ISP_BE_DRC_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1480)
#define ISP_BE_DMS_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1940)
#define ISP_BE_CLC_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1980)
#define ISP_BE_DH_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1c60)
#define ISP_BE_RYC_BASE_ADDR (ISP_BE_BASE_ADDR + 0x1fc0)
#define ISP_BE_CUS_V_BASE_ADDR (ISP_BE_BASE_ADDR + 0x2000)
#define ISP_BE_CDS_H_BASE_ADDR (ISP_BE_BASE_ADDR + 0x2020)
#define ISP_BE_LCE_BASE_ADDR (ISP_BE_BASE_ADDR + 0x2040)
#define ISP_BE_CDS_V_BASE_ADDR (ISP_BE_BASE_ADDR + 0x22e0)
#define ISP_BE_STNR_BASE_ADDR (ISP_BE_BASE_ADDR + 0x2300)
#define ISP_BE_CNR_BASE_ADDR (ISP_BE_BASE_ADDR + 0x24e0)
#define ISP_BE_LDC_H_BASE_ADDR (ISP_BE_BASE_ADDR + 0x2520)
#define ISP_BE_VIPROC_REF_ADDR (ISP_BE_BASE_ADDR + 0x25e0)
#define ISP_CRG_SENSOR_CLK_BASE_ADDR 0x120100F0
#define ISP_RGB_CHN_NUM 3
typedef struct {
xmedia_u32 zone_valid_count; // 有效个数点
xmedia_u32 rgb_avg_value[ISP_RGB_CHN_NUM];
} isp_be_awb_zone;
typedef struct {
xmedia_u32 rgb_avg_value[ISP_RGB_CHN_NUM];
} isp_be_awb_global;
#define ISP_BAYER_CHN_NUM 4
#define ISP_BE_STATISTICS_HIST_NUM 1024
typedef struct {
xmedia_u32 rggb_avg_value[ISP_BAYER_CHN_NUM];
} isp_be_ae_zone;
typedef struct {
xmedia_u32 rggb_avg_value[ISP_BAYER_CHN_NUM];
} isp_be_ae_global;
typedef struct {
xmedia_u32 hist_value[ISP_BE_STATISTICS_HIST_NUM];
} isp_be_ae_hist;
typedef struct {
xmedia_u32 isp_dgain0[XMEDIA_ISP_WDR_CHN_MAX_NUM][XMEDIA_ISP_BAYER_PATTERN_NUM];
xmedia_u32 isp_dgain1[XMEDIA_ISP_WDR_CHN_MAX_NUM][XMEDIA_ISP_BAYER_PATTERN_NUM];
xmedia_u32 isp_dgain2;
xmedia_u32 exp_ratio[XMEDIA_ISP_WDR_EXP_RATIO_MAX_NUM];
xmedia_u16 gain_mul[XMEDIA_ISP_WDR_CHN_MAX_NUM]
[XMEDIA_ISP_BAYER_PATTERN_NUM]; // 除此参数区分长短帧,其余的所有通道使用一套配置
} isp_ae_sync_cfg;
typedef struct {
xmedia_bool valid;
xmedia_sensor_regs_info sns;
isp_ae_sync_cfg ae;
} isp_sync_cfg;
#define ISP_STATISTICS_BUFFER_NUM 2
#define ISP_SYNC_BUFF_MAX_NUM 6
#define ISP_BE_AAC_AE_ZONE_COL_MAX_NUM 17
#define ISP_BE_REGS_AAC_AE_WEIGHT_LUT_LENGTH 32
typedef struct {
xmedia_u32 frame_cnt;
xmedia_u16 blc[XMEDIA_SENSOR_BAYER_CHN_NUM];
xmedia_u8 sync_index;
isp_sync_cfg sync_buff[ISP_SYNC_BUFF_MAX_NUM];
isp_sync_cfg *sync_node[ISP_SYNC_BUFF_MAX_NUM];
// 以下统计信息buffer都是按照实际分块数来分配的内存,并非是按照最大分块数分配的内存,需要小心使用,谨防越界
xmedia_u8 ae_zone_row_num;
xmedia_u8 ae_zone_col_num;
xmedia_u8 awb_zone_row_num;
xmedia_u8 awb_zone_col_num;
xmedia_u8 awb_zone_width;
xmedia_u8 awb_zone_height;
/*
* ping-pong buffer index 示意
* ----------------------------------------------------
* |init |fs |early |fe |fs |early |fe |fs |early |fe |
* ----------------------------------------------------
* w |---> 0 <--| |---> 1 <--| |---> 0 <--|
* r 0 1 0
* c 0 1 0 1
*
* w 表示硬件正在使用的buffer索引
* r 表示软件格式化统计信息正在使用的buffer索引
* c 表示软件配置到寄存器的buffer索引
*/
// 硬件输出统计信息使用的ping-pong buffer
xmedia_u8 read_index;
xmedia_u64 aac_statistics_buffer[ISP_STATISTICS_BUFFER_NUM]; // ping-pong
isp_be_awb_zone *awb_zone[ISP_STATISTICS_BUFFER_NUM];
isp_be_awb_global *awb_global[ISP_STATISTICS_BUFFER_NUM];
isp_be_ae_zone *ae_zone[ISP_STATISTICS_BUFFER_NUM];
isp_be_ae_global *ae_global[ISP_STATISTICS_BUFFER_NUM];
isp_be_ae_hist *ae_hist[ISP_STATISTICS_BUFFER_NUM];
// 软件使用的统计信息buffer,主要是给ae和awb库用
xmedia_u32 *awb_zone_head_addr;
xmedia_u32 *awb_zone_avg_r;
xmedia_u32 *awb_zone_avg_g;
xmedia_u32 *awb_zone_avg_b;
xmedia_u32 *awb_zone_valid_count;
xmedia_isp_ae_stat_global_avg ae_global_avg;
xmedia_isp_ae_stat_hist ae_format_hist;
} xmedia_isp_context;
#define ISP_PRINT(fmt, ...) printf("[ISP][Func]:%s [Line]:%d [Info]: " fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define ISP_DGAIN_PRECISION 256
#define ISP_DIV_0_TO_1(a) ((a) == 0 ? 1 : (a))
#define ISP_MAX2(x, y) ((x) > (y) ? (x) : (y))
#define ISP_ABS(x) ((x) >= 0 ? (x) : (-(x)))
static xmedia_isp_config g_isp_cfg[ISP_PIPE_MAX_NUM];
static xmedia_isp_regs g_isp_reg[ISP_PIPE_MAX_NUM];
static xmedia_isp_context g_isp_ctx[ISP_PIPE_MAX_NUM];
static const xmedia_u8 g_be_ae_default_zone_weight[XMEDIA_ISP_AE_ZONE_ROW_MAX_NUM][XMEDIA_ISP_AE_ZONE_COL_MAX_NUM] = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
};
#define DMA_ALIGN 32
#define ISP_ALIGN_UP(x, a) ((((x) + ((a)-1)) / a) * a)
STAGE1_FUNC xmedia_void delay(xmedia_u32 us)
{
xmedia_u32 i, j;
for (i = us; i > 0; i--) {
for (j = 100; j > 0; j--) {
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
}
STAGE1_FUNC static xmedia_u32 isp_read_reg(xmedia_u32 addr)
{
return *((xmedia_u32 *)addr);
}
STAGE1_FUNC static xmedia_void isp_write_reg(xmedia_u32 addr, xmedia_u32 value)
{
*((xmedia_u32 *)addr) = value;
}
STAGE1_FUNC xmedia_s32 hal_sensor_reset(xmedia_u32 ch, xmedia_bool enable)
{
xmedia_u32 value;
value = isp_read_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR);
value &= ~(0x1 << 1 << (ch * 8)); // clear reset bit
value |= (enable << 1 << (ch * 8));
isp_write_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR, value);
return XMEDIA_SUCCESS;
}
STAGE1_FUNC xmedia_s32 hal_sensor_read_mclk(xmedia_u32 ch, xmedia_u32 *clk)
{
xmedia_u32 value;
xmedia_u32 clk_value;
value = isp_read_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR);
if (ch == 0) {
value = (value & 0x3c) >> 2;
} else if (ch == 1) {
value = (value & 0x3c00) >> 10;
} else if (ch == 2) {
value = (value & 0x3c0000) >> 18;
} else if (ch == 3) {
value = (value & 0x3c000000) >> 26;
} else {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if (value == 0) {
clk_value = 74250000;
} else if (value == 1) {
clk_value = 72000000;
} else if (value == 2) {
clk_value = 54000000;
} else if (value == 3) {
clk_value = 50000000;
} else if (value == 4) {
clk_value = 37125000;
} else if (value == 5) {
clk_value = 36000000;
} else if (value == 6) {
clk_value = 27000000;
} else if (value == 7) {
clk_value = 25000000;
} else if (value == 8) {
clk_value = 24000000;
} else if (value == 9) {
clk_value = 20000000;
} else if (value == 10) {
clk_value = 18000000;
} else if (value == 11) {
clk_value = 12000000;
} else {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
*clk = clk_value;
return XMEDIA_SUCCESS;
}
STAGE1_FUNC xmedia_s32 hal_sensor_set_mclk(xmedia_u32 ch, xmedia_u32 clk)
{
xmedia_u32 value;
xmedia_u32 clk_value;
value = isp_read_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR);
value &= ~(0x1 << (ch * 8)); // clear clk_en bit
isp_write_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR, value);
value = isp_read_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR);
value &= ~(0xF << 2 << (ch * 8)); // clear clk_sel bit
if (clk == 74250000) {
clk_value = 0;
} else if (clk == 72000000) {
clk_value = 1;
} else if (clk == 54000000) {
clk_value = 2;
} else if (clk == 50000000) {
clk_value = 3;
} else if (clk == 37125000) {
clk_value = 4;
} else if (clk == 36000000) {
clk_value = 5;
} else if (clk == 27000000) {
clk_value = 6;
} else if (clk == 25000000) {
clk_value = 7;
} else if (clk == 24000000) {
clk_value = 8;
} else if (clk == 20000000) {
clk_value = 9;
} else if (clk == 18000000) {
clk_value = 10;
} else if (clk == 12000000) {
clk_value = 11;
} else {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
value |= (clk_value << 2 << (ch * 8));
isp_write_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR, value);
value = isp_read_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR);
value &= ~(0x1 << (ch * 8)); // clear clk_en bit
value |= (0x1 << (ch * 8)); // set clk_en bit
isp_write_reg(ISP_CRG_SENSOR_CLK_BASE_ADDR, value);
return XMEDIA_SUCCESS;
}
static xmedia_void isp_reg_init_aac(xmedia_u32 pipe)
{
xmedia_s32 i, row, col;
xmedia_u16 zone_width, zone_height, zone_col_start, zone_row_start;
xmedia_u32 tile_num;
// aac
// 分块数按照分块最大宽高计算,向上取整后再计算分块宽高,分块宽高需要为偶数,起始点也要为偶数,分块区域需要居中
zone_width = ((g_isp_cfg[pipe].size.width / g_isp_ctx[pipe].ae_zone_col_num) >> 1 << 1);
zone_height = ((g_isp_cfg[pipe].size.height / g_isp_ctx[pipe].ae_zone_row_num) >> 1 << 1);
zone_col_start = (g_isp_cfg[pipe].size.width - zone_width * g_isp_ctx[pipe].ae_zone_col_num) >> 2 << 1;
zone_row_start = (g_isp_cfg[pipe].size.height - zone_height * g_isp_ctx[pipe].ae_zone_row_num) >> 2 << 1;
// 1. ae只需要全局均值,不需要分块均值和直方图统计信息
// 2. 全局均值和分块均值是由同一个寄存器控制开关,所以分块均值相关的寄存器也需要配置
// 3. 全局均值的统计范围是由分块均值统计范围决定,所以分块均值统计范围需要尽量覆盖全图
g_isp_reg[pipe].aac.aac_be000.bits.reg_aac_initial_sram_enable = 1;
g_isp_reg[pipe].aac.aac_be000.bits.reg_aac_ae_cfa_enable = 1;
g_isp_reg[pipe].aac.aac_be000.bits.reg_aac_ae_cfa_tile_num_col = g_isp_ctx[pipe].ae_zone_col_num - 1;
g_isp_reg[pipe].aac.aac_be000.bits.reg_aac_ae_cfa_tile_num_row = g_isp_ctx[pipe].ae_zone_row_num - 1;
g_isp_reg[pipe].aac.aac_be001.bits.reg_aac_ae_cfa_tile_col_start = zone_col_start;
g_isp_reg[pipe].aac.aac_be001.bits.reg_aac_ae_cfa_tile_row_start = zone_row_start;
tile_num = g_isp_ctx[pipe].ae_zone_col_num * g_isp_ctx[pipe].ae_zone_row_num;
g_isp_reg[pipe].aac.aac_be002.bits.reg_aac_ae_cfa_tile_num_all = (256 * 16 * 8 + (tile_num >> 1)) / tile_num;
g_isp_reg[pipe].aac.aac_be003.bits.reg_aac_ae_cfa_tile_width = zone_width - 1;
g_isp_reg[pipe].aac.aac_be003.bits.reg_aac_ae_cfa_tile_height = zone_height - 1;
g_isp_reg[pipe].aac.aac_be003.bits.reg_aac_ae_stat_location = XMEDIA_ISP_AE_SWITCH_AFTER_DGN2;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_hist_enable = 1;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_hist_area_mode = 1;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_hist_fourmode = 1;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_hist_single_color_bin = 1;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_hist_sqrtmode = 0;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_ae_cfa_tile_sqrtmode = 0;
g_isp_reg[pipe].aac.aac_be004.bits.reg_aac_ae_cfa_tile_area = 512 * 512 * 8 / (zone_width * zone_height);
g_isp_reg[pipe].aac.aac_be005.bits.reg_aac_af_enable = 0;
// 分块数按照分块最大宽高计算,向上取整后再计算分块宽高,分块宽高需要为偶数,起始点也要为偶数,分块区域需要居中
zone_width = (g_isp_cfg[pipe].size.width / g_isp_ctx[pipe].awb_zone_col_num) >> 1 << 1;
zone_height = (g_isp_cfg[pipe].size.height / g_isp_ctx[pipe].awb_zone_row_num) >> 1 << 1;
zone_col_start = (g_isp_cfg[pipe].size.width - zone_width * g_isp_ctx[pipe].awb_zone_col_num) >> 2 << 1;
zone_row_start = (g_isp_cfg[pipe].size.height - zone_height * g_isp_ctx[pipe].awb_zone_row_num) >> 2 << 1;
g_isp_ctx[pipe].awb_zone_width = zone_width;
g_isp_ctx[pipe].awb_zone_height = zone_height;
g_isp_reg[pipe].aac.aac_be033.bits.reg_aac_awb_cfa_enable = 1;
g_isp_reg[pipe].aac.aac_be033.bits.reg_aac_awb_stat_location = XMEDIA_ISP_AWB_SWITCH_AFTER_DG2;
g_isp_reg[pipe].aac.aac_be033.bits.reg_aac_awb_cfa_tile_num_col = g_isp_ctx[pipe].awb_zone_col_num - 1;
g_isp_reg[pipe].aac.aac_be033.bits.reg_aac_awb_cfa_tile_num_row = g_isp_ctx[pipe].awb_zone_row_num - 1;
g_isp_reg[pipe].aac.aac_be034.bits.reg_aac_awb_cfa_tile_col_start = zone_col_start;
g_isp_reg[pipe].aac.aac_be034.bits.reg_aac_awb_cfa_tile_row_start = zone_row_start;
g_isp_reg[pipe].aac.aac_be035.bits.reg_aac_awb_cfa_tile_min_thresh = 0;
g_isp_reg[pipe].aac.aac_be035.bits.reg_aac_awb_cfa_tile_max_thresh = 65535;
g_isp_reg[pipe].aac.aac_be036.bits.reg_aac_awb_cfa_tile_width = zone_width - 1;
g_isp_reg[pipe].aac.aac_be036.bits.reg_aac_awb_cfa_tile_height = zone_height - 1;
g_isp_reg[pipe].aac.aac_be036.bits.reg_aac_awb_cfa_tile_num_all =
1024 * 8 / (g_isp_ctx[pipe].awb_zone_col_num * g_isp_ctx[pipe].awb_zone_row_num);
g_isp_reg[pipe].aac.aac_be037.bits.reg_aac_awb_cfa_tile_max_r_g = 2047;
g_isp_reg[pipe].aac.aac_be037.bits.reg_aac_awb_cfa_tile_min_r_g = 0;
g_isp_reg[pipe].aac.aac_be038.bits.reg_aac_awb_cfa_tile_max_b_g = 2047;
g_isp_reg[pipe].aac.aac_be038.bits.reg_aac_awb_cfa_tile_min_b_g = 0;
g_isp_reg[pipe].aac.aac_be039.bits.reg_aac_awb_cfa_pseudo_y_wgt_0 = 4;
g_isp_reg[pipe].aac.aac_be039.bits.reg_aac_awb_cfa_pseudo_y_wgt_1 = 5;
g_isp_reg[pipe].aac.aac_be039.bits.reg_aac_awb_cfa_pseudo_y_wgt_2 = 2;
g_isp_reg[pipe].aac.aac_be039.bits.reg_aac_awb_cfa_pseudo_y_wgt_3 = 5;
for (i = 0; i < ISP_BE_REGS_AAC_AE_WEIGHT_LUT_LENGTH; i++) {
row = i * 8 / ISP_BE_AAC_AE_ZONE_COL_MAX_NUM;
col = i * 8 % ISP_BE_AAC_AE_ZONE_COL_MAX_NUM;
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_0 =
g_be_ae_default_zone_weight[row][col];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_1 =
g_be_ae_default_zone_weight[row][col + 1];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_2 =
g_be_ae_default_zone_weight[row][col + 2];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_3 =
g_be_ae_default_zone_weight[row][col + 3];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_4 =
g_be_ae_default_zone_weight[row][col + 4];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_5 =
g_be_ae_default_zone_weight[row][col + 5];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_6 =
g_be_ae_default_zone_weight[row][col + 6];
g_isp_reg[pipe].aac.aac_be_reg_aac_ae_cfa_tile_domain_wt[i].bits.reg_aac_ae_cfa_tile_domain_wt_7 =
g_be_ae_default_zone_weight[row][col + 7];
}
}
static xmedia_void isp_reg_init_blc(xmedia_u32 pipe)
{
g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1000.bits.reg_blc1_enable = 0;
g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1001.bits.reg_blc1_global_offset_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1001.bits.reg_blc1_global_offset_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1002.bits.reg_blc1_global_offset_2 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1002.bits.reg_blc1_global_offset_3 = g_isp_ctx[pipe].blc[3];
g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1000.bits.reg_blc1_enable = 0;
g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1001.bits.reg_blc1_global_offset_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1001.bits.reg_blc1_global_offset_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1002.bits.reg_blc1_global_offset_2 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1002.bits.reg_blc1_global_offset_3 = g_isp_ctx[pipe].blc[3];
g_isp_reg[pipe].blc2.blc2000.bits.reg_blc2_enable = 1;
g_isp_reg[pipe].blc2.blc2_global_offset[0].bits.reg_blc2_global_offset_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].blc2.blc2_global_offset[0].bits.reg_blc2_global_offset_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].blc2.blc2_global_offset[1].bits.reg_blc2_global_offset_0 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].blc2.blc2_global_offset[1].bits.reg_blc2_global_offset_1 = g_isp_ctx[pipe].blc[3];
}
static xmedia_void isp_reg_init_cds(xmedia_u32 pipe)
{
g_isp_reg[pipe].cds_h.cds_h000.bits.reg_cds422_enable = 1;
g_isp_reg[pipe].cds_h.cds_h000.bits.reg_cds422_param_0 = 32;
g_isp_reg[pipe].cds_h.cds_h000.bits.reg_cds422_param_1 = 32;
g_isp_reg[pipe].cds_v.cds_v000.bits.reg_cds_enable = 1;
g_isp_reg[pipe].cds_v.cds_v000.bits.reg_cds_param_0 = 32;
g_isp_reg[pipe].cds_v.cds_v000.bits.reg_cds_param_1 = 32;
}
static xmedia_void isp_reg_init_dgn(xmedia_u32 pipe)
{
// dgn
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_hreg000.bits.enable = 1;
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[0].bits.digital_gain_0 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[0].bits.digital_gain_1 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[1].bits.digital_gain_0 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[1].bits.digital_gain_1 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[0].bits.blc_in_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[0].bits.blc_in_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[1].bits.blc_in_0 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[1].bits.blc_in_1 = g_isp_ctx[pipe].blc[3];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[0].bits.blc_out_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[0].bits.blc_out_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[1].bits.blc_out_0 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[1].bits.blc_out_1 = g_isp_ctx[pipe].blc[3];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_hreg000.bits.enable = 1;
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[0].bits.digital_gain_0 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[0].bits.digital_gain_1 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[1].bits.digital_gain_0 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[1].bits.digital_gain_1 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[0].bits.blc_in_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[0].bits.blc_in_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[1].bits.blc_in_0 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[1].bits.blc_in_1 = g_isp_ctx[pipe].blc[3];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[0].bits.blc_out_0 = g_isp_ctx[pipe].blc[0];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[0].bits.blc_out_1 = g_isp_ctx[pipe].blc[1];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[1].bits.blc_out_0 = g_isp_ctx[pipe].blc[2];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[1].bits.blc_out_1 = g_isp_ctx[pipe].blc[3];
g_isp_reg[pipe].dgn2.dgn2_hreg000.bits.reg_dgn2_enable = 1;
g_isp_reg[pipe].dgn2.dgn2_hreg000.bits.reg_dgn2_multiplier_single = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn3.dgn3_hreg000.bits.reg_dgn3_enable = 1;
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[0].bits.reg_dgn3_multiplier_4ch_0 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[0].bits.reg_dgn3_multiplier_4ch_1 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[1].bits.reg_dgn3_multiplier_4ch_0 = ISP_DGAIN_PRECISION;
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[1].bits.reg_dgn3_multiplier_4ch_1 = ISP_DGAIN_PRECISION;
}
static xmedia_s32 isp_reg_init(xmedia_u32 pipe)
{
xmedia_s32 i;
xmedia_u32 value;
xmedia_u32 bayer_pattern = 0;
if (pipe >= ISP_PIPE_MAX_NUM) {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
if (g_isp_cfg[pipe].bayer_fmt == XMEDIA_VIDEO_BAYER_FMT_RGGB) {
bayer_pattern = 0;
} else if (g_isp_cfg[pipe].bayer_fmt == XMEDIA_VIDEO_BAYER_FMT_BGGR) {
bayer_pattern = 1;
} else if (g_isp_cfg[pipe].bayer_fmt == XMEDIA_VIDEO_BAYER_FMT_GRBG) {
bayer_pattern = 2;
} else if (g_isp_cfg[pipe].bayer_fmt == XMEDIA_VIDEO_BAYER_FMT_GBRG) {
bayer_pattern = 3;
} else {
puts("bayer_pattern - ");
putdec(g_isp_cfg[pipe].bayer_fmt);
puts(" is invalid.\n");
}
memset(&g_isp_reg[pipe], 0, sizeof(xmedia_isp_regs));
isp_reg_init_aac(pipe);
isp_reg_init_blc(pipe);
isp_reg_init_cds(pipe);
isp_reg_init_dgn(pipe);
isp_write_reg(ISP_BE_CTRL_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_CTRL_BASE_ADDR + 0x4, 0x0);
value = isp_read_reg(ISP_BE_COMM_BASE_ADDR);
value &= ~((1 << 15) | (1 << 14) | (1 << 13) | (1 << 12) | (1 << 11) | (1 << 7) | (1 << 2) | (1 << 1));
isp_write_reg(ISP_BE_COMM_BASE_ADDR, value);
value = isp_read_reg(ISP_BE_COMM_BASE_ADDR + 0xC);
value &= ~((0x3 << 0));
value |= (bayer_pattern << 0);
isp_write_reg(ISP_BE_COMM_BASE_ADDR + 0xC, value);
isp_write_reg(ISP_BE_COMM_BASE_ADDR + 0x10, 64 | (((1 << 18) / 64) << 16)); // 64为一倍曝光比
isp_write_reg(ISP_BE_COMM_BASE_ADDR + 0x10C, 0x0);
isp_write_reg(ISP_BE_COMM_BASE_ADDR + 0x11C, 0x0);
isp_write_reg(ISP_BE_COMM_BASE_ADDR + 0x120, g_isp_ctx[pipe].aac_statistics_buffer[0]);
g_isp_ctx[pipe].read_index = 1;
isp_write_reg(ISP_BE_FPN_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_BLC1_CH0_BASE_ADDR, g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1000.u32);
isp_write_reg(ISP_BE_BLC1_CH0_BASE_ADDR + 0x4, g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1001.u32);
isp_write_reg(ISP_BE_BLC1_CH0_BASE_ADDR + 0x8, g_isp_reg[pipe].blc1_ch0.blc1_ch0_blc1002.u32);
isp_write_reg(ISP_BE_BLC1_CH1_BASE_ADDR, g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1000.u32);
isp_write_reg(ISP_BE_BLC1_CH1_BASE_ADDR + 0x4, g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1001.u32);
isp_write_reg(ISP_BE_BLC1_CH1_BASE_ADDR + 0x8, g_isp_reg[pipe].blc1_ch1.blc1_ch1_blc1002.u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_hreg000.u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x4, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[0].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x8, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[1].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0xC, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[0].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x10, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[1].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x14, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[0].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x18, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[1].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_hreg000.u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x4, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[0].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x8, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[1].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0xC, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[0].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x10, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[1].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x14, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[0].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x18, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[1].u32);
isp_write_reg(ISP_BE_BPC_CH0_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR, g_isp_reg[pipe].aac.aac_be000.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x4, g_isp_reg[pipe].aac.aac_be001.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x8, g_isp_reg[pipe].aac.aac_be002.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0xC, g_isp_reg[pipe].aac.aac_be003.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x10, g_isp_reg[pipe].aac.aac_be004.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x14, g_isp_reg[pipe].aac.aac_be005.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x84, g_isp_reg[pipe].aac.aac_be033.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x88, g_isp_reg[pipe].aac.aac_be034.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x8C, g_isp_reg[pipe].aac.aac_be035.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x90, g_isp_reg[pipe].aac.aac_be036.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x94, g_isp_reg[pipe].aac.aac_be037.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x98, g_isp_reg[pipe].aac.aac_be038.u32);
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0x9C, g_isp_reg[pipe].aac.aac_be039.u32);
for (i = 0; i < 32; i++) {
isp_write_reg(ISP_BE_AAC_BE_BASE_ADDR + 0xA0 + i * 0x4, 0x11111111);
}
isp_write_reg(ISP_BE_HDR_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_EXPANDER_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_COMP_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_NLM_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_DCMP_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_BLC2_BASE_ADDR, g_isp_reg[pipe].blc2.blc2000.u32);
isp_write_reg(ISP_BE_BLC2_BASE_ADDR + 0x4, g_isp_reg[pipe].blc2.blc2_global_offset[0].u32);
isp_write_reg(ISP_BE_BLC2_BASE_ADDR + 0x8, g_isp_reg[pipe].blc2.blc2_global_offset[1].u32);
isp_write_reg(ISP_BE_LSC_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_DGN2_BASE_ADDR, g_isp_reg[pipe].dgn2.dgn2_hreg000.u32);
isp_write_reg(ISP_BE_DGN3_BASE_ADDR, g_isp_reg[pipe].dgn3.dgn3_hreg000.u32);
isp_write_reg(ISP_BE_DGN3_BASE_ADDR + 0x4, g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[0].u32);
isp_write_reg(ISP_BE_DGN3_BASE_ADDR + 0x8, g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[1].u32);
isp_write_reg(ISP_BE_DRC_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_DMS_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_CLC_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_DH_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_RYC_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_CUS_V_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_CDS_H_BASE_ADDR, g_isp_reg[pipe].cds_h.cds_h000.u32);
isp_write_reg(ISP_BE_LCE_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_CDS_V_BASE_ADDR, g_isp_reg[pipe].cds_v.cds_v000.u32);
isp_write_reg(ISP_BE_STNR_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_CNR_BASE_ADDR, 0x0);
isp_write_reg(ISP_BE_LDC_H_BASE_ADDR, 0x0);
return XMEDIA_SUCCESS;
}
static xmedia_s32 isp_init_buffer(xmedia_u32 pipe)
{
xmedia_u32 addr, size, zone_num;
xmedia_u32 awb_zone_size, awb_global_size, ae_zone_size, ae_global_size, ae_hist_size;
// 分块数按照分块最大宽高计算,向上取整
g_isp_ctx[pipe].ae_zone_col_num = (g_isp_cfg[pipe].size.width + 511) / 512;
g_isp_ctx[pipe].ae_zone_row_num = (g_isp_cfg[pipe].size.height + 511) / 512;
g_isp_ctx[pipe].awb_zone_col_num = (g_isp_cfg[pipe].size.width + 255) / 256;
g_isp_ctx[pipe].awb_zone_row_num = (g_isp_cfg[pipe].size.height + 255) / 256;
awb_zone_size = g_isp_ctx[pipe].awb_zone_row_num * g_isp_ctx[pipe].awb_zone_col_num * sizeof(isp_be_awb_zone);
awb_global_size = sizeof(isp_be_awb_global);
ae_zone_size = g_isp_ctx[pipe].ae_zone_row_num * g_isp_ctx[pipe].ae_zone_col_num * sizeof(isp_be_ae_zone);
ae_global_size = sizeof(isp_be_ae_global);
ae_hist_size = sizeof(isp_be_ae_hist);
size = awb_zone_size + awb_global_size + ae_zone_size + ae_global_size + ae_hist_size;
size = ISP_ALIGN_UP(size, DMA_ALIGN);
addr = (xmedia_u32)reserved_mem_align(DMA_ALIGN, size * ISP_STATISTICS_BUFFER_NUM);
if (addr == XMEDIA_NULL) {
return XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY;
}
memset((xmedia_void *)addr, 0, size * ISP_STATISTICS_BUFFER_NUM);
g_isp_ctx[pipe].aac_statistics_buffer[0] = addr;
g_isp_ctx[pipe].awb_zone[0] = (isp_be_awb_zone *)(xmedia_uintptr_t)g_isp_ctx[pipe].aac_statistics_buffer[0];
g_isp_ctx[pipe].awb_global[0] = (isp_be_awb_global *)((xmedia_u8 *)g_isp_ctx[pipe].awb_zone[0] + awb_zone_size);
g_isp_ctx[pipe].ae_zone[0] = (isp_be_ae_zone *)((xmedia_u8 *)g_isp_ctx[pipe].awb_global[0] + awb_global_size);
g_isp_ctx[pipe].ae_global[0] = (isp_be_ae_global *)((xmedia_u8 *)g_isp_ctx[pipe].ae_zone[0] + ae_zone_size);
g_isp_ctx[pipe].ae_hist[0] = (isp_be_ae_hist *)((xmedia_u8 *)g_isp_ctx[pipe].ae_global[0] + ae_global_size);
g_isp_ctx[pipe].aac_statistics_buffer[1] = addr + size;
g_isp_ctx[pipe].awb_zone[1] = (isp_be_awb_zone *)(xmedia_uintptr_t)g_isp_ctx[pipe].aac_statistics_buffer[1];
g_isp_ctx[pipe].awb_global[1] = (isp_be_awb_global *)((xmedia_u8 *)g_isp_ctx[pipe].awb_zone[1] + awb_zone_size);
g_isp_ctx[pipe].ae_zone[1] = (isp_be_ae_zone *)((xmedia_u8 *)g_isp_ctx[pipe].awb_global[1] + awb_global_size);
g_isp_ctx[pipe].ae_global[1] = (isp_be_ae_global *)((xmedia_u8 *)g_isp_ctx[pipe].ae_zone[1] + ae_zone_size);
g_isp_ctx[pipe].ae_hist[1] = (isp_be_ae_hist *)((xmedia_u8 *)g_isp_ctx[pipe].ae_global[1] + ae_global_size);
addr = (xmedia_u32)malloc(awb_zone_size);
if (addr == XMEDIA_NULL) {
return XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY;
}
memset((xmedia_void *)addr, 0, awb_zone_size);
zone_num = g_isp_ctx[pipe].awb_zone_row_num * g_isp_ctx[pipe].awb_zone_col_num;
g_isp_ctx[pipe].awb_zone_head_addr = (xmedia_u32 *)(xmedia_uintptr_t)addr;
g_isp_ctx[pipe].awb_zone_avg_r = g_isp_ctx[pipe].awb_zone_head_addr;
g_isp_ctx[pipe].awb_zone_avg_g = g_isp_ctx[pipe].awb_zone_avg_r + zone_num;
g_isp_ctx[pipe].awb_zone_avg_b = g_isp_ctx[pipe].awb_zone_avg_g + zone_num;
g_isp_ctx[pipe].awb_zone_valid_count = g_isp_ctx[pipe].awb_zone_avg_b + zone_num;
addr = (xmedia_u32)malloc(ae_hist_size);
if (addr == XMEDIA_NULL) {
return XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY;
}
memset((xmedia_void *)addr, 0, ae_hist_size);
g_isp_ctx[pipe].ae_format_hist.be_histogram_mem_array = (xmedia_isp_be_hist *)(xmedia_uintptr_t)addr;
#if ISP_COUNT_SIZE_DEBUG
puts("aac_stt_buff size = ");
putdec(size * ISP_STATISTICS_BUFFER_NUM);
puts(".\n");
puts("awb_zone_size size = ");
putdec(awb_zone_size);
puts(".\n");
#endif
return XMEDIA_SUCCESS;
}
xmedia_s32 hal_isp_init_expander(xmedia_u32 pipe, const xmedia_isp_expander_attr *attr)
{
return XMEDIA_SUCCESS;
}
xmedia_s32 hal_isp_init(xmedia_u32 pipe, xmedia_isp_config *cfg, xmedia_sensor_black_level *blc)
{
xmedia_u32 i;
xmedia_s32 ret;
if (pipe >= ISP_PIPE_MAX_NUM || cfg == XMEDIA_NULL) {
return XMEDIA_ERRCODE_INVALID_PARAM;
}
memcpy(&g_isp_cfg[pipe], cfg, sizeof(xmedia_isp_config));
ret = isp_init_buffer(pipe);
if (ret != XMEDIA_SUCCESS) {
return ret;
}
for (i = 0; i < XMEDIA_SENSOR_BAYER_CHN_NUM; i++) {
g_isp_ctx[pipe].blc[i] = blc->black_level[i];
}
isp_reg_init(pipe);
#if ISP_COUNT_SIZE_DEBUG
puts("g_isp_cfg size = ");
putdec(sizeof(g_isp_cfg));
puts(".\n");
puts("g_isp_reg size = ");
putdec(sizeof(g_isp_reg));
puts(".\n");
puts("g_isp_ctx size = ");
putdec(sizeof(g_isp_ctx));
puts(".\n");
#endif
return XMEDIA_SUCCESS;
}
xmedia_s32 hal_isp_stat(xmedia_u32 pipe, xmedia_isp_statistics *stat)
{
stat->ae_stat.frame_cnt = g_isp_ctx[pipe].frame_cnt;
stat->ae_stat.ae_stat_global_avg.global_avg[0] = g_isp_ctx[pipe].ae_global_avg.global_avg[0];
stat->ae_stat.ae_stat_global_avg.global_avg[1] = g_isp_ctx[pipe].ae_global_avg.global_avg[1];
stat->ae_stat.ae_stat_global_avg.global_avg[2] = g_isp_ctx[pipe].ae_global_avg.global_avg[2];
stat->ae_stat.ae_stat_global_avg.global_avg[3] = g_isp_ctx[pipe].ae_global_avg.global_avg[3];
stat->ae_stat.ae_stat_hist.be_histogram_mem_array = g_isp_ctx[pipe].ae_format_hist.be_histogram_mem_array;
stat->awb_stat.frame_cnt = g_isp_ctx[pipe].frame_cnt;
stat->awb_stat.awb_zone_avg_r = g_isp_ctx[pipe].awb_zone_avg_r;
stat->awb_stat.awb_zone_avg_g = g_isp_ctx[pipe].awb_zone_avg_g;
stat->awb_stat.awb_zone_avg_b = g_isp_ctx[pipe].awb_zone_avg_b;
stat->awb_stat.awb_zone_valid_count = g_isp_ctx[pipe].awb_zone_valid_count;
stat->awb_stat.awb_stat_switch = XMEDIA_ISP_AWB_SWITCH_AFTER_DG2;
stat->awb_stat.awb_width = g_isp_ctx[pipe].awb_zone_width;
stat->awb_stat.awb_height = g_isp_ctx[pipe].awb_zone_height;
stat->awb_stat.awb_zone_row_num = g_isp_ctx[pipe].awb_zone_row_num;
stat->awb_stat.awb_zone_col_num = g_isp_ctx[pipe].awb_zone_col_num;
return XMEDIA_SUCCESS;
}
xmedia_s32 hal_isp_update(xmedia_u32 pipe, xmedia_isp_result *result, xmedia_sensor_regs_info *reg_info)
{
xmedia_u32 i;
xmedia_u32 blc_gain;
xmedia_u32 dg1_value, dg2_value;
// sensor 和 ae gain 需要做同步后再配置到寄存器,所以先存放在同步数组里
// update sensor config
for (i = ISP_SYNC_BUFF_MAX_NUM - 1; i >= 1; i--) {
g_isp_ctx[pipe].sync_node[i] = g_isp_ctx[pipe].sync_node[i - 1];
}
g_isp_ctx[pipe].sync_node[0] = &g_isp_ctx[pipe].sync_buff[g_isp_ctx[pipe].sync_index];
g_isp_ctx[pipe].sync_index = (g_isp_ctx[pipe].sync_index + 1) % ISP_SYNC_BUFF_MAX_NUM;
memcpy(&g_isp_ctx[pipe].sync_node[0]->sns, reg_info, sizeof(xmedia_sensor_regs_info));
// update ae config
blc_gain = 4095 * 256 / ISP_DIV_0_TO_1(4096 - g_isp_ctx[pipe].blc[0]) + 1;
if (result->ae_result.isp_dgain <= 0x400) {
dg1_value = result->ae_result.isp_dgain;
dg2_value = 0x100;
} else if (result->ae_result.isp_dgain <= 0x1000) {
dg1_value = 0x400;
dg2_value = result->ae_result.isp_dgain >> 2;
} else {
dg1_value = result->ae_result.isp_dgain >> 2;
dg2_value = 0x400;
}
for (i = 0; i < XMEDIA_ISP_BAYER_PATTERN_NUM; i++) {
g_isp_ctx[pipe].sync_node[0]->ae.isp_dgain1[0][i] = dg1_value;
}
g_isp_ctx[pipe].sync_node[0]->ae.isp_dgain2 = (dg2_value * blc_gain) >> 8;
// awb gain 不需要做同步,可以直接配置给寄存器
// update awb config
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[0].bits.reg_dgn3_multiplier_4ch_0 =
result->awb_result.white_balance_gain[0];
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[0].bits.reg_dgn3_multiplier_4ch_1 =
result->awb_result.white_balance_gain[1];
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[1].bits.reg_dgn3_multiplier_4ch_0 =
result->awb_result.white_balance_gain[2];
g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[1].bits.reg_dgn3_multiplier_4ch_1 =
result->awb_result.white_balance_gain[3];
return XMEDIA_SUCCESS;
}
xmedia_s32 hal_isp_format_statistics(xmedia_u32 pipe)
{
xmedia_u8 index = g_isp_ctx[pipe].read_index;
xmedia_u32 i;
isp_be_awb_zone *awb_zone = XMEDIA_NULL;
g_isp_ctx[pipe].frame_cnt++;
// ae只需要全局均值,所以只格式化了全局均值,而不格式化分块均值
g_isp_ctx[pipe].ae_global_avg.global_avg[0] = g_isp_ctx[pipe].ae_global[index]->rggb_avg_value[0];
g_isp_ctx[pipe].ae_global_avg.global_avg[1] = g_isp_ctx[pipe].ae_global[index]->rggb_avg_value[1];
g_isp_ctx[pipe].ae_global_avg.global_avg[2] = g_isp_ctx[pipe].ae_global[index]->rggb_avg_value[2];
g_isp_ctx[pipe].ae_global_avg.global_avg[3] = g_isp_ctx[pipe].ae_global[index]->rggb_avg_value[3];
memcpy(g_isp_ctx[pipe].ae_format_hist.be_histogram_mem_array, g_isp_ctx[pipe].ae_hist[index]->hist_value,
sizeof(xmedia_isp_be_hist));
// awb只需要分块均值,所以只格式化了分块均值,而不格式化全局均值
for (i = 0; i < g_isp_ctx[pipe].awb_zone_row_num * g_isp_ctx[pipe].awb_zone_col_num; i++) {
awb_zone = &g_isp_ctx[pipe].awb_zone[index][i];
g_isp_ctx[pipe].awb_zone_avg_r[i] = awb_zone->rgb_avg_value[0];
g_isp_ctx[pipe].awb_zone_avg_g[i] = awb_zone->rgb_avg_value[1];
g_isp_ctx[pipe].awb_zone_avg_b[i] = awb_zone->rgb_avg_value[2];
g_isp_ctx[pipe].awb_zone_valid_count[i] = awb_zone->zone_valid_count;
}
return XMEDIA_SUCCESS;
}
xmedia_s32 hal_isp_config(xmedia_u32 pipe)
{
xmedia_u8 index = g_isp_ctx[pipe].read_index;
g_isp_ctx[pipe].read_index = (index + 1) % ISP_STATISTICS_BUFFER_NUM;
isp_write_reg(ISP_BE_COMM_BASE_ADDR + 0x120, g_isp_ctx[pipe].aac_statistics_buffer[index]);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_hreg000.u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x4, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[0].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x8, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[1].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0xC, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[0].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x10, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_in[1].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x14, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[0].u32);
isp_write_reg(ISP_BE_DGN1_CH0_BASE_ADDR + 0x18, g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_blc_out[1].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_hreg000.u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x4, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[0].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x8, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[1].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0xC, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[0].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x10, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_in[1].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x14, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[0].u32);
isp_write_reg(ISP_BE_DGN1_CH1_BASE_ADDR + 0x18, g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_blc_out[1].u32);
isp_write_reg(ISP_BE_DGN2_BASE_ADDR, g_isp_reg[pipe].dgn2.dgn2_hreg000.u32);
isp_write_reg(ISP_BE_DGN3_BASE_ADDR, g_isp_reg[pipe].dgn3.dgn3_hreg000.u32);
isp_write_reg(ISP_BE_DGN3_BASE_ADDR + 0x4, g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[0].u32);
isp_write_reg(ISP_BE_DGN3_BASE_ADDR + 0x8, g_isp_reg[pipe].dgn3.dgn3_multiplier_4ch[1].u32);
return XMEDIA_SUCCESS;
}
static isp_sync_cfg *isp_sync_get_sns_cfg(xmedia_u32 pipe, xmedia_u32 index)
{
xmedia_u8 delay_cfg_frame_num;
isp_sync_cfg *sync_cfg = g_isp_ctx[pipe].sync_node[0];
isp_sync_cfg *cur_cfg = XMEDIA_NULL;
isp_sync_cfg *pre_cfg = XMEDIA_NULL;
if (sync_cfg == XMEDIA_NULL) {
return XMEDIA_NULL;
}
delay_cfg_frame_num = sync_cfg->sns.cfg_to_valid_delay_max - sync_cfg->sns.i2c_data[index].delay_frame_num;
if (delay_cfg_frame_num > ISP_SYNC_BUFF_MAX_NUM - 2) {
return XMEDIA_NULL;
}
cur_cfg = g_isp_ctx[pipe].sync_node[delay_cfg_frame_num];
pre_cfg = g_isp_ctx[pipe].sync_node[delay_cfg_frame_num + 1];
if (cur_cfg == XMEDIA_NULL) {
return XMEDIA_NULL;
}
if (pre_cfg != XMEDIA_NULL && pre_cfg == cur_cfg) {
return XMEDIA_NULL;
}
return cur_cfg;
}
static xmedia_void isp_sync_set_sns_cfg(xmedia_u32 pipe, xmedia_sensor_regs_info *reg_info, xmedia_u32 index)
{
xmedia_s32 fd;
xmedia_u8 buf[8];
xmedia_s32 i;
xmedia_u32 len = 0;
fd = i2c_open(g_isp_ctx[pipe].sync_node[0]->sns.com_bus.i2c_dev);
if (fd < 0) {
puts("i2c open failed.\n");
return;
}
for (i = reg_info->i2c_data[index].addr_byte_num - 1; i >= 0; i--) {
buf[len++] = ((reg_info->i2c_data[index].reg_addr >> (i * 8)) & 0xFF);
}
for (i = reg_info->i2c_data[index].data_byte_num - 1; i >= 0; i--) {
buf[len++] = ((reg_info->i2c_data[index].data >> (i * 8)) & 0xFF);
}
i2c_write(fd, reg_info->i2c_data[index].dev_addr, buf, len);
i2c_close(fd);
}
static xmedia_bool isp_is_online_mode()
{
return XMEDIA_TRUE; // TODO: 待后续完善
}
static xmedia_void isp_sync_get_sync_index(xmedia_u8 cfg_to_valid_delay_max, xmedia_u8 *be_index)
{
if (isp_is_online_mode()) {
*be_index = cfg_to_valid_delay_max - 1;
} else {
*be_index = cfg_to_valid_delay_max;
}
}
xmedia_s32 hal_isp_sync(xmedia_u32 pipe)
{
xmedia_u32 i;
isp_sync_cfg *sync_cfg = XMEDIA_NULL;
xmedia_u8 be_index;
if (g_isp_ctx[pipe].sync_node[0] == XMEDIA_NULL) {
return XMEDIA_ERRCODE_NULL_PTR;
}
for (i = 0; i < g_isp_ctx[pipe].sync_node[0]->sns.reg_num; i++) {
sync_cfg = isp_sync_get_sns_cfg(pipe, i);
if (sync_cfg == XMEDIA_NULL) {
continue;
}
if (sync_cfg->sns.i2c_data[i].update == XMEDIA_TRUE) {
isp_sync_set_sns_cfg(pipe, &sync_cfg->sns, i);
}
}
isp_sync_get_sync_index(g_isp_ctx[pipe].sync_node[0]->sns.cfg_to_valid_delay_max, &be_index);
sync_cfg = g_isp_ctx[pipe].sync_node[be_index];
if (sync_cfg != XMEDIA_NULL) {
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[0].bits.digital_gain_0 = sync_cfg->ae.isp_dgain1[0][0];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[0].bits.digital_gain_1 = sync_cfg->ae.isp_dgain1[0][1];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[1].bits.digital_gain_0 = sync_cfg->ae.isp_dgain1[0][2];
g_isp_reg[pipe].dgn1_ch0.dgn1_ch0_digital_gain[1].bits.digital_gain_1 = sync_cfg->ae.isp_dgain1[0][3];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[0].bits.digital_gain_0 = sync_cfg->ae.isp_dgain1[1][0];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[0].bits.digital_gain_1 = sync_cfg->ae.isp_dgain1[1][1];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[1].bits.digital_gain_0 = sync_cfg->ae.isp_dgain1[1][2];
g_isp_reg[pipe].dgn1_ch1.dgn1_ch1_digital_gain[1].bits.digital_gain_1 = sync_cfg->ae.isp_dgain1[1][3];
g_isp_reg[pipe].dgn2.dgn2_hreg000.bits.reg_dgn2_multiplier_single = sync_cfg->ae.isp_dgain2;
}
return XMEDIA_SUCCESS;
}