backlight: update ldim setting for tl1 [1/1]

PD#SWPL-2762

Problem:
ldim is changed for tl1

Solution:
update ldim setting for tl1

Verify:
x301

Change-Id: I21b10f27f4d1776db664c62fa7358b38801c7f53
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
This commit is contained in:
Evoke Zhang
2018-11-20 18:38:38 +08:00
parent 618b3a5d5c
commit e5f641e72d
13 changed files with 1545 additions and 760 deletions

View File

@@ -14730,6 +14730,7 @@ F: arch/arm64/boot/dts/amlogic/partition_mbox_ab_P_32.dtsi
AMLOGIC BACKLIGHT LDIM DRIVER
M: Evoke Zhang <evoke.zhang@amlogic.com>
F: drivers/amlogic/media/vout/backlight/aml_ldim/ldim_spi.c
F: drivers/amlogic/media/vout/backlight/aml_ldim/ldim_hw.c
AMLOGIC MESON TL1 DTS
M: Xingyu Chen <xingyu.chen@amlogic.com>

View File

@@ -879,6 +879,47 @@
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
};
backlight_3{
index = <3>;
bl_name = "pwm_combo_ldim_test";
bl_level_default_uboot_kernel = <31 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
410 110>; /*on_delay(ms), off_delay(ms)*/
bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
0 0>; /*pwm_1 range*/
bl_pwm_combo_port = "PWM_C","PWM_D";
bl_pwm_combo_attr = <1 /*pwm0 method*/
180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
100 25 /*pwm0 duty_max(%), duty_min(%)*/
1 /*pwm1 method*/
18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
80 80>; /*pwm1 duty_max(%), duty_min(%)*/
bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
bl_ldim_region_row_col = <2 10>;
};
backlight_4{
index = <4>;
bl_name = "ldim_global";
bl_level_default_uboot_kernel = <100 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
200 200>; /*on_delay(ms), off_delay(ms)*/
bl_ldim_region_row_col = <1 1>;
bl_ldim_mode = <1>; /*0=left/right side
*1=top/bottom side
*2=direct
*/
ldim_dev_index = <1>;
};
};
bl_pwm_conf:bl_pwm_conf{
@@ -892,4 +933,50 @@
};
};
local_dimming_device {
compatible = "amlogic, ldim_dev";
status = "okay";
pinctrl-names = "ldim_pwm",
"ldim_pwm_vs",
"ldim_pwm_off";
pinctrl-0 = <&pwm_c_pins3>;
pinctrl-1 = <&bl_pwm_vs_on_pins>;
pinctrl-2 = <&bl_pwm_off_pins>;
pinctrl_version = <1>; /* for uboot */
ldim_pwm_config = <&bl_pwm_conf>;
/* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
&gpio GPIOZ_5 GPIO_ACTIVE_HIGH
&gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
ldim_dev_0 {
index = <0>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "ob3350";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_B";
ldim_pwm_attr = <0 /* pol */
200 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <0 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
ldim_dev_1 {
index = <1>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "global";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_C";
ldim_pwm_attr = <1 /* pol */
180 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <2 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
};
}; /* end of / */

View File

@@ -882,6 +882,47 @@
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
};
backlight_3{
index = <3>;
bl_name = "pwm_combo_ldim_test";
bl_level_default_uboot_kernel = <31 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
410 110>; /*on_delay(ms), off_delay(ms)*/
bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
0 0>; /*pwm_1 range*/
bl_pwm_combo_port = "PWM_C","PWM_D";
bl_pwm_combo_attr = <1 /*pwm0 method*/
180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
100 25 /*pwm0 duty_max(%), duty_min(%)*/
1 /*pwm1 method*/
18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
80 80>; /*pwm1 duty_max(%), duty_min(%)*/
bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
bl_ldim_region_row_col = <2 10>;
};
backlight_4{
index = <4>;
bl_name = "ldim_global";
bl_level_default_uboot_kernel = <100 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
200 200>; /*on_delay(ms), off_delay(ms)*/
bl_ldim_region_row_col = <1 1>;
bl_ldim_mode = <1>; /*0=left/right side
*1=top/bottom side
*2=direct
*/
ldim_dev_index = <1>;
};
};
bl_pwm_conf:bl_pwm_conf{
@@ -895,4 +936,49 @@
};
};
local_dimming_device {
compatible = "amlogic, ldim_dev";
status = "okay";
pinctrl-names = "ldim_pwm",
"ldim_pwm_vs",
"ldim_pwm_off";
pinctrl-0 = <&pwm_c_pins3>;
pinctrl-1 = <&bl_pwm_vs_on_pins>;
pinctrl-2 = <&bl_pwm_off_pins>;
pinctrl_version = <1>; /* for uboot */
ldim_pwm_config = <&bl_pwm_conf>;
/* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
&gpio GPIOZ_5 GPIO_ACTIVE_HIGH
&gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
ldim_dev_0 {
index = <0>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "ob3350";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_B";
ldim_pwm_attr = <0 /* pol */
200 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <0 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
ldim_dev_1 {
index = <1>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "global";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_C";
ldim_pwm_attr = <1 /* pol */
180 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <2 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
};
}; /* end of / */

View File

@@ -879,6 +879,47 @@
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
};
backlight_3{
index = <3>;
bl_name = "pwm_combo_ldim_test";
bl_level_default_uboot_kernel = <31 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
410 110>; /*on_delay(ms), off_delay(ms)*/
bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
0 0>; /*pwm_1 range*/
bl_pwm_combo_port = "PWM_C","PWM_D";
bl_pwm_combo_attr = <1 /*pwm0 method*/
180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
100 25 /*pwm0 duty_max(%), duty_min(%)*/
1 /*pwm1 method*/
18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
80 80>; /*pwm1 duty_max(%), duty_min(%)*/
bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
bl_ldim_region_row_col = <2 10>;
};
backlight_4{
index = <4>;
bl_name = "ldim_global";
bl_level_default_uboot_kernel = <100 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
200 200>; /*on_delay(ms), off_delay(ms)*/
bl_ldim_region_row_col = <1 1>;
bl_ldim_mode = <1>; /*0=left/right side
*1=top/bottom side
*2=direct
*/
ldim_dev_index = <1>;
};
};
bl_pwm_conf:bl_pwm_conf{
@@ -892,4 +933,50 @@
};
};
local_dimming_device {
compatible = "amlogic, ldim_dev";
status = "okay";
pinctrl-names = "ldim_pwm",
"ldim_pwm_vs",
"ldim_pwm_off";
pinctrl-0 = <&pwm_c_pins3>;
pinctrl-1 = <&bl_pwm_vs_on_pins>;
pinctrl-2 = <&bl_pwm_off_pins>;
pinctrl_version = <1>; /* for uboot */
ldim_pwm_config = <&bl_pwm_conf>;
/* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
&gpio GPIOZ_5 GPIO_ACTIVE_HIGH
&gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
ldim_dev_0 {
index = <0>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "ob3350";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_B";
ldim_pwm_attr = <0 /* pol */
200 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <0 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
ldim_dev_1 {
index = <1>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "global";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_C";
ldim_pwm_attr = <1 /* pol */
180 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <2 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
};
}; /* end of / */

View File

@@ -882,6 +882,47 @@
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
};
backlight_3{
index = <3>;
bl_name = "pwm_combo_ldim_test";
bl_level_default_uboot_kernel = <31 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <2>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
410 110>; /*on_delay(ms), off_delay(ms)*/
bl_pwm_combo_level_mapping = <255 10 /*pwm_0 range*/
0 0>; /*pwm_1 range*/
bl_pwm_combo_port = "PWM_C","PWM_D";
bl_pwm_combo_attr = <1 /*pwm0 method*/
180 /*pwm0 freq(pwm:Hz, pwm_vs:multiple of vs)*/
100 25 /*pwm0 duty_max(%), duty_min(%)*/
1 /*pwm1 method*/
18000 /*pwm1 freq(pwm:Hz, pwm_vs:multi of vs)*/
80 80>; /*pwm1 duty_max(%), duty_min(%)*/
bl_pwm_combo_power = <1 0 /*pwm0 gpio_index, gpio_off*/
2 0 /*pwm1 gpio_index, gpio_off*/
10 10>; /*pwm_on_delay(ms), pwm_off_delay(ms)*/
bl_ldim_region_row_col = <2 10>;
};
backlight_4{
index = <4>;
bl_name = "ldim_global";
bl_level_default_uboot_kernel = <100 100>;
bl_level_attr = <255 10 /*max, min*/
128 128>; /*mid, mid_mapping*/
bl_ctrl_method = <3>; /*1=pwm,2=pwm_combo,3=ldim*/
bl_power_attr = <0 /*en_gpio_index*/
1 0 /*on_value, off_value*/
200 200>; /*on_delay(ms), off_delay(ms)*/
bl_ldim_region_row_col = <1 1>;
bl_ldim_mode = <1>; /*0=left/right side
*1=top/bottom side
*2=direct
*/
ldim_dev_index = <1>;
};
};
bl_pwm_conf:bl_pwm_conf{
@@ -895,4 +936,49 @@
};
};
local_dimming_device {
compatible = "amlogic, ldim_dev";
status = "okay";
pinctrl-names = "ldim_pwm",
"ldim_pwm_vs",
"ldim_pwm_off";
pinctrl-0 = <&pwm_c_pins3>;
pinctrl-1 = <&bl_pwm_vs_on_pins>;
pinctrl-2 = <&bl_pwm_off_pins>;
pinctrl_version = <1>; /* for uboot */
ldim_pwm_config = <&bl_pwm_conf>;
/* pwm port: PWM_A, PWM_B, PWM_C, PWM_D, PWM_E, PWM_F, PWM_VS*/
ldim_dev-gpios = <&gpio_ao GPIOAO_11 GPIO_ACTIVE_HIGH
&gpio GPIOZ_5 GPIO_ACTIVE_HIGH
&gpio GPIOZ_6 GPIO_ACTIVE_HIGH>;
ldim_dev_gpio_names = "GPIOAO_11","GPIOZ_5","GPIOZ_6";
ldim_dev_0 {
index = <0>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "ob3350";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_B";
ldim_pwm_attr = <0 /* pol */
200 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <0 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
ldim_dev_1 {
index = <1>;
type = <0>; /*0=normal, 1=spi, 2=i2c*/
ldim_dev_name = "global";
ldim_pwm_pinmux_sel = "ldim_pwm";
ldim_pwm_port = "PWM_C";
ldim_pwm_attr = <1 /* pol */
180 /*freq(pwm:Hz, pwm_vs:multiple of vs)*/
50>;/*duty(%)*/
dim_max_min = <100 20>; /*dim_max, dim_min*/
en_gpio_on_off = <2 /*ldim_dev-gpios index*/
1 0>; /*on_level, off_level*/
};
};
}; /* end of / */

View File

@@ -1535,7 +1535,8 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf,
bconf->power_on_delay = bl_para[3];
bconf->power_off_delay = bl_para[4];
}
ret = of_property_read_u32(child, "bl_ldim_mode", &bl_para[0]);
ret = of_property_read_u32(child, "bl_ldim_region_row_col",
&bl_para[0]);
if (ret == 0)
bconf->ldim_flag = 1;
@@ -1603,10 +1604,11 @@ static int aml_bl_config_load_from_dts(struct bl_config_s *bconf,
ret = of_property_read_u32(child,
"bl_pwm_en_sequence_reverse", &val);
if (ret) {
BLPR("don't find bl_pwm_en_sequence_reverse\n");
bconf->en_sequence_reverse = 0;
} else
} else {
bconf->en_sequence_reverse = val;
BLPR("find bl_pwm_en_sequence_reverse: %d\n", val);
}
bl_pwm->pwm_duty = bl_pwm->pwm_duty_min;
/* init pwm config */
@@ -2047,6 +2049,9 @@ static int aml_bl_pwm_channel_register(struct bl_config_s *bconf,
struct device_node *child;
struct bl_pwm_config_s *bl_pwm = NULL;
if (bl_debug_print_flag)
BLPR("%s\n", __func__);
ret = of_property_read_u32(blnode, "bl_pwm_config", &pwm_phandle);
if (ret) {
BLERR("not match bl_pwm_config node\n");
@@ -2110,8 +2115,6 @@ static int aml_bl_pwm_channel_register(struct bl_config_s *bconf,
bl_pwm->pwm_data.port_index, bl_pwm->pwm_data.pwm);
}
BLPR("%s ok\n", __func__);
return ret;
}

View File

@@ -3,6 +3,6 @@
#
obj-$(CONFIG_AMLOGIC_LOCAL_DIMMING) = aml_ldim.o ldim_dev_drv.o ldim_spi.o \
ob3350_bl.o global_bl.o iw7027_bl.o
aml_ldim-objs := ldim_drv.o ldim_func.o
aml_ldim-objs := ldim_drv.o ldim_func.o ldim_hw.o

View File

@@ -636,6 +636,9 @@ static int ldim_dev_pwm_channel_register(struct bl_pwm_config_s *bl_pwm,
struct device_node *child;
struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver();
if (ldim_debug_print)
LDIMPR("%s ok\n", __func__);
ret = of_property_read_u32(blnode, "ldim_pwm_config", &pwm_phandle);
if (ret) {
LDIMERR("not match ldim_pwm_config node\n");
@@ -683,8 +686,6 @@ static int ldim_dev_pwm_channel_register(struct bl_pwm_config_s *bl_pwm,
bl_pwm->pwm_data.port_index, bl_pwm->pwm_data.pwm);
}
LDIMPR("%s ok\n", __func__);
return ret;
}
@@ -1255,11 +1256,12 @@ static int ldim_dev_probe(struct platform_device *pdev)
ldim_drv->dev_index);
ldim_dev_add_driver(ldim_drv);
/* init ldim function */
if (ldim_drv->valid_flag)
ldim_drv->init();
LDIMPR("%s OK\n", __func__);
}
/* init ldim function */
if (ldim_drv->valid_flag)
ldim_drv->init();
LDIMPR("%s OK\n", __func__);
return 0;
}
@@ -1268,10 +1270,11 @@ static int __exit ldim_dev_remove(struct platform_device *pdev)
{
struct aml_ldim_driver_s *ldim_drv = aml_ldim_get_driver();
if (ldim_drv->dev_index != 0xff)
if (ldim_drv->dev_index != 0xff) {
ldim_dev_remove_driver(ldim_drv);
LDIMPR("%s OK\n", __func__);
}
LDIMPR("%s OK\n", __func__);
return 0;
}

View File

@@ -309,258 +309,22 @@ static void ldim_db_load_update(struct LDReg_s *mLDReg,
ldim_db_para_print(mLDReg);
}
static void ldim_stts_initial_txlx(unsigned int resolution)
{
Wr_reg(LDIM_STTS_CTRL0, 7 << 2);
ldim_set_matrix_ycbcr2rgb();
ldim_stts_en(resolution, 0, 0, 1, 1, 1, 0);
}
static void ldim_stts_initial(unsigned int pic_h, unsigned int pic_v,
unsigned int BLK_Vnum, unsigned int BLK_Hnum)
{
unsigned int resolution, resolution_region, 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;
LDIMPR("%s: %d %d %d %d\n", __func__, pic_h, pic_v, BLK_Vnum, BLK_Hnum);
ldim_fw_para.hist_col = BLK_Vnum;
ldim_fw_para.hist_row = BLK_Hnum;
resolution = (((pic_h - 1) & 0xffff) << 16) | ((pic_v - 1) & 0xffff);
/*Wr_reg(VDIN0_HIST_CTRL, 0x10d);*/
if (ldim_dev.ldim_op_func == NULL) {
LDIMERR("%s: invalid ldim_op_func\n", __func__);
return;
}
if (ldim_dev.ldim_op_func->stts_init)
ldim_dev.ldim_op_func->stts_init(resolution);
resolution_region = 0;
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_set_region(0, blk_height, blk_width,
row_start, col_start, BLK_Hnum);
}
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;
if (ldim_dev.ldim_op_func->stts_init) {
ldim_dev.ldim_op_func->stts_init(pic_h, pic_v,
BLK_Vnum, BLK_Hnum);
}
Previous_Matrix:
return 1;
}
static void ldim_initial_txlx(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 void LDIM_Initial(unsigned int pic_h, unsigned int pic_v,
@@ -591,105 +355,23 @@ static void LDIM_Initial(unsigned int pic_h, unsigned int pic_v,
LDIMERR("%s: invalid ldim_op_func\n", __func__);
return;
}
if (ldim_dev.ldim_op_func->ldim_init)
ldim_dev.ldim_op_func->ldim_init(ldim_bl_en, ldim_hvcnt_bypass);
}
static void ldim_update_matrix(unsigned int mode)
{
unsigned int data;
int bl_matrix[8] = {0};
unsigned int reg_BL_matrix_Compensate = 0x0;
int bl_matrix_1[8] = {0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff,
0xfff, 0xfff};
unsigned int reg_BL_matrix_Compensate_1 = 0xfff;
int bl_matrix_2[8] = {0xfff, 0xfff, 0xfff, 0x000, 0x000, 0xfff,
0xfff, 0xfff};
unsigned int reg_BL_matrix_Compensate_2 = 0xbff;
int bl_matrix_3[8] = {0, 0, 0, 0xfff, 0, 0, 0, 0};
unsigned int reg_BL_matrix_Compensate_3 = 0x1ff;
int bl_matrix_4[8] = {0xfff, 0xfff, 0xfff, 0, 0xfff, 0xfff,
0xfff, 0xfff};
unsigned int reg_BL_matrix_Compensate_4 = 0xdff;
data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
data = data & (~(3<<4));
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
/* gMatrix_LUT: s12*100 ==> max to 8*8 enum ##r/w ram method*/
if (mode == 0) {
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
&bl_matrix[0], 8);
/* compensate */
data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
data = data|(reg_BL_matrix_Compensate&0xfff);
LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
} else if (mode == 1) {
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
&bl_matrix_1[0], 8);
/* compensate */
data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
data = data | (reg_BL_matrix_Compensate_1 & 0xfff);
LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
} else if (mode == 2) {
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
&bl_matrix_2[0], 8);
/* compensate */
data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
data = data|(reg_BL_matrix_Compensate_2 & 0xfff);
LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
} else if (mode == 3) {
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
&bl_matrix_3[0], 8);
/* compensate */
data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
data = data | (reg_BL_matrix_Compensate_3 & 0xfff);
LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
} else if (mode == 4) {
LDIM_WR_BASE_LUT_DRT(REG_LD_MATRIX_BASE,
&bl_matrix_4[0], 8);
/* compensate */
data = LDIM_RD_32Bits(REG_LD_LIT_GAIN_COMP);
data = data | (reg_BL_matrix_Compensate_4 & 0xfff);
LDIM_WR_32Bits(REG_LD_LIT_GAIN_COMP, data);
if (ldim_dev.ldim_op_func->ldim_init) {
ldim_dev.ldim_op_func->ldim_init(&nPRM,
ldim_bl_en, ldim_hvcnt_bypass);
}
/* disable the CBUS configure the RAM */
data = LDIM_RD_32Bits(REG_LD_MISC_CTRL0);
data = data | (3<<4);
LDIM_WR_32Bits(REG_LD_MISC_CTRL0, data);
}
static void ldim_update_txlx(void)
{
unsigned int data;
if (ldim_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 (ldim_matrix_update_en)
LDIM_Update_Matrix(nPRM.BL_matrix, ldim_blk_row*ldim_blk_col);
}
static void ldim_update_setting(void)
static void ldim_remap_update(void)
{
if (ldim_dev.ldim_op_func == NULL) {
if (brightness_vs_cnt == 0)
LDIMERR("%s: invalid ldim_op_func\n", __func__);
return;
}
if (ldim_dev.ldim_op_func->update_setting)
ldim_dev.ldim_op_func->update_setting();
if (ldim_dev.ldim_op_func->remap_update) {
ldim_dev.ldim_op_func->remap_update(&nPRM,
ldim_avg_update_en, ldim_matrix_update_en);
}
}
static irqreturn_t ldim_vsync_isr(int irq, void *dev_id)
@@ -706,7 +388,7 @@ static irqreturn_t ldim_vsync_isr(int irq, void *dev_id)
if (ldim_func_en) {
if (ldim_avg_update_en)
ldim_update_setting();
ldim_remap_update();
if (ldim_hist_en) {
/*schedule_work(&ldim_on_vs_work);*/
@@ -1293,7 +975,7 @@ static void ldim_get_matrix_info(void)
}
pr_info("current black_frm: %d\n", ldim_fw_para.black_frm);
pr_info("spi transfer_matrix:\n");
pr_info("ldim_dev brightness transfer_matrix:\n");
for (i = 0; i < ldim_blk_row; i++) {
len = 0;
for (j = 0; j < ldim_blk_col; j++) {
@@ -1662,7 +1344,8 @@ static int ldim_on_init(void)
{
int ret = 0;
LDIMPR("%s\n", __func__);
if (ldim_debug_print)
LDIMPR("%s\n", __func__);
/* init ldim */
ldim_stts_initial(ldim_config.hsize, ldim_config.vsize,
@@ -1775,6 +1458,45 @@ struct aml_ldim_driver_s *aml_ldim_get_driver(void)
return &ldim_driver;
}
/* ******************************************************
* local dimming dummy function for virtual ldim dev
* ******************************************************
*/
static int ldim_virtual_smr(unsigned short *buf, unsigned char len)
{
return 0;
}
static int ldim_virtual_power_on(void)
{
return 0;
}
static int ldim_virtual_power_off(void)
{
return 0;
}
static int ldim_virtual_driver_update(struct aml_ldim_driver_s *ldim_drv)
{
ldim_drv->device_power_on = ldim_virtual_power_on;
ldim_drv->device_power_off = ldim_virtual_power_off;
ldim_drv->device_bri_update = ldim_virtual_smr;
return 0;
}
static int ldim_dev_add_virtual_driver(struct aml_ldim_driver_s *ldim_drv)
{
LDIMPR("%s\n", __func__);
ldim_virtual_driver_update(ldim_drv);
ldim_drv->init();
return 0;
}
/* ****************************************************** */
static int ldim_open(struct inode *inode, struct file *file)
{
struct ldim_dev_s *devp;
@@ -2356,16 +2078,6 @@ static ssize_t ldim_attr_store(struct class *cla,
pr_info("reg_addr: 0x%x=0x%x, readback: 0x%x\n",
reg_addr, reg_val, LDIM_RD_32Bits(reg_addr));
}
} else if (!strcmp(parm[0], "update_matrix")) {
unsigned int mode = 0;
if (parm[1] != NULL) {
if (kstrtouint(parm[1], 10, &mode) < 0)
goto ldim_attr_store_err;
ldim_update_matrix(mode);
pr_info("mode: %d\n", mode);
}
} else if (!strcmp(parm[0], "bl_remap_curve")) {
if (parm[1] != NULL) {
if (!strcmp(parm[1], "r")) {
@@ -2855,7 +2567,8 @@ static ssize_t ldim_attr_store(struct class *cla,
ldim_fw_para.Dbprint_lv);
} else if (!strcmp(parm[0], "info")) {
pr_info("ldim_drv_ver: %s\n", LDIM_DRV_VER);
ldim_driver.config_print();
if (ldim_driver.config_print)
ldim_driver.config_print();
pr_info("\nldim_blk_row = %d\n"
"ldim_blk_col = %d\n"
"ldim_hist_row = %d\n"
@@ -2944,10 +2657,32 @@ static ssize_t ldim_func_en_store(struct class *class,
return count;
}
static ssize_t ldim_para_show(struct class *class,
struct class_attribute *attr, char *buf)
{
int len = 0;
len = sprintf(buf, "boost_gain=%d\n", ldim_fw_para.boost_gain);
return len;
}
static ssize_t ldim_dump_show(struct class *class,
struct class_attribute *attr, char *buf)
{
int len = 0;
len = ldim_hw_reg_dump(buf);
return len;
}
static struct class_attribute aml_ldim_class_attrs[] = {
__ATTR(attr, 0644, ldim_attr_show, ldim_attr_store),
__ATTR(func_en, 0644,
ldim_func_en_show, ldim_func_en_store),
__ATTR(para, 0644, ldim_para_show, NULL),
__ATTR(dump, 0644, ldim_dump_show, NULL),
__ATTR_NULL,
};
@@ -3000,7 +2735,8 @@ int aml_ldim_get_config_dts(struct device_node *child)
LDIMERR("failed to get ldim_dev_index\n");
else
ldim_driver.dev_index = (unsigned char)para[0];
LDIMPR("get ldim_dev_index = %d\n", ldim_driver.dev_index);
if (ldim_driver.dev_index < 0xff)
LDIMPR("get ldim_dev_index = %d\n", ldim_driver.dev_index);
return 0;
}
@@ -3032,7 +2768,8 @@ int aml_ldim_get_config_unifykey(unsigned char *buf)
/* get ldim_dev_index 1byte*/
ldim_driver.dev_index = *(p + LCD_UKEY_BL_LDIM_DEV_INDEX);
LDIMPR("get dev_index = %d\n", ldim_driver.dev_index);
if (ldim_driver.dev_index < 0xff)
LDIMPR("get dev_index = %d\n", ldim_driver.dev_index);
return 0;
}
@@ -3192,17 +2929,52 @@ ldim_malloc_err0:
}
static struct ldim_operate_func_s ldim_op_func_txlx = {
.update_setting = ldim_update_txlx,
.h_region_max = 24,
.v_region_max = 16,
.total_region_max = 384,
.remap_update = ldim_remap_update_txlx,
.stts_init = ldim_stts_initial_txlx,
.ldim_init = ldim_initial_txlx,
};
static struct ldim_operate_func_s ldim_op_func_tl1 = {
.update_setting = NULL,
.stts_init = NULL,
.h_region_max = 31,
.v_region_max = 16,
.total_region_max = 128,
.remap_update = NULL,
.stts_init = ldim_stts_initial_tl1,
.ldim_init = NULL,
};
static int ldim_region_num_check(struct ldim_operate_func_s *ldim_func)
{
unsigned short temp;
if (ldim_func == NULL) {
LDIMERR("%s: ldim_func is NULL\n", __func__);
return -1;
}
if (ldim_config.row > ldim_func->v_region_max) {
LDIMERR("%s: blk row (%d) is out of support (%d)\n",
__func__, ldim_config.row, ldim_func->v_region_max);
return -1;
}
if (ldim_config.col > ldim_func->h_region_max) {
LDIMERR("%s: blk col (%d) is out of support (%d)\n",
__func__, ldim_config.col, ldim_func->h_region_max);
return -1;
}
temp = ldim_config.row * ldim_config.col;
if (temp > ldim_func->total_region_max) {
LDIMERR("%s: blk total region (%d) is out of support (%d)\n",
__func__, temp, ldim_func->total_region_max);
return -1;
}
return 0;
}
int aml_ldim_probe(struct platform_device *pdev)
{
int ret = 0;
@@ -3250,6 +3022,9 @@ int aml_ldim_probe(struct platform_device *pdev)
devp->ldim_op_func = NULL;
break;
}
ret = ldim_region_num_check(devp->ldim_op_func);
if (ret)
return -1;
ret = aml_ldim_malloc(ldim_blk_row, ldim_blk_col);
if (ret) {
@@ -3320,12 +3095,18 @@ int aml_ldim_probe(struct platform_device *pdev)
goto err;
}
ldim_vsync_irq = bl_drv->res_ldim_vsync_irq->start;
LDIMPR("ldim_vsync_irq: %d\n", ldim_vsync_irq);
if (ldim_debug_print)
LDIMPR("ldim_vsync_irq: %d\n", ldim_vsync_irq);
if (request_irq(ldim_vsync_irq, ldim_vsync_isr, IRQF_SHARED,
"ldim_vsync", (void *)"ldim_vsync"))
"ldim_vsync", (void *)"ldim_vsync")) {
LDIMERR("can't request ldim_vsync_irq\n");
else
LDIMPR("request ldim_vsync_irq successful\n");
} else {
if (ldim_debug_print)
LDIMPR("request ldim_vsync_irq successful\n");
}
if (bl_drv->bconf->method != BL_CTRL_LOCAL_DIMMING)
ldim_dev_add_virtual_driver(&ldim_driver);
ldim_driver.valid_flag = 1;

View File

@@ -25,7 +25,8 @@
/*20180820: pq tooling support, espically optimize some alg parameters */
/*20181101: fix ldim_op_func null mistake, add new spi api support */
/*20181203: add 50/60hz change & iw7027 error handle support */
#define LDIM_DRV_VER "20181203"
/*20181220: add tl1 support*/
#define LDIM_DRV_VER "20181220"
extern unsigned char ldim_debug_print;
@@ -39,25 +40,36 @@ extern int LD_remap_lut[16][32];
/*========================================*/
struct ldim_operate_func_s {
void (*update_setting)(void);
void (*stts_init)(unsigned int resolution);
void (*ldim_init)(unsigned int bl_en, unsigned int hvcnt_bypass);
unsigned short h_region_max;
unsigned short v_region_max;
unsigned short total_region_max;
void (*remap_update)(struct LDReg_s *nPRM,
unsigned int avg_update_en, unsigned int matrix_update_en);
void (*stts_init)(unsigned int pic_h, unsigned int pic_v,
unsigned int blk_vnum, unsigned int blk_hnum);
void (*ldim_init)(struct LDReg_s *nPRM,
unsigned int bl_en, unsigned int hvcnt_bypass);
};
/*========================================*/
extern int ldim_round(int ix, int ib);
extern 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);
extern void ldim_set_region(unsigned int resolution, unsigned int blk_height,
unsigned int blk_width, unsigned int row_start, unsigned int col_start,
unsigned int blk_hnum);
extern void LD_ConLDReg(struct LDReg_s *Reg);
extern void ld_fw_cfg_once(struct LDReg_s *nPRM);
extern void ldim_stts_read_region(unsigned int nrow, unsigned int ncol);
/* ldim hw */
extern int ldim_hw_reg_dump(char *buf);
extern void ldim_stts_read_region(unsigned int nrow, unsigned int ncol);
extern void ldim_set_matrix_ycbcr2rgb(void);
extern void ldim_set_matrix_rgb2ycbcr(int mode);
extern void ldim_initial_txlx(struct LDReg_s *nPRM,
unsigned int ldim_bl_en, unsigned int ldim_hvcnt_bypass);
extern void ldim_stts_initial_txlx(unsigned int pic_h, unsigned int pic_v,
unsigned int blk_vnum, unsigned int blk_hnum);
extern void ldim_stts_initial_tl1(unsigned int pic_h, unsigned int pic_v,
unsigned int blk_vnum, unsigned int blk_hnum);
extern void ldim_remap_update_txlx(struct LDReg_s *nPRM,
unsigned int avg_update_en, unsigned int matrix_update_en);
#endif

View File

@@ -38,9 +38,6 @@
#define MIN(a, b) ((a < b) ? a:b)
#endif
#define Wr(reg, val) Wr_reg(reg, val)
#define Rd(reg) Rd_reg(reg)
static int LD_BLK_Hidx[33] = {
/* S14* 33 */
-1920, -1440, -960, -480, 0, 480,
@@ -246,385 +243,6 @@ int ldim_round(int ix, int ib)
return ld_rst;
}
/***** 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*/
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);
}
void ldim_set_region(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 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 */
}
}
int Round(int iX, int iB)
{
int Rst = 0;

File diff suppressed because it is too large Load Diff

View File

@@ -23,8 +23,8 @@
#define ASSIST_SPARE8_REG1 0x1f58
/*gxtvbb new add*/
#define LDIM_STTS_CTRL0 0x1ac1
#define LDIM_STTS_GCLK_CTRL0 0x1ac0
#define LDIM_STTS_CTRL0 0x1ac1
#define LDIM_STTS_WIDTHM1_HEIGHTM1 0x1ac2
#define LDIM_STTS_MATRIX_COEF00_01 0x1ac3
#define LDIM_STTS_MATRIX_COEF02_10 0x1ac4