| /* |
| * drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c |
| * |
| * 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. |
| * |
| */ |
| |
| #include <linux/version.h> |
| #include <linux/string.h> |
| #include <linux/io.h> |
| #include <linux/mm.h> |
| #include <linux/mutex.h> |
| #include <linux/cdev.h> |
| #include <linux/uaccess.h> |
| #include <linux/timer.h> |
| #include <linux/delay.h> |
| #include <linux/major.h> |
| #include <linux/sched.h> |
| #include <linux/vmalloc.h> |
| #include <linux/types.h> |
| #include <linux/init.h> |
| #include <linux/slab.h> |
| #include <linux/module.h> |
| #include <linux/kernel.h> |
| #include <linux/device.h> |
| #include <linux/interrupt.h> |
| #include <linux/fs.h> |
| #include <linux/miscdevice.h> |
| #include <linux/platform_device.h> |
| #include <linux/moduleparam.h> |
| #include <linux/timer.h> |
| #include <linux/spinlock.h> |
| #include <linux/amlogic/iomap.h> |
| #include <linux/workqueue.h> |
| #include <linux/amlogic/media/vfm/vframe.h> |
| #include <linux/amlogic/media/vout/lcd/aml_ldim.h> |
| #include <linux/amlogic/media/vout/lcd/aml_bl.h> |
| #include <linux/amlogic/media/vout/vout_notify.h> |
| #include <linux/amlogic/media/vout/lcd/lcd_vout.h> |
| #include <linux/amlogic/media/utils/vdec_reg.h> |
| #include <linux/amlogic/media/vout/lcd/lcd_unifykey.h> |
| #include <linux/amlogic/media/vout/lcd/ldim_alg.h> |
| #include "ldim_drv.h" |
| #include "ldim_reg.h" |
| |
| #define Wr(reg, val) Wr_reg(reg, val) |
| #define Rd(reg) Rd_reg(reg) |
| |
| static int LDIM_Update_Matrix(int NewBlMatrix[], int BlMatrixNum) |
| { |
| int data; |
| |
| data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0); |
| if (data & (1 << 12)) { /*bl_ram_mode=1;*/ |
| if (LDIM_RD_32Bits(REG_LD_BLMAT_RAM_MISC) & 0x10000) |
| /*Previous Matrix is not used*/ |
| goto Previous_Matrix; |
| else { |
| LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE, |
| NewBlMatrix, BlMatrixNum); |
| LDIM_WR_32Bits(REG_LD_BLMAT_RAM_MISC, |
| (BlMatrixNum & 0x1ff) | (1 << 16)); |
| /*set Matrix update ready*/ |
| |
| return 0; |
| } |
| } else { /*bl_ram_mode=0*/ |
| /*set ram_clk_sel=0, ram_bus_sel = 0*/ |
| data = data & (~(3 << 9)); |
| LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); |
| LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE, |
| NewBlMatrix, BlMatrixNum); |
| data = data | (3 << 9); /*set ram_clk_sel=1, ram_bus_sel = 1*/ |
| LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); |
| |
| return 0; |
| } |
| |
| Previous_Matrix: |
| return 1; |
| } |
| |
| void ldim_initial_txlx(struct LDReg_s *nPRM, |
| unsigned int ldim_bl_en, unsigned int ldim_hvcnt_bypass) |
| { |
| unsigned int i; |
| unsigned int data; |
| unsigned int *arrayTmp; |
| |
| arrayTmp = kcalloc(1536, sizeof(unsigned int), GFP_KERNEL); |
| if (arrayTmp == NULL) { |
| LDIMERR("%s malloc error\n", __func__); |
| return; |
| } |
| |
| /* LD_FRM_SIZE */ |
| data = ((nPRM->reg_LD_pic_RowMax & 0xfff)<<16) | |
| (nPRM->reg_LD_pic_ColMax & 0xfff); |
| LDIM_WR_32Bits(REG_LD_FRM_SIZE, data); |
| |
| /* LD_RGB_MOD */ |
| data = ((0 & 0xfff) << 20) | |
| ((nPRM->reg_LD_RGBmapping_demo & 0x1) << 19) | |
| ((nPRM->reg_LD_X_LUT_interp_mode[2] & 0x1) << 18) | |
| ((nPRM->reg_LD_X_LUT_interp_mode[1] & 0x1) << 17) | |
| ((nPRM->reg_LD_X_LUT_interp_mode[0] & 0x1) << 16) | |
| ((0 & 0x1) << 15) | |
| ((nPRM->reg_LD_BkLit_LPFmod & 0x7) << 12) | |
| ((nPRM->reg_LD_Litshft & 0x7) << 8) | |
| ((nPRM->reg_LD_BackLit_Xtlk & 0x1) << 7) | |
| ((nPRM->reg_LD_BkLit_Intmod & 0x1) << 6) | |
| ((nPRM->reg_LD_BkLUT_Intmod & 0x1) << 5) | |
| ((nPRM->reg_LD_BkLit_curmod & 0x1) << 4) | |
| ((nPRM->reg_LD_BackLit_mode & 0x3)); |
| LDIM_WR_32Bits(REG_LD_RGB_MOD, data); |
| |
| /* LD_BLK_HVNUM */ |
| data = ((nPRM->reg_LD_Reflect_Vnum & 0x7) << 20) | |
| ((nPRM->reg_LD_Reflect_Hnum & 0x7) << 16) | |
| ((nPRM->reg_LD_BLK_Vnum & 0x3f) << 8) | |
| ((nPRM->reg_LD_BLK_Hnum & 0x3f)); |
| LDIM_WR_32Bits(REG_LD_BLK_HVNUM, data); |
| |
| /* LD_HVGAIN */ |
| data = ((nPRM->reg_LD_Vgain & 0xfff) << 16) | |
| (nPRM->reg_LD_Hgain & 0xfff); |
| LDIM_WR_32Bits(REG_LD_HVGAIN, data); |
| |
| /* LD_BKLIT_VLD */ |
| data = 0; |
| for (i = 0; i < 32; i++) |
| if (nPRM->reg_LD_BkLit_valid[i]) |
| data = data | (1 << i); |
| LDIM_WR_32Bits(REG_LD_BKLIT_VLD, data); |
| |
| /* LD_BKLIT_PARAM */ |
| data = ((nPRM->reg_LD_BkLit_Celnum & 0xff) << 16) | |
| (nPRM->reg_BL_matrix_AVG & 0xfff); |
| LDIM_WR_32Bits(REG_LD_BKLIT_PARAM, data); |
| |
| /* LD_LIT_GAIN_COMP */ |
| data = ((nPRM->reg_LD_Litgain & 0xfff) << 16) | |
| (nPRM->reg_BL_matrix_Compensate & 0xfff); |
| LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data); |
| |
| /* LD_FRM_RST_POS */ |
| data = (1 << 16) | (5); /* h=1,v=5 :ldim_param_frm_rst_pos */ |
| LDIM_WR_32Bits(REG_LD_FRM_RST_POS, data); |
| |
| /* LD_FRM_BL_START_POS */ |
| data = (1 << 16) | (6); /* ldim_param_frm_bl_start_pos; */ |
| LDIM_WR_32Bits(REG_LD_FRM_BL_START_POS, data); |
| |
| /* REG_LD_FRM_HBLAN_VHOLS */ |
| data = ((nPRM->reg_LD_LUT_VHo_LS & 0x7) << 16) | |
| ((6 & 0x1fff)) ; /*frm_hblank_num */ |
| LDIM_WR_32Bits(REG_LD_FRM_HBLAN_VHOLS, data); |
| |
| /* REG_LD_XLUT_DEMO_ROI_XPOS */ |
| data = ((nPRM->reg_LD_xlut_demo_roi_xend & 0x1fff) << 16) | |
| (nPRM->reg_LD_xlut_demo_roi_xstart & 0x1fff); |
| LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_XPOS, data); |
| |
| /* REG_LD_XLUT_DEMO_ROI_YPOS */ |
| data = ((nPRM->reg_LD_xlut_demo_roi_yend & 0x1fff) << 16) | |
| (nPRM->reg_LD_xlut_demo_roi_ystart & 0x1fff); |
| LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_YPOS, data); |
| |
| /* REG_LD_XLUT_DEMO_ROI_CTRL */ |
| data = ((nPRM->reg_LD_xlut_oroi_enable & 0x1) << 1) | |
| (nPRM->reg_LD_xlut_iroi_enable & 0x1); |
| LDIM_WR_32Bits(REG_LD_XLUT_DEMO_ROI_CTRL, data); |
| |
| /*LD_BLMAT_RAM_MISC*/ |
| LDIM_WR_32Bits(REG_LD_BLMAT_RAM_MISC, 384 & 0x1ff); |
| |
| /* X_idx: 12*16 */ |
| LDIM_WR_BASE_LUT(REG_LD_RGB_IDX_BASE, nPRM->X_idx[0], 16, 16); |
| |
| /* X_nrm[16]: 4 * 16 */ |
| LDIM_WR_BASE_LUT(REG_LD_RGB_NRMW_BASE_TXLX, nPRM->X_nrm[0], 4, 16); |
| |
| /*reg_LD_BLK_Hidx[33]: 14*33 */ |
| LDIM_WR_BASE_LUT(REG_LD_BLK_HIDX_BASE_TXLX, |
| nPRM->reg_LD_BLK_Hidx, 16, 33); |
| |
| /* reg_LD_BLK_Vidx[25]: 14*25 */ |
| LDIM_WR_BASE_LUT(REG_LD_BLK_VIDX_BASE_TXLX, |
| nPRM->reg_LD_BLK_Vidx, 16, 25); |
| |
| /* reg_LD_LUT_VHk_pos[32]/reg_LD_LUT_VHk_neg[32]: u8 */ |
| for (i = 0; i < 32; i++) |
| arrayTmp[i] = nPRM->reg_LD_LUT_VHk_pos[i]; |
| for (i = 0; i < 32; i++) |
| arrayTmp[32+i] = nPRM->reg_LD_LUT_VHk_neg[i]; |
| LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_NEGPOS_BASE_TXLX, arrayTmp, 8, 64); |
| |
| /* reg_LD_LUT_VHo_pos[32]/reg_LD_LUT_VHo_neg[32]: s8 */ |
| for (i = 0; i < 32; i++) |
| arrayTmp[i] = nPRM->reg_LD_LUT_VHo_pos[i]; |
| for (i = 0; i < 32; i++) |
| arrayTmp[32+i] = nPRM->reg_LD_LUT_VHo_neg[i]; |
| LDIM_WR_BASE_LUT(REG_LD_LUT_VHO_NEGPOS_BASE_TXLX, arrayTmp, 8, 64); |
| |
| /* reg_LD_LUT_HHk[32]:u8 */ |
| LDIM_WR_BASE_LUT(REG_LD_LUT_HHK_BASE_TXLX, nPRM->reg_LD_LUT_HHk, 8, 32); |
| |
| /*reg_LD_Reflect_Hdgr[20],reg_LD_Reflect_Vdgr[20], |
| * reg_LD_Reflect_Xdgr[4] |
| */ |
| for (i = 0; i < 20; i++) |
| arrayTmp[i] = nPRM->reg_LD_Reflect_Hdgr[i]; |
| for (i = 0; i < 20; i++) |
| arrayTmp[20+i] = nPRM->reg_LD_Reflect_Vdgr[i]; |
| for (i = 0; i < 4; i++) |
| arrayTmp[40+i] = nPRM->reg_LD_Reflect_Xdgr[i]; |
| LDIM_WR_BASE_LUT(REG_LD_REFLECT_DGR_BASE_TXLX, arrayTmp, 8, 44); |
| |
| /*reg_LD_LUT_Hdg_LEXT[8]/reg_LD_LUT_Vdg_LEXT[8]/reg_LD_LUT_VHk_LEXT[8]*/ |
| for (i = 0; i < 8; i++) |
| arrayTmp[i] = (nPRM->reg_LD_LUT_Hdg_LEXT_TXLX[i] & 0x3ff) | |
| ((nPRM->reg_LD_LUT_VHk_LEXT_TXLX[i] & 0x3ff) << 10) | |
| ((nPRM->reg_LD_LUT_Vdg_LEXT_TXLX[i] & 0x3ff) << 20); |
| LDIM_WR_BASE_LUT_DRT(REG_LD_LUT_LEXT_BASE_TXLX, arrayTmp, 8); |
| |
| /*reg_LD_LUT_Hdg[8][32]: u10*8*32*/ |
| LDIM_WR_BASE_LUT(REG_LD_LUT_HDG_BASE_TXLX, |
| nPRM->reg_LD_LUT_Hdg_TXLX[0], 16, 8*32); |
| |
| /*reg_LD_LUT_Vdg[8][32]: u10*8*32*/ |
| LDIM_WR_BASE_LUT(REG_LD_LUT_VDG_BASE_TXLX, |
| nPRM->reg_LD_LUT_Vdg_TXLX[0], 16, 8*32); |
| |
| /*reg_LD_LUT_VHk[8][32]: u10*8*32*/ |
| LDIM_WR_BASE_LUT(REG_LD_LUT_VHK_BASE_TXLX, |
| nPRM->reg_LD_LUT_VHk_TXLX[0], 16, 8*32); |
| |
| /*reg_LD_LUT_Id[16][24]: u3*16*24=u3*384 */ |
| LDIM_WR_BASE_LUT(REG_LD_LUT_ID_BASE_TXLX, nPRM->reg_LD_LUT_Id, 4, 384); |
| |
| /*enable the CBUS configure the RAM*/ |
| /*LD_MISC_CTRL0 {reg_blmat_ram_mode, |
| *1'h0,ram_bus_sel,ram_clk_sel,ram_clk_gate_en, |
| *2'h0,reg_hvcnt_bypass,reg_demo_synmode,reg_ldbl_synmode, |
| *reg_ldim_bl_en,soft_bl_start,reg_soft_rst) |
| */ |
| data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0); |
| data = (data & (~(3 << 9))) | (1 << 8); |
| LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); |
| |
| /*X_lut[3][16][16]*/ |
| LDIM_WR_BASE_LUT_DRT(REG_LD_RGB_LUT_BASE, nPRM->X_lut2[0][0], 3*16*16); |
| |
| data = 0 | (0 << 1) | ((ldim_bl_en & 0x1) << 2) | |
| (ldim_hvcnt_bypass << 5) | (1 << 8) | |
| (3 << 9) | (1 << 12); |
| LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data); |
| |
| LDIM_Update_Matrix(nPRM->BL_matrix, 16 * 24); |
| |
| kfree(arrayTmp); |
| } |
| |
| static unsigned int ldim_hw_reg_dump_table[] = { |
| LDIM_STTS_GCLK_CTRL0, |
| LDIM_STTS_WIDTHM1_HEIGHTM1, |
| LDIM_STTS_CTRL0, |
| LDIM_STTS_HIST_REGION_IDX, |
| }; |
| |
| int ldim_hw_reg_dump(char *buf) |
| { |
| unsigned int reg, data32; |
| int i, size, len = 0; |
| |
| size = sizeof(ldim_hw_reg_dump_table) / sizeof(unsigned int); |
| for (i = 0; i < size; i++) { |
| reg = ldim_hw_reg_dump_table[i]; |
| data32 = Rd(reg); |
| len += sprintf(buf+len, "0x%x = 0x%08x\n", reg, data32); |
| } |
| |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32); |
| for (i = 0; i < 23; i++) { |
| reg = LDIM_STTS_HIST_SET_REGION; |
| data32 = Rd(reg); |
| len += sprintf(buf+len, "0x%x = 0x%08x\n", reg, data32); |
| } |
| |
| return len; |
| } |
| |
| /***** local dimming stts functions begin *****/ |
| /*hist mode: 0: comp0 hist only, 1: Max(comp0,1,2) for hist, |
| *2: the hist of all comp0,1,2 are calculated |
| */ |
| /*lpf_en 1: 1,2,1 filter on before finding max& hist*/ |
| /*rd_idx_auto_inc_mode 0: no self increase, 1: read index increase after |
| *read a 25/48 block, 2: increases every read and lock sub-idx |
| */ |
| /*one_ram_en 1: one ram mode; 0:double ram mode*/ |
| static void ldim_stts_en(unsigned int resolution, unsigned int pix_drop_mode, |
| unsigned int eol_en, unsigned int hist_mode, unsigned int lpf_en, |
| unsigned int rd_idx_auto_inc_mode, unsigned int one_ram_en) |
| { |
| int data32; |
| |
| Wr(LDIM_STTS_GCLK_CTRL0, 0x0); |
| Wr(LDIM_STTS_WIDTHM1_HEIGHTM1, resolution); |
| |
| data32 = 0x80000000 | ((pix_drop_mode & 0x3) << 29); |
| data32 = data32 | ((eol_en & 0x1) << 28); |
| data32 = data32 | ((one_ram_en & 0x1) << 27); |
| data32 = data32 | ((hist_mode & 0x3) << 22); |
| data32 = data32 | ((lpf_en & 0x1) << 21); |
| data32 = data32 | ((rd_idx_auto_inc_mode & 0xff) << 14); |
| Wr(LDIM_STTS_HIST_REGION_IDX, data32); |
| } |
| |
| static void ldim_stts_set_region_txlx(unsigned int resolution, |
| unsigned int blk_height, unsigned int blk_width, |
| unsigned int row_start, unsigned int col_start, |
| unsigned int blk_hnum) |
| { |
| unsigned int hend0, hend1, hend2, hend3, hend4, hend5, |
| hend6, hend7, hend8, hend9, hend10, hend11, hend12, |
| hend13, hend14, hend15, hend16, hend17, hend18, |
| hend19, hend20, hend21, hend22, hend23; |
| unsigned int vend0, vend1, vend2, vend3, vend4, vend5, |
| vend6, vend7, vend8, vend9, vend10, vend11, |
| vend12, vend13, vend14, vend15; |
| unsigned int data32, k, h_index[24], v_index[16]; |
| |
| if (resolution == 0) { |
| h_index[0] = col_start + blk_width - 1; |
| for (k = 1; k < 24; k++) { |
| h_index[k] = h_index[k-1] + blk_width; |
| if (h_index[k] > 4095) |
| h_index[k] = 4095; /* clip U12 */ |
| } |
| v_index[0] = row_start + blk_height - 1; |
| for (k = 1; k < 16; k++) { |
| v_index[k] = v_index[k-1] + blk_height; |
| if (v_index[k] > 4095) |
| v_index[k] = 4095; /* clip U12 */ |
| } |
| hend0 = h_index[0];/*col_start + blk_width - 1;*/ |
| hend1 = h_index[1];/*hend0 + blk_width;*/ |
| hend2 = h_index[2];/*hend1 + blk_width;*/ |
| hend3 = h_index[3];/*hend2 + blk_width;*/ |
| hend4 = h_index[4];/*hend3 + blk_width;*/ |
| hend5 = h_index[5];/*hend4 + blk_width;*/ |
| hend6 = h_index[6];/*hend5 + blk_width;*/ |
| hend7 = h_index[7];/*hend6 + blk_width;*/ |
| hend8 = h_index[8];/*hend7 + blk_width;*/ |
| hend9 = h_index[9];/*hend8 + blk_width;*/ |
| hend10 = h_index[10];/*hend9 + blk_width ;*/ |
| hend11 = h_index[11];/*hend10 + blk_width;*/ |
| hend12 = h_index[12];/*hend11 + blk_width;*/ |
| hend13 = h_index[13];/*hend12 + blk_width;*/ |
| hend14 = h_index[14];/*hend13 + blk_width;*/ |
| hend15 = h_index[15];/*hend14 + blk_width;*/ |
| hend16 = h_index[16];/*hend15 + blk_width;*/ |
| hend17 = h_index[17];/*hend16 + blk_width;*/ |
| hend18 = h_index[18];/*hend17 + blk_width;*/ |
| hend19 = h_index[19];/*hend18 + blk_width;*/ |
| hend20 = h_index[20];/*hend19 + blk_width ;*/ |
| hend21 = h_index[21];/*hend20 + blk_width;*/ |
| hend22 = h_index[22];/*hend21 + blk_width;*/ |
| hend23 = h_index[23];/*hend22 + blk_width;*/ |
| vend0 = v_index[0];/*row_start + blk_height - 1;*/ |
| vend1 = v_index[1];/*vend0 + blk_height;*/ |
| vend2 = v_index[2];/*vend1 + blk_height;*/ |
| vend3 = v_index[3];/*vend2 + blk_height;*/ |
| vend4 = v_index[4];/*vend3 + blk_height;*/ |
| vend5 = v_index[5];/*vend4 + blk_height;*/ |
| vend6 = v_index[6];/*vend5 + blk_height;*/ |
| vend7 = v_index[7];/*vend6 + blk_height;*/ |
| vend8 = v_index[8];/*vend7 + blk_height;*/ |
| vend9 = v_index[9];/*vend8 + blk_height;*/ |
| vend10 = v_index[10];/*vend9 + blk_height;*/ |
| vend11 = v_index[11];/*vend10 + blk_height;*/ |
| vend12 = v_index[12];/*vend11 + blk_height;*/ |
| vend13 = v_index[13];/*vend12 + blk_height;*/ |
| vend14 = v_index[14];/*vend13 + blk_height;*/ |
| vend15 = v_index[15];/*vend14 + blk_height;*/ |
| |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32); |
| Wr(LDIM_STTS_HIST_SET_REGION, |
| ((((row_start & 0x1fff) << 16) & 0xffff0000) | |
| (col_start & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend1 & 0x1fff) << 16) |
| | (hend0 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend1 & 0x1fff) << 16) |
| | (vend0 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend3 & 0x1fff) << 16) |
| | (hend2 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend3 & 0x1fff) << 16) |
| | (vend2 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend5 & 0x1fff) << 16) |
| | (hend4 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend5 & 0x1fff) << 16) |
| | (vend4 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend7 & 0x1fff) << 16) |
| | (hend6 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend7 & 0x1fff) << 16) |
| | (vend6 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend9 & 0x1fff) << 16) |
| | (hend8 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend9 & 0x1fff) << 16) |
| | (vend8 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend11 & 0x1fff) << 16) |
| | (hend10 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend11 & 0x1fff) << 16) |
| | (vend10 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend13 & 0x1fff) << 16) |
| | (hend12 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend13 & 0x1fff) << 16) |
| | (vend12 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend15 & 0x1fff) << 16) |
| | (hend14 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend15 & 0x1fff) << 16) |
| | (vend14 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend17 & 0x1fff) << 16) |
| | (hend16 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend19 & 0x1fff) << 16) |
| | (hend18 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend21 & 0x1fff) << 16) |
| | (hend20 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend23 & 0x1fff) << 16) |
| | (hend22 & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, blk_hnum); /*h region number*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0); /*line_n_int_num*/ |
| } else if (resolution == 1) { |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0010010); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1000080); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0800040); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2000180); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x10000c0); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x3000280); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1800140); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000380); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x20001c0); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff0480);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0260);*/ |
| } else if (resolution == 2) { |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);/*hv00*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x17f00bf);/*h01*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0d7006b);/*v01*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff023f);/*h23*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1af0143);/*v23*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x47f03bf);/*h45*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x287021b);/*v45*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff053f);/*h67*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x35f02f3);/*v67*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h89*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v89*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1011*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1011*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1213*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1213*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1415*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*v1415*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1617*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h1819*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h2021*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/*h2223*/ |
| } else if (resolution == 3) { |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1df00ef); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x10d0086); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x3bf02cf); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x21b0194); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x59f04af); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x32902a2); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f068f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x43703b0); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 4) { /* 5x6 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0040001); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x27f0136); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1af00d7); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff03bf); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x35f0287); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f063f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 5) { /* 8x2 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x31f02bb); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x233012b); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x30b0243); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x42d03d3); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 6) { /* 2x1 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x78002bb); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 7) { /* 2x2 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f03bf); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x437021b); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 8) { /* 3x5 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff017f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0167); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff047f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x780077f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 9) { /* 4x3 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4560333); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800666); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } else if (resolution == 10) { /* 6x8 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2430167); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000350); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x6000510); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4370410); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f0700); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780);*/ |
| /*Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438);*/ |
| } |
| } |
| |
| static void ldim_stts_set_region_tl1( |
| unsigned int resolution, |
| /* 0: auto calc by height/width/row_start/col_start |
| * 1: 720p |
| * 2: 1080p |
| */ |
| unsigned int height, unsigned int width, |
| unsigned int blk_height, unsigned int blk_width, |
| unsigned int row_start, unsigned int col_start, |
| unsigned int blk_vnum, unsigned int blk_hnum) |
| { |
| unsigned int data32, h_region_num; |
| unsigned int heightm1, widthm1; |
| unsigned int lights_mode = 0; |
| unsigned int hend[24], vend[16], i; |
| |
| memset(hend, 0, (sizeof(unsigned int) * 24)); |
| memset(vend, 0, (sizeof(unsigned int) * 16)); |
| |
| /* 0:normal 1:>24 h region */ |
| if (blk_hnum > 24) |
| lights_mode = 1; |
| h_region_num = blk_hnum; |
| if (ldim_debug_print) { |
| pr_info("%s: lights_mode=%d, h_region_num=%d\n", |
| __func__, lights_mode, h_region_num); |
| } |
| |
| heightm1 = height - 1; |
| widthm1 = width - 1; |
| |
| if (resolution == 0) { |
| hend[0] = col_start + blk_width - 1; |
| for (i = 1; i < 24; i++) { |
| hend[i] = (hend[i-1] + blk_width >= widthm1) ? |
| hend[i-1] : (hend[i-1] + blk_width); |
| } |
| vend[0] = row_start + blk_height - 1; |
| for (i = 1; i < 16; i++) { |
| vend[i] = (vend[i-1] + blk_height >= heightm1) ? |
| vend[i-1] : (vend[i-1] + blk_height); |
| } |
| |
| if (lights_mode == 1) { /* 31 h region */ |
| vend[8] = (hend[23] + blk_width >= widthm1) ? |
| hend[23] : (hend[23] + blk_width); |
| for (i = 9; i < 16; i++) { |
| vend[i] = (vend[i-1] + blk_width >= widthm1) ? |
| vend[i-1] : (vend[i-1] + blk_width); |
| } |
| } |
| |
| Wr_reg_bits(LDIM_STTS_CTRL0, lights_mode, 22, 2); |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xffe0ffff & data32); |
| Wr(LDIM_STTS_HIST_SET_REGION, |
| ((((row_start & 0x1fff) << 16) & 0xffff0000) | |
| (col_start & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[1] & 0x1fff) << 16) | |
| (hend[0] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[1] & 0x1fff) << 16) | |
| (vend[0] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[3] & 0x1fff) << 16) | |
| (hend[2] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[3] & 0x1fff) << 16) | |
| (vend[2] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[5] & 0x1fff) << 16) | |
| (hend[4] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[5] & 0x1fff) << 16) | |
| (vend[4] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[7] & 0x1fff) << 16) | |
| (hend[6] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[7] & 0x1fff) << 16) | |
| (vend[6] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[9] & 0x1fff) << 16) | |
| (hend[8] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[9] & 0x1fff) << 16) | |
| (vend[8] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[11] & 0x1fff) << 16) | |
| (hend[10] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[11] & 0x1fff) << 16) | |
| (vend[10] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[13] & 0x1fff) << 16) | |
| (hend[12] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[13] & 0x1fff) << 16) | |
| (vend[12] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[15] & 0x1fff) << 16) | |
| (hend[14] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((vend[15] & 0x1fff) << 16) | |
| (vend[14] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[17] & 0x1fff) << 16) | |
| (hend[16] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[19] & 0x1fff) << 16) | |
| (hend[18] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[21] & 0x1fff) << 16) | |
| (hend[20] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, (((hend[23] & 0x1fff) << 16) | |
| (hend[22] & 0x1fff))); |
| Wr(LDIM_STTS_HIST_SET_REGION, h_region_num); /*h region number*/ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0); /* line_n_int_num */ |
| } else if (resolution == 1) { |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0010010); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1000080); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0800040); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2000180); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x10000c0); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x3000280); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1800140); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000380); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x20001c0); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff0480); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0260); */ |
| } else if (resolution == 2) { |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000);/* hv00 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x17f00bf);/* h01 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0d7006b);/* v01 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff023f);/* h23 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1af0143);/* v23 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x47f03bf);/* h45 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x287021b);/* v45 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff053f);/* h67 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x35f02f3);/* v67 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h89 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v89 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1011 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v1011 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1213 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v1213 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1415 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* v1415 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1617 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h1819 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h2021 */ |
| Wr(LDIM_STTS_HIST_SET_REGION, 0xffe0ffe);/* h2223 */ |
| } else if (resolution == 3) { |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1df00ef); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x10d0086); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x3bf02cf); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x21b0194); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x59f04af); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x32902a2); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f068f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x43703b0); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 4) { /* 5x6 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0040001); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x27f0136); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x1af00d7); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4ff03bf); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x35f0287); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f063f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 5) { /* 8x2 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x31f02bb); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x233012b); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x30b0243); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x42d03d3); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 6) { /* 2x1 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0030002); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x78002bb); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0940031); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 7) { /* 2x2 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f03bf); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x437021b); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 8) { /* 3x5 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0000000); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2ff017f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2cf0167); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x5ff047f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380437); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x780077f); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 9) { /* 4x3 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4560333); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800666); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } else if (resolution == 10) { /* 6x8 */ |
| data32 = Rd(LDIM_STTS_HIST_REGION_IDX); |
| Wr(LDIM_STTS_HIST_REGION_IDX, 0xfff0ffff & data32); |
| |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x0010001); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2430167); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x2220180); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000350); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4000338); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x6000510); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4370410); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x77f0700); |
| Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x7800780); */ |
| /* Wr(LDIM_STTS_HIST_SET_REGION, 0x4380438); */ |
| } |
| } |
| |
| void ldim_stts_initial_txlx(unsigned int pic_h, unsigned int pic_v, |
| unsigned int blk_vnum, unsigned int blk_hnum) |
| { |
| unsigned int resolution, blk_height, blk_width; |
| unsigned int row_start, col_start; |
| |
| blk_vnum = (blk_vnum == 0) ? 1 : blk_vnum; |
| blk_hnum = (blk_hnum == 0) ? 1 : blk_hnum; |
| |
| resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff); |
| /*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/ |
| |
| blk_height = (pic_v - 8) / blk_vnum; |
| blk_width = (pic_h - 8) / blk_hnum; |
| row_start = (pic_v - (blk_height * blk_vnum)) >> 1; |
| col_start = (pic_h - (blk_width * blk_hnum)) >> 1; |
| |
| Wr_reg(LDIM_STTS_CTRL0, 7 << 2); |
| ldim_set_matrix_ycbcr2rgb(); |
| ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0); |
| |
| ldim_stts_set_region_txlx(0, blk_height, blk_width, |
| row_start, col_start, blk_hnum); |
| } |
| |
| void ldim_stts_initial_tl1(unsigned int pic_h, unsigned int pic_v, |
| unsigned int blk_vnum, unsigned int blk_hnum) |
| { |
| unsigned int resolution, blk_height, blk_width; |
| unsigned int row_start, col_start; |
| |
| blk_vnum = (blk_vnum == 0) ? 1 : blk_vnum; |
| blk_hnum = (blk_hnum == 0) ? 1 : blk_hnum; |
| |
| resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff); |
| /*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/ |
| |
| blk_height = (pic_v - 8) / blk_vnum; |
| blk_width = (pic_h - 8) / blk_hnum; |
| row_start = (pic_v - (blk_height * blk_vnum)) >> 1; |
| col_start = (pic_h - (blk_width * blk_hnum)) >> 1; |
| |
| ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0); |
| ldim_set_matrix_ycbcr2rgb(); |
| /*0:di 1:vdin 2:null 3:postblend 4:vpp out 5:vd1 6:vd2 7:osd1*/ |
| Wr_reg_bits(LDIM_STTS_CTRL0, 3, 3, 3); |
| |
| ldim_stts_set_region_tl1(0, pic_v, pic_h, blk_height, blk_width, |
| row_start, col_start, blk_vnum, blk_hnum); |
| } |
| |
| static unsigned int invalid_val_cnt; |
| void ldim_stts_read_region(unsigned int nrow, unsigned int ncol) |
| { |
| unsigned int i, j, k; |
| unsigned int data32; |
| struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver(); |
| |
| if (invalid_val_cnt > 0xfffffff) |
| invalid_val_cnt = 0; |
| |
| Wr(LDIM_STTS_HIST_REGION_IDX, Rd(LDIM_STTS_HIST_REGION_IDX) |
| & 0xffffc000); |
| data32 = Rd(LDIM_STTS_HIST_START_RD_REGION); |
| |
| for (i = 0; i < nrow; i++) { |
| for (j = 0; j < ncol; j++) { |
| data32 = Rd(LDIM_STTS_HIST_START_RD_REGION); |
| for (k = 0; k < 17; k++) { |
| if (k == 16) { |
| data32 = Rd(LDIM_STTS_HIST_READ_REGION); |
| ldim_drv->max_rgb[i * ncol + j] |
| = data32; |
| } else { |
| data32 = Rd(LDIM_STTS_HIST_READ_REGION); |
| ldim_drv->hist_matrix[i * ncol * 16 + |
| j * 16 + k] = data32; |
| } |
| if (!(data32 & 0x40000000)) |
| invalid_val_cnt++; |
| } |
| } |
| } |
| } |
| |
| /* VDIN_MATRIX_YUV601_RGB */ |
| /* -16 1.164 0 1.596 0 */ |
| /* -128 1.164 -0.391 -0.813 0 */ |
| /* -128 1.164 2.018 0 0 */ |
| /*{0x07c00600, 0x00000600, 0x04a80000, 0x066204a8, 0x1e701cbf, 0x04a80812, |
| * 0x00000000, 0x00000000, 0x00000000,}, |
| */ |
| void ldim_set_matrix_ycbcr2rgb(void) |
| { |
| Wr_reg_bits(LDIM_STTS_CTRL0, 1, 2, 1); /* enable matrix */ |
| |
| Wr(LDIM_STTS_MATRIX_PRE_OFFSET0_1, 0x07c00600); |
| Wr(LDIM_STTS_MATRIX_PRE_OFFSET2, 0x00000600); |
| Wr(LDIM_STTS_MATRIX_COEF00_01, 0x04a80000); |
| Wr(LDIM_STTS_MATRIX_COEF02_10, 0x066204a8); |
| Wr(LDIM_STTS_MATRIX_COEF11_12, 0x1e701cbf); |
| Wr(LDIM_STTS_MATRIX_COEF20_21, 0x04a80812); |
| Wr(LDIM_STTS_MATRIX_COEF22, 0x00000000); |
| Wr(LDIM_STTS_MATRIX_OFFSET0_1, 0x00000000); |
| Wr(LDIM_STTS_MATRIX_OFFSET2, 0x00000000); |
| } |
| |
| void ldim_set_matrix_rgb2ycbcr(int mode) |
| { |
| Wr_reg_bits(LDIM_STTS_CTRL0, 1, 2, 1); |
| if (mode == 0) {/*ycbcr not full range, 601 conversion*/ |
| Wr(LDIM_STTS_MATRIX_PRE_OFFSET0_1, 0x0); |
| Wr(LDIM_STTS_MATRIX_PRE_OFFSET2, 0x0); |
| /* 0.257 0.504 0.098 */ |
| /* -0.148 -0.291 0.439 */ |
| /* 0.439 -0.368 -0.071 */ |
| Wr(LDIM_STTS_MATRIX_COEF00_01, (0x107 << 16) | 0x204); |
| Wr(LDIM_STTS_MATRIX_COEF02_10, (0x64 << 16) | 0x1f68); |
| Wr(LDIM_STTS_MATRIX_COEF11_12, (0x1ed6 << 16) | 0x1c2); |
| Wr(LDIM_STTS_MATRIX_COEF20_21, (0x1c2 << 16) | 0x1e87); |
| Wr(LDIM_STTS_MATRIX_COEF22, 0x1fb7); |
| |
| Wr(LDIM_STTS_MATRIX_OFFSET2, 0x0200); |
| } else if (mode == 1) {/*ycbcr full range, 601 conversion*/ |
| /* todo */ |
| } |
| } |
| |
| void ldim_remap_update_txlx(struct LDReg_s *nPRM, |
| unsigned int avg_update_en, unsigned int matrix_update_en) |
| { |
| unsigned int data; |
| |
| if (avg_update_en) { |
| /* LD_BKLIT_PARAM */ |
| data = LDIM_RD_32Bits(REG_LD_BKLIT_PARAM); |
| data = (data & (~0xfff)) | (nPRM->reg_BL_matrix_AVG & 0xfff); |
| LDIM_WR_32Bits(REG_LD_BKLIT_PARAM, data); |
| |
| /* compensate */ |
| data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP); |
| data = (data & (~0xfff)) | |
| (nPRM->reg_BL_matrix_Compensate & 0xfff); |
| LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data); |
| } |
| |
| if (matrix_update_en) { |
| data = nPRM->reg_LD_BLK_Vnum * nPRM->reg_LD_BLK_Hnum; |
| LDIM_Update_Matrix(nPRM->BL_matrix, data); |
| } |
| } |