⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvhdmirx.c

📁 the HDMI(High Definition Multimedia Interface) driver code
💻 C
📖 第 1 页 / 共 5 页
字号:
//! @param		outParam(O)丗敾掕寢壥<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdCheckValidVideoFormat(UB DevNo, THdmiRxDrvVideoFormat cur_video, UB * outParam)
{
	IW ret = HDMIDRV_OK;
	UB video_code;
	UB	* avi_info_frame = gHdmiRxDrvAviInfoFrameBuff;

	// EDID偵傛傞擖椡塮憸怣崋偺堎忢敾掕傪峴偆
	if (cur_video.VideoCode != 0xFF) {
		video_code = cur_video.VideoCode & 0x7F;
	} else {
		return DVHDMI_E_DEV;
	}

	if (gHdmiRxDrvVideoFormatTbl[video_code].EdidEnable == 1) {
		// EDID堘斀枹専弌
		*outParam = 0;
	} else {
		// EDID堘斀専弌
		*outParam = 1;
		HdmiRxDrvErrCatch("EDID failed:%d\n", video_code);
	}

	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡PLL慖戰
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		inParam(I)丗壒惡宱楬愝掕忣曬峔憿懱<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW _HdmiRxVdSetAudioCrystalParamCheck(UB DevNo, UB CrystalNo)
{
	IW ret = HDMIDRV_OK;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			if (CrystalNo > 1) {
				ret = DVHDMI_E_INVAL;
			}
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡PLL慖戰
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		CrystalNo(I)丗奜晹PLL巊梡帪 0x01<BR>
//!							  撪憼PLL巊梡帪 0x00<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/7/31
//*******************************************************************
IW _HdmiRxVdSetAudioCrystal(UB DevNo, UB CrystalNo)
{
	IW ret = HDMIDRV_OK;
	UB use_crystal = 0;
	UB cur_crystal;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			_HdmiRxVdGetAudioCrystal(DevNo, &cur_crystal);
			if (CrystalNo != cur_crystal) {
				use_crystal = CrystalNo << 7;
				ret = _dvHdmiRxSetR8J66030FTSetAudioCrystal(use_crystal);
			}
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}

	return ret;
}
//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡PLL慖戰
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		CrystalNo(O)丗奜晹PLL巊梡帪 0x01<BR>
//!							  撪憼PLL巊梡帪 0x00<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/7/31
//*******************************************************************
IW _HdmiRxVdGetAudioCrystal(UB DevNo, UB* CrystalNo)
{
	IW ret = HDMIDRV_OK;
	UB audo_path1, audo_path2;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			_dvHdmiRxR8J66030FTGetAudioPath(&audo_path1, &audo_path2);
			*CrystalNo = 0x00;
			*CrystalNo = (audo_path1 >> 7);
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

/* #AUDIO_PLL ADD S 2007/11/01 Y.Takeuchi */
//*******************************************************************
//! @brief		HDMI Rx Virtual Drv CTS Auto Adjust儌乕僪愝掕
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		Mode(I) 丗Disable 0x01<BR>
//!						  Enable 0x00<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/11/01
//*******************************************************************
IW _HdmiRxVdSetCTSAutoAdjustMode(UB DevNo, UB Mode)
{
	UB cur_mode = 0;
	IW ret = HDMIDRV_OK;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			_HdmiRxVdGetCTSAutoAdjustMode(DevNo, &cur_mode);
			if (Mode != cur_mode) {
				Mode = Mode << 6;
				ret = _dvHdmiRxSetR8J66030FTSetCTSAutoAdjustMode(Mode);
			}
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv CTS Auto Adjust儌乕僪庢摼
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		Mode(O) 丗Disable 0x01<BR>
//!						  Enable 0x00<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/11/01
//*******************************************************************
IW _HdmiRxVdGetCTSAutoAdjustMode(UB DevNo, UB * Mode)
{
	IW ret = HDMIDRV_OK;
	UB audo_path1, audo_path2;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			_dvHdmiRxR8J66030FTGetAudioPath(&audo_path1, &audo_path2);
			*Mode = 0x00;
			*Mode = ((audo_path1 & 0x40) >> 6);
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}
/* #AUDIO_PLL ADD E 2007/11/01 Y.Takeuchi */

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡宱楬愝掕
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		inParam(I)丗壒惡宱楬愝掕忣曬峔憿懱<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdSetAudioPath(UB DevNo, THdmiRxDrvAudioPath* inParam)
{
	IW ret = HDMIDRV_OK;
	UB	sample_freq = 0x00;
	UB	audio_path1 = 0x00;
	UB	audio_path2 = 0x00;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// 僒儞僾儕儞僌廃攇悢愝掕
			switch (inParam->SampleFreq) {
				case 0x00 :		// 48kHz
					sample_freq = 0x02;
					break;
				case 0x01 :		// 44kHz
					sample_freq = 0x01;
					break;
				case 0x02 :		// 32kHz
					sample_freq = 0x00;
					break;
				default :
					ret = DVHDMI_E_INVAL;
					return ret;
			}
			/* #AUDIO_PLL CHG S 2007/11/01 Y.Takeuchi */
			audio_path1 |= sample_freq;
			/* #AUDIO_PLL CHG E 2007/11/01 Y.Takeuchi */

			// 壒惡庬暿愝掕偼L-PCM偺傒側偺偱Standard(0) 屌掕
			// 彨棃揑偵懡條側僼僅乕儅僢僩偵懳墳偡傞応崌偼偙偙傪奼挘偡傞偙偲

			// 僒儞僾儕儞僌僒僀僘愝掕
			audio_path2 = inParam->SampleSize << 4;
			// MCLK廃攇悢愝掕
			audio_path2 |= inParam->MasterClockFreq;
			ret = _dvHdmiRxSetR8J66030FTSetAudioPath(audio_path1, audio_path2);
			if (ret == HDMIDRV_OK) {
				// 娗棟忣曬峏怴
				memcpy(&gHdmiRxDrvSysInfo.AudioPath[DV_HDMIRX_DEF_DEV_0], inParam, sizeof(THdmiRxDrvAudioPath));
			}
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡宱楬愝掕僷儔儊乕僞敾掕
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		inParam(I)丗壒惡宱楬愝掕忣曬峔憿懱<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdSetAudioPathParamCheck(UB DevNo, THdmiRxDrvAudioPath* inParam)
{
	IW ret = HDMIDRV_OK;
	UB	audio_path = 0x00;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// 壒惡庬暿敾掕 PCM埲奜偼僄儔乕
			if (inParam->AudioType != DV_HDMIRX_DEF_LPCM ) {
				ret = DVHDMI_E_INVAL;
			}
			// 僒儞僾儕儞僌廃攇悢敾掕 32kbps 乣 48kbps 埲奜偼僄儔乕
			if (inParam->SampleFreq > 0x02 ) {
				ret = DVHDMI_E_INVAL;
			}
			// 僒儞僾儕儞僌僒僀僘偑16bit埲奜偼僄儔乕
			if (inParam->SampleSize > 0) {
				ret = DVHDMI_E_INVAL;
			}
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡宱楬庢摼
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		outParam(O)丗壒惡宱楬愝掕忣曬峔憿懱<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdGetAudioPath(UB DevNo, THdmiRxDrvAudioPath* outParam)
{
	IW ret = HDMIDRV_OK;
	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// 娗棟忣曬庢摼
			memcpy(outParam, &gHdmiRxDrvSysInfo.AudioPath[DV_HDMIRX_DEF_DEV_0], sizeof(THdmiRxDrvAudioPath));
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡怣崋忣曬庢摼
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		outParam(O)丗壒惡怣崋忣曬<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdGetInputAudioFormat(UB DevNo, THdmiRxDrvAudioFormat* outParam)
{
	IW ret = HDMIDRV_OK;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// 壒惡怣崋忣曬庢摼
			ret = HdmiRxGetInputAudioFormatDev0(outParam);
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default :
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 壒惡怣崋僼僅乕儅僢僩堎忢敾掕
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @param		cur_audio(I)丗擖椡壒惡僼僅乕儅僢僩
//! @param		outParam(O)丗敾掕寢壥<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		07/04/27
//*******************************************************************
IW	_HdmiRxVdCheckValidAudioFormat(UB DevNo, THdmiRxDrvAudioFormat * cur_audio, UB * outParam)
{
	IW ret = HDMIDRV_OK;
	UB i;
	UB tbl_max = 0;
	UB tbl_idx = 0;
	UB sample_freq = 0;
	UB sample_size = cur_audio->SampleSize;

	*outParam = 0;

	// EDID偵傛傞擖椡壒惡庬暿偺堎忢敾掕傪峴偆
	tbl_max = sizeof(gHdmiRxDrvAudioFormatTbl) / sizeof(gHdmiRxDrvAudioFormatTbl[0]);
	for (tbl_idx=0; tbl_idx < tbl_max; tbl_idx++) {
		if (gHdmiRxDrvAudioFormatTbl[tbl_idx].AudioFormatCode == cur_audio->AudioType) {
			break;
		}
	}
	// EDID偐傜夝愅偟偨僥乕僽儖偵尰嵼庴怣偟偰偄傞壒惡僼僅乕儅僢僩偑娷傑傟偰偄傞偐妋擣
	if (tbl_idx >= tbl_max) {
		// 僥乕僽儖偵奩摉偡傞壒惡僼僅乕儅僢僩側偟
		if ((cur_audio->AudioType != 0xFF) && (cur_audio->Sts & DV_HDMIRX_DEF_AUDIO_TYPE_DET)) {
			// 壒惡庬暿晄掕帪偼EDID堎忢側偟偲埖偆
			// 壒惡庬暿偺EDID堘斀専弌
			*outParam = 1;
			return ret;
		}
	}

	// EDID偵傛傞僒儞僾儕儞僌廃攇悢偺堎忢敾掕傪峴偆
	sample_freq = gHdmiRxDrvAudioFormatTbl[tbl_idx].SampleFreq >> 1;
	if ((sample_freq <= cur_audio->SampleFreq) && (cur_audio->SampleFreq != 0xFF) && (cur_audio->Sts & DV_HDMIRX_DEF_SAMPLE_FREQ_DET)) {
		// 僒儞僾儕儞僌廃攇悢偺EDID堘斀専弌
		*outParam = 1;
		return ret;
	}

#if 0
	// EDID偵傛傞僒儞僾儕儞僌僒僀僘偺堎忢敾掕傪峴偆
	if (

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -