?? dvhdmirxutil.c
字號(hào):
//! @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:僞僀儉傾僂僩側(cè)偟
//! @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偱傕側(cè)偄応崌
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帪偵僙儅僼僅偺儘僢僋傪
// 峴偭偰偄傞偨傔偙偙偱偼僙儅僼僅儘僢僋偼峴傢側(cè)偄
// 撉崬傒僨乕僞僶僢僼傽偺愭摢偐傜儗僕僗僞傾僪儗僗偑奿擺偝傟偰偄傞
// 撉崬傒偺慜偵僨僶僀僗偵懳偟偰儗僕僗僞傾僪儗僗傪彂偒崬傓偨傔
// 撉崬傒僨乕僞僒僀僘傪戅旔偝偣偰儗僕僗僞傾僪儗僗傪愝掕偟
// 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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -