bool CAESinkIntelSMD::LoadEDID() { UnloadEDID(); bool ret = false; gdl_init(); gdl_hdmi_audio_ctrl_t ctrl; edidHint** cur = &m_edidTable; // Set up our control ctrl.cmd_id = GDL_HDMI_AUDIO_GET_CAPS; ctrl.data._get_caps.index = 0; while( gdl_port_recv(GDL_PD_ID_HDMI, GDL_PD_RECV_HDMI_AUDIO_CTRL, &ctrl, sizeof(ctrl)) == GDL_SUCCESS ) { edidHint* hint = new edidHint; if( !hint ) return false; ret = true; hint->format = mapGDLAudioFormat( (gdl_hdmi_audio_fmt_t)ctrl.data._get_caps.cap.format ); if( ISMD_AUDIO_MEDIA_FMT_INVALID == hint->format ) { delete hint; ctrl.data._get_caps.index++; continue; } hint->channels = (int)ctrl.data._get_caps.cap.max_channels; hint->sample_rates = (unsigned char) (ctrl.data._get_caps.cap.fs & 0x7f); if( ISMD_AUDIO_MEDIA_FMT_PCM == hint->format ) { hint->sample_sizes = (ctrl.data._get_caps.cap.ss_bitrate & 0x07); if( hint->sample_sizes & 0x04 ) hint->sample_sizes |= 0x08; // if we support 24, we support 32. } else hint->sample_sizes = 0; *cur = hint; cur = &( hint->next ); // get the next block ctrl.data._get_caps.index++; } *cur = NULL; DumpEDID(); return ret; }
BYTE Read_OneBlock_EDID(BYTE *rEDID, BYTE uBlock, BYTE EDIDdev) { BYTE i; BOOL EDID_Reading; BYTE CheckSum =0; for(i=0;i<0x80;i+=0x10) { // Read EDID #ifdef On_Chip_EDID if(EDIDdev == ExtEDID) EDID_Reading=EDID_READ_BYTE(EXT_EDIDADR, i+(uBlock*0x80), 0x10, &rEDID[i], EDIDdev); else #endif EDID_Reading=EDID_READ_BYTE(EDIDADR, i+(uBlock*0x80), 0x10, &rEDID[i], EDIDdev); if(EDID_Reading== TRUE) continue; else { #ifdef EDID_Dump EDID_DEBUG_PRINTF(("Read EIDI[%x] = %x\n",(WORD)i,(WORD)rEDID[i])); #endif return Ext_EDID_Read_Fail; } } for(i=0;i<0x80;i++) { CheckSum+=rEDID[i]; } #ifdef EDID_Dump EDID_DEBUG_PRINTF(("========Read EDID Block %x ========\n",(WORD)uBlock)); EDID_DEBUG_PRINTF(("CheckSum=%X\n",(WORD)CheckSum)); DumpEDID(rEDID); #endif if(CheckSum!=0) { #ifdef EDID_Dump EDID_DEBUG_PRINTF(("================================\n")); EDID_DEBUG_PRINTF(("|| ||\n")); EDID_DEBUG_PRINTF(("|| ||\n")); EDID_DEBUG_PRINTF(("|| Check Sum Error ||\n")); EDID_DEBUG_PRINTF(("|| ||\n")); EDID_DEBUG_PRINTF(("|| ||\n")); EDID_DEBUG_PRINTF(("================================\n")); #endif return Int_EDID_CheckSum_Fail; } return EDID_Read_Success; // EDID OK return }
BYTE Write_OneBlock_EDID(BYTE *wEDID, BYTE uBlock) { BYTE i; EDIDWP(FALSE); //================================================================== wEDID[0x7F] = 0; for(i=0;i<0x7F;i++) { wEDID[0x7F] -= wEDID[i]; } #ifdef EDID_Dump EDID_DEBUG_PRINTF(("========EDID buf Data %x ========\n",(WORD)uBlock)); DumpEDID(wEDID); //================================================================== #endif for(i=0;i<0x80;i+=EDID_Page_Size) { BYTE cCheckLimCnt,cNumCnt,ByteAddress,ReadErrorCnt; BYTE cCheckData[EDID_Page_Size]; BOOL bWriteSuccess; #ifdef EDID_Dump EDID_DEBUG_PRINTF1(("========EDID block-%x-%x========",(WORD)uBlock,(WORD)i)); #endif cCheckLimCnt = 3; while(cCheckLimCnt--) { ByteAddress = i+(uBlock*0x80); ReadErrorCnt = 100; #ifdef On_Chip_EDID EDID_WRITE_BYTE( EDIDADR,ByteAddress ,EDID_Page_Size, &wEDID[i], RXDEV); while(!EDID_READ_BYTE(EDIDADR,ByteAddress, EDID_Page_Size, cCheckData, RXDEV)&&(ReadErrorCnt)) ReadErrorCnt--; #else EDID_WRITE_BYTE( EDIDADR,ByteAddress ,EDID_Page_Size, &wEDID[i], IntEDID); delay1ms(8);//8 while(!EDID_READ_BYTE(EDIDADR,ByteAddress, EDID_Page_Size, cCheckData, IntEDID)&&(ReadErrorCnt)) ReadErrorCnt--; #endif for(cNumCnt=0;cNumCnt<EDID_Page_Size;cNumCnt++) { ByteAddress = i+cNumCnt; bWriteSuccess = TRUE; //EDID_DEBUG_PRINTF(("ByteAddress=%x\n",(WORD)ByteAddress)); if(cCheckData[cNumCnt] == wEDID[ByteAddress]) continue; else { #ifdef EDID_Dump EDID_DEBUG_PRINTF(("cCheckData=%x vs EDID[%x]=%x\n",(WORD)cCheckData[cNumCnt],(WORD)ByteAddress,(WORD)wEDID[ByteAddress])); #endif bWriteSuccess = FALSE; //break; } } if(bWriteSuccess) break; } #ifdef EDID_Dump if(bWriteSuccess==FALSE) EDID_DEBUG_PRINTF(("========can't write ========\n",(WORD)uBlock)); else EDID_DEBUG_PRINTF(("\n")); #endif } // HoldSystem(); #ifdef EDID_Dump #ifdef On_Chip_EDID //================================================================== Read_OneBlock_EDID(wEDID, uBlock, RXDEV); //================================================================== #else //================================================================== Read_OneBlock_EDID(wEDID, uBlock, IntEDID); //================================================================== #endif #endif EDIDWP(TRUE); return EDID_Write_Finish; }