⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 displayport.c

📁 realtek LCD monitor, TV开发源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        pData[1]=16;

    OffsetLine = 1536*(WORD)(ucDisplayPortCtrl&0x07)/(WORD)pData[1];

    FrontPorchValueData = (((DWORD)(HtotalValueData-HwidthValueData-HstartValueData+OffsetLine)) * NvidValueData/MvidValueData);
//end of eagleeyes-20080309

     pData[0]=(FrontPorchValueData>>24);
     if(pData[0]==0)
        return(FrontPorchValueData);
     else
        return(0x000002);
}
#endif //End of #if(_FRONT_PORCH_REGENERATOR == _ON)

//--------------------------------------------------
// Description  : Display Format Initial of Display Port
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDpDisplayFormatInitial(void)
{
#if(_FRONT_PORCH_REGENERATOR == _ON)
    DWORD VsyncFrontPorchValue,HsyncFrontPorchValue,FrontPorchValue;
#endif // End of #if(_Front_Porch_Regenerator == _ON)
    CScalerPageSelect(_PAGEC);
#if(_DP_DISPLAY_FORMAT_SEL == _FRAME_SYNC_MODE)       //start format @ frame-sync mode
     //bit7=start bit. 1-->start to generate
    //bit6=double buffer. 1-->double buffer active
    //bit5=HS/VS generation. 1-->framep-sync, 0-->full last line
    //bit4=DE generation. 1-->digital mode, 0: normal mode
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0xA0);
#endif // End of #if(_DP_DISPLAY_FORMAT_SEL == _FRAME_SYNC_MODE)

#if(_DP_DISPLAY_FORMAT_SEL == _FULL_LAST_LINE)     //start format @ full-last mode
    //bit7=start bit. 1-->start to generate
    //bit6=double buffer. 1-->double buffer active
    //bit5=HS/VS generation. 1-->framep-sync, 0-->full last line
    //bit4=DE generation. 1-->digital mode, 0: normal mode                                                                       //bit4=DE generation. 1-->digital mode, 0: normal mode
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0x80);
#endif // End of #if(_DP_DISPLAY_FORMAT_SEL == _FULL_LAST_LINE)
    //The delay count of link clk for "BS or BE to Virtual VS" in even field
    pData[0]=0x00; //H
    pData[1]=0x00; //M //640pixels*2lines*24bits div 10 = 0xC00
    pData[2]=0x02; //L
#if(_FRONT_PORCH_REGENERATOR == _ON)
    VsyncFrontPorchValue = CDpGetVsyncFrontPorch();
    HsyncFrontPorchValue=CDpGetHsyncFrontPorch();
    FrontPorchValue = ( VsyncFrontPorchValue + HsyncFrontPorchValue )*100/100;// + 0x100;
    pData[0]=(FrontPorchValue>>16);
    pData[1]=(FrontPorchValue>>8);
    pData[2]=(FrontPorchValue>>0);
    CScalerWrite(0xC5, 3, pData, _AUTOINC);   //LSB delay value
#endif // End of #if(_Front_Porch_Regenerator == _ON)
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x36, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x37, pData[1]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x38, pData[2]);
   //The delay count of link clk for "BS or BE to Virtual VS" in odd field
    pData[0]=0x00; //H
    pData[1]=0x00; //M //640pixels*2lines*24bits div 10 = 0xC00
    pData[2]=0x02; //L
#if(_FRONT_PORCH_REGENERATOR == _ON)
    VsyncFrontPorchValue = CDpGetVsyncFrontPorch();
    HsyncFrontPorchValue = CDpGetHsyncFrontPorch();
    FrontPorchValue = (VsyncFrontPorchValue + HsyncFrontPorchValue)*100/100;
    pData[0]=(FrontPorchValue>>16);
    pData[1]=(FrontPorchValue>>8);
    pData[2]=(FrontPorchValue>>0);
#endif // End of #if(_Front_Porch_Regenerator == _ON)
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x39, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3A, pData[1]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3B, pData[2]);
  //The delay count of link clk for "BS or BE to DE" in digital mode
    pData[1]=0x00;
    pData[0]=0x00;
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3C, pData[1]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3D, pData[0]);
  //Set Htotal
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x04, 2, pData, _NON_AUTOINC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3E, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3F, pData[1]);
  //Set Hstart
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x06, 2, pData, _NON_AUTOINC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x40, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x41, pData[1]);
  //Set Hwidth
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x08, 2, pData, _NON_AUTOINC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x42, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x43, pData[1]);
  //Set HSW
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x0A, 2, pData, _NON_AUTOINC);
    pData[0] &= 0x7F; //set pority in plus
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x44, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x45, pData[1]);
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x01, 1, pData, _NON_AUTOINC);
    if ((pData[0]&0x06)==0x06)  //Set ODD-Vtotal if interlace-ODD
        CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x0E, 2, pData, _NON_AUTOINC);
    else  //Set Even-Vtotal if interlace-EVEN or progressive
        CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x0C, 2, pData, _NON_AUTOINC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x46, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x47, pData[1]);
  //Set Vstart
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x10, 2, pData, _NON_AUTOINC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x48, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x49, pData[1]);
  //Set Vheight
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x12, 2, pData, _NON_AUTOINC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x4A, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x4B, pData[1]);
  //Set VSP and VSW
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x14, 2, pData, _NON_AUTOINC);
    pData[0] &= 0x7F;    //set pority in plus
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x4C, pData[0]);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x4D, pData[1]);
#if(_DP_DISPLAY_FORMAT_SEL == _FRAME_SYNC_MODE)
    //bit7=start bit. 1-->start to generate
    //bit6=double buffer. 1-->double buffer active
    //bit5=HS/VS generation. 1-->framep-sync, 0-->full last line
    //bit4=DE generation. 1-->digital mode, 0: normal mode
     CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0xE0);
#endif // End of #if(_DP_DISPLAY_FORMAT_SEL == _FRAME_SYNC_MODE)
#if(_DP_DISPLAY_FORMAT_SEL == _FULL_LAST_LINE)
    //bit7=start bit. 1-->start to generate
    //bit6=double buffer. 1-->double buffer active
    //bit5=HS/VS generation. 1-->framep-sync, 0-->full last line
    //bit4=DE generation. 1-->digital mode, 0: normal mode
     CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0xC0);
#endif // End of #if(_DP_DISPLAY_FORMAT_SEL == _FULL_LAST_LINE)
}
//--------------------------------------------------
// Description  : Display port vedio fifo Auto-Test Function
// Input Value  : None
// Output Value : True: BIST PASS, False: BIST Fail
//--------------------------------------------------
bit CDpIsFifoMemoryPass(void)
{
    CScalerPageSelect(_PAGEC);
    CScalerSetByte(_PC_DP_MEM_BIST_B2, 0x05);
    CScalerRead(_PC_DP_MEM_BIST_B2, 1, pData, _NON_AUTOINC);
    while((( pData[0]&0x04)==0x04)||((pData[0]&0x01)==0x01))
    {
       CScalerRead(_PC_DP_MEM_BIST_B2, 1, pData, _NON_AUTOINC);
    }
    if (pData[0]==0x0A)
        return _TRUE;
    else
        return _FALSE;
}

//--------------------------------------------------
// Description  : Display port vedio fifo Auto-Test Function
// Input Value  : None
// Output Value : True: BIST PASS, False: BIST Fail
//--------------------------------------------------
bit CDpIsFifoUnderOverFlow(void)
{
    CScalerPageSelect(_PAGEC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x30, 0xff);
    CTimerDelayXms(30); // 30:MN_Tracking , 70:VS_Tracking
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x30, 1, pData, _NON_AUTOINC);
//eagleeyes-20080313
    if( (pData[0]&0x80)==0x80)
        return _TRUE;

    else if( (pData[0]&0x40)==0x40)
        return _TRUE;

    else
        return _FALSE;
/*
    if( (pData[0]&0x08)==0x08)    // whhsiao + VerB
        return _TRUE;          //video fifo overflow
    else if( (pData[0]&0x01)==0x01) // whhsiao VerA/B the same
        return _TRUE;          //small fifo underflow
    else if( (pData[0]&0x12)==0x12)   // whhsiao + VerB
        return _FALSE;          //small fifo non-empty
    else
        return _TRUE;
*/
}
//--------------------------------------------------
// Description  : DP MAC INITIALTION
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CDpMacInitial(void)
{
    BYTE buf=0;
    CScalerPageSelect(_PAGEC);
    if(GET_DP_ENHANCEMENT_MODE())
    {
        buf|=0x04;
    }
    CScalerPageSelect(_PAGEB);
    CScalerSetByte(_PB_DIG00_E0,0xC0);
    CScalerPageSelect(_PAGEC);
    if(GET_DP_ONE_LANE_INPUT())
    {
        buf|=0x08;
        CScalerSetByte(_PC_DP_CTL_A1, buf);
        CScalerSetByte(_PC_DP_OUTPUT_CTL_A2, 0xF0);
        CScalerSetByte(_PC_MIN_DE_SKEW_A8, 0x00); //0x0: disable all de-skew circuit
        CScalerSetByte(_PC_MN_ERRC_A9, 0x00); //0x0:disable error correction, 0xF4:enable all error correction
    }
    if(GET_DP_TWO_LANE_INPUT())
    {
    buf|=0x10;
        CScalerSetByte(_PC_DP_CTL_A1, buf);
        CScalerSetByte(_PC_DP_OUTPUT_CTL_A2, 0xF0);
        CScalerSetByte(_PC_MIN_DE_SKEW_A8, 0x1C); //0x0: disable all de-skew circuit
        CScalerSetByte(_PC_MN_ERRC_A9, 0x00); //0x0:disable error correction, 0xF4:enable all error correction
    }
    if(GET_DP_FOUR_LANE_INPUT())
    {
    buf|=0x18;
        CScalerSetByte(_PC_DP_CTL_A1, buf);
        CScalerSetByte(_PC_DP_OUTPUT_CTL_A2, 0xF0);
        CScalerSetByte(_PC_MIN_DE_SKEW_A8, 0x1C); //0x0: disable all de-skew circuit
        CScalerSetByte(_PC_MN_ERRC_A9, 0x00); //0x0:disable error correction, 0xF4:enable all error correction
    }
    CScalerSetByte(0xA3,0x00);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x00, 0xF8);  //pop up parameter
}

//--------------------------------------------------
// Description  : Display port FIFO Adjustment
// Input Value  : None
// Output Value : None
//--------------------------------------------------
//
void CDpAdjustVsyncDelayCount(void)
{
    BYTE buf;
    DWORD MaxBStoVSDelayValue,MinBStoVSDelayValue,CurrentBStoVSDelayValue;
    BYTE FifoErrorCnt=0;
    bit forwardtrace;
    CScalerPageSelect(_PAGEC);
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x5E, 0x2A);
    CTimerDelayXms(30);
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x5E, 1, pData, _NON_AUTOINC);
    buf=0;
    while((pData[0]&0x20)==0x20)
    {
       CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x5E, 0x2A);
       CTimerDelayXms(30);
       CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x5E, 1, pData, _NON_AUTOINC);
//eagleeyes-20080215
//bLED9=~bLED9;
       CMiscIspDebugProc(); //Anderson 080512
       if(buf<=15)
          buf++;
       else
          break;
    }
    CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x30, 0xFF);
    CTimerDelayXms(50);
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x30, 1, pData, _NON_AUTOINC);
    if ((pData[0]&0x80)==0x80) //earily overflow  --> backward trace
        forwardtrace=0;
    else
        forwardtrace=1; //earily underflow and non-overflow/non-underflow
    CScalerPageSelect(_PAGEC);
    CScalerGetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x36, 3, pData, _NON_AUTOINC);
    CurrentBStoVSDelayValue = ( ((DWORD)pData[0]<<16) | ((DWORD)pData[1]<<8) | ((DWORD)pData[2]<<0) );
    buf=0;
    if(CDpIsFifoUnderOverFlow()==_TRUE) //FIFO overflow/underflow
    {
       while((FifoErrorCnt<=_BOUNDARY_CHECK_NUM) && (buf<=_TIMEOUT_NUM) ) //eagleeeys 070926
       {
//eagleeyes-20080215
          CMiscIspDebugProc(); //Anderson 080512
          if( forwardtrace==1 ) //backward trace
             CurrentBStoVSDelayValue+=0x18;
          else
             CurrentBStoVSDelayValue-=0x18;
          pData[0]=(CurrentBStoVSDelayValue>>16);
          pData[1]=(CurrentBStoVSDelayValue>>8);
          pData[2]=(CurrentBStoVSDelayValue>>0);
          CScalerWrite(0xBA, 3, pData, _AUTOINC);   //LSB delay value
      //The delay count of link clk for "BS or BE to Virtual VS" in even field
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x36, pData[0]);
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x37, pData[1]);
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x38, pData[2]);
      //The delay count of link clk for "BS or BE to Virtual VS" in odd field
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x39, pData[0]);
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3A, pData[1]);
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3B, pData[2]);
#if(_DP_DISPLAY_FORMAT_SEL == _FRAME_SYNC_MODE)
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0x00);
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0xE0);
#endif // End of #if(_DP_DISPLAY_FORMAT_SEL == _FRAME_SYNC_MODE)
#if(_DP_DISPLAY_FORMAT_SEL == _FULL_LAST_LINE)
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0x00);
          CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x35, 0xC0);
#endif // End of #if(_DP_DISPLAY_FORMAT_SEL == _FULL_LAST_LINE)
          CTimerDelayXms(20); // 20:MN_Tracking , 60:VS_Tracking
          if(CDpIsFifoUnderOverFlow()==_FALSE) //eagleeeys 070926
          {
             FifoErrorCnt++; //OK
          }
          else //debug-eagle
          {// harry 20071212
             FifoErrorCnt = 0;
             buf++;  //Fail
          }
       }
    }
    MinBStoVSDelayValue=CurrentBStoVSDelayValue;
    ucDisplayPortStatus |= 0x20;        //FIND The Minmum BS to VS delay value, it make fifo not overflow and under flow
    CScalerSetByte (0xC9, ucDisplayPortStatus);
    if(CDpIsFifoUnderOverFlow()==_FALSE)
    {
        FifoErrorCnt = 0;
        while (FifoErrorCnt!=_SEARCH_RANGE)
        {
//eagleeyes-20080401
#if ((_PCB_TYPE == _RTD2472D_QA_PCB) || (_SCALER_TYPE == _RTD247xRD))
            bLED2=~bLED2;
#endif
           CMiscIspDebugProc(); //Anderson 080512
           if(forwardtrace==1 ) //backward trace
              CurrentBStoVSDelayValue+=0x18;
           else
              CurrentBStoVSDelayValue-=0x18;
           pData[0]=(CurrentBStoVSDelayValue>>16);
           pData[1]=(CurrentBStoVSDelayValue>>8);
           pData[2]=(CurrentBStoVSDelayValue>>0);
           CScalerWrite(0xBD, 3, pData, _AUTOINC);   //MSB delay value
         //The delay count of link clk for "BS or BE to Virtual VS" in even field
           CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x36, pData[0]);
           CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x37, pData[1]);
           CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x38, pData[2]);
         //The delay count of link clk for "BS or BE to Virtual VS" in odd field
           CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x39, pData[0]);
           CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3A, pData[1]);
           CScalerSetDataPortByte(_PC_DP_ACCESS_PORT_B3, 0x3B, pData[2]);
#if(_DP_DI

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -