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

📄 dvhdmirxutil.c

📁 the HDMI(High Definition Multimedia Interface) driver code
💻 C
📖 第 1 页 / 共 2 页
字号:
//!	@param		bcnt(I)   : 儕僇僶儕乕梡僟儈乕怣崋弌椡夞悢
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
IW  _HdmiRxDrvIicRecovery(UB bBus, UB bCnt)
{
	IW ret = HDMIDRV_OK;
	return ret;
}

//*******************************************************************
//! @brief		GPIO彂崬傒
//! @retval		張棟寢壥<BR>
//! @param		id (I) :懳徾億乕僩抂巕偺ID斣崋愝掕<BR>
//! @param		lvl (I) :懳徾億乕僩抂巕傊偺弌椡儗儀儖愝掕<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/4/23
//*******************************************************************
IW _HdmiRxDrvGpioWrite(UB id, IB lvl)
{
	IW ret;
	ret = _dvGpioWrite(id, lvl);
	return ret;
}

//*******************************************************************
//! @brief		HDMI Drv 儘僌儗儀儖愝掕
//! @retval		曄峏慜偺僨僶僢僌儗儀儖
//! @param		lv (I) : 僨僶僢僌儗儀儖(壓婰偺OR傪巜掕偡傞偙偲)
//! @param				 0x00 儘僌弌椡柍岠
//! @param				 0x01 ASSERT儘僌桳岠
//! @param				 0x02 奜晹岞奐API 僩儗乕僗儘僌桳岠
//! @param				 0x04 撪晹娭悢僩儗乕僗儘僌桳岠
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/16
//*******************************************************************
UB _HdmiRxDrvChgLogLv(UB lv)
{
	UB old_lv;
	old_lv = gHdmiRxDrvDbgLvl;
	gHdmiRxDrvDbgLvl = lv;
	return old_lv;
}

/* 巄掕徻嵶僨僶僢僌弌椡 */
void HdmiRxDrvDebugPrint(char* format, ...)
{
	va_list list;
	int result;

	if (gHdmiRxDrvDbgLvl & 0x04) {
		va_start(list, format);
		result = vprintf(format, list);
		va_end( list );
	}
}

/* 巄掕僄儔乕僴儞僪儔乕 */
void HdmiRxDrvErrCatch(char* format, ...)
{
	va_list list;
	int result;

	if (gHdmiRxDrvDbgLvl & 0x01) {
		printf("[HDMI Drv Err] ");
		va_start(list, format);
		result = vprintf(format, list);
		va_end( list );
	}
}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%% f-3  private娭悢孮        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//*******************************************************************
//! @brief		IIC 彂崬傒梡僷儔儊乕僞愝掕
//! @retval		<BR>
//! @param		pWriteParam  (I/O) : IIC僪儔僀僶 API梡峔憿懱<BR>
//!	@param		pUtilParam  (I/O) : 撪晹巊梡峔憿懱
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static void SetWriteParam(T_IicSend* pWriteParam, const TdvHdmiRxIicParam* pUtilParam)
{
	pWriteParam->ch = pUtilParam->bCh;				// 巊梡Bus傪巜掕
	pWriteParam->add = pUtilParam->bDevAddr >> 1;	// 僨僶僀僗傾僪儗僗(7bit儌乕僪偵曄姺)
	pWriteParam->bcnt = pUtilParam->bNDataSize;		// 彂崬傒僶僀僩悢
	pWriteParam->p_data = pUtilParam->pbData;		// 彂崬傒僨乕僞傾僪儗僗
	pWriteParam->ack = pUtilParam->bAck;			// ACK乛NAK敾掕桳柍
	pWriteParam->cbPtr = NotifyIicWriteCB;			// 彂崬傒姰椆CB娭悢
	pWriteParam->cbPrm = &gWriteCbParam;			// 彂崬傒姰椆CB娭悢僷儔儊乕僞椞堟
}

//*******************************************************************
//! @brief		IIC 撉崬傒傒梡僷儔儊乕僞愝掕
//! @retval		<BR>
//! @param		pReadParam  (I/O) : IIC僪儔僀僶 API梡峔憿懱<BR>
//!	@param		pUtilParam  (I/O) : 撪晹巊梡峔憿懱
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static void SetReadParam(T_IicRcv* pReadParam, TdvHdmiRxIicParam* pUtilParam)
{
	pReadParam->ch = pUtilParam->bCh;				// 巊梡Bus傪巜掕
	pReadParam->add = pUtilParam->bDevAddr >> 1;	// 僨僶僀僗傾僪儗僗(7bit儌乕僪偵曄姺)
	pReadParam->bcnt = pUtilParam->bNDataSize;		// 撉崬傒僶僀僩悢
	pReadParam->p_data = pUtilParam->pbData;		// 撉崬傒僨乕僞傾僪儗僗
	pReadParam->ack = pUtilParam->bAck;				// ACK乛NAK敾掕桳柍
	pReadParam->cbPtr = NotifyIicReadCB;			// 撉崬傒姰椆CB娭悢
	pReadParam->cbPrm = &gReadCbParam;				// 撉崬傒姰椆CB娭悢僷儔儊乕僞椞堟
}

//*******************************************************************
//! @brief		僙儅僼僅ID庢摼
//! @retval		僙儅僼僅ID (0 < ret) : 惓忢廔椆<BR>
//!	@retval		偦偺懠 丗 堎忢廔椆
//! @param		semid (I)  丗僙儅僼僅ID<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static ID GetSemId(IW ch)
{
	ID ret;

	if (ch == DV_HDMIRX_DEF_IIC_CH) {
		ret = DV_HDMIRX_DEF_RES_SEM2;
	} else {
		ret = DVHDMI_E_INVAL;
	}
	return ret;
}

//*******************************************************************
//! @brief		僙儅僼僅憖嶌
//! @retval		張棟寢壥BR>
//! @param		semid (I)  丗僙儅僼僅ID<BR>
//! @param		semop(I) 丗僙儅僼僅憖嶌僼儔僌
//!						   儘僢僋(DV_HDMIRX_DEF_SEM_LOCK)
//!						   傾儞儘僢僋(DV_HDMIRX_DEF_SEM_UNLOCK) 
//! @param		timeout(I) : 僞僀儉傾僂僩抣 0:僞僀儉傾僂僩側偟 
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static ER SemOp(ID semid, IW semop, UW timeout)
{
	ER ercd = 0;

	if (semop == DV_HDMIRX_DEF_SEM_LOCK) {
		if (timeout > 0) {
			ercd = twai_sem(semid, (TMO)timeout);
		} else {
			ercd = wai_sem(semid);
		}
	} else if (semop == DV_HDMIRX_DEF_SEM_UNLOCK) {
		ercd = isig_sem(semid);
	} else {
		ercd = E_PAR;
	}
	return ercd;
}

//*******************************************************************
//! @brief		嫟捠僷儔儊乕僞敾掕
//! @retval		張棟寢壥BR>
//! @param		pInParam (I/O)丗撉傒彂偒懳徾IIC忣曬峔憿懱<BR>
//! @param		rw_mode (I): 撉傒彂偒儌乕僪庬暿 
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static IW ParamCheck(TdvHdmiRxIicParam * pInParam, IW rw_mode)
{
	IW ret;
	ret = HDMIDRV_OK;

	if ( pInParam== NULL ) {
		ret = DVHDMI_E_INVAL;
	}

	if ( pInParam->pbData == NULL || pInParam->bNDataSize <=0 ) {
		ret =DVHDMI_E_INVAL;
	}

	// 巊梡Bus偑0偱傕1偱傕側偄応崌
	if (pInParam->bCh != 2) {
		ret =DVHDMI_E_INVAL;
	}

	// 弶婜壔嵪傒敾掕
	if (gInitFlag == 0) {
		ret =DVHDMI_E_NONINIT;
	}
	
	// R/W儌乕僪傪愝掕
	pInParam->bMode = rw_mode;
	return ret;
}

//*******************************************************************
//! @brief		IIC bus 彂崬傒僒僽娭悢
//! @retval		張棟寢壥BR>
//! @param		pInParam (I/O):IIC僨僶僀僗忣曬峔憿懱<BR>
//! @note		<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static IW HdmiRxDrvIicWrite( TdvHdmiRxIicParam * pInParam )
{
	T_IicSend inParam;
	ID semid;
	UW timeout;
	ER ercd;
	IW result;
	IW ret = HDMIDRV_OK;

	// IIC捠怣僷儔儊乕僞愝掕
	SetWriteParam(&inParam, pInParam);

	// 僙儅僼僅ID偺庢摼
	semid = GetSemId(pInParam->bCh);

	// 僞僀儉傾僂僩抣庢摼
	timeout = (pInParam->nTimeOut > 0) ? pInParam->nTimeOut : 0;

	// 僙儅僼僅妉摼
	ercd = SemOp(semid, DV_HDMIRX_DEF_SEM_LOCK, timeout);
	switch (ercd) {
		case E_OK :		// 僙儅僼僅妉摼惉岟
			break;
		case E_TMOUT :	// 僙儅僼僅妉摼 僞僀儉傾僂僩
			ret = DVHDMI_E_SEM_TIMEOUT;
			goto End_Of_HdmiRxDrvIicWrite;
			break;
		default :		// 僙儅僼僅妉摼 僄儔乕
			ret = DVHDMI_E_KERNEL;
			goto End_Of_HdmiRxDrvIicWrite;
			break;
	}

#ifdef HDMI_IIC_SIMPLE_DLY
	// 僄儔乕僼儔僌傪弶婜壔
	gHdmiRxNotifyIicWriteTimeOut = 0;
#else
	// 婲彴梫媮梡偺帺僞僗僋ID傪庢摼
	get_tid(&gWupTaskId);
#endif

	// I2C捠怣憲怣奐巒
	result = _dvIicSend(&inParam);
	if (result != DV_E_OK ) {
		ret = result;
		_dvIicStop(inParam.ch);
		if (pInParam->bMode == DV_HDMIRX_DEF_WRITE) {
			SemOp(semid, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
#ifdef HDMI_IIC_SIMPLE_DLY
			// 僶僗奐曻懸偪
			WAIT(HDMI_IIC_WAIT);
#endif
		}
		goto End_Of_HdmiRxDrvIicWrite;
	}

#ifdef HDMI_IIC_SIMPLE_DLY
	// 彂崬傒姰椆CB懸偪
	ercd = SemOp(DV_HDMIRX_DEF_RES_SEM1, DV_HDMIRX_DEF_SEM_LOCK, gIicWrapTimeOut);
	if (ercd != E_OK) {
		// 僄儔乕帪偼憲庴怣嫮惂廔椆
		if (ercd == E_TMOUT) {
			// 憲庴怣懸偪梡僙儅僼僅偺夝彍
			gHdmiRxNotifyIicWriteTimeOut = 1;
			SemOp(DV_HDMIRX_DEF_RES_SEM1, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
		}
		_dvIicStop(inParam.ch);
		ret = DVHDMI_E_TIMEOUT;
	} else {
#else
	// 彂崬傒姰椆CB懸偪
	ercd = tslp_tsk((TMO)gIicWrapTimeOut);
	if (ercd != E_OK) {
		// 僞僀儉傾僂僩帪偼憲庴怣嫮惂廔椆
		ret = DVHDMI_E_TIMEOUT;
	} else {
#endif
		// 彂崬傒姰椆敾掕
		switch (gWriteCbParam.sts) {
			case 0:
				// 彂偒崬傒惓忢廔椆
				break;
			default:
			case 1:
				ret = DVHDMI_E_SEND_SLAVE;
				break;
			case 2:
				// 僨乕僞憲怣帪偵NACK傪庴怣 憡庤僨僶僀僗偑BUSY偺壜擻惈偑偁傞偨傔
				// 忋埵憌偱堦掕帪娫屻偵儕僩儔僀
				ret = DVHDMI_E_NACK;
				break;
		}
	}

	// 彂崬傒儌乕僪偺応崌偺傒僙儅僼僅傪奐曻
	// 撉傒崬傒偺応崌偼懕偗偰張棟傪峴偆偨傔暿搑奐曻偡傞
	if (pInParam->bMode == DV_HDMIRX_DEF_WRITE) {
		SemOp(semid, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
#ifdef HDMI_IIC_SIMPLE_DLY
		// 僶僗奐曻懸偪
		WAIT(HDMI_IIC_WAIT);
#endif
	}
End_Of_HdmiRxDrvIicWrite :
	return ret;
}

//*******************************************************************
//! @brief		IIC撉崬傒僒僽娭悢
//! @retval		張棟寢壥<BR>
//! @param		pInParam (I/O) : IIC僨僶僀僗忣曬峔憿懱<BR>
//!	@param		bReadMode(I) :  僒僽傾僪儗僗巜掕儌乕僪(0)
//!								僒僽傾僪儗僗巜掕柍偟儌乕僪(1)
//! @note		IIC捠怣傪峴偄儗僕僗僞偺抣傪撉傒崬傓<BR>
//! @attention	<BR>
//! @author		Y.Takeuchi
//! @date		2007/3/22
//*******************************************************************
static IW HdmiRxDrvIicRead( TdvHdmiRxIicParam * pInParam, UB bReadMode )
{
	T_IicRcv inReadParam; 
	UW temp;
	ID semid;
	ER ercd;
	IW result;
	UW timeout;
	IW ret = HDMIDRV_OK;

	// 僙儅僼僅ID偺庢摼
	semid = GetSemId(pInParam->bCh);

	if (bReadMode == 0) {
		// 僒僽傾僪儗僗巜掕撉崬傒儌乕僪
		// 僒僽傾僪儗僗巜掕偱撉傒崬傓応崌偼Write帪偵僙儅僼僅偺儘僢僋傪
		// 峴偭偰偄傞偨傔偙偙偱偼僙儅僼僅儘僢僋偼峴傢側偄

		// 撉崬傒僨乕僞僶僢僼傽偺愭摢偐傜儗僕僗僞傾僪儗僗偑奿擺偝傟偰偄傞
		// 撉崬傒偺慜偵僨僶僀僗偵懳偟偰儗僕僗僞傾僪儗僗傪彂偒崬傓偨傔
		// 撉崬傒僨乕僞僒僀僘傪戅旔偝偣偰儗僕僗僞傾僪儗僗傪愝掕偟
		// bNRegAddrSize僶僀僩彂偒崬傓
		if (pInParam->bNRegAddrSize <= 0) {
			ret = DVHDMI_E_INVAL;
			goto End_Of_HdmiRxDrvIicRead;
		}
		temp = pInParam->bNDataSize;
		pInParam->bNDataSize = pInParam->bNRegAddrSize;
		ret = HdmiRxDrvIicWrite(pInParam);
		if (ret != HDMIDRV_OK) {
			goto End_Of_HdmiRxDrvIicRead;
		}
		pInParam->bNDataSize = temp;
	} else {
		// 僒僽傾僪儗僗巜掕柍偟撉崬傒儌乕僪
		// 僞僀儉傾僂僩抣庢摼
		timeout = (pInParam->nTimeOut > 0) ? pInParam->nTimeOut : 0;
		// 僙儅僼僅妉摼
		ercd = SemOp(semid, DV_HDMIRX_DEF_SEM_LOCK, timeout);
	}

	// IIC捠怣僷儔儊乕僞愝掕
	SetReadParam(&inReadParam, pInParam);


#ifdef HDMI_IIC_SIMPLE_DLY
	// 僄儔乕僼儔僌傪弶婜壔
	gHdmiRxNotifyIicReadTimeOut = 0;
#else
	// 婲彴梫媮梡偺帺僞僗僋ID傪庢摼
	get_tid(&gWupTaskId);
#endif

	// IIC捠怣庴怣奐巒
	result = _dvIicRcv(&inReadParam);
	if (result != DV_E_OK ) {
		ret = result;
		_dvIicStop(inReadParam.ch);
		goto End_Of_HdmiRxDrvIicRead;
	}

#ifdef HDMI_IIC_SIMPLE_DLY
	// 彂崬傒姰椆CB懸偪
	ercd = SemOp(DV_HDMIRX_DEF_RES_SEM1, DV_HDMIRX_DEF_SEM_LOCK, gIicWrapTimeOut);
	if (ercd != E_OK) {
		// 僄儔乕帪偼憲庴怣嫮惂廔椆
		if (ercd == E_TMOUT) {
			// 憲庴怣懸偪梡僙儅僼僅偺夝彍
			gHdmiRxNotifyIicReadTimeOut = 1;
			SemOp(DV_HDMIRX_DEF_RES_SEM1, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
			_dvIicStop(inReadParam.ch);
		}
		ret = DVHDMI_E_TIMEOUT;
	} else {
#else
	// 彂崬傒姰椆CB懸偪
	ercd = tslp_tsk((TMO)gIicWrapTimeOut);
	if (ercd != E_OK) {
		// 僞僀儉傾僂僩帪偼憲庴怣嫮惂廔椆
		ret = DVHDMI_E_TIMEOUT;
		_dvIicStop(inReadParam.ch);
	} else {
#endif
		switch (gReadCbParam.sts) {
			case 0:
				// 惓忢廔椆
				break;
			default:
			case 1:
				ret = DVHDMI_E_SEND_SLAVE;
				break;
		}
	}

End_Of_HdmiRxDrvIicRead :
#ifdef HDMI_IIC_SIMPLE_DLY
	// 僶僗奐曻懸偪
	WAIT(HDMI_IIC_WAIT);
#endif
	// 僙儅僼僅曉媝
	SemOp(semid, DV_HDMIRX_DEF_SEM_UNLOCK, 0);
	return ret;
}

⌨️ 快捷键说明

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