1
0
mirror of https://github.com/marqs85/ossc.git synced 2024-06-08 18:29:30 +00:00

TX improvements

* tweak audio parameters
* set AFE level based on PCLK
This commit is contained in:
marqs 2019-01-10 23:25:39 +02:00
parent 687905780e
commit 2bac00fd82
9 changed files with 7096 additions and 6999 deletions

View File

@ -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; AVI_InfoFrame AviInfo;
OS_PRINTF("HDMITX_SetAVIInfoFrame: VIC=%d, Aspect-Ratio=%s, ITU709=%s, ITC=%s, pixelrep=%u\n", OS_PRINTF("HDMITX_SetAVIInfoFrame: VIC=%d, ColorMode=%d, Aspect-Ratio=%s, ITU709=%s, ITC=%s, pixelrep=%u\n",
VIC, b16x9?"16:9":"4:3", ITU709?"Yes":"No", ITC?"Yes":"No", pixelrep); 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[0] = AVI_INFOFRAME_TYPE|0x80 ;
AviInfo.pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ; AviInfo.pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ;
AviInfo.pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ; AviInfo.pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ;
/*switch(OutputColorMode) switch(OutputColorMode)
{ {
case F_MODE_YUV444: case F_MODE_YUV444:
// AviInfo.info.ColorMode = 2 ; // 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.info.ColorMode = 0 ;
AviInfo.pktbyte.AVI_DB[0] = (0<<5)|(1<<4) ; AviInfo.pktbyte.AVI_DB[0] = (0<<5)|(1<<4) ;
break ; 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[0] |= 2; // indicate "no overscan"
AviInfo.pktbyte.AVI_DB[1] = 8 ; AviInfo.pktbyte.AVI_DB[1] = 8 ;
//AviInfo.pktbyte.AVI_DB[1] |= (!b16x9)?(1<<4):(2<<4) ; // 4:3 or 16:9 //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) void HDMITX_SetAudioInfoFrame(BYTE bAudioDwSampling)
{ {
int i;
Audio_InfoFrame AudioInfo; Audio_InfoFrame AudioInfo;
AudioInfo.info.Type = AUDIO_INFOFRAME_TYPE; AudioInfo.info.Type = AUDIO_INFOFRAME_TYPE;
AudioInfo.info.Ver = AUDIO_INFOFRAME_VER; AudioInfo.info.Ver = AUDIO_INFOFRAME_VER;
AudioInfo.info.Len = AUDIO_INFOFRAME_LEN; AudioInfo.info.Len = AUDIO_INFOFRAME_LEN;
for (i=0; i<AUDIO_INFOFRAME_LEN; i++) {
AudioInfo.pktbyte.AUD_DB[i] = 0;
}
AudioInfo.info.AudioChannelCount = 1; // 2 channels AudioInfo.info.AudioChannelCount = 1; // 2 channels
AudioInfo.info.AudioCodingType = 1; // PCM AudioInfo.info.AudioCodingType = 1; // PCM
AudioInfo.info.SampleSize = 3; // 24bit AudioInfo.info.SampleSize = 3; // 24bit

View File

@ -12,7 +12,7 @@ bool HDMITX_ChipVerify(void);
bool HDMITX_HPD(void); bool HDMITX_HPD(void);
void HDMITX_ChangeVideoTiming(int VIC); void HDMITX_ChangeVideoTiming(int VIC);
void HDMITX_ChangeVideoTimingAndColor(int VIC, COLOR_TYPE Color); void HDMITX_ChangeVideoTimingAndColor(int VIC, COLOR_TYPE Color);
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);
void HDMITX_DisableVideoOutput(void); void HDMITX_DisableVideoOutput(void);
void HDMITX_EnableVideoOutput(void); void HDMITX_EnableVideoOutput(void);

View File

@ -572,14 +572,14 @@ BOOL EnableAudioOutput4OSSC(ULONG VideoPixelClock,BYTE bAudioDwSampl,BYTE bAudio
HDMITX_WriteI2C_Byte(REG_TX_AUDIO_CTRL1,Instance[0].bOutputAudioMode); HDMITX_WriteI2C_Byte(REG_TX_AUDIO_CTRL1,Instance[0].bOutputAudioMode);
HDMITX_WriteI2C_Byte(REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping. HDMITX_WriteI2C_Byte(REG_TX_AUDIO_FIFOMAP,0xE4); // default mapping.
HDMITX_WriteI2C_Byte(REG_TX_AUDIO_CTRL3,(Instance[0].bAudioChannelSwap&0xF)|(AudioEnable&B_AUD_SPDIF)); HDMITX_WriteI2C_Byte(REG_TX_AUDIO_CTRL3,(Instance[0].bAudioChannelSwap&0xF)|(AudioEnable&B_AUD_SPDIF));
HDMITX_WriteI2C_Byte(REG_TX_AUD_SRCVALID_FLAT,B_AUD_SPXFLAT_SRC3|B_AUD_SPXFLAT_SRC2|B_AUD_SPXFLAT_SRC1|B_AUD_ERR2FLAT); // only two channels HDMITX_WriteI2C_Byte(REG_TX_AUD_SRCVALID_FLAT,B_AUD_ERR2FLAT); // only two channels
Switch_HDMITX_Bank(1) ; Switch_HDMITX_Bank(1) ;
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_MODE,0); // 2 audio channel without pre-emphasis HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_MODE,(1<<3)); // 2 audio channel without pre-emphasis, no copyright
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CAT,0); HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CAT,0);
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_SRCNUM,1); HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_SRCNUM,1);
HDMITX_WriteI2C_Byte(REG_TX_AUD0CHST_CHTNUM,0); HDMITX_WriteI2C_Byte(REG_TX_AUD0CHST_CHTNUM,0);
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CA_FS,0xC0|fs); // choose clock HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CA_FS,0x00|fs); // choose clock
fs = ~fs; // OFS is the one's complement of FS fs = ~fs; // OFS is the one's complement of FS
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_OFS_WL,(fs<<4)|AUD_SWL_24); // 24 bit Audio HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_OFS_WL,(fs<<4)|AUD_SWL_24); // 24 bit Audio

File diff suppressed because it is too large Load Diff

View File

@ -80,6 +80,7 @@ avinput_t target_input;
alt_u8 pcm1862_active; alt_u8 pcm1862_active;
alt_u32 pclk_out;
alt_u32 read_it2(alt_u32 regaddr); alt_u32 read_it2(alt_u32 regaddr);
inline void lcd_write_menu() inline void lcd_write_menu()
@ -98,12 +99,7 @@ inline void SetupAudio(tx_mode_t mode)
DisableAudioOutput(); DisableAudioOutput();
EnableAudioInfoFrame(FALSE, NULL); EnableAudioInfoFrame(FALSE, NULL);
if (mode == TX_HDMI) { if (mode != TX_DVI) {
alt_u32 pclk_out = (TVP_EXTCLK_HZ/cm.clkcnt)*video_modes[cm.id].h_total*cm.sample_mult*(cm.fpga_vmultmode+1);
pclk_out *= 1+cm.tx_pixelrep;
printf("PCLK_out: %luHz\n", pclk_out);
EnableAudioOutput4OSSC(pclk_out, tc.audio_dw_sampl, tc.audio_swap_lr); EnableAudioOutput4OSSC(pclk_out, tc.audio_dw_sampl, tc.audio_swap_lr);
HDMITX_SetAudioInfoFrame((BYTE)tc.audio_dw_sampl); HDMITX_SetAudioInfoFrame((BYTE)tc.audio_dw_sampl);
#ifdef DEBUG #ifdef DEBUG
@ -128,10 +124,10 @@ inline void TX_enable(tx_mode_t mode)
//Setup TX configuration //Setup TX configuration
//TODO: set pclk target and VIC dynamically //TODO: set pclk target and VIC dynamically
EnableVideoOutput(PCLK_MEDIUM, COLOR_RGB444, COLOR_RGB444, !mode); EnableVideoOutput(cm.hdmitx_pclk_level ? PCLK_HIGH : PCLK_MEDIUM, COLOR_RGB444, (mode == TX_HDMI_YCBCR444) ? COLOR_YUV444 : COLOR_RGB444, (mode != TX_DVI));
if (mode == TX_HDMI) { if (mode != TX_DVI) {
HDMITX_SetAVIInfoFrame(HDMI_Unkown, 0, 0, tc.hdmi_itc, cm.hdmitx_pixr_ifr); HDMITX_SetAVIInfoFrame(HDMI_Unkown, (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; cm.cc.hdmi_itc = tc.hdmi_itc;
} }
@ -347,8 +343,6 @@ status_t get_status(tvp_input_t input, video_format format)
#ifdef ENABLE_AUDIO #ifdef ENABLE_AUDIO
if ((tc.audio_dw_sampl != cm.cc.audio_dw_sampl) || if ((tc.audio_dw_sampl != cm.cc.audio_dw_sampl) ||
#ifdef MANUAL_CTS #ifdef MANUAL_CTS
(tc.edtv_l2x != cm.cc.edtv_l2x) ||
(tc.interlace_pt != cm.cc.interlace_pt) ||
update_cur_vm || update_cur_vm ||
#endif #endif
(tc.audio_swap_lr != cm.cc.audio_swap_lr)) (tc.audio_swap_lr != cm.cc.audio_swap_lr))
@ -480,7 +474,7 @@ void set_videoinfo()
// Configure TVP7002 and scan converter logic based on the video mode // Configure TVP7002 and scan converter logic based on the video mode
void program_mode() void program_mode()
{ {
alt_u8 h_syncinlen, v_syncinlen; alt_u8 h_syncinlen, v_syncinlen, hdmitx_pclk_level;
alt_u32 h_hz, v_hz_x100, h_synclen_px; alt_u32 h_hz, v_hz_x100, h_synclen_px;
// Mark as stable (needed after sync up to avoid unnecessary mode switch) // Mark as stable (needed after sync up to avoid unnecessary mode switch)
@ -530,13 +524,29 @@ void program_mode()
set_videoinfo(); set_videoinfo();
TX_SetPixelRepetition(cm.tx_pixelrep, ((cm.cc.tx_mode==TX_HDMI) && (cm.tx_pixelrep == cm.hdmitx_pixr_ifr)) ? 1 : 0); TX_SetPixelRepetition(cm.tx_pixelrep, ((cm.cc.tx_mode!=TX_DVI) && (cm.tx_pixelrep == cm.hdmitx_pixr_ifr)) ? 1 : 0);
// Full TX initialization increases mode switch delay, use only for compatibility pclk_out = (TVP_EXTCLK_HZ/cm.clkcnt)*video_modes[cm.id].h_total*cm.sample_mult*(cm.fpga_vmultmode+1);
if (cm.cc.full_tx_setup) { pclk_out *= 1+cm.tx_pixelrep;
if (cm.fpga_hmultmode == FPGA_H_MULTMODE_OPTIMIZED_1X)
pclk_out /= 2;
else if (cm.fpga_hmultmode == FPGA_H_MULTMODE_ASPECTFIX)
pclk_out = (pclk_out*4)/3;
printf("PCLK_out: %luHz\n", pclk_out);
if (pclk_out > 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); TX_enable(cm.cc.tx_mode);
} else if (cm.cc.tx_mode==TX_HDMI) { } else if (cm.cc.tx_mode!=TX_DVI) {
HDMITX_SetAVIInfoFrame(HDMI_Unkown, 0, 0, cm.cc.hdmi_itc, cm.hdmitx_pixr_ifr); 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 ENABLE_AUDIO
#ifdef MANUAL_CTS #ifdef MANUAL_CTS
SetupAudio(cm.cc.tx_mode); SetupAudio(cm.cc.tx_mode);
@ -689,7 +699,7 @@ int init_hw()
setup_rc(); setup_rc();
// init always in HDMI mode (fixes yellow screen bug) // init always in HDMI mode (fixes yellow screen bug)
TX_enable(TX_HDMI); TX_enable(TX_HDMI_RGB);
return 0; return 0;
} }
@ -957,15 +967,15 @@ int main()
// Check here to enable regardless of input // Check here to enable regardless of input
if (tc.tx_mode != cm.cc.tx_mode) { 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); TX_enable(tc.tx_mode);
cm.cc.tx_mode = tc.tx_mode; cm.cc.tx_mode = tc.tx_mode;
cm.clkcnt = 0; //TODO: proper invalidate 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); //EnableAVIInfoFrame(FALSE, NULL);
printf("setting ITC to %d\n", tc.hdmi_itc); 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; cm.cc.hdmi_itc = tc.hdmi_itc;
} }

View File

@ -77,8 +77,9 @@ typedef enum {
} status_t; } status_t;
typedef enum { typedef enum {
TX_HDMI = 0, TX_HDMI_RGB = 0,
TX_DVI = 1 TX_HDMI_YCBCR444 = 1,
TX_DVI = 2
} tx_mode_t; } tx_mode_t;
//TODO: transform binary values into flags //TODO: transform binary values into flags
@ -93,6 +94,7 @@ typedef struct {
alt_u8 fpga_hmultmode; alt_u8 fpga_hmultmode;
alt_u8 tx_pixelrep; alt_u8 tx_pixelrep;
alt_u8 hdmitx_pixr_ifr; alt_u8 hdmitx_pixr_ifr;
alt_u8 hdmitx_pclk_level;
alt_u8 sample_mult; alt_u8 sample_mult;
alt_u8 sample_sel; alt_u8 sample_sel;
alt_u8 hsync_cut; alt_u8 hsync_cut;

View File

@ -49,7 +49,7 @@ const avconfig_t tc_default = {
.post_coast = DEFAULT_POST_COAST, .post_coast = DEFAULT_POST_COAST,
#ifdef ENABLE_AUDIO #ifdef ENABLE_AUDIO
.audio_dw_sampl = DEFAULT_ON, .audio_dw_sampl = DEFAULT_ON,
.tx_mode = TX_HDMI, .tx_mode = TX_HDMI_RGB,
.audio_gain = AUDIO_GAIN_0DB, .audio_gain = AUDIO_GAIN_0DB,
#endif #endif
.col = { .col = {
@ -68,7 +68,7 @@ int set_default_avconfig()
{ {
memcpy(&tc, &tc_default, sizeof(avconfig_t)); memcpy(&tc, &tc_default, sizeof(avconfig_t));
#ifndef ENABLE_AUDIO #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 #endif
memcpy(video_modes, video_modes_default, VIDEO_MODES_SIZE); memcpy(video_modes, video_modes_default, VIDEO_MODES_SIZE);

View File

@ -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_480p_desc[] = { LNG("Passthru","パススルー"), "Line2x" };
static const char *pm_1080i_desc[] = { LNG("Passthru","パススルー"), "Line2x (bob)" }; static const char *pm_1080i_desc[] = { LNG("Passthru","パススルー"), "Line2x (bob)" };
static const char *ar_256col_desc[] = { "4:3", "8:7" }; 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_mode_desc[] = { LNG("Off","オフ"), LNG("Auto","オート"), LNG("Manual","カスタム") };
static const char *sl_method_desc[] = { LNG("Multiplication","Multiplication"), LNG("Subtraction","Subtraction") }; static const char *sl_method_desc[] = { LNG("Multiplication","Multiplication"), LNG("Subtraction","Subtraction") };
static const char *sl_type_desc[] = { LNG("Horizontal","ヨコ"), LNG("Vertical","タテ"), LNG("Alternating","コウゴ") }; static const char *sl_type_desc[] = { LNG("Horizontal","ヨコ"), LNG("Vertical","タテ"), LNG("Alternating","コウゴ") };