blob: 8f98e87528dfb9a3b7c086fb53690f6d804b942f [file] [log] [blame]
/*
* include/linux/amlogic/media/vout/lcd/ldim_alg.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _INC_AML_LDIM_ALG_H_
#define _INC_AML_LDIM_ALG_H_
/*========================================*/
#define LD_STA_BIN_NUM 16
#define LD_STA_LEN_V 17
/* support maximum 16x4 regions for statistics (16+1) */
#define LD_STA_LEN_H 25
/* support maximum 16x4 regions for statistics (24+1)*/
#define LD_BLK_LEN_V 25
/* support maximum 16 led of each side left/right(16+4+4+1)*/
#define LD_BLK_LEN_H 33
/* support maximum 24 led of each side top/bot (24+4+4+1)*/
#define LD_LUT_LEN 32
#define LD_BLKHMAX 32
#define LD_BLKVMAX 32
#define LD_BLKREGNUM 384 /* maximum support 24*16*/
struct LDReg_s {
int reg_LD_pic_RowMax; /*u13*/
int reg_LD_pic_ColMax; /*u13*/
int reg_LD_pic_YUVsum[3];
/* only output u16*3, (internal ACC will be u32x3)*/
int reg_LD_pic_RGBsum[3];
/* Statistic options */
int reg_LD_STA_Vnum;
/*u8: statistic region number of V, maximum to (STA_LEN_V-1) (0~16)*/
int reg_LD_STA_Hnum;
/*u8: statistic region number of H, maximum to (STA_LEN_H-1) (0~24)*/
int reg_LD_BLK_Vnum;
/*u8: Maximum to 16*/
int reg_LD_BLK_Hnum;
/*u8: Maximum to 24*/
int reg_LD_STA1max_LPF;
/*u1: STA1max statistics on [1 2 1]/4 filtered results*/
int reg_LD_STA2max_LPF;
/*u1: STA2max statistics on [1 2 1]/4 filtered results*/
int reg_LD_STAhist_LPF;
/*u1: STAhist statistics on [1 2 1]/4 filtered results*/
int reg_LD_STA1max_Hdlt;
/* u2: (2^x) extra pixels into Max calculation*/
int reg_LD_STA1max_Vdlt;
/* u4: extra pixels into Max calculation vertically*/
int reg_LD_STA2max_Hdlt;
/* u2: (2^x) extra pixels into Max calculation*/
int reg_LD_STA2max_Vdlt;
/* u4: extra pixels into Max calculation vertically*/
int reg_LD_STA1max_Hidx[LD_STA_LEN_H]; /* U12* STA_LEN_H*/
int reg_LD_STA1max_Vidx[LD_STA_LEN_V]; /* u12x STA_LEN_V*/
int reg_LD_STA2max_Hidx[LD_STA_LEN_H]; /* U12* STA_LEN_H*/
int reg_LD_STA2max_Vidx[LD_STA_LEN_V]; /* u12x STA_LEN_V*/
int reg_LD_STAhist_mode;
/*u3: histogram statistics on XX separately 20bits*16bins:
*0: R-only,1:G-only 2:B-only 3:Y-only;
*4: MAX(R,G,B), 5/6/7: R&G&B
*/
int reg_LD_STAhist_pix_drop_mode;
/* u2:histogram statistics pixel drop mode:
* 0:no drop; 1:only statistic
* x%2=0; 2:only statistic x%4=0; 3: only statistic x%8=0;
*/
int reg_LD_STAhist_Hidx[LD_STA_LEN_H]; /* U12* STA_LEN_H*/
int reg_LD_STAhist_Vidx[LD_STA_LEN_V]; /* u12x STA_LEN_V*/
/***** FBC3 fw_hw_alg_frm *****/
int reg_ldfw_BLmax;/* maximum BL value*/
int reg_ldfw_blk_norm;
/*u8: normalization gain for blk number,
*1/blk_num= norm>>(rs+8), norm = (1<<(rs+8))/blk_num
*/
int reg_ldfw_blk_norm_rs;/*u3: 0~7, 1/blk_num= norm>>(rs+8) */
int reg_ldfw_sta_hdg_weight[8];
/* u8x8, weighting to each
* block's max to decide that block's ld.
*/
int reg_ldfw_sta_max_mode;
/* u2: maximum selection for
*components: 0: r_max, 1: g_max, 2: b_max; 3: max(r,g,b)
*/
int reg_ldfw_sta_max_hist_mode;
/* u2: mode of reference
* max/hist mode:0: MIN(max, hist), 1: MAX(max, hist)
* 2: (max+hist)/2, 3: (max(a,b)*3 + min(a,b))/4
*/
int reg_ldfw_hist_valid_rate;
/* u8, norm to 512 as "1", if hist_matrix[i]>(rate*histavg)>>9*/
int reg_ldfw_hist_valid_ofst;/*u8, hist valid bin upward offset*/
int reg_ldfw_sedglit_RL;/*u1: single edge lit right/bottom mode*/
int reg_ldfw_sf_thrd;/*u12: threshold of difference to enable the sf;*/
int reg_ldfw_boost_gain;
/* u8: boost gain for the region that
* is larger than the average, norm to 16 as "1"
*/
int reg_ldfw_tf_alpha_rate;
/*u8: rate to SFB_BL_matrix from
*last frame difference;
*/
int reg_ldfw_tf_alpha_ofst;
/*u8: ofset to alpha SFB_BL_matrix
*from last frame difference;
*/
int reg_ldfw_tf_disable_th;
/*u8: 4x is the threshod to disable
*tf to the alpha (SFB_BL_matrix from last frame difference;
*/
int reg_ldfw_blest_acmode;
/*u3: 0: est on BLmatrix;
*1: est on(BL-DC); 2: est on (BL-MIN);
*3: est on (BL-MAX) 4: 2048; 5:1024
*/
int reg_ldfw_sf_enable;
/*u1: enable signal for spatial filter on the tbl_matrix*/
int reg_ldfw_enable;
int reg_ldfw_sta_hdg_vflt;
int reg_ldfw_sta_norm;
int reg_ldfw_sta_norm_rs;
int reg_ldfw_tf_enable;
int reg_LD_LUT_Hdg_TXLX[8][32];
int reg_LD_LUT_Vdg_TXLX[8][32];
int reg_LD_LUT_VHk_TXLX[8][32];
int reg_LD_LUT_Id[16 * 24];
int reg_LD_LUT_Hdg_LEXT_TXLX[8];
int reg_LD_LUT_Vdg_LEXT_TXLX[8];
int reg_LD_LUT_VHk_LEXT_TXLX[8];
int reg_ldfw_boost_enable;
/*u1: enable signal for Boost
*filter on the tbl_matrix
*/
int ro_ldfw_bl_matrix_avg;/*u12: read-only register for bl_matrix*/
/* Backlit Modeling registers*/
int BL_matrix[LD_BLKREGNUM];
/* Define the RAM Matrix*/
int reg_LD_BackLit_Xtlk;
/*u1: 0 no block to block Xtalk model needed; 1: Xtalk model needed*/
int reg_LD_BackLit_mode;
/*u2: 0- LEFT/RIGHT Edge Lit; 1- Top/Bot Edge Lit; 2 - DirectLit
*modeled H/V independent; 3- DirectLit modeled HV Circle distribution
*/
int reg_LD_Reflect_Hnum;
/*u3: numbers of band reflection considered in Horizontal direction;
* 0~4
*/
int reg_LD_Reflect_Vnum;
/*u3: numbers of band reflection considered in Horizontal direction;
* 0~4
*/
int reg_LD_BkLit_curmod;
/*u1: 0: H/V separately, 1 Circle distribution*/
int reg_LD_BkLUT_Intmod;
/*u1: 0: linear interpolation, 1 cubical interpolation*/
int reg_LD_BkLit_Intmod;
/*u1: 0: linear interpolation, 1 cubical interpolation*/
int reg_LD_BkLit_LPFmod;
/*u3: 0: no LPF, 1:[1 14 1]/16;2:[1 6 1]/8; 3: [1 2 1]/4;
* 4:[9 14 9]/32 5/6/7: [5 6 5]/16;
*/
int reg_LD_BkLit_Celnum;
/*u8: 0: 1920~ 61*/
int reg_BL_matrix_AVG;
/*u12: DC of whole picture BL to be subtract from BL_matrix
* during modeling (Set by FW daynamically)
*/
int reg_BL_matrix_Compensate;
/*u12: DC of whole picture BL to be compensated back to
* Litfull after the model (Set by FW dynamically);
*/
int reg_LD_Reflect_Hdgr[20];
/*20*u6: cells 1~20 for H Gains of different dist of
* Left/Right;
*/
int reg_LD_Reflect_Vdgr[20];
/*20*u6: cells 1~20 for V Gains of different dist of Top/Bot;*/
int reg_LD_Reflect_Xdgr[4]; /*4*u6:*/
int reg_LD_Vgain; /*u12*/
int reg_LD_Hgain; /*u12*/
int reg_LD_Litgain; /*u12*/
int reg_LD_Litshft;
/*u3 right shif of bits for the all Lit's sum*/
int reg_LD_BkLit_valid[32];
/*u1x32: valid bits for the 32 cell Bklit to contribut to current
* position (refer to the backlit padding pattern)
*/
/* region division index 1 2 3 4 5(0) 6(1) 7(2)
* 8(3) 9(4) 10(5)11(6)12(7)13(8) 14(9)15(10) 16 17 18 19
*/
int reg_LD_BLK_Hidx[LD_BLK_LEN_H]; /* S14* BLK_LEN*/
int reg_LD_BLK_Vidx[LD_BLK_LEN_V]; /* S14* BLK_LEN*/
/* Define the RAM Matrix*/
int reg_LD_LUT_Hdg[LD_LUT_LEN]; /*u10*/
int reg_LD_LUT_Vdg[LD_LUT_LEN]; /*u10*/
int reg_LD_LUT_VHk[LD_LUT_LEN]; /*u10*/
/* VHk positive and negative side gain, normalized to 128
* as "1" 20150428
*/
int reg_LD_LUT_VHk_pos[32]; /* u8*/
int reg_LD_LUT_VHk_neg[32]; /* u8*/
int reg_LD_LUT_HHk[32];
/* u8 side gain for LED direction hdist gain for different LED*/
/* VHo possitive and negative side offset, use with LS, (x<<LS)*/
int reg_LD_LUT_VHo_pos[32]; /* s8*/
int reg_LD_LUT_VHo_neg[32]; /* s8*/
int reg_LD_LUT_VHo_LS;/* u3:0~6,left shift bits of VH0_pos/neg*/
/* adding three cells for left boundary extend during
* Cubic interpolation
*/
int reg_LD_LUT_Hdg_LEXT;
int reg_LD_LUT_Vdg_LEXT;
int reg_LD_LUT_VHk_LEXT;
/* adding demo window mode for LD for RGB lut compensation*/
int reg_LD_xlut_demo_roi_xstart;
/* u14 start col index of the region of interest*/
int reg_LD_xlut_demo_roi_xend;
/* u14 end col index of the region of interest*/
int reg_LD_xlut_demo_roi_ystart;
/* u14 start row index of the region of interest*/
int reg_LD_xlut_demo_roi_yend;
/* u14 end row index of the region of interest*/
int reg_LD_xlut_iroi_enable;
/* u1: enable rgb LUT remapping inside regon of interest:
* 0: no rgb remapping; 1: enable rgb remapping
*/
int reg_LD_xlut_oroi_enable;
/* u1: enable rgb LUT remapping outside regon of interest:
* 0: no rgb remapping; 1: enable rgb remapping
*/
/* Register used in RGB remapping*/
int reg_LD_RGBmapping_demo;
/*u2: 0 no demo mode 1: display BL_fulpel on RGB*/
int reg_LD_X_LUT_interp_mode[3];
/*U1 0: using linear interpolation between to neighbour LUT;
* 1: use the nearest LUT results
*/
int X_idx[1][16];
/* Changed to 16 Lits define 32 Bin LUT to save cost*/
int X_nrm[1][16];
/* Changed to 16 Lits define 32 Bin LUT to save cost*/
int X_lut[3][16][32];
/* Changed to 16 Lits define 32 Bin LUT to save cost*/
/* only do the Lit modleing on the AC part*/
int X_lut2[3][16][16];
int fw_LD_BLEst_ACmode;
/*u2: 0: est on BLmatrix; 1: est on (BL-DC);
* 2: est on (BL-MIN); 3: est on (BL-MAX)
*/
};
struct FW_DAT_s {
/* for temporary Firmware algorithm */
unsigned int *TF_BL_alpha;
unsigned int *last_YUVsum;
unsigned int *last_RGBsum;
unsigned int *last_STA1_MaxRGB;
unsigned int *SF_BL_matrix;
unsigned int *TF_BL_matrix;
unsigned int *TF_BL_matrix_2;
};
struct ldim_fw_para_s {
/* header */
unsigned int para_ver;
unsigned int para_size;
char ver_str[20];
unsigned char ver_num;
unsigned char hist_col;
unsigned char hist_row;
unsigned int fw_LD_ThSF_l;
unsigned int fw_LD_ThTF_l;
unsigned int boost_gain; /*norm 256 to 1,T960 finally use*/
unsigned int TF_alpha; /*256;*/
unsigned int lpf_gain; /* [0~128~256], norm 128 as 1*/
unsigned int boost_gain_neg;
unsigned int alpha_delta;
/*LPF tap: 0-lpf_res 41,1-lpf_res 114,...*/
unsigned int lpf_res; /* 1024/9*9 = 13,LPF_method=3 */
unsigned int rgb_base;
unsigned int ov_gain;
/*unsigned int incr_dif_gain; //16 */
unsigned int avg_gain;
unsigned int fw_rgb_diff_th;
unsigned int max_luma;
unsigned int lmh_avg_TH;/*for woman flicker*/
unsigned int fw_TF_sum_th;/*20180530*/
unsigned int LPF_method;
unsigned int LD_TF_STEP_TH;
unsigned int TF_step_method;
unsigned int TF_FRESH_BL;
unsigned int TF_BLK_FRESH_BL;
unsigned int side_blk_diff_th;
unsigned int bbd_th;
unsigned char bbd_detect_en;
unsigned char diff_blk_luma_en;
unsigned char Sf_bypass, Boost_light_bypass;
unsigned char Lpf_bypass, Ld_remap_bypass;
unsigned char black_frm;
/* for debug print */
unsigned char fw_hist_print;/*20180525*/
unsigned int fw_print_frequent;/*20180606,print every 8 frame*/
unsigned int Dbprint_lv;
struct LDReg_s *nPRM;
struct FW_DAT_s *FDat;
unsigned int *bl_remap_curve; /* size: 16 */
unsigned int *fw_LD_Whist; /* size: 16 */
void (*fw_alg_frm)(struct ldim_fw_para_s *fw_para,
unsigned int *max_matrix, unsigned int *hist_matrix);
void (*fw_alg_para_print)(struct ldim_fw_para_s *fw_para);
};
/* if struct ldim_fw_para_s changed, FW_PARA_VER must be update */
#define FW_PARA_VER 1
extern struct ldim_fw_para_s *aml_ldim_get_fw_para(void);
#endif