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;
}
Beispiel #2
0
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
}
Beispiel #3
0
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;
}