author | Evoke Zhang <evoke.zhang@amlogic.com> | 2019-10-09 02:52:38 (GMT) |
---|---|---|
committer | zihuan.ling <zihuan.ling@amlogic.com> | 2019-10-12 01:49:00 (GMT) |
commit | 872a316fe19d69236c733accd0bad8c2d71253f7 (patch) | |
tree | 90929277b3aae24ea86f755d63c36ed53f13dda9 | |
parent | 3aba40dc5c1c061c0b730ea3164f0e019fa27c2d (diff) | |
download | common-872a316fe19d69236c733accd0bad8c2d71253f7.zip common-872a316fe19d69236c733accd0bad8c2d71253f7.tar.gz common-872a316fe19d69236c733accd0bad8c2d71253f7.tar.bz2 |
cvbsout: fix cgms bit mistake for NTSC [1/1]
PD#OTT-5683
Problem:
NTSC cgms data bit is incorrect
Solution:
fix cgms bit mistake
Verify:
u212
Change-Id: If1d26714eeed9061773c25871715713b122d9980
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
-rw-r--r-- | drivers/amlogic/media/vout/cvbs/wss.c | 17 | ||||
-rw-r--r-- | drivers/amlogic/media/vout/cvbs/wss.h | 2 |
2 files changed, 11 insertions, 8 deletions
diff --git a/drivers/amlogic/media/vout/cvbs/wss.c b/drivers/amlogic/media/vout/cvbs/wss.c index fb73223..ffcfc36 100644 --- a/drivers/amlogic/media/vout/cvbs/wss.c +++ b/drivers/amlogic/media/vout/cvbs/wss.c @@ -35,6 +35,7 @@ static const char * const wss_480i_cmd[] = {"ar", "cgms", "psp", "prerec", "CC", "off"}; static const char * const wss_576i_cmd[] = {"ar", "mode", "coding", "helper", "ttxsubt", "opensubt", "surrsnd", "cgms", "full", "CC", "off"}; +static unsigned int cgms_ntsc_crc[] = {0x0, 0x5, 0xa, 0xf}; static void wss_set_output(unsigned int cmd, unsigned int mode, unsigned int line, unsigned int data, @@ -60,15 +61,14 @@ static void wss_set_output(unsigned int cmd, unsigned int mode, cvbs_out_reg_setb(ENCI_VBI_SETTING, 0x1, 0, 2); break; case WSS_480I_CMD_CGMS_A: - value = cvbs_out_reg_read(ENCI_VBI_CGMSDT_L); - value |= (cvbs_out_reg_read(ENCI_VBI_CGMSDT_H) << 16); - - value = ((value & (~(((1L << length) - 1) << start))) | - ((data & ((1L << length) - 1)) << start)); + data = (data > 3) ? 0 : data; + value = ((data << start) | (cgms_ntsc_crc[data] << 14)); cvbs_out_reg_write(ENCI_VBI_CGMSDT_L, (value & 0xffff)); cvbs_out_reg_write(ENCI_VBI_CGMSDT_H, ((value >> 16) & 0xff)); - cvbs_out_reg_write(ENCI_VBI_CGMS_LN, (line - 4)); + /* bit[7:0] even, bit[15:8] odd */ + cvbs_out_reg_write(ENCI_VBI_CGMS_LN, + ((line - 4) | (line - 3) << 8)); cvbs_out_reg_setb(ENCI_VBI_SETTING, 0x3, 4, 2); /*480i, enable even field for line 20*/ /*enable odd field for line 283 */ @@ -94,7 +94,10 @@ static void wss_set_output(unsigned int cmd, unsigned int mode, static void wss_close_output(unsigned int mode) { pr_info("[%s] close mode = %d\n", __func__, mode); - cvbs_out_reg_setb(ENCI_VBI_SETTING, 0x0, 2, 2); + if (mode == 480) + cvbs_out_reg_setb(ENCI_VBI_SETTING, 0x0, 2, 4); + else + cvbs_out_reg_setb(ENCI_VBI_SETTING, 0x0, 2, 2); } /* for 576i, according to <ETSI EN 300294 V1.4.1> */ diff --git a/drivers/amlogic/media/vout/cvbs/wss.h b/drivers/amlogic/media/vout/cvbs/wss.h index 3ac7aba..38ee334 100644 --- a/drivers/amlogic/media/vout/cvbs/wss.h +++ b/drivers/amlogic/media/vout/cvbs/wss.h @@ -98,7 +98,7 @@ #define WSS_480I_AR_BITS_169 0x2 #define WSS_480I_AR_BITS_RESERVED 0x3 -#define WSS_480I_CGMS_A_START 0x7 +#define WSS_480I_CGMS_A_START 0x6 #define WSS_480I_CGMS_A_LENGTH 0x2 #define WSS_480I_CGMS_A_MASK 0x3 #define WSS_480I_CGMS_A_PERMITTED 0x0 |