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

📄 dvhdmirxutil.c

📁 the HDMI(High Definition Multimedia Interface) driver code
💻 C
📖 第 1 页 / 共 2 页
字号:
/*=================================================================
 *  Copyright 2003-2005, Renesas Technology Corporation
 *  and Renesas Solution Corporation.
 *  All right reserved.
 *===============================================================*/
#include <string.h> 
#include <stdio.h>
#include <stddef.h>
#include "lowlib.h"

#include "itron.h"
#include "kernel.h"
#include "dtvc4_io.h"
#include "dvCom.h"
#include "dvAPI.h"
#include "dvHdmiRx.h"
#include "DTVS_Resource.h"
#include "dvHdmiRxLocal.h"
#include "dvHdmiRxUtil.h"
#include <stdarg.h>

//------------------------------------------------------------------------------
// 僌儘乕僶儖曄悢愰尵
//------------------------------------------------------------------------------
// 僨僶僢僌儗儀儖曄悢 壓婰偺崁栚偺OR傪巜掕偡傞偙偲
// 0x01 ASSERT桳岠 HdmiRxDrvErrCatch
// 0x02 奜晹岞奐API 僩儗乕僗儘僌
// 0x04 撪晹娭悢僩儗乕僗儘僌 HdmiRxDrvDebugPrint
//UB gHdmiRxDrvDbgLvl = 0x0F;
UB gHdmiRxDrvDbgLvl = 0x00;

static T_CBIicSendPrm gWriteCbParam;
static T_CBIicRcvPrm gReadCbParam;
static ID gWupTaskId;
static IW gInitFlag = 0;

// ToDo
// TimeOut抣傪摦揑偵愝掕 1s偼挿偡偓丒丒丒
// IIC捠怣僞僀儉傾僂僩抣
static TMO gIicWrapTimeOut = 1000;
// 僨僶僢僌梡曄悢
static UB gIicWrapDbglv = 0x01;
// IIC忬懺曄壔僐乕儖僶僢僋僷儔儊乕僞
static T_CBIicStsPrm IicChgCbParam;
#ifdef HDMI_IIC_SIMPLE_DLY
static UB gHdmiRxNotifyIicWriteTimeOut = 0;
static UB gHdmiRxNotifyIicReadTimeOut = 0;
#endif

//------------------------------------------------------------------------------
// 撪晹娭悢僾儘僩僞僀僾愰尵
//------------------------------------------------------------------------------
static void NotifyIicWriteCB(T_CBIicSendPrm* pInParam );
static void NotifyIicReadCB(T_CBIicRcvPrm* pInParam );
static void SetWriteParam(T_IicSend* pWriteParam, const TdvHdmiRxIicParam* pUtilParam);
static void SetReadParam(T_IicRcv* pReadParam, TdvHdmiRxIicParam* pUtilParam);
static ID GetSemId(IW ch);
static ER SemOp(ID semid, IW semop, UW timeout);
static IW ParamCheck(TdvHdmiRxIicParam * pInParam, IW rw_mode);
static IW HdmiRxDrvIicWrite( TdvHdmiRxIicParam * pInParam );
static IW HdmiRxDrvIicRead( TdvHdmiRxIicParam * pInParam, UB bReadMode );

void _HdmiRxDrvIicStsChgCB(T_CBIicStsPrm* inParam);

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%% f-0  捠抦娭悢孮           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//*******************************************************************
//! @brief		IIC bus忬懺曄壔捠抦CB
//! @retval		<BR>
//! @param		inParam (I)   : IIC僶僗忣曬僷儔儊乕僞
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
void _HdmiRxDrvIicStsChgCB(T_CBIicStsPrm* inParam)
{
	HdmiRxDrvDebugPrint("----------HdmiRxDrvIicStsChgCB-----------\n");
	HdmiRxDrvDebugPrint("Ch:%d\n", inParam->ch);
	HdmiRxDrvDebugPrint("sts:%d\n", inParam->sts);
}

//*******************************************************************
//! @brief		IIC 彂崬傒僐乕儖僶僢僋娭悢 
//! @retval		<BR>
//! @param		pInParam(I) : IIC捠怣彂崬傒寢壥峔憿懱
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static void NotifyIicWriteCB(T_CBIicSendPrm* pInParam )
{
#ifdef HDMI_IIC_SIMPLE_DLY
	if (gHdmiRxNotifyIicWriteTimeOut != 1) {
		SemOp(DV_HDMIRX_DEF_RES_SEM1, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
	}
#else
	wup_tsk(gWupTaskId);
#endif
}

//*******************************************************************
//! @brief		IIC 撉崬傒僐乕儖僶僢僋娭悢 
//! @retval		<BR>
//! @param		pInParam (I) : IIC捠怣撉崬傒寢壥峔憿懱
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static void NotifyIicReadCB(T_CBIicRcvPrm* pInParam )
{
#ifdef HDMI_IIC_SIMPLE_DLY
	if (gHdmiRxNotifyIicReadTimeOut != 1) {
		SemOp(DV_HDMIRX_DEF_RES_SEM1, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
	}
#else
	wup_tsk(gWupTaskId);
#endif
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%% f-1  弶婜壔娭悢孮           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//*******************************************************************
//! @brief		IIC 僶僗弶婜壔  
//! @retval		張棟寢壥<BR>
//! @param		<BR>
//! @note		IIC僶僗攔懠惂屼梡偺僙儅僼僅傪惗惉偡傞<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvIicInit()
{
	T_CSEM pk_csem;
	T_CCYC pk_ccyc;
	IW ret = HDMIDRV_OK;
	ER ercd;
	T_IicInit in_prm_iicinit;

	// IIC僪儔僀僶 僶僗2偺弶婜壔
	in_prm_iicinit.ch = 2;							// IIC僨僶僀僗偺僠儍儞僱儖斣崋 1
	in_prm_iicinit.adfmt = 0;						// 傾僪儗僗僼僅乕儅僢僩愝掕
	in_prm_iicinit.sad = 0x70;						// 帺僗儗乕僽傾僪儗僗愝掕
	in_prm_iicinit.frq = 400000;					// 僋儘僢僋弌椡廃攇悢愝掕乮扨埵 bps乯
	in_prm_iicinit.scl_id = 0xFF;					// SCL抂巕愙懕梡億乕僩抂巕偺ID斣崋
	in_prm_iicinit.sda_id = 0xFF;					// SDA抂巕愙懕梡億乕僩抂巕偺ID斣崋
	in_prm_iicinit.cbPtr = _HdmiRxDrvIicStsChgCB;	// 僐乕儖僶僢僋娭悢億僀儞僞
	in_prm_iicinit.cbPrm = &IicChgCbParam;			// 僐乕儖僶僢僋娭悢梡 堷悢椞堟 愭摢傾僪儗僗
	HdmiRxDrvDebugPrint( "[  _dvIicInit ] Call ==> " );
	ret = _dvIicInit( (T_IicInit *)&in_prm_iicinit );
	HdmiRxDrvDebugPrint( "Ret(%d)\n",  ret );

	// 弶婜壔嵪傒偺応崌偼OS儕僜乕僗傪惗惉偟側偄
	if (gInitFlag == 1) {
		return ret;
	}

#ifdef HDMI_IIC_SIMPLE_DLY
	// 攔懠惂屼梡僙儅僼僅惗惉
	pk_csem.sematr = TA_TFIFO;
	pk_csem.isemcnt = 1;
	pk_csem.maxsem = 1;
	ercd = cre_sem(DV_HDMIRX_DEF_RES_SEM1, &pk_csem);
	if (ercd != E_OK) {
		ret = DVHDMI_E_KERNEL;
		goto End_Of_HdmiRxDrvIicInitt;
	}
#endif

	// 撪晹僶僗梡僙儅僼僅惗惉
	pk_csem.sematr = TA_TFIFO;
	pk_csem.isemcnt = 1;
	pk_csem.maxsem = 1;
	ercd = cre_sem(DV_HDMIRX_DEF_RES_SEM2, &pk_csem);
	if (ercd != E_OK) {
		ret = DVHDMI_E_KERNEL;
	} else {
		gInitFlag = 1;
	}
End_Of_HdmiRxDrvIicInitt :
	return ret;
}

//*******************************************************************
//! @brief		GPIO弶婜壔  
//! @retval		張棟寢壥<BR>
//! @param		id(i):懳徾億乕僩抂巕偺ID斣崋<BR>
//! @param		pmux(i):懳徾億乕僩抂巕偺婡擻慖戰<BR>
//! @param		pioe(i):懳徾億乕僩抂巕偺擖弌椡愝掕<BR>
//! @param		ptdata(i):懳徾億乕僩抂巕偺弶婜弌椡僨乕僞愝掕<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/4/23
//*******************************************************************
IW _HdmiRxDrvGpioInit(UB id, UB pmux, UB pioe, UB ptdata)
{
	T_GpioInit port;
	IW ret;

	port.id = id;
	port.pmux = pmux;
	port.pioe = pioe;
	port.ptdata = ptdata;
	ret = _dvGpioInit(&port);

	return ret;
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%% f-2  憖嶌娭悢孮           %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//*******************************************************************
//! @brief		儗僕僗僞彂崬傒乮摨婜乯
//! @retval		張棟寢壥<BR>
//! @param		DevAddr (I):僨僶僀僗傾僪儗僗<BR>
//! @param		Size (I):彂崬傒僨乕僞僒僀僘<BR>
//! @param		Reg (I):彂崬傒僶僢僼傽<BR>
//! @note		IIC捠怣傪峴偄儗僕僗僞偵抣傪彂偒崬傓<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvRegWrite(UB DevAddr, UB Size, UB* Reg )
{
	IW ret = HDMIDRV_OK;
	UB	i;
#ifdef NOT_USE_IIC
	for (i=0; i<Size; i++) {
		printf("Reg[%d]:%x\n",i, Reg[i]);
	}
#else
	TdvHdmiRxIicParam	iic_pram;
	iic_pram.bCh = DV_HDMIRX_DEF_IIC_CH;		// 巊梡僶僗
	iic_pram.bDevAddr = DevAddr;				// 僨僶僀僗傾僪儗僗
	iic_pram.bNDataSize = Size;					// 彂崬傒僒僀僘(RegAddr+僨乕僞)
	iic_pram.pbData = Reg;						// 彂崬傒僶僢僼傽
	iic_pram.bAck = 1;							// ACK敾掕偁傝
	iic_pram.nTimeOut = 0;						// 僙儅僼僅僞僀儉傾僂僩柍
	iic_pram.bMode = DV_HDMIRX_DEF_WRITE;		// 彂崬傒

#ifdef HDMI_REG_DEBUG
	for (i=0; i<Size; i++) {
		HdmiRxDrvDebugPrint("[HDMI IIC] Write [%d]:%x\n",i, Reg[i]);
	}
#endif
	ret = HdmiRxDrvIicWrite(&iic_pram);
#endif
	return ret;
}
//*******************************************************************
//! @brief		IIC bus 彂崬傒傪峴偆乮摨婜乯
//! @retval		張棟寢壥<BR>
//! @param		pInParam (I/O)	: IIC僨僶僀僗忣曬峔憿懱<BR>
//! @note		IIC捠怣傪峴偄儗僕僗僞偵抣傪彂偒崬傓<BR>
//! @attention	1.杮API傪幚峴偡傞慜偵_IiCWrapInit()傪幚峴偟偰壓偝偄<BR>
//!				2.堷悢偺僨僶僀僗傾僪儗僗偼8bit偱巜掕偡傞偙偲
//!				  (LSB偵偼0傪奿擺偡傞偙偲)
//!				3.儗僕僗僞傾僪儗僗偼彂崬傒僨乕僞偺愭摢偐傜bNRegAddrSize
//!				  僶僀僩偱奿擺
//!				  彂偒崬傒懳徾僨乕僞偼丄僶僢僼傽偺bNRegAddrSize埲崀偵傪
//!				  奿擺偡傞偙偲
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvIicWrite( TdvHdmiRxIicParam * pInParam )
{
	IW ret = HDMIDRV_OK;
	
	// 僷儔儊乕僞僠僃僢僋
	ret = ParamCheck(pInParam, DV_HDMIRX_DEF_WRITE);
	if (ret != HDMIDRV_OK) {
		return ret;
	}
	ret = HdmiRxDrvIicWrite(pInParam);
	return ret;
}

//*******************************************************************
//! @brief		儗僕僗僞撉崬傒乮摨婜乯
//! @retval		張棟寢壥<BR>
//! @param		DevAddr (I):僨僶僀僗傾僪儗僗<BR>
//! @param		RegAddr (I):撉崬傒儗僕僗僞傾僪儗僗<BR>
//! @param		Size (I):撉崬傒僨乕僞僒僀僘<BR>
//! @param		Reg (I):撉崬傒僶僢僼傽<BR>
//! @note		IIC捠怣傪峴偄儗僕僗僞偵抣傪彂偒崬傓<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvRegRead(UB DevAddr, UB Size, UB* Reg )
{
	IW ret;
#ifdef NOT_USE_IIC
	ret = HDMIDRV_OK;
#else
	TdvHdmiRxIicParam	iic_pram;

	iic_pram.bCh = DV_HDMIRX_DEF_IIC_CH;		// 巊梡僶僗
	iic_pram.bDevAddr = DevAddr;				// 僨僶僀僗傾僪儗僗
	iic_pram.bNRegAddrSize = 1;					// 儗僕僗僞僒僀僘
	iic_pram.bNDataSize = Size;					// 撉崬傒僒僀僘
	iic_pram.pbData = Reg;						// 彂崬傒僶僢僼傽
	iic_pram.bAck = 1;							// ACK敾掕偁傝
	iic_pram.nTimeOut = 0;						// 僙儅僼僅僞僀儉傾僂僩柍
	iic_pram.bMode = DV_HDMIRX_DEF_READ;		// 撉崬傒

	ret = _HdmiRxDrvIicSpecificSubAddrRead(&iic_pram);
#endif
	return ret;
}

//*******************************************************************
//! @brief		僒僽傾僪儗僗巜掕偱IIC撉崬傒傪峴偆 (摨婜乯
//! @retval		張棟寢壥<BR>
//! @param		pInParam (I/O)	: IIC僨僶僀僗忣曬峔憿懱<BR>
//! @note		IIC捠怣傪峴偄儗僕僗僞偺抣傪撉傒崬傓<BR>
//! @attention	1.杮API傪幚峴偡傞慜偵_IiCWrapInit()傪幚峴偟偰壓偝偄<BR>
//!				2.堷悢偺僨僶僀僗傾僪儗僗偼8bit偱巜掕偡傞偙偲
//!				  (LSB偵偼0傪奿擺偡傞偙偲)
//!				3.撉崬傒梡偺僶僢僼傽偼忋埵懁偱妋曐偡傞偙偲
//!				  僶僀僩偱奿擺
//!				4.撉崬傒僶僢僼傽偺愭摢偐傜儗僕僗僞傾僪儗僗傪奿擺偡傞偙偲
//!				5.杮API偱偼丄儗僕僗僞傾僪儗僗傪彂偒崬傫偩屻偵巜掕儗僕僗僞
//!				  偺抣傪撉崬傓
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvIicSpecificSubAddrRead( TdvHdmiRxIicParam * pInParam )
{
	IW ret = HDMIDRV_OK;

	// 僷儔儊乕僞僠僃僢僋
	ret = ParamCheck(pInParam, DV_HDMIRX_DEF_READ);
	if (ret != HDMIDRV_OK) {
		return ret;
	}
	// 僒僽傾僪儗僗巜掕偱撉崬傒
	ret = HdmiRxDrvIicRead(pInParam, 0);
	return ret;
}

//*******************************************************************
//! @brief		僒僽傾僪儗僗柍巜掕偱IIC撉崬傒傪峴偆 (摨婜乯
//! @retval		張棟寢壥<BR>
//! @param		pInParam (I/O)	: IIC僨僶僀僗忣曬峔憿懱<BR>
//! @note		IIC捠怣傪峴偄儗僕僗僞偺抣傪撉傒崬傓<BR>
//! @attention	1.杮API傪幚峴偡傞慜偵_IiCWrapInit()傪幚峴偟偰壓偝偄<BR>
//!				2.堷悢偺僨僶僀僗傾僪儗僗偼8bit偱巜掕偡傞偙偲
//!				  (LSB偵偼0傪奿擺偡傞偙偲)
//!				3.杮API偱偼丄僗儗乕僽傾僪儗僗偺傒傪巜掕偟撉崬傒傪峴偆
//!				  (堷悢偺儗僕僗僞傾僪儗僗偼巊梡偟側偄)
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvIicRead( TdvHdmiRxIicParam * pInParam )
{
	IW ret = HDMIDRV_OK;

	// 僷儔儊乕僞僠僃僢僋
	ret = ParamCheck(pInParam, DV_HDMIRX_DEF_READ);
	if (ret != HDMIDRV_OK) {
		return ret;
	}
	// 僒僽傾僪儗僗巜掕柍偟偱撉崬傒
	ret = HdmiRxDrvIicRead(pInParam, 1);
	return ret;
}

//*******************************************************************
//! @brief		IIC bus僨僶僀僗偺憲庴怣摦嶌嫮惂廔椆
//! @retval		張棟寢壥<BR>
//! @param		bCh (I) : IIC僶僗 僠儍儞僱儖斣崋<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvIicStop(UB bCh)
{
	IW ret = HDMIDRV_OK;
	IW result;
	ID semid;
	ER ercd;

	// 巊梡Bus偑0偱傕1偱傕側偄応崌
	if (bCh < 0 || bCh > 1) {
		ret =DVHDMI_E_INVAL;
		goto End_Of_HdmiRxDrvIicStop;
	}

	// 弶婜壔嵪傒敾掕
	if (gInitFlag == 0) {
		ret =DVHDMI_E_NONINIT;
		goto End_Of_HdmiRxDrvIicStop;
	}

	// 僙儅僼僅ID偺庢摼
	semid = GetSemId(bCh);
	//僙儅僼僅妉摼
	ercd = SemOp(semid, DV_HDMIRX_DEF_SEM_LOCK, 0);
	switch (ercd) {
		case E_OK :		// 僙儅僼僅妉摼惉岟
			break;
		case E_TMOUT :	// 僙儅僼僅妉摼 僞僀儉傾僂僩
			ret = DVHDMI_E_SEM_TIMEOUT;
			goto End_Of_HdmiRxDrvIicStop;
			break;
		default :		// 僙儅僼僅妉摼 僄儔乕
			ret = DVHDMI_E_KERNEL;
			goto End_Of_HdmiRxDrvIicStop;
			break;
	}
	result = _dvIicStop(bCh);

	// 僙儅僼僅曉媝
	SemOp(semid, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
End_Of_HdmiRxDrvIicStop :
	return ret;		
}

//*******************************************************************
//! @brief		IIC bus僨僶僀僗偺忬懺忣曬庢摼
//! @retval		張棟寢壥<BR>
//! @param		bCh (I) : IIC僶僗 僠儍儞僱儖斣崋<BR>
//!	@param		bcnt(O) : 憲庴怣僨乕僞僶僀僩悢忣曬 
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW _HdmiRxDrvIicGetSts(UB ch, UW *bcnt)
{
	IW ret = HDMIDRV_OK;
	ret = _dvIicGetsts(ch, bcnt);
	return ret;
}

//*******************************************************************
//! @brief		IIC bus僨僶僀僗偺堎忢暅婣
//! @retval		張棟寢壥<BR>
//! @param		bCh (I) : IIC僶僗 僠儍儞僱儖斣崋<BR>

⌨️ 快捷键说明

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