mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
amvecm: add ioctrl for sat/hue/contrast/pcmode/dnlp_en
PD#169671: amvecm: add ioctrl for sat/hue/contrast/pcmode/dnlp_en Change-Id: Ib5257a577274561d367f29c48d464e810f1b0f91 Signed-off-by: Bencheng Jing <bencheng.jing@amlogic.com>
This commit is contained in:
committed by
Jianxin Pan
parent
b3b7e9640b
commit
3f50fd6e5a
@@ -57,7 +57,7 @@ static unsigned int cm_width_limit = 50;/* vlsi adjust */
|
||||
module_param(cm_width_limit, uint, 0664);
|
||||
MODULE_PARM_DESC(cm_width_limit, "\n cm_width_limit\n");
|
||||
|
||||
int pq_reg_wr_rdma = 1;/* 0:disabel;1:enable */
|
||||
int pq_reg_wr_rdma;/* 0:disabel;1:enable */
|
||||
module_param(pq_reg_wr_rdma, int, 0664);
|
||||
MODULE_PARM_DESC(pq_reg_wr_rdma, "\n pq_reg_wr_rdma\n");
|
||||
|
||||
|
||||
@@ -306,7 +306,7 @@ module_param_array(wb_val, int, &num_wb_val, 0664);
|
||||
MODULE_PARM_DESC(wb_val, "\n white balance setting\n");
|
||||
|
||||
static enum vframe_source_type_e pre_src_type = VFRAME_SOURCE_TYPE_COMP;
|
||||
static uint cur_csc_type = 0xffff;
|
||||
uint cur_csc_type = 0xffff;
|
||||
module_param(cur_csc_type, uint, 0444);
|
||||
MODULE_PARM_DESC(cur_csc_type, "\n current color space convert type\n");
|
||||
|
||||
|
||||
@@ -47,36 +47,6 @@ enum vpp_matrix_sel_e {
|
||||
/* video1->cm->lut->vadj1->matrix1-^*/
|
||||
/* video2->matrix6-^*/
|
||||
|
||||
|
||||
enum vpp_matrix_csc_e {
|
||||
VPP_MATRIX_NULL = 0,
|
||||
VPP_MATRIX_RGB_YUV601 = 0x1,
|
||||
VPP_MATRIX_RGB_YUV601F = 0x2,
|
||||
VPP_MATRIX_RGB_YUV709 = 0x3,
|
||||
VPP_MATRIX_RGB_YUV709F = 0x4,
|
||||
VPP_MATRIX_YUV601_RGB = 0x10,
|
||||
VPP_MATRIX_YUV601_YUV601F = 0x11,
|
||||
VPP_MATRIX_YUV601_YUV709 = 0x12,
|
||||
VPP_MATRIX_YUV601_YUV709F = 0x13,
|
||||
VPP_MATRIX_YUV601F_RGB = 0x14,
|
||||
VPP_MATRIX_YUV601F_YUV601 = 0x15,
|
||||
VPP_MATRIX_YUV601F_YUV709 = 0x16,
|
||||
VPP_MATRIX_YUV601F_YUV709F = 0x17,
|
||||
VPP_MATRIX_YUV709_RGB = 0x20,
|
||||
VPP_MATRIX_YUV709_YUV601 = 0x21,
|
||||
VPP_MATRIX_YUV709_YUV601F = 0x22,
|
||||
VPP_MATRIX_YUV709_YUV709F = 0x23,
|
||||
VPP_MATRIX_YUV709F_RGB = 0x24,
|
||||
VPP_MATRIX_YUV709F_YUV601 = 0x25,
|
||||
VPP_MATRIX_YUV709F_YUV709 = 0x26,
|
||||
VPP_MATRIX_YUV601L_YUV709L = 0x27,
|
||||
VPP_MATRIX_YUV709L_YUV601L = 0x28,
|
||||
VPP_MATRIX_YUV709F_YUV601F = 0x29,
|
||||
VPP_MATRIX_BT2020YUV_BT2020RGB = 0x40,
|
||||
VPP_MATRIX_BT2020RGB_709RGB,
|
||||
VPP_MATRIX_BT2020RGB_CUSRGB,
|
||||
};
|
||||
|
||||
#define CSC_ON 1
|
||||
#define CSC_OFF 0
|
||||
|
||||
@@ -127,6 +97,8 @@ extern uint hdr_flag;
|
||||
extern int video_rgb_ogo_xvy_mtx_latch;
|
||||
extern int video_rgb_ogo_xvy_mtx;
|
||||
extern int tx_op_color_primary;
|
||||
extern uint cur_csc_type;
|
||||
|
||||
|
||||
extern int amvecm_matrix_process(
|
||||
struct vframe_s *vf, struct vframe_s *vf_rpt, int flags);
|
||||
|
||||
@@ -766,24 +766,10 @@ void ve_frame_size_patch(unsigned int width, unsigned int height)
|
||||
|
||||
void ve_dnlp_latch_process(void)
|
||||
{
|
||||
if (vecm_latch_flag & FLAG_VE_DNLP) {
|
||||
vecm_latch_flag &= ~FLAG_VE_DNLP;
|
||||
/*ve_set_dnlp(&am_ve_dnlp);*/
|
||||
}
|
||||
if (vecm_latch_flag & FLAG_VE_NEW_DNLP) {
|
||||
vecm_latch_flag &= ~FLAG_VE_NEW_DNLP;
|
||||
ve_set_v3_dnlp(&dnlp_curve_param_load);
|
||||
}
|
||||
if (vecm_latch_flag & FLAG_VE_DNLP_EN) {
|
||||
vecm_latch_flag &= ~FLAG_VE_DNLP_EN;
|
||||
ve_enable_dnlp();
|
||||
pr_amve_dbg("\n[amve..] set vpp_enable_dnlp OK!!!\n");
|
||||
}
|
||||
if (vecm_latch_flag & FLAG_VE_DNLP_DIS) {
|
||||
vecm_latch_flag &= ~FLAG_VE_DNLP_DIS;
|
||||
ve_disable_dnlp();
|
||||
pr_amve_dbg("\n[amve..] set vpp_disable_dnlp OK!!!\n");
|
||||
}
|
||||
if (dnlp_en && dnlp_status) {
|
||||
dnlp_status = 0;
|
||||
ve_set_dnlp_2();
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
#define AMVECM_MODULE_NAME "amvecm"
|
||||
#define AMVECM_DEVICE_NAME "amvecm"
|
||||
#define AMVECM_CLASS_NAME "amvecm"
|
||||
#define AMVECM_VER "Ref.2018/07/03"
|
||||
#define AMVECM_VER "Ref.2018/08/29"
|
||||
|
||||
|
||||
struct amvecm_dev_s {
|
||||
@@ -111,6 +111,16 @@ static unsigned int pc_mode = 0xff;
|
||||
static unsigned int pc_mode_last = 0xff;
|
||||
static struct hdr_metadata_info_s vpp_hdr_metadata_s;
|
||||
|
||||
/*bit0: brightness
|
||||
*bit1: brightness2
|
||||
*bit2: saturation_hue
|
||||
*bit3: saturation_hue_post
|
||||
*bit4: contrast
|
||||
*bit5: contrast2
|
||||
*/
|
||||
static int vdj_mode_flg;
|
||||
struct am_vdj_mode_s vdj_mode_s;
|
||||
|
||||
void __iomem *amvecm_hiu_reg_base;/* = *ioremap(0xc883c000, 0x2000); */
|
||||
|
||||
static int debug_amvecm;
|
||||
@@ -212,6 +222,26 @@ static int __init amvecm_load_pq_val(char *str)
|
||||
}
|
||||
__setup("pq=", amvecm_load_pq_val);
|
||||
|
||||
static int amvecm_set_contrast2(int val)
|
||||
{
|
||||
val += 0x80;
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ2_Y,
|
||||
val, 0, 8);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 2, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amvecm_set_brightness2(int val)
|
||||
{
|
||||
if (get_cpu_type() <= MESON_CPU_MAJOR_ID_GXTVBB)
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ2_Y,
|
||||
vdj_mode_s.brightness2, 8, 9);
|
||||
else
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ2_Y,
|
||||
vdj_mode_s.brightness2 << 1, 8, 10);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 2, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void amvecm_size_patch(void)
|
||||
{
|
||||
@@ -317,14 +347,7 @@ static ssize_t video_adj2_brightness_store(struct class *cla,
|
||||
r = sscanf(buf, "%d\n", &val);
|
||||
if ((r != 1) || (val < -255) || (val > 255))
|
||||
return -EINVAL;
|
||||
|
||||
if (get_cpu_type() <= MESON_CPU_MAJOR_ID_GXTVBB)
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ2_Y, val, 8, 9);
|
||||
else
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ2_Y, val << 1, 8, 10);
|
||||
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 2, 1);
|
||||
|
||||
amvecm_set_brightness2(val);
|
||||
return count;
|
||||
}
|
||||
|
||||
@@ -345,13 +368,9 @@ static ssize_t video_adj2_contrast_store(struct class *cla,
|
||||
r = sscanf(buf, "%d\n", &val);
|
||||
if ((r != 1) || (val < -127) || (val > 127))
|
||||
return -EINVAL;
|
||||
|
||||
val += 0x80;
|
||||
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ2_Y, val, 0, 8);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 2, 1);
|
||||
|
||||
amvecm_set_contrast2(val);
|
||||
return count;
|
||||
|
||||
}
|
||||
|
||||
static ssize_t amvecm_usage_show(struct class *cla,
|
||||
@@ -1034,6 +1053,130 @@ static int amvecm_release(struct inode *inode, struct file *file)
|
||||
static struct am_regs_s amregs_ext;
|
||||
struct ve_pq_overscan_s overscan_table[TIMING_MAX];
|
||||
|
||||
static int parse_para_pq(const char *para, int para_num, int *result)
|
||||
{
|
||||
char *token = NULL;
|
||||
char *params, *params_base;
|
||||
int *out = result;
|
||||
int len = 0, count = 0;
|
||||
int res = 0;
|
||||
|
||||
if (!para)
|
||||
return 0;
|
||||
|
||||
params = kstrdup(para, GFP_KERNEL);
|
||||
params_base = params;
|
||||
token = params;
|
||||
len = strlen(token);
|
||||
do {
|
||||
token = strsep(¶ms, " ");
|
||||
while (token && (isspace(*token)
|
||||
|| !isgraph(*token)) && len) {
|
||||
token++;
|
||||
len--;
|
||||
}
|
||||
if (len == 0)
|
||||
break;
|
||||
if (!token || kstrtoint(token, 0, &res) < 0)
|
||||
break;
|
||||
len = strlen(token);
|
||||
*out++ = res;
|
||||
count++;
|
||||
} while ((token) && (count < para_num) && (len > 0));
|
||||
|
||||
kfree(params_base);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int amvecm_set_saturation_hue(int mab)
|
||||
{
|
||||
s16 mc = 0, md = 0;
|
||||
s16 ma, mb;
|
||||
|
||||
if (mab&0xfc00fc00)
|
||||
return -EINVAL;
|
||||
ma = (s16)((mab << 6) >> 22);
|
||||
mb = (s16)((mab << 22) >> 22);
|
||||
|
||||
saturation_ma = ma - 0x100;
|
||||
saturation_mb = mb;
|
||||
|
||||
ma += saturation_ma_shift;
|
||||
mb += saturation_mb_shift;
|
||||
if (ma > 511)
|
||||
ma = 511;
|
||||
if (ma < -512)
|
||||
ma = -512;
|
||||
if (mb > 511)
|
||||
mb = 511;
|
||||
if (mb < -512)
|
||||
mb = -512;
|
||||
mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
|
||||
WRITE_VPP_REG(VPP_VADJ1_MA_MB, mab);
|
||||
mc = (s16)((mab<<22)>>22); /* mc = -mb */
|
||||
mc = 0 - mc;
|
||||
if (mc > 511)
|
||||
mc = 511;
|
||||
if (mc < -512)
|
||||
mc = -512;
|
||||
md = (s16)((mab<<6)>>22); /* md = ma; */
|
||||
mab = ((mc&0x3ff)<<16)|(md&0x3ff);
|
||||
WRITE_VPP_REG(VPP_VADJ1_MC_MD, mab);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 0, 1);
|
||||
pr_amvecm_dbg("%s set video_saturation_hue OK!!!\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amvecm_set_saturation_hue_post(int val1,
|
||||
int val2)
|
||||
{
|
||||
int i, ma, mb, mab, mc, md;
|
||||
int hue_cos[] = {
|
||||
/*0~12*/
|
||||
256, 256, 256, 255, 255, 254, 253, 252, 251, 250,
|
||||
248, 247, 245, 243, 241, 239, 237, 234, 231, 229,
|
||||
226, 223, 220, 216, 213, 209 /*13~25*/
|
||||
};
|
||||
int hue_sin[] = {
|
||||
-147, -142, -137, -132, -126, -121, -115, -109, -104,
|
||||
-98, -92, -86, -80, /*-25~-13*/-74, -68, -62, -56,
|
||||
-50, -44, -38, -31, -25, -19, -13, -6, /*-12~-1*/
|
||||
0, /*0*/
|
||||
6, 13, 19, 25, 31, 38, 44, 50, 56,
|
||||
62, 68, 74, /*1~12*/ 80, 86, 92, 98, 104,
|
||||
109, 115, 121, 126, 132, 137, 142, 147 /*13~25*/
|
||||
};
|
||||
|
||||
saturation_post = val1;
|
||||
hue_post = val2;
|
||||
i = (hue_post > 0) ? hue_post : -hue_post;
|
||||
ma = (hue_cos[i]*(saturation_post + 128)) >> 7;
|
||||
mb = (hue_sin[25+hue_post]*(saturation_post + 128)) >> 7;
|
||||
if (ma > 511)
|
||||
ma = 511;
|
||||
if (ma < -512)
|
||||
ma = -512;
|
||||
if (mb > 511)
|
||||
mb = 511;
|
||||
if (mb < -512)
|
||||
mb = -512;
|
||||
mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
|
||||
pr_info("\n[amvideo..] saturation_post:%d hue_post:%d mab:%x\n",
|
||||
saturation_post, hue_post, mab);
|
||||
WRITE_VPP_REG(VPP_VADJ2_MA_MB, mab);
|
||||
mc = (s16)((mab<<22)>>22); /* mc = -mb */
|
||||
mc = 0 - mc;
|
||||
if (mc > 511)
|
||||
mc = 511;
|
||||
if (mc < -512)
|
||||
mc = -512;
|
||||
md = (s16)((mab<<6)>>22); /* md = ma; */
|
||||
mab = ((mc&0x3ff)<<16)|(md&0x3ff);
|
||||
WRITE_VPP_REG(VPP_VADJ2_MC_MD, mab);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 2, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long amvecm_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
@@ -1076,12 +1219,6 @@ static long amvecm_ioctl(struct file *file,
|
||||
} else
|
||||
ret = cm_load_reg(&amregs_ext);
|
||||
break;
|
||||
case AMVECM_IOC_VE_DNLP_EN:
|
||||
vecm_latch_flag |= FLAG_VE_DNLP_EN;
|
||||
break;
|
||||
case AMVECM_IOC_VE_DNLP_DIS:
|
||||
vecm_latch_flag |= FLAG_VE_DNLP_DIS;
|
||||
break;
|
||||
case AMVECM_IOC_VE_NEW_DNLP:
|
||||
if (copy_from_user(&dnlp_curve_param_load,
|
||||
(void __user *)arg,
|
||||
@@ -1198,7 +1335,7 @@ static long amvecm_ioctl(struct file *file,
|
||||
case AMVECM_IOC_3D_SYNC_DIS:
|
||||
vecm_latch_flag |= FLAG_3D_SYNC_DIS;
|
||||
break;
|
||||
case AMVECM_IOC_GET_OVERSCAN:
|
||||
case AMVECM_IOC_SET_OVERSCAN:
|
||||
if (copy_from_user(&vpp_pq_load,
|
||||
(void __user *)arg,
|
||||
sizeof(struct ve_pq_load_s))) {
|
||||
@@ -1252,6 +1389,114 @@ static long amvecm_ioctl(struct file *file,
|
||||
(vpp_pq_load_table[i].value2 >> 16) & 0xffff;
|
||||
}
|
||||
break;
|
||||
case AMVECM_IOC_G_DNLP_STATE:
|
||||
if (copy_to_user((void __user *)arg,
|
||||
&dnlp_en, sizeof(enum dnlp_state_e)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
case AMVECM_IOC_S_DNLP_STATE:
|
||||
if (copy_from_user(&dnlp_en,
|
||||
(void __user *)arg, sizeof(enum dnlp_state_e)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
case AMVECM_IOC_G_PQMODE:
|
||||
argp = (void __user *)arg;
|
||||
if (copy_to_user(argp,
|
||||
&pc_mode, sizeof(enum pc_mode_e)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
case AMVECM_IOC_S_PQMODE:
|
||||
if (copy_from_user(&pc_mode,
|
||||
(void __user *)arg, sizeof(enum pc_mode_e)))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
pc_mode_last = 0xff;
|
||||
break;
|
||||
case AMVECM_IOC_G_CSCTYPE:
|
||||
argp = (void __user *)arg;
|
||||
if (copy_to_user(argp,
|
||||
&cur_csc_type, sizeof(enum vpp_matrix_csc_e)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
case AMVECM_IOC_S_CSCTYPE:
|
||||
if (copy_from_user(&cur_csc_type,
|
||||
(void __user *)arg,
|
||||
sizeof(enum vpp_matrix_csc_e))) {
|
||||
ret = -EFAULT;
|
||||
pr_amvecm_dbg("[amvecm..] cur_csc_type ioctl copy fail!!\n");
|
||||
}
|
||||
break;
|
||||
case AMVECM_IOC_G_PIC_MODE:
|
||||
argp = (void __user *)arg;
|
||||
if (copy_to_user(argp,
|
||||
&vdj_mode_s, sizeof(struct am_vdj_mode_s)))
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
case AMVECM_IOC_S_PIC_MODE:
|
||||
if (copy_from_user(&vdj_mode_s,
|
||||
(void __user *)arg,
|
||||
sizeof(struct am_vdj_mode_s))) {
|
||||
ret = -EFAULT;
|
||||
pr_amvecm_dbg("[amvecm..] vdj_mode_s ioctl copy fail!!\n");
|
||||
break;
|
||||
}
|
||||
vdj_mode_flg = vdj_mode_s.flag;
|
||||
if (vdj_mode_flg & 0x1) { /*brightness*/
|
||||
vd1_brightness = vdj_mode_s.brightness;
|
||||
vecm_latch_flag |= FLAG_VADJ1_BRI;
|
||||
}
|
||||
if (vdj_mode_flg & 0x2) { /*brightness2*/
|
||||
if ((vdj_mode_s.brightness2 < -255) ||
|
||||
(vdj_mode_s.brightness2 > 255)) {
|
||||
pr_amvecm_dbg("load brightness2 value invalid!!!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = amvecm_set_brightness2(vdj_mode_s.brightness2);
|
||||
}
|
||||
if (vdj_mode_flg & 0x4) { /*saturation_hue*/
|
||||
ret =
|
||||
amvecm_set_saturation_hue(vdj_mode_s.saturation_hue);
|
||||
}
|
||||
if (vdj_mode_flg & 0x8) { /*saturation_hue_post*/
|
||||
int parsed[2];
|
||||
int saturation_hue_post;
|
||||
char *buf;
|
||||
|
||||
saturation_hue_post = vdj_mode_s.saturation_hue_post;
|
||||
buf = (char *) &saturation_hue_post;
|
||||
if (likely(parse_para_pq(buf, 2, parsed) != 2)) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
if ((parsed[0] < -128) || (parsed[0] > 128) ||
|
||||
(parsed[1] < -25) || (parsed[1] > 25)) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
ret = amvecm_set_saturation_hue_post(parsed[0],
|
||||
parsed[1]);
|
||||
}
|
||||
if (vdj_mode_flg & 0x10) { /*contrast*/
|
||||
if ((vdj_mode_s.contrast < -1024)
|
||||
|| (vdj_mode_s.contrast > 1024)) {
|
||||
ret = -EINVAL;
|
||||
pr_amvecm_dbg("[amvecm..] ioctrl contrast value invalid!!\n");
|
||||
break;
|
||||
}
|
||||
vd1_contrast = vdj_mode_s.contrast;
|
||||
vecm_latch_flag |= FLAG_VADJ1_CON;
|
||||
vecm_latch_flag |= FLAG_VADJ1_COLOR;
|
||||
}
|
||||
if (vdj_mode_flg & 0x20) { /*constract2*/
|
||||
if ((vdj_mode_s.contrast2 < -127)
|
||||
|| (vdj_mode_s.contrast2 > 127)) {
|
||||
ret = -EINVAL;
|
||||
pr_amvecm_dbg("[amvecm..] ioctrl contrast2 value invalid!!\n");
|
||||
break;
|
||||
}
|
||||
ret = amvecm_set_contrast2(vdj_mode_s.contrast2);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
@@ -1827,77 +2072,13 @@ static ssize_t amvecm_saturation_hue_store(struct class *cla,
|
||||
{
|
||||
size_t r;
|
||||
s32 mab = 0;
|
||||
s16 mc = 0, md = 0;
|
||||
s16 ma, mb;
|
||||
|
||||
r = sscanf(buf, "0x%x", &mab);
|
||||
if ((r != 1) || (mab&0xfc00fc00))
|
||||
return -EINVAL;
|
||||
ma = (s16)((mab << 6) >> 22);
|
||||
mb = (s16)((mab << 22) >> 22);
|
||||
|
||||
saturation_ma = ma - 0x100;
|
||||
saturation_mb = mb;
|
||||
|
||||
ma += saturation_ma_shift;
|
||||
mb += saturation_mb_shift;
|
||||
if (ma > 511)
|
||||
ma = 511;
|
||||
if (ma < -512)
|
||||
ma = -512;
|
||||
if (mb > 511)
|
||||
mb = 511;
|
||||
if (mb < -512)
|
||||
mb = -512;
|
||||
mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
|
||||
WRITE_VPP_REG(VPP_VADJ1_MA_MB, mab);
|
||||
mc = (s16)((mab<<22)>>22); /* mc = -mb */
|
||||
mc = 0 - mc;
|
||||
if (mc > 511)
|
||||
mc = 511;
|
||||
if (mc < -512)
|
||||
mc = -512;
|
||||
md = (s16)((mab<<6)>>22); /* md = ma; */
|
||||
mab = ((mc&0x3ff)<<16)|(md&0x3ff);
|
||||
WRITE_VPP_REG(VPP_VADJ1_MC_MD, mab);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 0, 1);
|
||||
pr_amvecm_dbg("%s set video_saturation_hue OK!!!\n", __func__);
|
||||
amvecm_set_saturation_hue(mab);
|
||||
return count;
|
||||
}
|
||||
|
||||
static int parse_para_pq(const char *para, int para_num, int *result)
|
||||
{
|
||||
char *token = NULL;
|
||||
char *params, *params_base;
|
||||
int *out = result;
|
||||
int len = 0, count = 0;
|
||||
int res = 0;
|
||||
|
||||
if (!para)
|
||||
return 0;
|
||||
|
||||
params = kstrdup(para, GFP_KERNEL);
|
||||
params_base = params;
|
||||
token = params;
|
||||
len = strlen(token);
|
||||
do {
|
||||
token = strsep(¶ms, " ");
|
||||
while (token && (isspace(*token)
|
||||
|| !isgraph(*token)) && len) {
|
||||
token++;
|
||||
len--;
|
||||
}
|
||||
if (len == 0)
|
||||
break;
|
||||
if (!token || kstrtoint(token, 0, &res) < 0)
|
||||
break;
|
||||
len = strlen(token);
|
||||
*out++ = res;
|
||||
count++;
|
||||
} while ((token) && (count < para_num) && (len > 0));
|
||||
|
||||
kfree(params_base);
|
||||
return count;
|
||||
}
|
||||
|
||||
void vpp_vd_adj1_saturation_hue(signed int sat_val,
|
||||
@@ -1989,58 +2170,17 @@ static ssize_t amvecm_saturation_hue_post_store(struct class *cla,
|
||||
struct class_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
int parsed[2];
|
||||
int i, ma, mb, mab, mc, md;
|
||||
int hue_cos[] = {
|
||||
/*0~12*/
|
||||
256, 256, 256, 255, 255, 254, 253, 252, 251, 250,
|
||||
248, 247, 245, 243, 241, 239, 237, 234, 231, 229,
|
||||
226, 223, 220, 216, 213, 209 /*13~25*/
|
||||
};
|
||||
int hue_sin[] = {
|
||||
-147, -142, -137, -132, -126, -121, -115, -109, -104,
|
||||
-98, -92, -86, -80, /*-25~-13*/-74, -68, -62, -56,
|
||||
-50, -44, -38, -31, -25, -19, -13, -6, /*-12~-1*/
|
||||
0, /*0*/
|
||||
6, 13, 19, 25, 31, 38, 44, 50, 56,
|
||||
62, 68, 74, /*1~12*/ 80, 86, 92, 98, 104,
|
||||
109, 115, 121, 126, 132, 137, 142, 147 /*13~25*/
|
||||
};
|
||||
|
||||
if (likely(parse_para_pq(buf, 2, parsed) != 2))
|
||||
return -EINVAL;
|
||||
|
||||
if ((parsed[0] < -128) ||
|
||||
(parsed[0] > 128) ||
|
||||
(parsed[1] < -25) ||
|
||||
(parsed[1] > 25)) {
|
||||
(parsed[1] > 25))
|
||||
return -EINVAL;
|
||||
}
|
||||
saturation_post = parsed[0];
|
||||
hue_post = parsed[1];
|
||||
i = (hue_post > 0) ? hue_post : -hue_post;
|
||||
ma = (hue_cos[i]*(saturation_post + 128)) >> 7;
|
||||
mb = (hue_sin[25+hue_post]*(saturation_post + 128)) >> 7;
|
||||
if (ma > 511)
|
||||
ma = 511;
|
||||
if (ma < -512)
|
||||
ma = -512;
|
||||
if (mb > 511)
|
||||
mb = 511;
|
||||
if (mb < -512)
|
||||
mb = -512;
|
||||
mab = ((ma & 0x3ff) << 16) | (mb & 0x3ff);
|
||||
pr_info("\n[amvideo..] saturation_post:%d hue_post:%d mab:%x\n",
|
||||
saturation_post, hue_post, mab);
|
||||
WRITE_VPP_REG(VPP_VADJ2_MA_MB, mab);
|
||||
mc = (s16)((mab<<22)>>22); /* mc = -mb */
|
||||
mc = 0 - mc;
|
||||
if (mc > 511)
|
||||
mc = 511;
|
||||
if (mc < -512)
|
||||
mc = -512;
|
||||
md = (s16)((mab<<6)>>22); /* md = ma; */
|
||||
mab = ((mc&0x3ff)<<16)|(md&0x3ff);
|
||||
WRITE_VPP_REG(VPP_VADJ2_MC_MD, mab);
|
||||
WRITE_VPP_REG_BITS(VPP_VADJ_CTRL, 1, 2, 1);
|
||||
amvecm_set_saturation_hue_post(parsed[0],
|
||||
parsed[1]);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
@@ -176,7 +176,70 @@ struct ve_pq_table_s {
|
||||
unsigned int reserved2;
|
||||
};
|
||||
|
||||
#define AMVECM_IOC_GET_OVERSCAN _IOR(_VE_CM, 0x52, struct ve_pq_load_s)
|
||||
#define AMVECM_IOC_SET_OVERSCAN _IOW(_VE_CM, 0x52, struct ve_pq_load_s)
|
||||
enum dnlp_state_e {
|
||||
DNLP_OFF = 0,
|
||||
DNLP_ON,
|
||||
};
|
||||
/*DNLP IOCTL command list*/
|
||||
#define AMVECM_IOC_G_DNLP_STATE _IOR(_VE_CM, 0x53, enum dnlp_state_e)
|
||||
#define AMVECM_IOC_S_DNLP_STATE _IOW(_VE_CM, 0x54, enum dnlp_state_e)
|
||||
enum pc_mode_e {
|
||||
PCMODE_OFF = 0,
|
||||
PCMODE_ON,
|
||||
};
|
||||
/*PCMODE IOCTL command list*/
|
||||
#define AMVECM_IOC_G_PQMODE _IOR(_VE_CM, 0x55, enum pc_mode_e)
|
||||
#define AMVECM_IOC_S_PQMODE _IOW(_VE_CM, 0x56, enum pc_mode_e)
|
||||
|
||||
/*CUR_CSCTYPE IOCTL command list*/
|
||||
#define AMVECM_IOC_G_CSCTYPE _IOR(_VE_CM, 0x57, enum vpp_matrix_csc_e)
|
||||
#define AMVECM_IOC_S_CSCTYPE _IOW(_VE_CM, 0x58, enum vpp_matrix_csc_e)
|
||||
|
||||
/*PIC_MODE IOCTL command list*/
|
||||
#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)
|
||||
|
||||
struct am_vdj_mode_s {
|
||||
int flag;
|
||||
int brightness;
|
||||
int brightness2;
|
||||
int saturation_hue;
|
||||
int saturation_hue_post;
|
||||
int contrast;
|
||||
int contrast2;
|
||||
};
|
||||
|
||||
enum vpp_matrix_csc_e {
|
||||
VPP_MATRIX_NULL = 0,
|
||||
VPP_MATRIX_RGB_YUV601 = 0x1,
|
||||
VPP_MATRIX_RGB_YUV601F = 0x2,
|
||||
VPP_MATRIX_RGB_YUV709 = 0x3,
|
||||
VPP_MATRIX_RGB_YUV709F = 0x4,
|
||||
VPP_MATRIX_YUV601_RGB = 0x10,
|
||||
VPP_MATRIX_YUV601_YUV601F = 0x11,
|
||||
VPP_MATRIX_YUV601_YUV709 = 0x12,
|
||||
VPP_MATRIX_YUV601_YUV709F = 0x13,
|
||||
VPP_MATRIX_YUV601F_RGB = 0x14,
|
||||
VPP_MATRIX_YUV601F_YUV601 = 0x15,
|
||||
VPP_MATRIX_YUV601F_YUV709 = 0x16,
|
||||
VPP_MATRIX_YUV601F_YUV709F = 0x17,
|
||||
VPP_MATRIX_YUV709_RGB = 0x20,
|
||||
VPP_MATRIX_YUV709_YUV601 = 0x21,
|
||||
VPP_MATRIX_YUV709_YUV601F = 0x22,
|
||||
VPP_MATRIX_YUV709_YUV709F = 0x23,
|
||||
VPP_MATRIX_YUV709F_RGB = 0x24,
|
||||
VPP_MATRIX_YUV709F_YUV601 = 0x25,
|
||||
VPP_MATRIX_YUV709F_YUV709 = 0x26,
|
||||
VPP_MATRIX_YUV601L_YUV709L = 0x27,
|
||||
VPP_MATRIX_YUV709L_YUV601L = 0x28,
|
||||
VPP_MATRIX_YUV709F_YUV601F = 0x29,
|
||||
VPP_MATRIX_BT2020YUV_BT2020RGB = 0x40,
|
||||
VPP_MATRIX_BT2020RGB_709RGB,
|
||||
VPP_MATRIX_BT2020RGB_CUSRGB,
|
||||
VPP_MATRIX_DEFAULT_CSCTYPE = 0xffff,
|
||||
};
|
||||
|
||||
|
||||
enum ve_source_input_e {
|
||||
SOURCE_INVALID = -1,
|
||||
|
||||
Reference in New Issue
Block a user