amvecm: Local Contrast ioctrl load interface support [1/4]
authorBencheng Jing <bencheng.jing@amlogic.com>
Wed, 27 Feb 2019 11:53:49 +0000 (19:53 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Thu, 7 Mar 2019 12:19:45 +0000 (04:19 -0800)
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 <bencheng.jing@amlogic.com>
drivers/amlogic/media/enhancement/amvecm/amve.c
drivers/amlogic/media/enhancement/amvecm/amve.h
drivers/amlogic/media/enhancement/amvecm/amvecm.c
drivers/amlogic/media/enhancement/amvecm/local_contrast.c
drivers/amlogic/media/enhancement/amvecm/local_contrast.h
include/linux/amlogic/media/amvecm/amvecm.h
include/linux/amlogic/media/amvecm/ve.h

index e87b26a..6bc63d6 100644 (file)
@@ -36,6 +36,7 @@
 #include "amve_gamma_table.h"
 #include <linux/io.h>
 #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)
index d90c1e0..6963dfe 100644 (file)
@@ -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);
index 12e2b30..7d37d77 100644 (file)
@@ -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)
 {
index f8167ac..cb792d8 100644 (file)
@@ -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,
index d9d7a22..9a27ace 100644 (file)
@@ -22,7 +22,8 @@
 #include <linux/amlogic/media/vfm/vframe.h>
 
 /*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,
index eeeb64d..0f5a6ab 100644 (file)
@@ -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)
index b891d3a..11ed510 100644 (file)
@@ -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;