#include <math.h>
#include ".\Include\common.h"
#include ".\Include\spReg52.h"
#include ".\Include\Switch.h"
#include ".\Include\mic_i2c.h"
#include ".\Include\HwLayer.h"
#include ".\Device\hdmi\hdmirx.h"
#define HDCP_ENABLE
#if 0
extern unsigned int dev_MSP3450Read(UCHAR,unsigned int);
extern void dev_MSP3450DspWrite(unsigned int,unsigned int);
extern void dev_MSP3450DemodWrite(unsigned int,unsigned int);
extern void dev_MSP3450DemodWrite(unsigned int,unsigned int);
#endif
unsigned char OldSysState =0xFF;
unsigned char PLLLockCount =0x20;
unsigned char PLLLStableCount =0x00;
bit IsAudioPLLReset = FALSE;
//------------------------------------------------------------
// used only in timer.c
unsigned char msCounter;
unsigned char AudioTO;
/******************************************************************************/
/**
* @brief The internal HDMI power control function
* @param ucSwitchChannel : K_PWR_DOWN - > power down HDMI \n
K_PWR_ON -> Power on HDMI
* @return none
******************************************************************************/
unsigned char HDMI_Power(unsigned char ucPowerCtrl)
{
unsigned char ucPD_PWR,ucEn_TMDS_Prt,ucEn_TMDS_Rx;
XBYTE[0x7fff] = 0x06;
ucPD_PWR = XBYTE[0x7f08];
ucEn_TMDS_Prt = XBYTE[0x7f09];
XBYTE[0x7fff] = 0x00;
ucEn_TMDS_Rx = XBYTE[0x7fc4];
if(ucPowerCtrl == K_PWR_ON )
{
ucPD_PWR |= 0x01;
ucEn_TMDS_Prt |= 0x11;
ucEn_TMDS_Rx |= 0x82;
}
else
{
XBYTE[0x7f09] = 0x01;
ucPD_PWR &= 0xfe;
ucEn_TMDS_Prt &= 0xee;
ucEn_TMDS_Rx &= 0x7d;
}
XBYTE[0x7fff] = 0x06;
XBYTE[0x7f09] = ucEn_TMDS_Prt;
XBYTE[0x7f08] = ucPD_PWR;
XBYTE[0x7fff] = 0x00;
XBYTE[0x7fc4] = ucEn_TMDS_Rx;
return TRUE;
}
/******************************************************************************/
/**
* @brief The build-in HDMI initial function
* @param ucDevstatus :
* K_RGB_24BIT\K_YUV422_16BIT\K_YUV411_12BIT
* K_YUV444_24BIT\K_YUV422_8BIT
* @return none
******************************************************************************/
void HDMI_Initialize(unsigned char ucDevstatus)
{
L2_Set_HDMI_Init10();
L2_Set_HDMI_Init11();
//HDMIWriteByteB7(0x26, 0x34);
HDMIWriteByteB7(0x26, 0x70);
ucDevstatus = ucDevstatus; //avoid warning C280
#if 0
HDMIWriteByteB7(0x02, 0x63);
HDMIWriteByteB7(0x26, 0x70);
HDMIWriteByteB7(0x27, 0xf9);
HDMIWriteByteB7(0x29, 0x0c);
HDMIWriteByteB7(0x00, 0x00);
// HDMIWriteByteB7(0x02, 0xf3);
#endif
}
#if 0 //uncalled segment now
/******************************************************************************/
/**
* @brief Reset build-in HDMI
* @param K_SW_RESET / K_HW_RESET
* @return none
******************************************************************************/
void HDMI_Reset(unsigned char ucResetType)
{
if(ucResetType == K_SW_RESET )
{
HDMIWriteByteB6( SWRST_ADDR,0x01);
HDMIWriteByteB6( SWRST_ADDR,0x00);
}
else
{
//HDMIWriteByteB6( SWRST_ADDR, AUTO_HDCP_RST); //<--Need to change
}
}
#endif
/******************************************************************************/
/**
* @brief The build-in HDMI sync detect function
* @param None
* @return K_SIGNAL_IN/K_NO_SIGNAL_IN
******************************************************************************/
unsigned char HDMI_Detect_Input(void)
{
unsigned char ucTmp;
XBYTE[0x7fff]= 0x06;
ucTmp = XBYTE[0x7f06];
if((ucTmp & 0x03) == 0x03 )
{
XBYTE[0x7fff]= 0x06;
ucTmp = XBYTE[0x7ff9];
if((ucTmp&0x10)!=0x10)
{
XBYTE[0x7f71]=0x00;
XBYTE[0x7ffa]=0x00;
XBYTE[0x7ffa]=0x20;
XBYTE[0x7ff9]=0x00;
return K_NO_SIGNAL_IN;
}
else
{
XBYTE[0x7ffa]=0x20;
return K_SIGNAL_IN;
}
}
else
{
return K_NO_SIGNAL_IN;
}
}
/******************************************************************************/
/**
* @brief Return the Timing's polarity
* @param none
*
* @return bit 0 Hs polarity, bit 1 Vs polarity 0x00 (v-,h-), 0x01 (v-,h+) \n
0x02 (v+,h-), 0x03 (v+,h+) \n
******************************************************************************/
unsigned char HDMI_Get_Polarity(void)
{
XBYTE[0x7fff]=0x06;
return ((XBYTE[0x7f55]&0x02)|(XBYTE[0x7f55]&0x01));
}
/******************************************************************************/
/**
* @brief Get the HDMI input data format \n
* @param none
*
* @return K_RGB_24BIT\K_YUV444_24BIT\K_YUV422_8BIT
******************************************************************************/
unsigned char HDMI_Get_Output_DataFormat(void)
{
unsigned char ucRet;
InfoFrameType idata InfoFrame;
HDMIRxGetInfoFrame(AVI_IF_ADDR, &InfoFrame);
switch (InfoFrame.Data[0] & 0x60)
{
case 0x00 :
ucRet = K_RGB_24BIT;
break;
case 0x20 :
// if ((InfoFrame.Data[4] & 0x01) == 0x01)
// {
// HDMIWriteByteB6(0x4a,(HDMIReadByteB6(0x4a) | 0x04));
// ucRet = K_YUV444_24BIT;
// }
// else
// {
// HDMIWriteByteB6(0x4a,(HDMIReadByteB6(0x4a) & 0xfb));
ucRet = K_YUV422_16BIT;
// }
break;
case 0x40 :
// HDMIWriteByteB6(0x4a,(HDMIReadByteB6(0x4a) & 0xfb));
ucRet = K_YUV444_24BIT;
break;
default:
ucRet = K_RGB_24BIT;
break;
}
switch(InfoFrame.Data[1] & 0x30)
{
case 0x10 :
ucRet |= K_HDMI_DIS_43;
break;
default:
ucRet |= K_HDMI_DIS_169;
break;
}
return ucRet;
}
/******************************************************************************/
/**
* @brief The build-in HDMI report horizontal/vertical total pixel
* @param None
* @return TRUE
******************************************************************************/
unsigned char HDMI_Rpt_Total(unsigned short *usHtotal,unsigned short *usVtotal)
{
XBYTE[0x7fff]= 0x06;
*usHtotal=((XBYTE[0x7f3b]&0x1f)<<8)+(XBYTE[0x7f3a]);
*usVtotal=((XBYTE[0x7f3d]&0x07)<<8)+(XBYTE[0x7f3c]);
return TRUE;
}
/******************************************************************************/
/**
* @brief Polling the HDMI event report
* @param None
* @return bit0 for SCDT change/bit1 for AVI change/bit2 for Resoultion change
******************************************************************************/
unsigned char HDMIReadRxInt(void)
{
unsigned char ucHDMIChange;
unsigned char IntrData[4];
//unsigned char InfoPara[5];
//unsigned char InfoErrorType;
unsigned short Htotal, Vtotal;
InfoFrameType idata InfoFrame;
ucHDMIChange = 0x00;
if(HDMIReadByteB6(0x70)| 0x01){
if(SysState != PowerDown)
{
HDMIReadBlockB6(HDMI_INT_ADDR, 4, IntrData); // read 0x71 ~ 0x74interrupt status
IntrData[0] &= (~BIT_CTS_CHANGED); // this interrupt will be cleared at Timer.c
HDMIWriteBlockB6(HDMI_INT_ADDR, 4,IntrData);
//HDMIWriteByteB7(0x26, 0x34);
// HDMIWriteByteB7(0x26, 0x70);
#if 1// solved audio noise 2 temporarily
// if((HDMIReadByteB6(0x71) & 0x90) != 0x00)
if(((HDMIReadByteB6(0x71) & 0x90) != 0x00) || ((HDMIReadByteB6(0x74) & 0x03) != 0x00))
// if(((HDMIReadByteB6(0x74) & 0x03) != 0x00))
// if(((IntrData[0] & 0x80) == 0x80) || ((IntrData[3] & 0x03) != 0x00))
{
// IsAudioPLLReset = FALSE;
// printf("HDMIReadByteB6(0x71)=%bx\n",HDMIReadByteB6(0x71));
// printf("HDMIReadByteB6(0x74)=%bx\n",HDMIReadByteB6(0x74));
PLLLStableCount = 0x00;
AudioTurn(OFF);
/*
HDMIWriteByteB7(0x03,0xff);
HDMIWriteByteB7(0x04,0xff);
HDMIWriteByteB7(0x05,0x0f);
HDMIWriteByteB7(0x09,0xff);
HDMIWriteByteB7(0x0a,0
- 1
- 2
- 3
前往页