amvecm: modify dnlp algorithm

PD#161646: amvecm: modify dnlp algorithm

1. separate dnlp algorithm to dnlp_cal.c
2. modify dnlp algorithm
3. add dnlp curve debug interface

Change-Id: Ic5dd20f606b6cd612897c30ec09c6f0535ffefca
Signed-off-by: wenfeng.guo <wenfeng.guo@amlogic.com>
This commit is contained in:
wenfeng.guo
2018-03-07 19:34:52 +08:00
committed by Yixun Lan
parent 18898d41c5
commit eabf26b56e
8 changed files with 4580 additions and 3898 deletions

View File

@@ -3,5 +3,5 @@
#
obj-$(CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_VECM) += am_vecm.o
am_vecm-objs := amve.o amcm.o amcsc.o amvecm.o keystone_correction.o bitdepth.o set_hdr2_v0.o
am_vecm-objs := amve.o amcm.o amcsc.o amvecm.o keystone_correction.o bitdepth.o set_hdr2_v0.o dnlp_cal.o

File diff suppressed because it is too large Load Diff

View File

@@ -73,7 +73,6 @@ enum vlock_param_e {
extern struct ve_hist_s video_ve_hist;
extern unsigned int ve_size;
extern struct ve_dnlp_s am_ve_dnlp;
extern struct ve_dnlp_table_s am_ve_new_dnlp;
extern struct tcon_gamma_table_s video_gamma_table_r;
extern struct tcon_gamma_table_s video_gamma_table_g;
extern struct tcon_gamma_table_s video_gamma_table_b;
@@ -82,19 +81,6 @@ extern struct tcon_gamma_table_s video_gamma_table_g_adj;
extern struct tcon_gamma_table_s video_gamma_table_b_adj;
extern struct tcon_rgb_ogo_s video_rgb_ogo;
extern int glb_scurve[65];
extern int glb_clash_curve[65];
extern int glb_pst_gamma[65];
extern int gma_scurve0[65];
extern int gma_scurve1[65];
extern int gma_scurvet[65];
extern int clash_curve[65];
extern int clsh_scvbld[65];
extern int blk_gma_crv[65];
extern int blk_gma_bld[65];
extern int blkwht_ebld[65];
extern spinlock_t vpp_lcd_gamma_lock;
@@ -102,7 +88,6 @@ void ve_on_vs(struct vframe_s *vf);
void ve_set_bext(struct ve_bext_s *p);
void ve_set_dnlp(struct ve_dnlp_s *p);
void ve_set_new_dnlp(struct ve_dnlp_table_s *p);
void ve_set_dnlp_2(void);
void ve_set_hsvs(struct ve_hsvs_s *p);
void ve_set_ccor(struct ve_ccor_s *p);
@@ -194,6 +179,8 @@ extern int video_rgb_ogo_xvy_mtx;
/* 0:enc;1:pll;2:manual pll */
extern unsigned int vlock_mode;
extern unsigned int vlock_en;
extern unsigned int dnlp_sel;
extern void ve_dnlp_load_reg(void);
/*gxlx sr adaptive setting*/
extern void amve_sharpness_adaptive_setting(struct vframe_s *vf,

View File

@@ -56,6 +56,7 @@
#include "keystone_correction.h"
#include "bitdepth.h"
#include <linux/amlogic/media/amdolbyvision/dolby_vision.h>
#include "dnlp_cal.h"
#define pr_amvecm_dbg(fmt, args...)\
do {\
@@ -1032,21 +1033,16 @@ static long amvecm_ioctl(struct file *file,
case AMVECM_IOC_VE_DNLP_DIS:
vecm_latch_flag |= FLAG_VE_DNLP_DIS;
break;
case AMVECM_IOC_VE_DNLP:
if (copy_from_user(&am_ve_dnlp,
(void __user *)arg,
sizeof(struct ve_dnlp_s)))
ret = -EFAULT;
else
ve_dnlp_param_update();
break;
case AMVECM_IOC_VE_NEW_DNLP:
if (copy_from_user(&am_ve_new_dnlp,
(void __user *)arg,
sizeof(struct ve_dnlp_table_s)))
if (copy_from_user(&dnlp_curve_param_load,
(void __user *)arg,
sizeof(struct ve_dnlp_curve_param_s))) {
pr_amvecm_dbg("dnlp load fail\n");
ret = -EFAULT;
else
ve_new_dnlp_param_update();
} else {
ve_new_dnlp_param_update();
pr_amvecm_dbg("dnlp load success\n");
}
break;
case AMVECM_IOC_G_HIST_AVG:
argp = (void __user *)arg;
@@ -1171,156 +1167,443 @@ static long amvecm_compat_ioctl(struct file *file, unsigned int cmd,
}
#endif
static ssize_t amvecm_dnlp_curve_show(struct class *cla,
static ssize_t amvecm_dnlp_debug_show(struct class *cla,
struct class_attribute *attr, char *buf)
{
pr_info("echo gma_scurve0 > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo gma_scurve1 > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo gma_scurvet > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo clash_curve > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo clsh_scvbld > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo blk_gma_crv > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo blk_gma_bld > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo blkwht_ebld > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo wv glb_scurve idx value > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo wv glb_clash_curve idx value > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo wv glb_pst_gamma idx value > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo glb_scurve > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo glb_clash_curve > /sys/class/amvecm/dnlp_curve\n");
pr_info("echo glb_pst_gamma > /sys/class/amvecm/dnlp_curve\n");
return 0;
}
static ssize_t amvecm_dnlp_curve_store(struct class *cla,
static void str_sapr_to_d(char *s, int *d, int n)
{
int i, j, count;
long value;
char des[9] = {0};
count = (strlen(s) + n - 2) / (n - 1);
for (i = 0; i < count; i++) {
for (j = 0; j < n - 1; j++)
des[j] = s[j + i * (n - 1)];
des[n - 1] = '\0';
if (kstrtol(des, 10, &value) < 0)
return;
d[i] = value;
}
}
static void d_convert_str(int num,
int num_num, char cur_s[], int char_bit)
{
char buf[9] = {0};
int i, count;
snprintf(buf, sizeof(buf), "%d", num);
count = strlen(buf);
for (i = 0; i < count; i++)
buf[i + char_bit] = buf[i];
for (i = 0; i < char_bit; i++)
buf[i] = '0';
count = strlen(buf);
for (i = 0; i < char_bit; i++)
buf[i] = buf[count - char_bit + i];
if (num_num > 0) {
for (i = 0; i < char_bit; i++)
cur_s[i + num_num * char_bit] =
buf[i];
} else {
for (i = 0; i < char_bit; i++)
cur_s[i] = buf[i];
}
}
static ssize_t amvecm_dnlp_debug_store(struct class *cla,
struct class_attribute *attr, const char *buf, size_t count)
{
int i;
long val = 0;
unsigned int idx, value;
unsigned int num;
char *buf_orig, *parm[8] = {NULL};
int curve_val[65] = {0};
char *stemp = NULL;
if (!buf)
return count;
stemp = kmalloc(400, GFP_KERNEL);
if (!stemp)
return 0;
buf_orig = kstrdup(buf, GFP_KERNEL);
parse_param_amvecm(buf_orig, (char **)&parm);
if (!strncmp(parm[0], "wv", 2)) {
if (!strncmp(parm[1], "glb_scurve", 10)) {
if (kstrtoul(parm[2], 10, &val) < 0)
return -EINVAL;
idx = val;
if (kstrtoul(parm[3], 10, &val) < 0)
return -EINVAL;
value = val;
if (idx > 0 && idx < 66) {
glb_scurve[idx-1] = value;
pr_amvecm_dbg("idx = %d, value = %d\n",
idx, value);
}
} else if (!strncmp(parm[1], "glb_clash_curve", 15)) {
if (kstrtoul(parm[2], 10, &val) < 0)
return -EINVAL;
idx = val;
if (kstrtoul(parm[3], 10, &val) < 0)
return -EINVAL;
value = val;
if (idx > 0 && idx < 66) {
glb_clash_curve[idx-1] = value;
pr_amvecm_dbg("idx = %d, value = %d\n",
idx, value);
}
} else if (!strncmp(parm[1], "glb_pst_gamma", 13)) {
if (kstrtoul(parm[2], 10, &val) < 0)
return -EINVAL;
idx = val;
if (kstrtoul(parm[3], 10, &val) < 0)
return -EINVAL;
value = val;
if (idx > 0 && idx < 66) {
glb_pst_gamma[idx-1] = value;
pr_amvecm_dbg("idx = %d, value = %d\n",
idx, value);
if (!strcmp(parm[0], "r")) {/*read param*/
if (!strcmp(parm[1], "param")) {
if (!strcmp(parm[2], "all")) {
for (i = 0;
dnlp_parse_cmd[i].value; i++) {
pr_info("%d ",
*(dnlp_parse_cmd[i].value));
}
pr_info("\n");
} else
pr_info("error cmd\n");
} else {
for (i = 0;
dnlp_parse_cmd[i].value; i++) {
if (!strcmp(parm[1],
dnlp_parse_cmd[i].parse_string)) {
pr_info("%d\n",
*(dnlp_parse_cmd[i].value));
break;
}
}
}
} else if (!strcmp(parm[0], "w")) {/*write param*/
for (i = 0; dnlp_parse_cmd[i].value; i++) {
if (!strcmp(parm[1],
dnlp_parse_cmd[i].parse_string)) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
*(dnlp_parse_cmd[i].value) = val;
pr_amvecm_dbg(" %s: %d\n",
dnlp_parse_cmd[i].parse_string,
*(dnlp_parse_cmd[i].value));
break;
}
}
} else if (!strcmp(parm[0], "rc")) {/*read curve*/
if (!strcmp(parm[1], "scurv_low")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(dnlp_scurv_low[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 64) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", dnlp_scurv_low[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "scurv_mid1")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(dnlp_scurv_mid1[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 64) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", dnlp_scurv_mid1[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "scurv_mid2")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(dnlp_scurv_mid2[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 64) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", dnlp_scurv_mid2[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "scurv_hgh1")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(dnlp_scurv_hgh1[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 64) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", dnlp_scurv_hgh1[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "scurv_hgh2")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(dnlp_scurv_hgh2[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 64) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", dnlp_scurv_hgh2[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "gain_var_lut49")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 49; i++)
d_convert_str(gain_var_lut49[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 48) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", gain_var_lut49[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "wext_gain")) {
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 48; i++)
d_convert_str(wext_gain[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((val > 47) || (val < 0))
pr_info("error cmd\n");
else
pr_info("%d\n", wext_gain[val]);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "ve_dnlp_tgt")) {
/*read only curve*/
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(ve_dnlp_tgt[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "GmScurve")) {
/*read only curve*/
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(GmScurve[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "clash_curve")) {
/*read only curve*/
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(clash_curve[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "clsh_scvbld")) {
/*read only curve*/
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(clsh_scvbld[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "blkwht_ebld")) {
/*read only curve*/
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 65; i++)
d_convert_str(blkwht_ebld[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else
pr_info("error cmd\n");
} else if (!strcmp(parm[1], "vpp_histgram")) {
/*read only curve*/
if (!strcmp(parm[2], "all")) {
for (i = 0; i < 64; i++)
d_convert_str(
vpp_hist_param.vpp_histgram[i],
i, stemp, 4);
pr_info("%s\n", stemp);
} else
pr_info("error cmd\n");
}
} else if (!strcmp(parm[0], "wc")) {/*write curve*/
if (!strcmp(parm[1], "scurv_low")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 65; i++)
dnlp_scurv_low[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 64) || (num < 0))
pr_info("error cmd\n");
else
dnlp_scurv_low[num] = val;
}
} else if (!strcmp(parm[1], "scurv_mid1")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 65; i++)
dnlp_scurv_mid1[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 64) || (num < 0))
pr_info("error cmd\n");
else
dnlp_scurv_mid1[num] = val;
}
} else if (!strcmp(parm[1], "scurv_mid2")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 65; i++)
dnlp_scurv_mid2[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 64) || (num < 0))
pr_info("error cmd\n");
else
dnlp_scurv_mid2[num] = val;
}
} else if (!strcmp(parm[1], "scurv_hgh1")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 65; i++)
dnlp_scurv_hgh1[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 64) || (num < 0))
pr_info("error cmd\n");
else
dnlp_scurv_hgh1[num] = val;
}
} else if (!strcmp(parm[1], "scurv_hgh2")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 65; i++)
dnlp_scurv_hgh2[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 64) || (num < 0))
pr_info("error cmd\n");
else
dnlp_scurv_hgh2[num] = val;
}
} else if (!strcmp(parm[1], "gain_var_lut49")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 49; i++)
gain_var_lut49[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 48) || (num < 0))
pr_info("error cmd\n");
else
gain_var_lut49[num] = val;
}
} else if (!strcmp(parm[1], "wext_gain")) {
if (!strcmp(parm[2], "all")) {
str_sapr_to_d(parm[3], curve_val, 5);
for (i = 0; i < 48; i++)
wext_gain[i] = curve_val[i];
} else if (parm[2] != NULL) {
if (kstrtoul(parm[2], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
num = val;
if (kstrtoul(parm[3], 10, &val) < 0) {
kfree(buf_orig);
return -EINVAL;
}
if ((num > 47) || (num < 0))
pr_info("error cmd\n");
else
wext_gain[num] = val;
}
}
} else if (!strcmp(parm[0], "ro")) {
if (!strcmp(parm[1], "luma_avg4"))
pr_info("%d\n", ro_luma_avg4);
else if (!strcmp(parm[1], "var_d8"))
pr_info("%d\n", ro_var_d8);
else if (!strcmp(parm[1], "scurv_gain"))
pr_info("%d\n", ro_scurv_gain);
else if (!strcmp(parm[1], "blk_wht_ext0"))
pr_info("%d\n", ro_blk_wht_ext0);
else if (!strcmp(parm[1], "blk_wht_ext1"))
pr_info("%d\n", ro_blk_wht_ext1);
else if (!strcmp(parm[1], "dnlp_brightness"))
pr_info("%d\n", ro_dnlp_brightness);
else
pr_info("error cmd\n");
}
if (!strncmp(parm[0], "gma_scurve0", 11)) {
for (i = 0; i < 64; i++)
pr_info("gma_scurve0[%d] = %d\n", i, gma_scurve0[i]);
} else if (!strncmp(parm[0], "gma_scurve1", 11)) {
for (i = 0; i < 64; i++)
pr_info("gma_scurve1[%d] = %d\n", i, gma_scurve1[i]);
} else if (!strncmp(parm[0], "gma_scurvet", 11)) {
for (i = 0; i < 64; i++)
pr_info("gma_scurvet[%d] = %d\n", i, gma_scurvet[i]);
} else if (!strncmp(parm[0], "clash_curve", 11)) {
for (i = 0; i < 64; i++)
pr_info("clash_curve[%d] = %d\n", i, clash_curve[i]);
} else if (!strncmp(parm[0], "clsh_scvbld", 11)) {
for (i = 0; i < 64; i++)
pr_info("clsh_scvbld[%d] = %d\n", i, clsh_scvbld[i]);
} else if (!strncmp(parm[0], "blk_gma_crv", 11)) {
for (i = 0; i < 64; i++)
pr_info("blk_gma_crv[%d] = %d\n", i, blk_gma_crv[i]);
} else if (!strncmp(parm[0], "blk_gma_bld", 11)) {
for (i = 0; i < 64; i++)
pr_info("blk_gma_bld[%d] = %d\n", i, blk_gma_bld[i]);
} else if (!strncmp(parm[0], "blkwht_ebld", 11)) {
for (i = 0; i < 64; i++)
pr_info("blkwht_ebld[%d] = %d\n", i, blkwht_ebld[i]);
} else if (!strncmp(parm[0], "glb_scurve", 10)) {
for (i = 0; i < 64; i++)
pr_info("glb_scurve[%d] = %d\n", i, glb_scurve[i]);
} else if (!strncmp(parm[0], "glb_clash_curve", 15)) {
for (i = 0; i < 64; i++)
pr_info("glb_clash_curve[%d] = %d\n",
i, glb_clash_curve[i]);
} else if (!strncmp(parm[0], "glb_pst_gamma", 13)) {
for (i = 0; i < 64; i++)
pr_info("glb_pst_gamma[%d] = %d\n",
i, glb_pst_gamma[i]);
}
kfree(buf_orig);
return count;
}
static ssize_t amvecm_dnlp_show(struct class *cla,
struct class_attribute *attr, char *buf)
{
return sprintf(buf, "0x%x\n",
(am_ve_dnlp.en << 28) | (am_ve_dnlp.rt << 24) |
(am_ve_dnlp.rl << 16) | (am_ve_dnlp.black << 8) |
(am_ve_dnlp.white << 0));
}
/* [ 28] en 0~1 */
/* [27:20] rt 0~16 */
/* [19:16] rl-1 0~15 */
/* [15: 8] black 0~16 */
/* [ 7: 0] white 0~16 */
static ssize_t amvecm_dnlp_store(struct class *cla,
struct class_attribute *attr,
const char *buf, size_t count)
{
size_t r;
s32 val;
r = sscanf(buf, "0x%x", &val);
if ((r != 1) || (vecm_latch_flag & FLAG_VE_DNLP))
return -EINVAL;
am_ve_dnlp.en = (val & 0xf0000000) >> 28;
am_ve_dnlp.rt = (val & 0x0f000000) >> 24;
am_ve_dnlp.rl = (val & 0x00ff0000) >> 16;
am_ve_dnlp.black = (val & 0x0000ff00) >> 8;
am_ve_dnlp.white = (val & 0x000000ff) >> 0;
if (am_ve_dnlp.en > 1)
am_ve_dnlp.en = 1;
if (am_ve_dnlp.rl > 64)
am_ve_dnlp.rl = 64;
if (am_ve_dnlp.black > 16)
am_ve_dnlp.black = 16;
if (am_ve_dnlp.white > 16)
am_ve_dnlp.white = 16;
vecm_latch_flag |= FLAG_VE_DNLP;
kfree(stemp);
return count;
}
@@ -3867,6 +4150,9 @@ void init_pq_setting(void)
}
if (is_meson_gxlx_cpu())
amve_sharpness_init();
/*dnlp alg parameters init*/
dnlp_alg_param_init();
}
/* #endif*/
@@ -3961,11 +4247,9 @@ static void amvecm_wb_init(bool en)
static struct class_attribute amvecm_class_attrs[] = {
__ATTR(debug, 0644,
amvecm_debug_show, amvecm_debug_store),
__ATTR(dnlp, 0644,
amvecm_dnlp_show, amvecm_dnlp_store),
__ATTR(dnlp_curve, 0644,
amvecm_dnlp_curve_show,
amvecm_dnlp_curve_store),
__ATTR(dnlp_debug, 0644,
amvecm_dnlp_debug_show,
amvecm_dnlp_debug_store),
__ATTR(brightness, 0644,
amvecm_brightness_show, amvecm_brightness_store),
__ATTR(contrast, 0644,

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,108 @@
#ifndef __AM_DNLP_CAL_H
#define __AM_DNLP_CAL_H
struct dnlp_alg_param_s {
unsigned int dnlp_alg_enable;
unsigned int dnlp_respond;
unsigned int dnlp_sel;
unsigned int dnlp_respond_flag;
unsigned int dnlp_smhist_ck;
unsigned int dnlp_mvreflsh;
unsigned int dnlp_pavg_btsft;
unsigned int dnlp_dbg_i2r;
unsigned int dnlp_cuvbld_min;
unsigned int dnlp_cuvbld_max;
unsigned int dnlp_schg_sft;
unsigned int dnlp_bbd_ratio_low;
unsigned int dnlp_bbd_ratio_hig;
unsigned int dnlp_limit_rng;
unsigned int dnlp_range_det;
unsigned int dnlp_blk_cctr;
unsigned int dnlp_brgt_ctrl;
unsigned int dnlp_brgt_range;
unsigned int dnlp_brght_add;
unsigned int dnlp_brght_max;
unsigned int dnlp_dbg_adjavg;
unsigned int dnlp_auto_rng;
unsigned int dnlp_lowrange;
unsigned int dnlp_hghrange;
unsigned int dnlp_satur_rat;
unsigned int dnlp_satur_max;
unsigned int dnlp_set_saturtn;
unsigned int dnlp_sbgnbnd;
unsigned int dnlp_sendbnd;
unsigned int dnlp_clashBgn;
unsigned int dnlp_clashEnd;
unsigned int dnlp_var_th;
unsigned int dnlp_clahe_gain_neg;
unsigned int dnlp_clahe_gain_pos;
unsigned int dnlp_clahe_gain_delta;
unsigned int dnlp_mtdbld_rate;
unsigned int dnlp_adpmtd_lbnd;
unsigned int dnlp_adpmtd_hbnd;
unsigned int dnlp_blkext_ofst;
unsigned int dnlp_whtext_ofst;
unsigned int dnlp_blkext_rate;
unsigned int dnlp_whtext_rate;
unsigned int dnlp_bwext_div4x_min;
unsigned int dnlp_iRgnBgn;
unsigned int dnlp_iRgnEnd;
unsigned int dnlp_dbg_map;
unsigned int dnlp_final_gain;
unsigned int dnlp_cliprate_v3;
unsigned int dnlp_cliprate_min;
unsigned int dnlp_adpcrat_lbnd;
unsigned int dnlp_adpcrat_hbnd;
unsigned int dnlp_scurv_low_th;
unsigned int dnlp_scurv_mid1_th;
unsigned int dnlp_scurv_mid2_th;
unsigned int dnlp_scurv_hgh1_th;
unsigned int dnlp_scurv_hgh2_th;
unsigned int dnlp_mtdrate_adp_en;
};
struct dnlp_parse_cmd_s {
char *parse_string;
unsigned int *value;
};
extern struct ve_dnlp_table_s am_ve_new_dnlp;
extern struct ve_dnlp_curve_param_s dnlp_curve_param_load;
extern unsigned int ve_dnlp_rt;
extern unsigned char ve_dnlp_tgt[65];
extern int GmScurve[65];
extern int clash_curve[65];
extern int clsh_scvbld[65];
extern int blkwht_ebld[65];
extern bool ve_en;
extern unsigned int ve_dnlp_rt;
extern unsigned int ve_dnlp_luma_sum;
extern ulong ve_dnlp_lpf[64];
extern ulong ve_dnlp_reg[16];
extern ulong ve_dnlp_reg_def[16];
extern struct dnlp_parse_cmd_s dnlp_parse_cmd[];
extern int dnlp_scurv_low[65];
extern int dnlp_scurv_mid1[65];
extern int dnlp_scurv_mid2[65];
extern int dnlp_scurv_hgh1[65];
extern int dnlp_scurv_hgh2[65];
extern int gain_var_lut49[49];
extern int wext_gain[48];
extern int ro_luma_avg4;
extern int ro_var_d8;
extern int ro_scurv_gain;
extern int ro_blk_wht_ext0;
extern int ro_blk_wht_ext1;
extern int ro_dnlp_brightness;
extern void ve_dnlp_calculate_tgtx_v3(struct vframe_s *vf);
extern void ve_set_v3_dnlp(struct ve_dnlp_curve_param_s *p);
extern void ve_dnlp_calculate_lpf(void);
extern void ve_dnlp_calculate_reg(void);
extern void dnlp_alg_param_init(void);
#endif

View File

@@ -125,11 +125,10 @@ enum pq_table_name_e {
#define _VE_CM 'C'
#define AMVECM_IOC_VE_DNLP _IOW(_VE_CM, 0x21, struct ve_dnlp_s)
#define AMVECM_IOC_G_HIST_AVG _IOW(_VE_CM, 0x22, struct ve_hist_s)
#define AMVECM_IOC_VE_DNLP_EN _IO(_VE_CM, 0x23)
#define AMVECM_IOC_VE_DNLP_DIS _IO(_VE_CM, 0x24)
#define AMVECM_IOC_VE_NEW_DNLP _IOW(_VE_CM, 0x25, struct ve_dnlp_table_s)
#define AMVECM_IOC_VE_NEW_DNLP _IOW(_VE_CM, 0x25, struct ve_dnlp_curve_param_s)
#define AMVECM_IOC_G_HIST_BIN _IOW(_VE_CM, 0x26, struct vpp_hist_param_s)
#define AMVECM_IOC_G_HDR_METADATA _IOW(_VE_CM, 0x27, struct hdr_metadata_info_s)

View File

@@ -66,107 +66,92 @@ struct ve_hist_s {
int height;
int ave;
};
struct ve_dnlp_table_s {
unsigned int en;
unsigned int method;
unsigned int cliprate;
unsigned int lowrange;
unsigned int hghrange;
unsigned int lowalpha;
unsigned int midalpha;
unsigned int hghalpha;
unsigned int adj_level;
unsigned int new_adj_level;
unsigned int new_mvreflsh;
unsigned int new_gmma_rate;
unsigned int new_lowalpha;
unsigned int new_hghalpha;
unsigned int new_sbgnbnd;
unsigned int new_sendbnd;
unsigned int new_clashBgn;
unsigned int new_clashEnd;
unsigned int new_cliprate;
unsigned int new_mtdbld_rate;
unsigned int new_dnlp_pst_gmarat;
unsigned int dnlp_sel;
unsigned int dnlp_blk_cctr;/*blk signal add brightness*/
unsigned int dnlp_brgt_ctrl;
unsigned int dnlp_brgt_range;
unsigned int dnlp_brght_add;
unsigned int dnlp_brght_max;
unsigned int dnlp_almst_wht;
unsigned int dnlp_hghbin;/*1*/
unsigned int dnlp_hghnum;
unsigned int dnlp_lowbin;
unsigned int dnlp_lownum;
unsigned int dnlp_bkgend;
unsigned int dnlp_bkgert;
unsigned int dnlp_blkext;
unsigned int dnlp_whtext;
unsigned int dnlp_bextmx;
unsigned int dnlp_wextmx;
unsigned int dnlp_smhist_ck;
unsigned int dnlp_glb_crate;/*12*/
unsigned int dnlp_pstgma_brghtrate;
unsigned int dnlp_pstgma_brghtrat1;
unsigned int dnlp_wext_autorat;
unsigned int dnlp_cliprate_min;
unsigned int dnlp_adpcrat_lbnd;
unsigned int dnlp_adpcrat_hbnd;
unsigned int dnlp_adpmtd_lbnd;
unsigned int dnlp_adpmtd_hbnd;
unsigned int dnlp_set_bext;
unsigned int dnlp_set_wext;
unsigned int dnlp_satur_rat;
unsigned int dnlp_satur_max;
unsigned int blk_prct_rng;
unsigned int blk_prct_max;
unsigned int dnlp_lowrange;
unsigned int dnlp_hghrange;
unsigned int dnlp_auto_rng;
unsigned int dnlp_bin0_absmax;
unsigned int dnlp_bin0_sbtmax;
unsigned int dnlp_adpalpha_lrate;
unsigned int dnlp_adpalpha_hrate;
unsigned int dnlp_lrate00;/*0-64bin curve slope*/
unsigned int dnlp_lrate02;
unsigned int dnlp_lrate04;
unsigned int dnlp_lrate06;
unsigned int dnlp_lrate08;
unsigned int dnlp_lrate10;
unsigned int dnlp_lrate12;
unsigned int dnlp_lrate14;
unsigned int dnlp_lrate16;
unsigned int dnlp_lrate18;
unsigned int dnlp_lrate20;
unsigned int dnlp_lrate22;
unsigned int dnlp_lrate24;
unsigned int dnlp_lrate26;
unsigned int dnlp_lrate28;
unsigned int dnlp_lrate30;
unsigned int dnlp_lrate32;
unsigned int dnlp_lrate34;
unsigned int dnlp_lrate36;
unsigned int dnlp_lrate38;
unsigned int dnlp_lrate40;
unsigned int dnlp_lrate42;
unsigned int dnlp_lrate44;
unsigned int dnlp_lrate46;
unsigned int dnlp_lrate48;
unsigned int dnlp_lrate50;
unsigned int dnlp_lrate52;
unsigned int dnlp_lrate54;
unsigned int dnlp_lrate56;
unsigned int dnlp_lrate58;
unsigned int dnlp_lrate60;
unsigned int dnlp_lrate62;
};
struct vpp_hist_param_s {
unsigned int vpp_hist_pow;
unsigned int vpp_luma_sum;
unsigned int vpp_pixel_sum;
unsigned short vpp_histgram[64];
};
struct ve_dnlp_curve_param_s {
unsigned int ve_dnlp_scurv_low[65];
unsigned int ve_dnlp_scurv_mid1[65];
unsigned int ve_dnlp_scurv_mid2[65];
unsigned int ve_dnlp_scurv_hgh1[65];
unsigned int ve_dnlp_scurv_hgh2[65];
unsigned int ve_gain_var_lut49[49];
unsigned int ve_wext_gain[48];
unsigned int param[100];
};
enum dnlp_param_e {
ve_dnlp_enable = 0,
ve_dnlp_respond,
ve_dnlp_sel,
ve_dnlp_respond_flag,
ve_dnlp_smhist_ck,
ve_dnlp_mvreflsh,
ve_dnlp_pavg_btsft,
ve_dnlp_dbg_i2r,
ve_dnlp_cuvbld_min,
ve_dnlp_cuvbld_max,
ve_dnlp_schg_sft,
ve_dnlp_bbd_ratio_low,
ve_dnlp_bbd_ratio_hig,
ve_dnlp_limit_rng,
ve_dnlp_range_det,
ve_dnlp_blk_cctr,
ve_dnlp_brgt_ctrl,
ve_dnlp_brgt_range,
ve_dnlp_brght_add,
ve_dnlp_brght_max,
ve_dnlp_dbg_adjavg,
ve_dnlp_auto_rng,
ve_dnlp_lowrange,
ve_dnlp_hghrange,
ve_dnlp_satur_rat,
ve_dnlp_satur_max,
ve_dnlp_set_saturtn,
ve_dnlp_sbgnbnd,
ve_dnlp_sendbnd,
ve_dnlp_clashBgn,
ve_dnlp_clashEnd,
ve_dnlp_var_th,
ve_dnlp_clahe_gain_neg,
ve_dnlp_clahe_gain_pos,
ve_dnlp_clahe_gain_delta,
ve_dnlp_mtdbld_rate,
ve_dnlp_adpmtd_lbnd,
ve_dnlp_adpmtd_hbnd,
ve_dnlp_blkext_ofst,
ve_dnlp_whtext_ofst,
ve_dnlp_blkext_rate,
ve_dnlp_whtext_rate,
ve_dnlp_bwext_div4x_min,
ve_dnlp_iRgnBgn,
ve_dnlp_iRgnEnd,
ve_dnlp_dbg_map,
ve_dnlp_final_gain,
ve_dnlp_cliprate_v3,
ve_dnlp_cliprate_min,
ve_dnlp_adpcrat_lbnd,
ve_dnlp_adpcrat_hbnd,
ve_dnlp_scurv_low_th,
ve_dnlp_scurv_mid1_th,
ve_dnlp_scurv_mid2_th,
ve_dnlp_scurv_hgh1_th,
ve_dnlp_scurv_hgh2_th,
ve_dnlp_mtdrate_adp_en,
ve_dnlp_param_max,
};
enum dnlp_curve_e {
ve_scurv_low = 1000,
ve_scurv_mid1,
ve_scurv_mid2,
ve_scurv_hgh1,
ve_scurv_hgh2,
ve_curv_var_lut49,
ve_curv_wext_gain,
};
#else
struct ve_dnlp_s {
unsigned char en;