From 2bac00fd82d6a512493e761300aadcecfd857ec9 Mon Sep 17 00:00:00 2001 From: marqs Date: Thu, 10 Jan 2019 23:25:39 +0200 Subject: [PATCH] TX improvements * tweak audio parameters * set AFE level based on PCLK --- software/sys_controller/it6613/HDMI_TX.c | 17 +- software/sys_controller/it6613/HDMI_TX.h | 2 +- software/sys_controller/it6613/it6613_drv.c | 6 +- .../mem_init/sys_onchip_memory2_0.hex | 14006 ++++++++-------- software/sys_controller/ossc/av_controller.c | 52 +- software/sys_controller/ossc/av_controller.h | 6 +- software/sys_controller/ossc/avconfig.c | 4 +- software/sys_controller/ossc/menu.c | 2 +- software/sys_controller_bsp/libhal_bsp.a | Bin 31568 -> 31568 bytes 9 files changed, 7096 insertions(+), 6999 deletions(-) diff --git a/software/sys_controller/it6613/HDMI_TX.c b/software/sys_controller/it6613/HDMI_TX.c index 46e1b7d..56f8fba 100644 --- a/software/sys_controller/it6613/HDMI_TX.c +++ b/software/sys_controller/it6613/HDMI_TX.c @@ -78,18 +78,18 @@ bool HDMITX_HPD(void){ } -void HDMITX_SetAVIInfoFrame(alt_u8 VIC, bool b16x9, bool ITU709, bool ITC, alt_u8 pixelrep) +void HDMITX_SetAVIInfoFrame(alt_u8 VIC, alt_u8 OutputColorMode, bool b16x9, bool ITU709, bool ITC, alt_u8 pixelrep) { AVI_InfoFrame AviInfo; - OS_PRINTF("HDMITX_SetAVIInfoFrame: VIC=%d, Aspect-Ratio=%s, ITU709=%s, ITC=%s, pixelrep=%u\n", - VIC, b16x9?"16:9":"4:3", ITU709?"Yes":"No", ITC?"Yes":"No", pixelrep); + OS_PRINTF("HDMITX_SetAVIInfoFrame: VIC=%d, ColorMode=%d, Aspect-Ratio=%s, ITU709=%s, ITC=%s, pixelrep=%u\n", + VIC, OutputColorMode, b16x9?"16:9":"4:3", ITU709?"Yes":"No", ITC?"Yes":"No", pixelrep); AviInfo.pktbyte.AVI_HB[0] = AVI_INFOFRAME_TYPE|0x80 ; AviInfo.pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ; AviInfo.pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ; - /*switch(OutputColorMode) + switch(OutputColorMode) { case F_MODE_YUV444: // AviInfo.info.ColorMode = 2 ; @@ -104,8 +104,8 @@ void HDMITX_SetAVIInfoFrame(alt_u8 VIC, bool b16x9, bool ITU709, bool ITC, alt_u // AviInfo.info.ColorMode = 0 ; AviInfo.pktbyte.AVI_DB[0] = (0<<5)|(1<<4) ; break ; - }*/ - AviInfo.pktbyte.AVI_DB[0] = (0<<5)|(1<<4) ; + } + //AviInfo.pktbyte.AVI_DB[0] = (0<<5)|(1<<4) ; AviInfo.pktbyte.AVI_DB[0] |= 2; // indicate "no overscan" AviInfo.pktbyte.AVI_DB[1] = 8 ; //AviInfo.pktbyte.AVI_DB[1] |= (!b16x9)?(1<<4):(2<<4) ; // 4:3 or 16:9 @@ -314,12 +314,17 @@ bool HDMITX_DevLoopProc() void HDMITX_SetAudioInfoFrame(BYTE bAudioDwSampling) { + int i; Audio_InfoFrame AudioInfo; AudioInfo.info.Type = AUDIO_INFOFRAME_TYPE; AudioInfo.info.Ver = AUDIO_INFOFRAME_VER; AudioInfo.info.Len = AUDIO_INFOFRAME_LEN; + for (i=0; i 85000000) + hdmitx_pclk_level = 1; + else if (pclk_out < 75000000) + hdmitx_pclk_level = 0; + else + hdmitx_pclk_level = cm.hdmitx_pclk_level; + + // Full TX initialization increases mode switch delay, use only when necessary + if (cm.cc.full_tx_setup || (cm.hdmitx_pclk_level != hdmitx_pclk_level)) { + cm.hdmitx_pclk_level = hdmitx_pclk_level; TX_enable(cm.cc.tx_mode); - } else if (cm.cc.tx_mode==TX_HDMI) { - HDMITX_SetAVIInfoFrame(HDMI_Unkown, 0, 0, cm.cc.hdmi_itc, cm.hdmitx_pixr_ifr); + } else if (cm.cc.tx_mode!=TX_DVI) { + HDMITX_SetAVIInfoFrame(HDMI_Unkown, (cm.cc.tx_mode == TX_HDMI_RGB) ? F_MODE_RGB444 : F_MODE_YUV444, 0, 0, cm.cc.hdmi_itc, cm.hdmitx_pixr_ifr); #ifdef ENABLE_AUDIO #ifdef MANUAL_CTS SetupAudio(cm.cc.tx_mode); @@ -689,7 +699,7 @@ int init_hw() setup_rc(); // init always in HDMI mode (fixes yellow screen bug) - TX_enable(TX_HDMI); + TX_enable(TX_HDMI_RGB); return 0; } @@ -957,15 +967,15 @@ int main() // Check here to enable regardless of input if (tc.tx_mode != cm.cc.tx_mode) { - HDMITX_SetAVIInfoFrame(HDMI_Unkown, 0, 0, 0, 0); + HDMITX_SetAVIInfoFrame(HDMI_Unkown, F_MODE_RGB444, 0, 0, 0, 0); TX_enable(tc.tx_mode); cm.cc.tx_mode = tc.tx_mode; cm.clkcnt = 0; //TODO: proper invalidate } - if ((tc.tx_mode == TX_HDMI) && (tc.hdmi_itc != cm.cc.hdmi_itc)) { + if ((tc.tx_mode != TX_DVI) && (tc.hdmi_itc != cm.cc.hdmi_itc)) { //EnableAVIInfoFrame(FALSE, NULL); printf("setting ITC to %d\n", tc.hdmi_itc); - HDMITX_SetAVIInfoFrame(HDMI_Unkown, 0, 0, tc.hdmi_itc, cm.hdmitx_pixr_ifr); + HDMITX_SetAVIInfoFrame(HDMI_Unkown, (tc.tx_mode == TX_HDMI_RGB) ? F_MODE_RGB444 : F_MODE_YUV444, 0, 0, tc.hdmi_itc, cm.hdmitx_pixr_ifr); cm.cc.hdmi_itc = tc.hdmi_itc; } diff --git a/software/sys_controller/ossc/av_controller.h b/software/sys_controller/ossc/av_controller.h index d4813a5..ed6b691 100644 --- a/software/sys_controller/ossc/av_controller.h +++ b/software/sys_controller/ossc/av_controller.h @@ -77,8 +77,9 @@ typedef enum { } status_t; typedef enum { - TX_HDMI = 0, - TX_DVI = 1 + TX_HDMI_RGB = 0, + TX_HDMI_YCBCR444 = 1, + TX_DVI = 2 } tx_mode_t; //TODO: transform binary values into flags @@ -93,6 +94,7 @@ typedef struct { alt_u8 fpga_hmultmode; alt_u8 tx_pixelrep; alt_u8 hdmitx_pixr_ifr; + alt_u8 hdmitx_pclk_level; alt_u8 sample_mult; alt_u8 sample_sel; alt_u8 hsync_cut; diff --git a/software/sys_controller/ossc/avconfig.c b/software/sys_controller/ossc/avconfig.c index 3d5a729..9c16307 100644 --- a/software/sys_controller/ossc/avconfig.c +++ b/software/sys_controller/ossc/avconfig.c @@ -49,7 +49,7 @@ const avconfig_t tc_default = { .post_coast = DEFAULT_POST_COAST, #ifdef ENABLE_AUDIO .audio_dw_sampl = DEFAULT_ON, - .tx_mode = TX_HDMI, + .tx_mode = TX_HDMI_RGB, .audio_gain = AUDIO_GAIN_0DB, #endif .col = { @@ -68,7 +68,7 @@ int set_default_avconfig() { memcpy(&tc, &tc_default, sizeof(avconfig_t)); #ifndef ENABLE_AUDIO - tc.tx_mode = !!(IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE) & HDMITX_MODE_MASK); + tc.tx_mode = (IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE) & HDMITX_MODE_MASK) ? TX_DVI : TX_HDMI_RGB; #endif memcpy(video_modes, video_modes_default, VIDEO_MODES_SIZE); diff --git a/software/sys_controller/ossc/menu.c b/software/sys_controller/ossc/menu.c index 4ae250c..0369b30 100644 --- a/software/sys_controller/ossc/menu.c +++ b/software/sys_controller/ossc/menu.c @@ -61,7 +61,7 @@ static const char *pm_384p_desc[] = { LNG("Passthru","パススルー"), "Lin static const char *pm_480p_desc[] = { LNG("Passthru","パススルー"), "Line2x" }; static const char *pm_1080i_desc[] = { LNG("Passthru","パススルー"), "Line2x (bob)" }; static const char *ar_256col_desc[] = { "4:3", "8:7" }; -static const char *tx_mode_desc[] = { "HDMI", "DVI" }; +static const char *tx_mode_desc[] = { "HDMI (RGB)", "HDMI (YCbCr444)", "DVI" }; static const char *sl_mode_desc[] = { LNG("Off","オフ"), LNG("Auto","オート"), LNG("Manual","カスタム") }; static const char *sl_method_desc[] = { LNG("Multiplication","Multiplication"), LNG("Subtraction","Subtraction") }; static const char *sl_type_desc[] = { LNG("Horizontal","ヨコ"), LNG("Vertical","タテ"), LNG("Alternating","コウゴ") }; diff --git a/software/sys_controller_bsp/libhal_bsp.a b/software/sys_controller_bsp/libhal_bsp.a index 9f11e3b13a4dad663e6991ea8d13314ca229c520..7c919f20f8661ed0938d8dbba392e2b5dd545323 100644 GIT binary patch delta 369 zcmcccjq$=a#tG8w=7uK5W(F1;m0HXn;k_z!DT0}V-wpPAXCi( zSFw&weDg~MHfAINvCTXx`CM=TIirZpxAbh`DmKd*O@(v723{~NW`ZjRS(#|@4^>5t z&1HlNkQ;LB53|CxfCPM8``O_Fd4l4bfBH;AHDgUcJc=2U*94r~{4IDQBTU=ozR-ur qTEsW^MyeqTh;6?rz)ZE~}Q+~z=;Di$C^ zcJm7bc4n{$uSy;lSY(D?JxD}$@(ewv&1FWmV9w?Xro~KP=>&`a%#)p+