📄 dvhdmirx.c
字号:
UB packet_type;
UB cnt;
UB length = 0;
UW checksum = 0;
UB packet_length;
UB i;
/* #ACP_PACKET ADD S 2007/12/14 Y.Takeuchi */
UB enable_check_sum = 0;
/* #ACP_PACKET ADD S 2007/12/14 Y.Takeuchi */
switch (DevNo) {
case DV_HDMIRX_DEF_DEV_0:
switch(inParam->PacketID) {
case 0x00 : // AVI InfoFrame Packet
/* #CALC_CHECK_SUM CHG S 2007/12/13 */
packet_length = DV_HDMIRX_DEF_AVI_INFO_FLAME_SIZE + 2;
/* #CALC_CHECK_SUM CHG E 2007/12/13 */
packet_type = DV_HDMIRX_DEF_AVI_INFOFRAME;
/* #ACP_PACKET ADD S 2007/12/14 Y.Takeuchi */
enable_check_sum = 1;
/* #ACP_PACKET ADD E 2007/12/14 Y.Takeuchi */
break;
case 0x01 : // Audio InfoFrame Packet
/* #CALC_CHECK_SUM CHG S 2007/12/13 */
packet_length = DV_HDMIRX_DEF_AUDIO_INFO_FLAME_SIZE + 2;
/* #CALC_CHECK_SUM CHG E 2007/12/13 */
packet_type = DV_HDMIRX_DEF_AUDIO_INFOFRAME;
/* #ACP_PACKET ADD S 2007/12/14 Y.Takeuchi */
enable_check_sum = 1;
/* #ACP_PACKET ADD E 2007/12/14 Y.Takeuchi */
break;
case 0x02 : // MS InfoFrame Packet
/* #CALC_CHECK_SUM CHG S 2007/12/13 */
packet_length = DV_HDMIRX_DEF_AUDIO_INFO_FLAME_SIZE + 2;
/* #CALC_CHECK_SUM CHG E 2007/12/13 */
packet_type = DV_HDMIRX_DEF_MS_INFOFRAME;
/* #ACP_PACKET ADD S 2007/12/14 Y.Takeuchi */
enable_check_sum = 1;
/* #ACP_PACKET ADD E 2007/12/14 Y.Takeuchi */
break;
case 0x03 : // ACP Packet
/* #ACP_PACKET ADD S 2007/12/18 Y.Takeuchi */
packet_length = inParam->PacketLength;
/* #ACP_PACKET ADD S 2007/12/18 Y.Takeuchi */
packet_type = DV_HDMIRX_DEF_ACP;
break;
default :
ret = DVHDMI_E_INVAL;
return ret;
}
memset(gHdmiRxDrvTempPacketBuff, 0x00, sizeof(gHdmiRxDrvTempPacketBuff));
ret = _dvHdmiRxR8J66030FTGetPacket(
packet_type,
packet_length,
gHdmiRxDrvTempPacketBuff);
if (ret != HDMIDRV_OK) {
return ret;
}
// 庢摼僨乕僞敾掕
if (gHdmiRxDrvTempPacketBuff[0] == 0x00) {
inParam->PacketSts = 0x01;
return ret;
}
/* #ACP_PACKET CHG S 2007/12/18 Y.Takeuchi */
if (enable_check_sum) {
// 僠僃僢僋僒儉寁嶼偲僄儔乕僐乕僪愝掕
// 僿僢僟乕晹偺抣傪checksum偵壛嶼(僷働僢僩挿偼彍偔)
for (cnt=0; cnt<2; cnt++) {
checksum += gHdmiRxDrvTempPacketBuff[cnt];
if (checksum > 0xFF) {
checksum -= 0x100;
}
}
// 僷働僢僩挿傪庢摼
length = gHdmiRxDrvTempPacketBuff[cnt];
// 僿僢僟乕晹偺抣傪checksum偵壛嶼(僷働僢僩挿)
checksum += gHdmiRxDrvTempPacketBuff[cnt++];
if (checksum > 0xFF) {
checksum -= 0x100;
}
// 僠僃僢僋僒儉晹暘偼壛嶼懳徾偲偟側偄偨傔僇僂儞僞傪恑傔傞
cnt++;
// 僨乕僞晹偺抣傪checksum偵壛嶼
for (i=0; i<length; i++) {
checksum += gHdmiRxDrvTempPacketBuff[i+cnt];
if (checksum > 0xFF) {
checksum -= 0x100;
}
}
// 崌寁抣偺2偺曗悢偑僠僃僢僋僒儉抣
if (checksum) {
checksum = (0xFF - checksum) + 1;
}
}
/* #ACP_PACKET CHG E 2007/12/18 Y.Takeuchi */
// 僷働僢僩偐傜庢摼偟偨僠僃僢僋僒儉抣偲寁嶼偵傛傞僠僃僢僋僒儉抣傪斾妑
/* #ACP_PACKET CHG S 2007/12/14 Y.Takeuchi */
if ((checksum != gHdmiRxDrvTempPacketBuff[3]) && (enable_check_sum)) {
/* #ACP_PACKET CHG E 2007/12/14 Y.Takeuchi */
HdmiRxDrvErrCatch("_HdmiRxVdGetPacket checksum failed type:%x sum_value:%x packet_value:%x\n", packet_type, checksum, inParam->PacketData[3]);
// 僠僃僢僋僒儉堎忢専弌
inParam->PacketSts = 0x02;
// 庢摼僷働僢僩傪巜掕僒僀僘暘偩偗僐僺乕
memcpy(inParam->PacketData, gHdmiRxDrvTempPacketBuff, inParam->PacketLength);
} else {
inParam->PacketSts = 0x00;
// 庢摼僷働僢僩傪巜掕僒僀僘暘偩偗僐僺乕
memcpy(inParam->PacketData, gHdmiRxDrvTempPacketBuff, inParam->PacketLength);
}
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>
//! @param outParam(O) 丗妱崬傒忬懺奿擺峔憿懱<BR>
//! @note <BR>
//! @attention <BR>
//! @author Y.Takeuchi
//! @date 2007/3/19
//*******************************************************************
IW _HdmiRxVdCheckIntrupt(UB DevNo, THdmiRxDrvIntr* outParam)
{
IW ret;
UB intr_sts[3] = {0, 0, 0};
switch (DevNo) {
case DV_HDMIRX_DEF_DEV_0:
// 僨僶僀僗妱崬傒敾掕
ret = _dvHdmiRxR8J66030FTCheckIntrupt (intr_sts);
if (ret == HDMIDRV_OK) {
outParam->IntrSts1 = intr_sts[0];
outParam->IntrSts2 = intr_sts[1];
outParam->IntrSts3 = 0x00; // 枹巊梡
if (outParam->IntrSts1 != 0 || outParam->IntrSts2 != 0) {
outParam->Intr = 1;
} else {
outParam->Intr = 0;
}
}
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>
//! @param outParam(O) 丗僨僶僀僗忬懺奿擺峔憿懱<BR>
//! @note <BR>
//! @attention <BR>
//! @author Y.Takeuchi
//! @date 2007/3/19
//*******************************************************************
IW _HdmiRxVdGetSts(UB DevNo, THdmiRxDrvSts* outParam)
{
IW ret = HDMIDRV_OK;
UB reg = 0x00;
UB tx_power = 0x00;
UB de_detect = 0x00;
UB hot_plug = 0x00;
UB hdmi_mode = 0x00;
UB auth_sts = 0x00;
UB audio_fifo = 0x00;
UB enc_sts = 0x00;
UB plug_det = 0x00;
static UB intr_lvl = 0x00;
static UB old_tx_power = 0x00;
static UB old_de_detect = 0x00;
static UB old_hot_plug = 0x00;
static UB old_hdmi_mode = 0x00;
static UB old_auth_sts = 0x00;
static UB old_audio_fifo = 0x00;
static UB old_enc_sts = 0x00;
static UB tx_chattering_cnt = 0;
static UB de_chattering_cnt = 0;
static UB hp_chattering_cnt = 0;
static UB hdmi_mode_chattering_cnt = 0;
static UB auth_chattering_cnt = 0;
static UB audio_fifo_chattering_cnt = 0;
static UB enc_chattering_cnt = 0;
// 晄掕抣偱弶婜壔
memset(outParam, 0xFF, sizeof(THdmiRxDrvSts));
outParam->Sts = 0;
// Rx 揹尮忬懺敾掕
if (gHdmiRxDrvSysInfo.RxPower[DV_HDMIRX_DEF_DEV_0] == DV_HDMIRX_DEF_POWER_OFF) {
outParam->RxPowerSts = DV_HDMIRX_DEF_POWER_OFF; // Rx揹尮OFF
outParam->PortNo = gHdmiRxDrvSysInfo.PortNo[DV_HDMIRX_DEF_DEV_0]; // 億乕僩斣崋
return ret;
} else {
outParam->RxPowerSts = DV_HDMIRX_DEF_POWER_ON; // Rx揹尮ON
outParam->PortNo = gHdmiRxDrvSysInfo.PortNo[DV_HDMIRX_DEF_DEV_0]; // 億乕僩斣崋
}
switch (DevNo) {
case DV_HDMIRX_DEF_DEV_0:
// 僗僥乕僞僗儗僕僗僞1撉崬傒
ret = _dvHdmiRxR8J66030FTGetStsReg1(®);
if (ret == HDMIDRV_OK) {
tx_power = reg & 0x20;
// 僠儍僞儕儞僌懳嶔
// 憲怣懁揹尮忬懺妋掕敾掕
if (old_tx_power == tx_power) {
if (tx_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.TxPowerDetCnt) {
// 憲怣懁揹尮忬懺枹妋掕
tx_chattering_cnt ++;
} else {
// 憲怣懁揹尮忬懺妋掕
outParam->Sts |= DV_HDMIRX_DEF_TXPOWER_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
tx_chattering_cnt = 0;
old_tx_power = tx_power;
}
// 憲怣懁揹尮忬懺庢摼
if (reg & 0x20) {
outParam->TxPowerSts = DV_HDMIRX_DEF_POWER_ON;
} else {
outParam->TxPowerSts = DV_HDMIRX_DEF_POWER_OFF;
}
de_detect = reg & 0x40;
// 僠儍僞儕儞僌懳嶔
// DE怣崋忬懺妋掕敾掕
if (old_de_detect == de_detect) {
if (de_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.DeDetCnt) {
// DE怣崋忬懺枹妋掕
de_chattering_cnt ++;
} else {
// DE怣崋忬懺妋掕
outParam->Sts |= DV_HDMIRX_DEF_DE_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
de_chattering_cnt = 0;
old_de_detect = de_detect;
}
// DE 怣崋忬懺庢摼
if (reg & 0x40) {
outParam->DEDetect = DV_HDMIRX_DEF_DE_VALID;
} else {
outParam->DEDetect = DV_HDMIRX_DEF_DE_UNVALID;
}
hot_plug = reg & 0x80;
// 僠儍僞儕儞僌懳嶔
// 愙懕忬懺妋掕敾掕
if (old_hot_plug == hot_plug) {
if (hp_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.HotPlugDetCnt) {
// 愙懕忬懺枹妋掕
hp_chattering_cnt ++;
} else {
// 愙懕忬懺妋掕
outParam->Sts |= DV_HDMIRX_DEF_HP_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
hp_chattering_cnt = 0;
old_hot_plug = hot_plug;
}
// 愙懕忬懺庢摼
// Source懁偐傜+5V偑擖偭偰偒偰偄傞忬懺偱HPDet傪曉偟偰偄傞応崌偺傒
// LinkOn偲側傞
// Source懁偐傜偺+5V偩偗偱LinkOn偲偼側傜側偄偨傔拲堄偡傞偙偲
if (reg & 0x80) {
outParam->HotPlug = DV_HDMIRX_DEF_LINK_ON;
} else {
outParam->HotPlug = DV_HDMIRX_DEF_LINK_OFF;
}
// 働乕僽儖忬懺敾掕
/* #AUTH_FAILED_MUTE CHG S 2007/10/26 */
if (outParam->TxPowerSts != DV_HDMIRX_DEF_POWER_ON) {
// Tx 揹尮OF専弌
return ret;
}
/* #AUTH_FAILED_MUTE CHG E 2007/10/26 */
// 壒惡FIFO偵惓忢傪愝掕
outParam->AudioFIFO = 0x00;
// 僠儍僞儕儞僌懳嶔
// 壒惡FIFO妋掕敾掕
audio_fifo = reg & 0x18;
if (old_audio_fifo == audio_fifo) {
if (audio_fifo_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.AudioFifoDetCnt) {
//壒惡FIFO枹妋掕
audio_fifo_chattering_cnt ++;
} else {
// 壒惡FIFO妋掕
outParam->Sts |= DV_HDMIRX_DEF_AFIFO_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
audio_fifo_chattering_cnt = 0;
old_audio_fifo = audio_fifo;
}
// 壒惡FIFO忬懺敾掕
if (reg & 0x10) {
// 僆乕僶乕僼儘乕専弌
outParam->AudioFIFO |= DV_HDMIRX_DEF_AFIFO_OF;
}
if (reg & 0x08) {
// 傾儞僟乕僼儘乕専弌
outParam->AudioFIFO |= DV_HDMIRX_DEF_AFIFO_OF;
}
} else {
// 嫮惂儕僙僢僩幚峴
_HdmiRxVdExtReset(DV_HDMIRX_DEF_DEV_0);
HdmiRxDrvErrCatch("_dvHdmiRxR8J66030FTGetStsReg1 failed %d\n", ret);
return ret;
}
// 僗僥乕僞僗儗僕僗僞0撉崬傒
ret = _dvHdmiRxR8J66030FTGetStsReg0(®);
if (ret == HDMIDRV_OK) {
/* #AUTH_FAILED_MUTE ADD S 2007/10/26 */
// 僠儍僞儕儞僌懳嶔
// 擣徹忬懺妋掕敾掕
auth_sts = reg & 0x08;
if (old_auth_sts == auth_sts) {
if (auth_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.AuthDetCnt) {
// 擣徹忬懺枹妋掕
auth_chattering_cnt ++;
} else {
// 擣徹忬懺妋掕
outParam->Sts |= DV_HDMIRX_DEF_AUTH_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
auth_chattering_cnt = 0;
old_auth_sts = auth_sts;
}
// 擣徹忬懺庢摼
if (auth_sts) {
outParam->AuthSts = 1;
} else {
outParam->AuthSts = 0;
}
if (outParam->HotPlug != DV_HDMIRX_DEF_LINK_ON) {
return ret;
}
/* #AUTH_FAILED_MUTE ADD E 2007/10/26 */
hdmi_mode = reg & 0x10;
// 僠儍僞儕儞僌懳嶔
// HDMI儌乕僪偑妋掕敾掕
if (old_hdmi_mode == hdmi_mode) {
if (hdmi_mode_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.HdmiModeDetCnt) {
// HDMI 儌乕僪枹妋掕
hdmi_mode_chattering_cnt ++;
} else {
// HDMI 儌乕僪妋掕
outParam->Sts |= DV_HDMIRX_DEF_MODE_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
hdmi_mode_chattering_cnt = 0;
old_hdmi_mode = hdmi_mode;
}
// HDMI 儌乕僪庢摼
if (hdmi_mode) {
outParam->Mode = DV_HDMIRX_DEF_MODE_HDMI ;
} else {
outParam->Mode = DV_HDMIRX_DEF_MODE_DVI;
// DVI儌乕僪側偺偱壒惡FIFO忬懺傪晄掕偲偡傞
outParam->AudioFIFO = 0xFF;
}
// 僠儍僞儕儞僌懳嶔
// 埫崋壔忬懺妋掕敾掕
enc_sts = reg & 0x04;
if (old_enc_sts == enc_sts) {
if (enc_chattering_cnt < gHdmiRxDrvConfigTbl.ConditionTbl.EncDetCnt) {
// 埫崋壔忬懺枹妋掕
enc_chattering_cnt ++;
} else {
// 埫崋壔忬懺妋掕
outParam->Sts |= DV_HDMIRX_DEF_ENC_DET;
}
} else {
// 慜夞偺抣偲偺曄壔専弌
enc_chattering_cnt = 0;
old_enc_sts = enc_sts;
}
// 埫崋壔忬懺庢摼
if (reg & 0x04) {
outParam->EncryptionSts = 1;
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -