Merge borti4938's diy-audio code and fix audio format.

This commit is contained in:
marqs committed 2016-11-08 20:53:58 +02:00
1 parent d548d53272
commit fac88b348e
12 files changed
+1225 -1039

No files matched your search

+18 -1
View File
@@ -312,4 +312,21 @@ bool HDMITX_DevLoopProc()
return HPDChange;
}
void HDMITX_SetAudioInfoFrame(BYTE bAudioDwSampling)
{
Audio_InfoFrame AudioInfo;
AudioInfo.info.Type = AUDIO_INFOFRAME_TYPE;
AudioInfo.info.Ver = AUDIO_INFOFRAME_VER;
AudioInfo.info.Len = AUDIO_INFOFRAME_LEN;
AudioInfo.info.AudioChannelCount = 1; // 2 channels
AudioInfo.info.AudioCodingType = 1; // PCM
AudioInfo.info.SampleSize = 3; // 24bit
AudioInfo.info.SampleFreq = bAudioDwSampling ? 3 : 5; //48kHz or 96kHz
AudioInfo.info.SpeakerPlacement = 0; // Front left and front right
AudioInfo.info.LevelShiftValue = 0;
AudioInfo.info.DM_INH = 0; // Down-mix Inhibit Flag; 0=Permitted or no information about any assertion of this
EnableAudioInfoFrame(TRUE, (BYTE *) &AudioInfo);
}
+2
View File
@@ -26,4 +26,6 @@ bool HDMITX_IsSinkSupportColorDepth36(void);
bool HDMITX_IsSinkSupportColorDepth30(void);
void HDMITX_SetOutputColorDepth(int ColorDepth);
void HDMITX_SetAudioInfoFrame(BYTE bAudioDwSampling);
#endif /*HDMI_TX_H_*/
@@ -523,6 +523,73 @@ BOOL EnableAudioOutput(ULONG VideoPixelClock,BYTE bAudioSampleFreq,BYTE ChannelN
return TRUE ;
}
BOOL EnableAudioOutput4OSSC(ULONG VideoPixelClock,BYTE bExtMCLK,BYTE bAudioDwSampl,BYTE bAudioSwapLR)
{
// set N and CTS
ULONG n = 12288;
ULONG cts = VideoPixelClock/1000;
if (bAudioDwSampl == 0x1)
n = n>>1;
//program N
Switch_HDMITX_Bank(1);
HDMITX_WriteI2C_Byte(REGPktAudN0,(BYTE)((n)&0xFF));
HDMITX_WriteI2C_Byte(REGPktAudN1,(BYTE)((n>>8)&0xFF));
HDMITX_WriteI2C_Byte(REGPktAudN2,(BYTE)((n>>16)&0xF));
//program CTS
HDMITX_WriteI2C_Byte(REGPktAudCTS0, cts & 0xff);
HDMITX_WriteI2C_Byte(REGPktAudCTS1,(cts>>8) & 0xff);
HDMITX_WriteI2C_Byte(REGPktAudCTS2,(cts>>16) & 0xff);
Switch_HDMITX_Bank(0);
#ifdef MANUAL_CTS
HDMITX_WriteI2C_Byte(0xF8, 0xC3);
HDMITX_WriteI2C_Byte(0xF8, 0xA5);
HDMITX_WriteI2C_Byte(REG_TX_PKT_SINGLE_CTRL,B_SW_CTS);
HDMITX_WriteI2C_Byte(0xF8, 0xFF);
#else
HDMITX_WriteI2C_Byte(REG_TX_PKT_SINGLE_CTRL,0); // D[1] = 0,HW auto count CTS
#endif
// define internal/external MCLK and audio down-sampling
HDMITX_SetREG_Byte(REG_TX_CLK_CTRL0,~(M_EXT_MCLK_SEL|B_EXT_MCLK_SAMP|B_EXT_MCLK4CTS),((bExtMCLK&0x1)<<O_MCLK_SAMP) | B_EXT_256FS | ((bExtMCLK&0x1)<<O_MCLK4CTS));
//HDMITX_AndREG_Byte(REG_TX_SW_RST,~M_AUD_DIV);
if (bAudioDwSampl == 0x1)
HDMITX_OrREG_Byte(REG_TX_CLK_CTRL1,B_AUD_DIV2);
// set audio format
Instance[0].TMDSClock = VideoPixelClock;
BYTE fs = bAudioDwSampl == 0x1 ? AUDFS_48KHz : AUDFS_96KHz;
Instance[0].bAudFs = fs;
Instance[0].bOutputAudioMode = B_AUDFMT_32BIT_I2S;
Instance[0].bAudioChannelSwap = bAudioSwapLR == 0x1 ? 0xf : 0x0; // swap channels
BYTE AudioEnable = (0x1 & ~(M_AUD_SWL|B_SPDIFTC)) | M_AUD_24BIT;
HDMITX_WriteI2C_Byte(REG_TX_AUDIO_CTRL0,AudioEnable & 0xF0);
HDMITX_AndREG_Byte(REG_TX_SW_RST,~(B_AUD_RST|B_AREF_RST));
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_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
Switch_HDMITX_Bank(1) ;
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_MODE,0); // 2 audio channel without pre-emphasis
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CAT,0);
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_SRCNUM,1);
HDMITX_WriteI2C_Byte(REG_TX_AUD0CHST_CHTNUM,0);
HDMITX_WriteI2C_Byte(REG_TX_AUDCHST_CA_FS,0xC0|fs); // choose clock
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
Switch_HDMITX_Bank(0);
HDMITX_WriteI2C_Byte(REG_TX_AUDIO_CTRL0,AudioEnable);
Instance[0].bAudioChannelEnable = AudioEnable;
return TRUE;
}
BOOL
GetEDIDData(int EDIDBlockID,BYTE *pEDIDData)
@@ -233,6 +233,9 @@
#define REG_TX_AUTH_STAT 0x46
#define B_T_AUTH_DONE (1<<7)
#define REG_TX_CLK_CTRL0 0x58
#define O_MCLK_SAMP 7
#define B_EXT_MCLK_SAMP (1<<O_MCLK_SAMP)
#define B_INT_MCLK_SAMP (0<<O_MCLK_SAMP)
#define O_OSCLK_SEL 5
#define M_OSCLK_SEL 3
#define B_AUTO_OVER_SAMPLING_CLOCK (1<<4)
@@ -242,6 +245,9 @@
#define B_EXT_256FS (1<<O_EXT_MCLK_SEL)
#define B_EXT_512FS (2<<O_EXT_MCLK_SEL)
#define B_EXT_1024FS (3<<O_EXT_MCLK_SEL)
#define O_MCLK4CTS 1
#define B_EXT_MCLK4CTS (1<<O_MCLK4CTS)
#define B_INT_MCLK4CTS (0<<O_MCLK4CTS)
#define REG_TX_SHA_SEL 0x50
#define REG_TX_SHA_RD_BYTE1 0x51
@@ -815,6 +821,7 @@ BOOL ProgramDEGenModeByID(MODE_ID id,BYTE bInputSignalType) ;
BOOL ProgramSyncEmbeddedVideoMode(BYTE VIC,BYTE bInputType) ;
#endif
BOOL EnableAudioOutput(unsigned long VideoPixelClock,BYTE bAudioSampleFreq,BYTE ChannelNumber,BYTE bAudSWL,BYTE bSPDIF) ;
BOOL EnableAudioOutput4OSSC(ULONG VideoPixelClock,BYTE bExtMCLK,BYTE bAudioDwSampl,BYTE bAudioSwapLR) ;
void DisableIT6613() ;
void DisableVideoOutput() ;
void DisableAudioOutput() ;