diff --git a/arch/arm/mach-meson8b/hdmi_tx_hw/hdmi_tx_hw.c b/arch/arm/mach-meson8b/hdmi_tx_hw/hdmi_tx_hw.c index 9a54e831efa8..f65f32fef423 100755 --- a/arch/arm/mach-meson8b/hdmi_tx_hw/hdmi_tx_hw.c +++ b/arch/arm/mach-meson8b/hdmi_tx_hw/hdmi_tx_hw.c @@ -792,6 +792,22 @@ static void hdmi_tvenc_set(Hdmi_tx_video_para_t *param) SOF_LINES = 10; TOTAL_FRAMES = 4; } + else if(param->VIC==HDMI_480x320p60hz){ + INTERLACE_MODE = 0; + PIXEL_REPEAT_VENC = 0; + PIXEL_REPEAT_HDMI = 0; + ACTIVE_PIXELS = 480; + ACTIVE_LINES = 320; + LINES_F0 = 263; + LINES_F1 = 263; + FRONT_PORCH = 120; + HSYNC_PIXELS = 100; + BACK_PORCH = 100; + EOF_LINES = 8; + VSYNC_LINES = 4; + SOF_LINES = 95; + TOTAL_FRAMES = 4; + } else if(param->VIC==HDMI_480x800p60hz){ INTERLACE_MODE = 0; PIXEL_REPEAT_VENC = 0; @@ -1113,6 +1129,7 @@ static void hdmi_tvenc_set(Hdmi_tx_video_para_t *param) case HDMI_640x480p60: case HDMI_800x480p60hz: case HDMI_480x800p60hz: + case HDMI_480x320p60hz: aml_write_reg32(P_VPU_HDMI_SETTING, 2); break; case HDMI_1366x768p60hz: @@ -2042,6 +2059,9 @@ static void hdmitx_set_pll(Hdmi_tx_video_para_t *param) case HDMI_800x480p60hz: set_vmode_clk(VMODE_800X480P_60HZ); break; + case HDMI_480x320p60hz: + set_vmode_clk(VMODE_480X320P_60HZ); + break; case HDMI_480x800p60hz: set_vmode_clk(VMODE_480X800P_60HZ); break; @@ -2129,6 +2149,7 @@ static int hdmitx_set_dispmode(hdmitx_dev_t* hdmitx_device, Hdmi_tx_video_para_t &&(param->VIC!=HDMI_1080p24) &&(param->VIC!=HDMI_1080p60)&&(param->VIC!=HDMI_1080p50) &&(param->VIC!=HDMI_720p60)&&(param->VIC!=HDMI_720p50) + &&(param->VIC!=HDMI_480x320p60hz) &&(param->VIC!=HDMI_800x480p60hz)&&(param->VIC!=HDMI_480x800p60hz) &&(param->VIC!=HDMI_1366x768p60hz)&&(param->VIC!=HDMI_1600x900p60hz) &&(param->VIC!=HDMI_800x600p60hz)&&(param->VIC!=HDMI_1024x600p60hz)&&(param->VIC!=HDMI_1024x768p60hz) @@ -2432,6 +2453,7 @@ static Vic_attr_map vic_attr_map_table[] = { {HDMI_720p60, 74250 }, {HDMI_800p, 71000 }, {HDMI_800x480p60hz, 29760 }, + {HDMI_480x320p60hz, 25175 }, {HDMI_480x800p60hz, 32000 }, {HDMI_1366x768p60hz, 85500 }, {HDMI_1600x900p60hz, 108000}, diff --git a/arch/arm/mach-meson8b/hdmi_tx_hw/tvenc_conf.h b/arch/arm/mach-meson8b/hdmi_tx_hw/tvenc_conf.h index ca9aa45e56bd..e8c8cb97ded5 100755 --- a/arch/arm/mach-meson8b/hdmi_tx_hw/tvenc_conf.h +++ b/arch/arm/mach-meson8b/hdmi_tx_hw/tvenc_conf.h @@ -3,6 +3,10 @@ typedef struct reg_s { uint val; } reg_t; +static reg_t hdmi_tvenc_regs_480x320p60[] = { + { 0, 0 } +}; + static reg_t hdmi_tvenc_regs_480i[] = { /*1st col: recommmended, but eof/sof/vs_lines +/- 1 from spec; 2nd col: from simu */ {ENCP_VIDEO_MODE, 0 /*0 */ }, @@ -259,6 +263,7 @@ typedef struct hdmi_tvenc_config_ }hdmi_tvenc_config_t; static const hdmi_tvenc_config_t hdmi_tvenc_configs[] = { + {HDMI_480x320p60hz, hdmi_tvenc_regs_480x320p60}, {HDMI_640x480p60 , hdmi_tvenc_regs_640x480p60}, {HDMI_480p60, hdmi_tvenc_regs_480p}, {HDMI_480p60_16x9, hdmi_tvenc_regs_480p}, diff --git a/arch/arm/mach-meson8b/include/mach/tvregs.h b/arch/arm/mach-meson8b/include/mach/tvregs.h index 2661b5e82063..7bcc34364aa4 100755 --- a/arch/arm/mach-meson8b/include/mach/tvregs.h +++ b/arch/arm/mach-meson8b/include/mach/tvregs.h @@ -533,6 +533,49 @@ static const reg_t tvregs_720p_50hz[] = { {MREG_END_MARKER, 0 } }; +static const reg_t tvregs_480x320p60hz[] = { + {P_ENCP_VIDEO_EN, 0}, + {P_ENCI_VIDEO_EN, 0}, + + {P_VENC_VDAC_SETTING, 0xff}, + {P_ENCP_VIDEO_MODE, 0x4040}, + {P_ENCP_VIDEO_MODE_ADV, 0x18}, + {P_ENCP_VIDEO_MAX_PXCNT, 0x31F}, + {P_ENCP_VIDEO_MAX_LNCNT, 0x20C}, + {P_ENCP_VIDEO_HAVON_BEGIN, 0x64}, + {P_ENCP_VIDEO_HAVON_END, 0x243}, + {P_ENCP_VIDEO_VAVON_BLINE, 0xBD}, + {P_ENCP_VIDEO_VAVON_ELINE, 0x1FC}, + {P_ENCP_VIDEO_HSO_BEGIN, 0x0}, + {P_ENCP_VIDEO_HSO_END, 0x64}, + {P_ENCP_VIDEO_VSO_BEGIN, 0x1E}, + {P_ENCP_VIDEO_VSO_END, 0x32}, + {P_ENCP_VIDEO_VSO_BLINE, 0x0}, + {P_ENCP_VIDEO_VSO_ELINE, 0x8}, + + /* DVI configs */ + {P_ENCP_DVI_HSO_BEGIN, 0x2}, + {P_ENCP_DVI_HSO_END, 0x4A}, + {P_ENCP_DVI_VSO_BLINE_EVN, 0x0}, + {P_ENCP_DVI_VSO_BLINE_ODD, 0x0}, + {P_ENCP_DVI_VSO_ELINE_EVN, 0x7}, + {P_ENCP_DVI_VSO_ELINE_ODD, 0x0}, + {P_ENCP_DVI_VSO_BEGIN_EVN, 0x2}, + {P_ENCP_DVI_VSO_BEGIN_ODD, 0x0}, + {P_ENCP_DVI_VSO_END_EVN, 0x2}, + {P_ENCP_DVI_VSO_END_ODD, 0x0}, + {P_ENCP_DE_H_BEGIN, 0xAA}, + {P_ENCP_DE_H_END, 0x3CA}, + {P_ENCP_DE_V_BEGIN_EVEN, 0x11}, + {P_ENCP_DE_V_END_EVEN, 0x1F1}, + {P_ENCP_DE_V_BEGIN_ODD, 0x0}, + {P_ENCP_DE_V_END_ODD, 0x0}, + + {P_ENCP_VIDEO_EN, 1}, + {P_ENCI_VIDEO_EN, 0}, + {MREG_END_MARKER, 0}, +}; + static const reg_t tvregs_480i[] = { {P_ENCP_VIDEO_EN, 0, }, {P_ENCI_VIDEO_EN, 0, }, @@ -1852,6 +1895,7 @@ static const reg_t tvregs_1920x1200[] = { /* The sequence of register tables items must match the enum define in tvmode.h */ static const reg_t *tvregsTab[] = { + tvregs_480x320p60hz, tvregs_480i, tvregs_480i, // For REPEAT MODE use, ENC setting is same tvregs_480cvbs, @@ -1913,6 +1957,7 @@ static const reg_t *tvregsTab[] = { }; static const tvinfo_t tvinfoTab[] = { + {.xres = 480, .yres = 320, .id = "480x320p60hz"}, {.xres = 720, .yres = 480, .id = "480i"}, {.xres = 720, .yres = 480, .id = "480i_rpt"}, {.xres = 720, .yres = 480, .id = "480cvbs"}, diff --git a/drivers/amlogic/display/aml_logo/logo_display/output_dev_osd.c b/drivers/amlogic/display/aml_logo/logo_display/output_dev_osd.c index cf4273ee1478..8cdc9c018b2e 100644 --- a/drivers/amlogic/display/aml_logo/logo_display/output_dev_osd.c +++ b/drivers/amlogic/display/aml_logo/logo_display/output_dev_osd.c @@ -38,6 +38,7 @@ static logo_output_dev_t output_osd1={ #ifdef CONFIG_AM_HDMI_ONLY static hdmi_only_info_t hdmi_only_info[PARA_HDMI_ONLY]={ + {"480x320p60hz", VMODE_480X320P_60HZ}, {"480i",VMODE_480I}, {"480p",VMODE_480P}, {"576i",VMODE_576I}, diff --git a/drivers/amlogic/display/vout/enc_clk_config.c b/drivers/amlogic/display/vout/enc_clk_config.c index 5886c22cc85d..82e9ae2b5c1a 100644 --- a/drivers/amlogic/display/vout/enc_clk_config.c +++ b/drivers/amlogic/display/vout/enc_clk_config.c @@ -758,8 +758,8 @@ static enc_clk_val_t setting_enc_clk_val_m8m2[] = { {VMODE_XGA, 1085, 1, 1, 1, VIU_ENCP, 5, 1, 1, 1, -1, -1, -1, 1, 1}, }; static enc_clk_val_t setting_enc_clk_val[] = { - #if MESON_CPU_TYPE == MESON_CPU_TYPE_MESON8B + {VMODE_480X320P_60HZ, 2014, 8, 1, 1, VIU_ENCP, 10, 4, 1, 1, -1, -1, -1, 1, -1}, {VMODE_480I, 2160, 8, 1, 1, VIU_ENCI, 5, 4, 2,-1, 2, -1, -1, 2, -1}, {VMODE_480CVBS, 1296, 4, 1, 1, VIU_ENCI, 6, 4, 2,-1, 2, -1, -1, 2, -1}, {VMODE_480P, 2160, 8, 1, 1, VIU_ENCP, 5, 4, 2, 1, -1, -1, -1, 1, -1}, diff --git a/drivers/amlogic/display/vout/tvconf.c b/drivers/amlogic/display/vout/tvconf.c index 9408a234a550..2c2df602b92f 100644 --- a/drivers/amlogic/display/vout/tvconf.c +++ b/drivers/amlogic/display/vout/tvconf.c @@ -84,7 +84,7 @@ SET_TV_CLASS_ATTR(policy_fr_auto, policy_framerate_automation_store) static const tvmode_t vmode_tvmode_tab[] = { - TVMODE_480I, TVMODE_480I_RPT, TVMODE_480CVBS, TVMODE_480P, + TVMODE_480X320P_60HZ, TVMODE_480I, TVMODE_480I_RPT, TVMODE_480CVBS, TVMODE_480P, #ifdef CONFIG_AML_VOUT_FRAMERATE_AUTOMATION TVMODE_480P_59HZ, #endif @@ -124,6 +124,18 @@ static const tvmode_t vmode_tvmode_tab[] = static const vinfo_t tv_info[] = { + { /* VMODE_480X320P_60HZ */ + .name = "480x320p60hz", + .mode = VMODE_480X320P_60HZ, + .width = 480, + .height = 320, + .field_height = 320, + .aspect_ratio_num = 3, + .aspect_ratio_den = 2, + .sync_duration_num = 60, + .sync_duration_den = 1, + .video_clk = 25175000, + }, { /* VMODE_480I */ .name = "480i", .mode = VMODE_480I, diff --git a/drivers/amlogic/display/vout/tvmode.h b/drivers/amlogic/display/vout/tvmode.h index 0101d1137bcc..2ded99a37d31 100644 --- a/drivers/amlogic/display/vout/tvmode.h +++ b/drivers/amlogic/display/vout/tvmode.h @@ -26,7 +26,8 @@ #define TVMODE_H typedef enum { - TVMODE_480I = 0, + TVMODE_480X320P_60HZ = 0, + TVMODE_480I, TVMODE_480I_RPT , TVMODE_480CVBS, TVMODE_480P , diff --git a/drivers/amlogic/display/vout/tvoutc.c b/drivers/amlogic/display/vout/tvoutc.c index 598bd5693c60..8e260a6e2e7f 100644 --- a/drivers/amlogic/display/vout/tvoutc.c +++ b/drivers/amlogic/display/vout/tvoutc.c @@ -227,6 +227,7 @@ int tvoutc_setclk(tvmode_t mode) case TVMODE_576P: setreg(&sd[xtal]); break; + case TVMODE_480X320P_60HZ: case TVMODE_720P: case TVMODE_800P: case TVMODE_800X480P_60HZ: diff --git a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx.c b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx.c index 2ee928081974..8aa351c40cbc 100755 --- a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx.c +++ b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx.c @@ -745,6 +745,7 @@ static ssize_t store_debug(struct device * dev, struct device_attribute *attr, c // support format lists const char* disp_mode_t[]={ + "480x320p60hz", "480i", "480i_rpt", "480p", diff --git a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c index 9cc27f119e17..4fbfb8c58313 100644 --- a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c +++ b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_edid.c @@ -1285,6 +1285,7 @@ typedef struct{ static dispmode_vic_t dispmode_VIC_tab[]= { + {"480x320p60hz", HDMI_480x320p60hz}, {"480i_4_3", HDMI_480i60}, {"480i_rpt", HDMI_480i60_16x9_rpt}, {"480i", HDMI_480i60_16x9}, diff --git a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_video.c b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_video.c index 8b851511e822..a7b438ff1952 100644 --- a/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_video.c +++ b/drivers/amlogic/hdmi/hdmi_tx/hdmi_tx_video.c @@ -22,6 +22,17 @@ extern int dvi_mode; static Hdmi_tx_video_para_t hdmi_tx_video_params[] = { + { + .VIC = HDMI_480x320p60hz, + .color_prefer = COLOR_SPACE_RGB444, + .color_depth = COLOR_24BIT, + .bar_info = B_BAR_VERT_HORIZ, + .repeat_time = NO_REPEAT, + .aspect_ratio = TV_ASPECT_RATIO_4_3, + .cc = CC_ITU709, + .ss = SS_SCAN_UNDER, + .sc = SC_SCALE_HORIZ_VERT, + }, { .VIC = HDMI_640x480p60, .color_prefer = COLOR_SPACE_RGB444, diff --git a/include/linux/amlogic/hdmi_tx/hdmi_info_global.h b/include/linux/amlogic/hdmi_tx/hdmi_info_global.h index 1aa0d9b8ae45..84c2b0e90625 100644 --- a/include/linux/amlogic/hdmi_tx/hdmi_info_global.h +++ b/include/linux/amlogic/hdmi_tx/hdmi_info_global.h @@ -3,7 +3,8 @@ typedef enum HDMI_Video_Type_ { HDMI_Unkown = 0 , - HDMI_640x480p60 = 1 , + HDMI_480x320p60hz = 1, + HDMI_640x480p60, HDMI_480p60, HDMI_480p60_16x9, HDMI_720p60, diff --git a/include/linux/amlogic/logo/logo_dev_osd.h b/include/linux/amlogic/logo/logo_dev_osd.h index f3ee68fefbaa..a45f9b714b07 100644 --- a/include/linux/amlogic/logo/logo_dev_osd.h +++ b/include/linux/amlogic/logo/logo_dev_osd.h @@ -7,7 +7,7 @@ } while (0) #ifdef CONFIG_AM_HDMI_ONLY -#define PARA_HDMI_ONLY 30 +#define PARA_HDMI_ONLY 31 typedef struct { char *name; diff --git a/include/linux/amlogic/vout/vinfo.h b/include/linux/amlogic/vout/vinfo.h index 4d3aae02fe4d..f01633c81418 100644 --- a/include/linux/amlogic/vout/vinfo.h +++ b/include/linux/amlogic/vout/vinfo.h @@ -28,7 +28,8 @@ #define VMODE_LOGO_BIT_MASK 0x8000 #define VMODE_MODE_BIT_MASK 0xff typedef enum { - VMODE_480I = 0, + VMODE_480X320P_60HZ = 0, + VMODE_480I, VMODE_480I_RPT , VMODE_480CVBS, VMODE_480P ,