📄 dvhdmirx.c
字号:
#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 + -