From 877bdf598d79f12655cb4135086ec623cf1e8d70 Mon Sep 17 00:00:00 2001 From: Bencheng Jing Date: Wed, 27 Feb 2019 19:53:49 +0800 Subject: [PATCH] amvecm: Local Contrast ioctrl load interface support [1/4] PD#SWPL-3301 Problem: Local Contrast ioctrl load interface support Solution: add Local Contrast ioctrl load interface Verify: tl1 Change-Id: I1c2ed1f54a1fe85b589f95fe9e49f8c469f3e80d Signed-off-by: Bencheng Jing --- drivers/amlogic/media/enhancement/amvecm/amve.c | 14 ++++++ drivers/amlogic/media/enhancement/amvecm/amve.h | 2 + drivers/amlogic/media/enhancement/amvecm/amvecm.c | 52 +++++++++++++++++++++- .../media/enhancement/amvecm/local_contrast.c | 3 ++ .../media/enhancement/amvecm/local_contrast.h | 15 ++++++- include/linux/amlogic/media/amvecm/amvecm.h | 8 +++- include/linux/amlogic/media/amvecm/ve.h | 18 ++++++++ 7 files changed, 107 insertions(+), 5 deletions(-) diff --git a/drivers/amlogic/media/enhancement/amvecm/amve.c b/drivers/amlogic/media/enhancement/amvecm/amve.c index e87b26a..6bc63d6 100644 --- a/drivers/amlogic/media/enhancement/amvecm/amve.c +++ b/drivers/amlogic/media/enhancement/amvecm/amve.c @@ -36,6 +36,7 @@ #include "amve_gamma_table.h" #include #include "dnlp_cal.h" +#include "local_contrast.h" #define pr_amve_dbg(fmt, args...)\ do {\ @@ -766,6 +767,14 @@ void ve_dnlp_latch_process(void) } } +void ve_lc_latch_process(void) +{ + if (vecm_latch_flag & FLAG_VE_LC_CURV) { + vecm_latch_flag &= ~FLAG_VE_LC_CURV; + lc_load_curve(&lc_curve_parm_load); + } +} + void ve_lcd_gamma_process(void) { if (vecm_latch_flag & FLAG_GAMMA_TABLE_EN) { @@ -868,6 +877,11 @@ void ve_new_dnlp_param_update(void) vecm_latch_flag |= FLAG_VE_NEW_DNLP; } +void ve_lc_curve_update(void) +{ + vecm_latch_flag |= FLAG_VE_LC_CURV; +} + static void video_data_limitation(int *val) { if (*val > 1023) diff --git a/drivers/amlogic/media/enhancement/amvecm/amve.h b/drivers/amlogic/media/enhancement/amvecm/amve.h index d90c1e0..6963dfe 100644 --- a/drivers/amlogic/media/enhancement/amvecm/amve.h +++ b/drivers/amlogic/media/enhancement/amvecm/amve.h @@ -110,6 +110,8 @@ extern void ve_lcd_gamma_process(void); extern void lvds_freq_process(void); extern void ve_dnlp_param_update(void); extern void ve_new_dnlp_param_update(void); +extern void ve_lc_curve_update(void); +extern void ve_lc_latch_process(void); extern void ve_ogo_param_update(void); extern void am_set_regmap(struct am_regs_s *p); extern void sharpness_process(struct vframe_s *vf); diff --git a/drivers/amlogic/media/enhancement/amvecm/amvecm.c b/drivers/amlogic/media/enhancement/amvecm/amvecm.c index 12e2b30..7d37d77 100644 --- a/drivers/amlogic/media/enhancement/amvecm/amvecm.c +++ b/drivers/amlogic/media/enhancement/amvecm/amvecm.c @@ -1059,7 +1059,8 @@ void amvecm_video_latch(void) } /* #endif */ pq_user_latch_process(); - + if (cpu_after_eq(MESON_CPU_MAJOR_ID_TL1)) + ve_lc_latch_process(); } int amvecm_on_vs( @@ -1676,6 +1677,17 @@ static long amvecm_ioctl(struct file *file, ret = amvecm_set_contrast2(vdj_mode_s.contrast2); } break; + case AMVECM_IOC_S_LC_CURVE: + if (copy_from_user(&lc_curve_parm_load, + (void __user *)arg, + sizeof(struct ve_lc_curve_parm_s))) { + pr_amvecm_dbg("lc load curve parm fail\n"); + ret = -EFAULT; + } else { + ve_lc_curve_update(); + pr_amvecm_dbg("lc load curve parm success\n"); + } + break; default: ret = -EINVAL; break; @@ -5612,6 +5624,44 @@ static void lc_wr_reg(int *p, enum lc_reg_lut_e reg_sel) } } +unsigned int lc_saturation_curv[63]; +unsigned int lc_yminval_lmt_curv[12]; +unsigned int lc_ypkbv_ymaxval_lmt_curv[12]; +unsigned int lc_ypkbv_ratio_curv[4]; + +void lc_load_curve(struct ve_lc_curve_parm_s *p) +{ + unsigned int i; + + /*load lc parms*/ + lc_alg_parm.dbg_parm0 = p->param[lc_dbg_parm0]; + lc_alg_parm.dbg_parm1 = p->param[lc_dbg_parm1]; + lc_alg_parm.dbg_parm2 = p->param[lc_dbg_parm2]; + lc_alg_parm.dbg_parm3 = p->param[lc_dbg_parm3]; + lc_alg_parm.dbg_parm4 = p->param[lc_dbg_parm4]; + + /*load lc curve*/ + for (i = 0; i < 63; i++) + lc_saturation_curv[i] = p->ve_lc_saturation[i]; + for (i = 0; i < 12; i++) { + lc_yminval_lmt_curv[i] = + p->ve_lc_yminval_lmt[i]; + lc_ypkbv_ymaxval_lmt_curv[i] = + p->ve_lc_ypkbv_ymaxval_lmt[i]; + } + for (i = 0; i < 4; i++) + lc_ypkbv_ratio_curv[i] = p->ve_lc_ypkbv_ratio[i]; + + /*load lc_staturation curve*/ + lc_wr_reg(lc_saturation_curv, 0x1); + /*load lc_yminval_lmt*/ + lc_wr_reg(lc_yminval_lmt_curv, 0x2); + /*load lc_ypkbv_ymaxval_lmt*/ + lc_wr_reg(lc_ypkbv_ymaxval_lmt_curv, 0x4); + /*load lc_ypkbV_ratio*/ + lc_wr_reg(lc_ypkbv_ratio_curv, 0x8); +} + static ssize_t amvecm_lc_show(struct class *cla, struct class_attribute *attr, char *buf) { diff --git a/drivers/amlogic/media/enhancement/amvecm/local_contrast.c b/drivers/amlogic/media/enhancement/amvecm/local_contrast.c index f8167ac..cb792d8 100644 --- a/drivers/amlogic/media/enhancement/amvecm/local_contrast.c +++ b/drivers/amlogic/media/enhancement/amvecm/local_contrast.c @@ -76,6 +76,9 @@ unsigned int lc_hist_prcnt; unsigned int lc_curve_prcnt; bool lc_curve_fresh = true; +struct ve_lc_curve_parm_s lc_curve_parm_load; +struct lc_alg_param_s lc_alg_parm; + /*lc saturation gain, low parameters*/ static unsigned int lc_satur_gain[63] = { 51, 104, 158, 213, 269, 325, 382, 440, 498, diff --git a/drivers/amlogic/media/enhancement/amvecm/local_contrast.h b/drivers/amlogic/media/enhancement/amvecm/local_contrast.h index d9d7a22..9a27ace 100644 --- a/drivers/amlogic/media/enhancement/amvecm/local_contrast.h +++ b/drivers/amlogic/media/enhancement/amvecm/local_contrast.h @@ -22,7 +22,8 @@ #include /*V1.0: Local_contrast Basic function, iir algorithm, debug interface for tool*/ -#define LC_VER "Ref.2019/02/27-V1.0" +/*V1.1: add ioctrl load interface supprt*/ +#define LC_VER "Ref.2019/03/07-V1.1" enum lc_mtx_sel_e { INP_MTX = 0x1, @@ -48,6 +49,15 @@ enum lc_reg_lut_e { MAX_REG_LUT }; +struct lc_alg_param_s { + unsigned int dbg_parm0; + unsigned int dbg_parm1; + unsigned int dbg_parm2; + unsigned int dbg_parm3; + unsigned int dbg_parm4; +}; + + extern int amlc_debug; extern int lc_en; extern int lc_demo_mode; @@ -77,7 +87,8 @@ extern bool lc_curve_fresh; extern int *lc_szcurve;/*12*8*6+4*/ extern int *curve_nodes_cur; extern int *lc_hist;/*12*8*17*/ - +extern struct ve_lc_curve_parm_s lc_curve_parm_load; +extern struct lc_alg_param_s lc_alg_parm; extern void lc_init(void); extern void lc_process(struct vframe_s *vf, diff --git a/include/linux/amlogic/media/amvecm/amvecm.h b/include/linux/amlogic/media/amvecm/amvecm.h index eeeb64d..0f5a6ab 100644 --- a/include/linux/amlogic/media/amvecm/amvecm.h +++ b/include/linux/amlogic/media/amvecm/amvecm.h @@ -32,7 +32,7 @@ #define FLAG_VADJ1_COLOR (1 << 30) #define FLAG_VE_DNLP (1 << 29) #define FLAG_VE_NEW_DNLP (1 << 28) -#define FLAG_RSV27 (1 << 27) +#define FLAG_VE_LC_CURV (1 << 27) #define FLAG_RSV26 (1 << 26) #define FLAG_3D_BLACK_DIS (1 << 25) #define FLAG_3D_BLACK_EN (1 << 24) @@ -214,6 +214,10 @@ enum pc_mode_e { #define AMVECM_IOC_G_PIC_MODE _IOR(_VE_CM, 0x59, struct am_vdj_mode_s) #define AMVECM_IOC_S_PIC_MODE _IOW(_VE_CM, 0x60, struct am_vdj_mode_s) +/*Local contrast command list*/ +#define AMVECM_IOC_S_LC_CURVE _IOW(_VE_CM, 0x62, struct ve_lc_curve_parm_s) + + struct am_vdj_mode_s { int flag; int brightness; @@ -445,11 +449,11 @@ struct hdr_metadata_info_s { extern void vpp_vd_adj1_saturation_hue(signed int sat_val, signed int hue_val, struct vframe_s *vf); extern void amvecm_sharpness_enable(int sel); - extern int metadata_read_u32(uint32_t *value); extern int metadata_wait(struct vframe_s *vf); extern int metadata_sync(uint32_t frame_id, uint64_t pts); extern void amvecm_wakeup_queue(void); +extern void lc_load_curve(struct ve_lc_curve_parm_s *p); #ifndef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA #define VSYNC_WR_MPEG_REG(adr, val) WRITE_VPP_REG(adr, val) diff --git a/include/linux/amlogic/media/amvecm/ve.h b/include/linux/amlogic/media/amvecm/ve.h index b891d3a..11ed510 100644 --- a/include/linux/amlogic/media/amvecm/ve.h +++ b/include/linux/amlogic/media/amvecm/ve.h @@ -159,6 +159,24 @@ struct ve_dnlp_s { unsigned char gamma[64]; }; #endif + +struct ve_lc_curve_parm_s { + unsigned int ve_lc_saturation[63]; + unsigned int ve_lc_yminval_lmt[12]; + unsigned int ve_lc_ypkbv_ymaxval_lmt[12]; + unsigned int ve_lc_ypkbv_ratio[4]; + unsigned int param[100]; +}; + +enum lc_alg_param_e { + lc_dbg_parm0 = 0, + lc_dbg_parm1, + lc_dbg_parm2, + lc_dbg_parm3, + lc_dbg_parm4, + lc_dbg_parm_max, +}; + struct ve_hsvs_s { unsigned char en; unsigned char peak_gain_h1; -- 2.7.4