?? dvhdmirxutil.c
字號:
/*=================================================================
* 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儕僜乕僗傪惗惉偟側(cè)偄
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):懳徾億乕僩抂巕偺婡擻慖戰(zhàn)<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偱偼丄僗儗乕僽傾僪儗僗偺傒傪巜掕偟撉崬傒傪峴偆
//! (堷悢偺儗僕僗僞傾僪儗僗偼巊梡偟側(cè)偄)
//! @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偱傕側(cè)偄応崌
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>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -