void vSetHdmiHighBitrate(u8 fgHighBitRate)
{
  u8 bData;
  MT8193_AUDIO_FUNC();
  if(fgHighBitRate ==TRUE)
  {
  	bData=bReadByteHdmiGRL(GRL_AOUT_BNUM_SEL);
    bData |= HIGH_BIT_RATE_PACKET_ALIGN;
    vWriteByteHdmiGRL(GRL_AOUT_BNUM_SEL, bData);
     udelay(100);//1ms
    bData=bReadByteHdmiGRL(GRL_AUDIO_CFG);
    bData |= HIGH_BIT_RATE;
    vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
  }
  else
  {
  	bData=bReadByteHdmiGRL(GRL_AOUT_BNUM_SEL);
    bData &= ~HIGH_BIT_RATE_PACKET_ALIGN;
    vWriteByteHdmiGRL(GRL_AOUT_BNUM_SEL, bData);
    
  	bData=bReadByteHdmiGRL(GRL_AUDIO_CFG);
    bData &= ~HIGH_BIT_RATE;
    vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
  }	
	
	
}	
void vSetHdmiIecI2s(u8 bIn)
{
  u8 bData;	
  MT8193_AUDIO_FUNC();
  if(bIn == SV_SPDIF)	
  {

    bData=bReadByteHdmiGRL(GRL_CFG1);

    if((bData&CFG1_SPDIF)==0)
    {
      bData |= CFG1_SPDIF;
      vWriteByteHdmiGRL(GRL_CFG1, bData);
    }
  }
  else
  {
     bData=bReadByteHdmiGRL(GRL_CFG1);
     if(bData&CFG1_SPDIF)
     {
        bData &= ~CFG1_SPDIF;
        vWriteByteHdmiGRL(GRL_CFG1, bData);
      }
      bData=bReadByteHdmiGRL(GRL_CFG1);
  }	
}	
void vHalHDCPReset(void) 
{
  u8 bTemp;
  MT8193_HDCP_FUNC();

  if (fgHostKey())
  {
    bTemp = HDCP_CTL_CP_RSTB | HDCP_CTL_HOST_KEY;
  }
  else
  {
    bTemp = HDCP_CTL_CP_RSTB;
  }
  
  vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  
  for(bTemp=0; bTemp<5; bTemp++) 
  {                               
    udelay(255);
  } 
 
  bTemp=bReadByteHdmiGRL(GRL_HDCP_CTL);
  bTemp &= (~HDCP_CTL_CP_RSTB);
  
  vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  
  vSetCTL0BeZero(FALSE);
}
void vSetHdmiI2SChNum(u8 bChNum, u8 bChMapping)
{
	u8 bData, bData1, bData2, bData3;
	MT8193_AUDIO_FUNC();
	if (bChNum == 2)	/* I2S 2ch */
	{
		bData = 0x04;	/* 2ch data */
		bData1 = 0x50;	/* data0 */


	} else if ((bChNum == 3) || (bChNum == 4))	/* I2S 2ch */
	{
		if ((bChNum == 4) && (bChMapping == 0x08)) {
			bData = 0x14;	/* 4ch data */

		} else {
			bData = 0x0c;	/* 4ch data */
		}
		bData1 = 0x50;	/* data0 */


	} else if ((bChNum == 6) || (bChNum == 5))	/* I2S 5.1ch */
	{
		if ((bChNum == 6) && (bChMapping == 0x0E)) {
			bData = 0x3C;	/* 6.0 ch data */
			bData1 = 0x50;	/* data0 */
		} else {
			bData = 0x1C;	/* 5.1ch data, 5/0ch */
			bData1 = 0x50;	/* data0 */
		}


	} else if (bChNum == 8)	/* I2S 5.1ch */
	{
		bData = 0x3C;	/* 7.1ch data */
		bData1 = 0x50;	/* data0 */
	} else if (bChNum == 7)	/* I2S 6.1ch */
	{
		bData = 0x3C;	/* 6.1ch data */
		bData1 = 0x50;	/* data0 */
	} else {
		bData = 0x04;	/* 2ch data */
		bData1 = 0x50;	/* data0 */
	}

	bData2 = 0xc6;
	bData3 = 0xfa;

	vWriteByteHdmiGRL(GRL_CH_SW0, bData1);
	vWriteByteHdmiGRL(GRL_CH_SW1, bData2);
	vWriteByteHdmiGRL(GRL_CH_SW2, bData3);
	vWriteByteHdmiGRL(GRL_I2S_UV, bData);

	/* vDisableDsdConfig(); */

}
void vHDMISettingColorSpace(u8 ui1colorspace)
{
	if (ui1colorspace == HDMI_YCBCR_444) {
		vWriteByteHdmiGRL(GRL_DIV_RESET, UNSWAP_YC);
	} else if (ui1colorspace == HDMI_YCBCR_422) {
		vWriteByteHdmiGRL(GRL_DIV_RESET, SWAP_YC);
	} else {
		vWriteByteHdmiGRL(GRL_DIV_RESET, UNSWAP_YC);
	}
}
void vEnableNotice(u8 bOn)
{
	u8 bData;
	MT8193_VIDEO_FUNC();
	if (bOn == TRUE) {
		bData = bReadByteHdmiGRL(GRL_CFG2);
		bData |= 0x40;	/* temp. solve 720p issue. to avoid audio packet jitter problem */
		vWriteByteHdmiGRL(GRL_CFG2, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_CFG2);
		bData &= ~0x40;
		vWriteByteHdmiGRL(GRL_CFG2, bData);
	}
}
void vHalHDMI_NCTS(u8 bAudioFreq, u8 bPix, u8 bDeepMode)
{
  u8 bTemp, bData, bData1[NCTS_BYTES];
  u32 u4Temp, u4NTemp=0;
  
  MT8193_AUDIO_FUNC();
  MT8193_AUDIO_LOG("bAudioFreq=%d,  bPix=%d, bDeepMode=%d\n", bAudioFreq,  bPix, bDeepMode);
  	
  bData=0;
  vWriteByteHdmiGRL(GRL_NCTS, bData);//YT suggest 3 dummy N-CTS
  vWriteByteHdmiGRL(GRL_NCTS, bData);
  vWriteByteHdmiGRL(GRL_NCTS, bData);

  for(bTemp=0; bTemp<NCTS_BYTES; bTemp++)
  {
    bData1[bTemp] = 0;	
  }
  	
  if(bDeepMode == HDMI_NO_DEEP_COLOR)
  {
    for(bTemp=0; bTemp<NCTS_BYTES; bTemp++)
    {

      if((bAudioFreq < 7) && (bPix < 9))

      bData1[bTemp]= HDMI_NCTS[bAudioFreq][bPix][bTemp];
    }
    
    u4NTemp = (bData1[4]<<16)|(bData1[5]<<8)|(bData1[6]);//N
    u4Temp = (bData1[0]<<24)|(bData1[1]<<16)|(bData1[2]<<8)|(bData1[3]);//CTS
    
  }
  else
  {
  	for(bTemp=0; bTemp<NCTS_BYTES; bTemp++)
    {
		if((bAudioFreq < 7) && (bPix < 9)) 

      bData1[bTemp] = HDMI_NCTS[bAudioFreq][bPix][bTemp];
    }
    
    u4NTemp = (bData1[4]<<16)|(bData1[5]<<8)|(bData1[6]);//N
    u4Temp = (bData1[0]<<24)|(bData1[1]<<16)|(bData1[2]<<8)|(bData1[3]);
    
    if(bDeepMode == HDMI_DEEP_COLOR_10_BIT)
    {
      u4Temp = (u4Temp >> 2)*5;// (*5/4) 
    }
    else if(bDeepMode == HDMI_DEEP_COLOR_12_BIT)
void vHalWriteKsvListPort(u8 *prKsvData, u8 bDevice_Count, u8 *prBstatus)
{
	u8 bIndex;
	MT8193_HDCP_FUNC();
	if ((bDevice_Count * 5) < KSV_BUFF_SIZE) {
		for (bIndex = 0; bIndex < (bDevice_Count * 5); bIndex++) {
			vWriteByteHdmiGRL(GRL_KSVLIST, *(prKsvData + bIndex));
		}

		for (bIndex = 0; bIndex < 2; bIndex++) {
			vWriteByteHdmiGRL(GRL_KSVLIST, *(prBstatus + bIndex));
		}
	}

}
void vEnableHdmiMode(u8 bOn)
{
	u8 bData;
	MT8193_DRV_FUNC();
	if (bOn == TRUE) {
		bData = bReadByteHdmiGRL(GRL_CFG1);
		bData &= ~CFG1_DVI;	/* enable HDMI mode */
		vWriteByteHdmiGRL(GRL_CFG1, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_CFG1);
		bData |= CFG1_DVI;	/* disable HDMI mode */
		vWriteByteHdmiGRL(GRL_CFG1, bData);
	}

}
void vDSTNormalDouble(u8 fgEnable)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	if (fgEnable) {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData |= DST_NORMAL_DOUBLE;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData &= ~DST_NORMAL_DOUBLE;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	}

}
void vEnableDSTConfig(u8 fgEnable)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	if (fgEnable) {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData |= SACD_DST;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData &= ~SACD_DST;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	}

}
void vMiAnUpdateOrFix(u8 bUpdate)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	if (bUpdate == TRUE) {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp |= CFG1_HDCP_DEBUG;
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	} else {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp &= ~CFG1_HDCP_DEBUG;
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	}

}
void vWriteDataHdmiGRL(u8 bAddr, u8 bCount, u8 *bVal)
{
	u8 i;
	MT8193_HDCP_FUNC();
	for (i = 0; i < bCount; i++)
		vWriteByteHdmiGRL(bAddr + i * 4, *(bVal + i));
}
void vWriteHdmiIntMask(u8 bMask)
{
	MT8193_DRV_FUNC();

	vWriteByteHdmiGRL(GRL_INT_MASK, bMask);	/* INT mask */

}
void vEnableHashHardwrae(void)
{
	u8 bData;
	MT8193_HDCP_FUNC();
	bData = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bData |= HDCP_CTL_SHA_EN;
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bData);
}
void MuteHDMIAudio(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
	bData |= AUDIO_ZERO;
	vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
}
void vSetCTL0BeZero(u8 fgBeZero)
{
	u8 bTemp;

	MT8193_VIDEO_FUNC();

	if (fgBeZero == TRUE) {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp |= (1 << 4);
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	} else {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp &= ~(1 << 4);
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	}

}
void vEnableIecTxRaw(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_MIX_CTRL);
	bData |= MIX_CTRL_FLAT;
	vWriteByteHdmiGRL(GRL_MIX_CTRL, bData);
}
void vDisableDsdConfig(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
	bData &= ~SACD_SEL;
	vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);

}
void vStopAn(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bTemp |= HDCP_CTL_AN_STOP;
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}
void vEnableNCTSAutoWrite(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_DIVN);
	bData |= NCTS_WRI_ANYTIME;	/* enabel N-CTS can be written in any time */
	vWriteByteHdmiGRL(GRL_DIVN, bData);

}
void vEnableEncrpt(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bTemp |= HDCP_CTL_ENC_EN;
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}
void UnMuteHDMIAudio(void)
{
	BYTE bData;
	MT8193_AUDIO_FUNC();

	bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
	bData &= ~AUDIO_ZERO;
	vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
}
void vHalWriteHashPort(u8 *prHashVBuff)
{
	u8 bIndex;
	MT8193_HDCP_FUNC();
	for (bIndex = 0; bIndex < 20; bIndex++) {
		vWriteByteHdmiGRL(GRL_REPEATER_HASH + bIndex * 4, *(prHashVBuff + bIndex));
	}

}
u8 fgHostKey(void)
{
	u8 bTemp;

	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp | HDCP_CTL_HOST_KEY);
	return TRUE;
}
void vEnableAuthHardware(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bTemp |= HDCP_CTL_AUTHEN_EN;

	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}
void vAudioPacketOff(u8 bOn)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_SHIFT_R2);
	if (bOn)
		bData |= 0x40;
	else
		bData &= ~0x40;

	vWriteByteHdmiGRL(GRL_SHIFT_R2, bData);
}
u8 bCheckHDCPStatus(u8 bMode)
{
	u8 bStatus = 0;
	MT8193_HDCP_FUNC();
	bStatus = bReadByteHdmiGRL(GRL_HDCP_STA);

	bStatus &= bMode;
	if (bStatus) {
		vWriteByteHdmiGRL(GRL_HDCP_STA, bMode);
		return TRUE;
	} else {
		return FALSE;
	}
}
void vHwNCTSOnOff(u8 bHwNctsOn)
{
  u8 bData;	
  MT8193_AUDIO_FUNC();
  bData=bReadByteHdmiGRL(GRL_CTS_CTRL);
  
  if(bHwNctsOn == TRUE)
  bData &= ~CTS_CTRL_SOFT;
  else
  bData |= CTS_CTRL_SOFT;
  
  vWriteByteHdmiGRL(GRL_CTS_CTRL, bData);
   
}   
void vRepeaterOnOff(u8 fgIsRep)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);

	if (fgIsRep == TRUE) {
		bTemp |= HDCP_CTRL_RX_RPTR;
	} else {
		bTemp &= ~HDCP_CTRL_RX_RPTR;
	}

	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}