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

📄 dvhdmirx.c

📁 the HDMI(High Definition Multimedia Interface) driver code
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "itron.h"
#include "kernel.h"
#include "dtvc4_io.h"
#include "dvCom.h"
#include "dvAPI.h"
#include "IoMgr.h"
#include "DispVd.h"
#include "dvHdmiRx.h"
#include "dvHdmiRxLocal.h"
#include "E_HdmiSwDrv.h"
#include "AudioVd.h"
#include "dvGrpDrv.h"

#include <string.h> 
#include <stdio.h>
#include <stddef.h>
#include "lowlib.h"

//------------------------------------------------------------------------
// 奜晹曄悢
//------------------------------------------------------------------------
// 塮憸僼僅乕儅僢僩僥乕僽儖
extern TdvHdmiRxVideoFormat gHdmiRxDrvVideoFormatTbl[DV_HDMIRX_DEF_VIDEO_TBL_NUM];
// 壒惡僼僅乕儅僢僩僥乕僽儖
extern TdvHdmiRxAudioFormat gHdmiRxDrvAudioFormatTbl[DV_HDMIRX_DEF_AUDIO_TBL_NUM]; 
// PC塮憸僼僅乕儅僢僩僥乕僽儖
extern TdvHdmiRxVideoFormat gHdmiRxDrvPcVideoFormatTbl[DV_HDMIRX_DEF_PC_VIDEO_TBL_NUM];
// 壒惡庬暿曄姺梡僥乕僽儖
extern TdvHdmiRxAudioType gHdmiRxDrvAudioTypeConversionTbl[];
// 僒儞僾儕儞僌廃攇悢曄姺梡僥乕僽儖
extern TdvHdmiRxSampleFreq gHdmiRxDrvSampleFreqConversionTbl[];
// 僒儞僾儕儞僌僒僀僘曄姺梡僥乕僽儖
extern TdvHdmiRxSampleSize gHdmiRxDrvSampleSizeConversionTbl[];
// 僠儍儞僱儖屄悢曬曄姺梡僥乕僽儖
extern TdvHdmiRxChannelCount gHdmiRxDrvChannelCountConversionTbl[];

// HDMI Rx Virtual Drv 娗棟忣曬幚懺
static TdvHdmiRxSys gHdmiRxDrvSysInfo;

// HDMI Rx Virtual Drv Config忣曬幚懺
static THdmiRxDrvConfig gHdmiRxDrvConfigTbl;

// 傾僋僥傿僽僨僶僀僗斣崋 
//弶婜壔帪偲億乕僩愗姺帪偵峏怴
static UB gHdmiRxActiveDevNo;

// HDMI Rx 妱崬傒儗儀儖
static UB gHdmiRxDrvIntrLv[2] = {0xFF, 0xFF};

// AVI InfoFrame庴怣梡僶僢僼傽 僿僢僟乕(3byte) + 僠僃僢僋僒儉丒僨乕僞(1byte + 13byte)
static UB gHdmiRxDrvAviInfoFrameBuff[DV_HDMIRX_DEF_AVI_INFO_FLAME_SIZE + DV_HDMIRX_DEF_PACKET_HEADER_SISE + 1];
// Audio InfoFrame庴怣梡僶僢僼傽 僿僢僟乕(3byte) + 僠僃僢僋僒儉丒僨乕僞(1byte + 5byte)
static UB gHdmiRxDrvAudioInfoFrameBuff[DV_HDMIRX_DEF_AUDIO_INFO_FLAME_SIZE + DV_HDMIRX_DEF_PACKET_HEADER_SISE + 1];
/* #ACP_PACKET CHG S 2007/12/18 Y.Takeuchi */
// User Packet1 庴怣梡僶僢僼傽
static UB gHdmiRxDrvUserPacket1Buff[31];
// User Packet2 庴怣梡僶僢僼傽
static UB gHdmiRxDrvUserPacket2Buff[31];
// 僷働僢僩庴怣梡僥儞億儔儕僶僢僼傽
static UB gHdmiRxDrvTempPacketBuff[31];
/* #ACP_PACKET CHG E 2007/12/18 Y.Takeuchi */

// HDMI 壖憐僪儔僀僶僨僼僅儖僩忬懺妋掕敾掕僥乕僽儖
THdmiRxDrvFixCondition gHdmiRxDrvDefFixCndTbl = {
	5,							// 儂僢僩僾儔僌妋掕敾掕梡僇僂儞僞乕
	5,							// 憲怣懁揹尮妋掕敾掕梡僇僂儞僞乕
	5,							// DE怣崋妋掕敾掕梡僇僂儞僞乕
	5,							// 擣徹忬懺妋掕梡僇僂儞僞乕
	5,							// HDMI儌乕僪妋掕敾掕梡僇僂儞僞乕
	5,							// 埫崋壔忬懺妋掕敾掕梡僇僂儞僞乕
	1,							// 壒惡FIFO妋掕敾掕梡僇僂儞僞乕
	1,							// 塮憸怣崋(桳/柍)妋掕敾掕梡僇僂儞僞乕
};

/* #HPD_DYBAMIC_CTL ADD S 2007/09/12 Y.Takeuchi */
// HotPlug抂巕儗儀儖
UB gHdmiRxDrvHotPlugLv = 0xFF;
/* #HPD_DYBAMIC_CTL ADD E 2007/09/12 Y.Takeuchi */

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%% f-1  捠抦娭悢孮  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//*******************************************************************
//! @brief		撪憼HDMI Rx 僨僶僀僗 妱崬傒僴儞僪儔乕
//! @retval		張棟寢壥
//! @param		<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/4/10
//*******************************************************************
IW _HdmiRxVdIntr0(void)
{
	if (gHdmiRxDrvSysInfo.IntrCbFunc != NULL) {
		// 妱崬傒捠抦CB娭悢幚峴
		(gHdmiRxDrvSysInfo.IntrCbFunc)(0);
	}
}

//*******************************************************************
//! @brief		奜晅偗HDMI Rx 僨僶僀僗 妱崬傒僴儞僪儔乕
//! @retval		張棟寢壥
//! @param		<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/4/10
//*******************************************************************
IW _HdmiRxVdIntr1(void)
{
	if (gHdmiRxDrvSysInfo.IntrCbFunc != NULL) {
		// 妱崬傒捠抦CB娭悢幚峴
		(gHdmiRxDrvSysInfo.IntrCbFunc)(1);
	}
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%% f-2  弶婜壔娭悢孮           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 弶婜壔張棟
//! @retval		張棟寢壥
//! @param		<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdInit(void)
{
	IW ret;
	UB dev_no;
	UB i;

	// IIC惂屼儌僕儏乕儖弶婜壔
	ret = _HdmiRxDrvIicInit();
	if (ret != HDMIDRV_OK ) {
		HdmiRxDrvErrCatch("_HdmiRxDrvIicInit failed %d\n", ret);
		return ret;
	}

	// 奺庬僷働僢僩庢摼僶僢僼傽偺弶婜壔
	memset(&gHdmiRxDrvAviInfoFrameBuff, 0x00, sizeof(gHdmiRxDrvAviInfoFrameBuff));
	memset(&gHdmiRxDrvAudioInfoFrameBuff, 0x00, sizeof(gHdmiRxDrvAudioInfoFrameBuff));
	memset(&gHdmiRxDrvUserPacket1Buff, 0x00, sizeof(gHdmiRxDrvUserPacket1Buff));
	memset(&gHdmiRxDrvUserPacket2Buff, 0x00, sizeof(gHdmiRxDrvUserPacket2Buff));

	// 僨僶僀僗僪儔僀僶偲偺娭楢晅偗
	ret = _dvHdmiRxR8J66030FTConfig();

	// HDMI 妱崬傒儅僗僋
	_HdmiRxVdSetIntrlvl(DV_HDMIRX_DEF_DEV_0, 0);

	// 僨僶僀僗媦傃娗棟忣曬偺弶婜壔
	// 奜晹儕僙僢僩幚峴
	_HdmiRxVdExtReset(DV_HDMIRX_DEF_DEV_0);
	ret = _HdmiRxVdReset(0);
	if (ret != HDMIDRV_OK) {
		// 僨僶僀僗弶婜壔幐攕専弌帪
		// 儕僇僶儕乕張棟偼僨僶僀僗弶婜壔幐攕帪偵峴偭偰偄傞
		// 揹尮OFF惂屼偼擮偺偨傔峴偭偰傒傞
		HdmiRxDrvErrCatch("_HdmiRxVdReset failed %d\n", ret);
	}

	// 擣徹弶婜壔幚峴
	/* #HDCP_RST DEL S 2007/10/17 Y.Takeuchi */
	//_HdmiRxVdHdcpReset(0);
	/* #HDCP_RST DEL E 2007/10/17 Y.Takeuchi */

	// 弶婜揹尮忬懺 OFF
	ret = _HdmiRxVdPowerDown(&dev_no);
	if (ret != HDMIDRV_OK ) {
		// 僒僗儁儞僪弶婜壔幐攕専弌帪
		// 儕僇僶儕乕張棟偼僒僗儁儞僪張棟幐攕帪偵峴偭偰偄傞
		HdmiRxDrvErrCatch("_HdmiRxVdPowerDown failed %d\n", ret);
	}

	// 撪憼僨僶僀僗 妱崬傒僴儞僪儔乕搊榐 
	ret = _dvHdmiRxR8J66030FTRegistCBIntrupt(_HdmiRxVdIntr0);

	/* #HPD_DYBAMIC_CTL ADD S 2007/09/12 Y.Takeuchi */
	// HotPlug抂巕傪Hi偵愝掕
	ret = _HdmiRxVdSetHotPlugPort(0, 1);
	/* #HPD_DYBAMIC_CTL ADD E 2007/09/12 Y.Takeuchi */

	// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰

	return ret;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 娭楢晅偗
//! @retval		張棟寢壥
//! @param		<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/20
//*******************************************************************
IW	_HdmiRxVdConfig(UB DevNo, THdmiRxDrvConfig* inParam)
{
	THdmiRxDrvConfig* cfg_tbl;
	THdmiRxDrvParamPort port;
	UB* tbl_buff;
	UB table_idx_max;
	UB video_length;
	UB audio_length;
	UB video_code;
	UB tbl_elemnt_num;
	UB i, j;
	IW ret;
	UB idx, bit1, bit3;

	// EDID敾掕僥乕僽儖偺弶婜愝掕
	tbl_elemnt_num = sizeof(gHdmiRxDrvVideoFormatTbl) / sizeof(TdvHdmiRxVideoFormat);
	// 塮憸僼僅乕儅僢僩僥乕僽儖偺嫋壜價僢僩傪弶婜壔
	// _HdmiRxVdConfig()偱忋埵偐傜巜掕偝傟偨撪梕偱嵞愝掕傪峴偆
	for (i=1; i<tbl_elemnt_num; i++) {
		gHdmiRxDrvVideoFormatTbl[i].EdidEnable = 1;
	}
	// 壒惡娭楢EDID偺弶婜愝掕
	memset(&gHdmiRxDrvAudioFormatTbl, 0x00, sizeof(gHdmiRxDrvAudioFormatTbl));


	if (inParam != NULL) {
		// 儐乕僓乕巜掕僐儞僼傿僌巊梡帪
		cfg_tbl = inParam;
	} else {
		return DVHDMI_E_INVAL;
	}

	if (cfg_tbl->EdidTbl) {
		// EDID僥乕僽儖巜掕偁傝
		tbl_buff = &cfg_tbl->EdidTbl[0x80];
	} else {
		// EDID僥乕僽儖巜掕側偟
		tbl_buff = NULL;
	}

	// 僨僶僢僌儘僌儗儀儖愝掕
	_HdmiRxDrvChgLogLv(cfg_tbl->DebugLv);
	// Config巜掕偺愝掕僥乕僽儖傪巊梡偡傞
	memcpy(&gHdmiRxDrvConfigTbl, cfg_tbl, sizeof(THdmiRxDrvConfig));
	if (tbl_buff != NULL) {
		// EDID敾掕僥乕僽儖偺弶婜愝掕
		tbl_elemnt_num = sizeof(gHdmiRxDrvVideoFormatTbl) / sizeof(TdvHdmiRxVideoFormat);
		// 塮憸僼僅乕儅僢僩僥乕僽儖偺嫋壜價僢僩傪枹嫋壜偱弶婜壔
		for (i=1; i<tbl_elemnt_num; i++) {
			gHdmiRxDrvVideoFormatTbl[i].EdidEnable = 0;
		}
		table_idx_max = tbl_buff[2] - 1;
		for (i=4; i<table_idx_max; i++) {
			if ((tbl_buff[i] & 0xF0) == 0x40) {
				// Video Block 傪敪尒 length傪庢摼
				video_length = tbl_buff[i] & 0x0F;
				i++;
				for (j=0; j<video_length; j++) {
					video_code = tbl_buff[j+i] & 0x7F;
					if (video_code < (sizeof(gHdmiRxDrvVideoFormatTbl) / sizeof(gHdmiRxDrvVideoFormatTbl[0]))) {
						gHdmiRxDrvVideoFormatTbl[video_code].EdidEnable = 1;
					}
				}
				i = i + video_length - 1;
			} else if ((tbl_buff[i] & 0xF0) == 0x20) {
				// Audio Block 傪敪尒 length傪庢摼
				audio_length = (tbl_buff[i] & 0x0F) / 3;
				for (j=0; j<audio_length; j++) {
					i++;
					// 壒惡僼僅乕儅僢僩僐乕僪傪庢摼
					idx = (tbl_buff[i] & 0x78) >> 3;
					gHdmiRxDrvAudioFormatTbl[j].AudioFormatCode = gHdmiRxDrvAudioTypeConversionTbl[idx].AudioType;
					// 僠儍儞僱儖忣曬庢摼
					gHdmiRxDrvAudioFormatTbl[j].MaxCh = tbl_buff[i++] & 0x03;
					// 僒儞僾儕儞僌廃攇悢庢摼
					gHdmiRxDrvAudioFormatTbl[j].SampleFreq = (tbl_buff[i++] & 0x7F);
					// 32k偲48k偺價僢僩偺埖偄偑媡側偺偱曄姺偡傞
					bit3 = gHdmiRxDrvAudioFormatTbl[j].SampleFreq & 0x01 << 2;
					bit1 = gHdmiRxDrvAudioFormatTbl[j].SampleFreq & 0x04 >> 2;
					gHdmiRxDrvAudioFormatTbl[j].SampleFreq &= 0x7A;
					gHdmiRxDrvAudioFormatTbl[j].SampleFreq |= (bit3 | bit1);
					// 僒儞僾儕儞僌僒僀僘庢摼
					gHdmiRxDrvAudioFormatTbl[j].SampleSize = tbl_buff[i];
				}
			} else {
				// 偦偺懠 Block 傪敪尒 idx傪Length暘恑傔傞 
				i += tbl_buff[i] & 0x0F;
			}
		}
	}

	return HDMIDRV_OK;
}

//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 儕僙僢僩
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdReset(UB DevNo)
{
	IW	ret;
	UB port_no;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// HDMI 妱崬傒儅僗僋
			_HdmiRxVdSetIntrlvl(DevNo, 0);
			// 僨僶僀僗儕僙僢僩媦傃娗棟忣曬偺弶婜壔
			ret = HdmiRxDev0Reset(0);
			if (ret == HDMIDRV_OK) {
				// 娗棟忣曬揹尮忬懺偺峏怴
				gHdmiRxDrvSysInfo.RxPower[DV_HDMIRX_DEF_DEV_0] = DV_HDMIRX_DEF_POWER_ON;
				if (gHdmiRxDrvSysInfo.PowerOnCbFunc != NULL) {
					// 僒僗儁儞僪儌乕僪暅婣 CB幚峴
					port_no = gHdmiRxDrvSysInfo.PortNo[DV_HDMIRX_DEF_DEV_0];
					(gHdmiRxDrvSysInfo.PowerOnCbFunc)(port_no);
				}
			}
			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>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/19
//*******************************************************************
IW	_HdmiRxVdHdcpReset(UB DevNo)
{
	IW	ret = HDMIDRV_OK;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// RxR8J66030FT擣徹儕僙僢僩
			ret = _dvHdmiRxR8J66030FTHdcpReset();
			if (ret != HDMIDRV_OK ) {
				HdmiRxDrvErrCatch("_dvHdmiRxR8J66030FTHdcpReset failed %d\n", ret);
				// 奜晹嫮惂儕僙僢僩
				_HdmiRxVdReset(DevNo);
			}
			// ToDo
			// HotPlug億乕僩偺惂屼偼偳偆偡傞丠 T.B.D
			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>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/28
//*******************************************************************
IW	_HdmiRxVdExtReset(UB DevNo)
{
	IW	ret = HDMIDRV_OK;

	switch (DevNo) {
		case DV_HDMIRX_DEF_DEV_0:
			// RxR8J66030FT奜晹儕僙僢僩
			MSYSCONF.SYCGPREG2_0.BIT.RSTHDMI = 0;
			WAIT(10);
			// RxR8J66030FT奜晹儕僙僢僩夝彍
			MSYSCONF.SYCGPREG2_0.BIT.RSTHDMI = 1;
			break;
		case DV_HDMIRX_DEF_DEV_1:
			// 奜晅偗僨僶僀僗 弶婜壔張棟偼偙偙偵幚憰
			ret = DVHDMI_E_DEV;
			break;
		default:
			ret = DVHDMI_E_INVAL;
			break;
	}
	return ret;
}

/* #HDCP_RESET2 ADD S 2007/11/12 Y.Takeuchi */
//*******************************************************************
//! @brief		HDMI Rx Virtual Drv 僜僼僩儕僙僢僩
//! @retval		張棟寢壥
//! @param		DevNo(I)丗僨僶僀僗斣崋<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/11/12
//*******************************************************************
IW	_HdmiRxVdSoftReset(UB DevNo)
{
	IW	ret = HDMIDRV_OK;

⌨️ 快捷键说明

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