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

📄 mode.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
📖 第 1 页 / 共 5 页
字号:
    	}
}

//--------------------------------------------------
// Description  : Setup VGA mode
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetupModeVGA(void)
{
    	BYTE option = 0;

    	// Get information from mode table, such as IHTotal, IHStartPos, IHWidth, IVStartPos, IVHeight.
    	CModeGetModeTableInfo();

    	// Start up settings of VGA mode.
    	CModeStartUpVGA();

    	// Get scaling option, Capture window setup, Scaling setup, Display setup
    	CModeSetupDisplay();

    	// Load mode user data from eeprom
    	CEepromLoadModeData(stModeInfo.ModeCurr);

    	// Setup color processing
    	CModeSetupColorProcess();

    	CAdjustBacklight();
		
    	CAdjustAdcGainOffset();
    	CAdjustAdcClock(stModeUserData.Clock);
    	CAdjustPhase(stModeUserData.Phase);
    	CAdjustHPosition();
    	CModeModifyVTotal();
    	CAdjustVPosition();

    	pData[0] = CFrameSyncDo();

    	if(pData[0] == 2)		//fail. note by zhang_dc
    	{
        	CModeResetMode();
        	return;
    	}

    	CModeSetupEtcs(_FUNCTION_ENABLE);
}

#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description  : Setup mode DVI
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetupModeDVI(void)
{
    	BYTE option = 0;

    	// Do initial settings of DVI mode.
    	CModeStartUpDVI();

    	// Get scaling option, Capture window setup, Scaling setup, Display setup
    	CModeSetupDisplay();

    	// Setup color processing
    	CModeSetupColorProcess();

    	CAdjustBacklight();

    	pData[0] = CFrameSyncDo();

    	if(pData[0] == 2)
    	{
        	CModeResetMode();
        	return;
    	}

    	CAdjustTMDSCRCCheck();

    	CModeSetupEtcs(_FUNCTION_DISABLE);
}
#endif  // End of #if(_TMDS_SUPPORT == _ON)

//--------------------------------------------------
// Description  : Setup display
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetupDisplay(void)
{
    	BYTE option = 0;

    	// Get scaling option
    	option = CModeGetScaleSetting();

    	// Capture window setup
    	CModeSetCaptureWindow(option);

    	// Scaling setup
    	CModeSetScaling(option);

    	// Display setup
    	CModeSetDisplay(option);
}

//--------------------------------------------------
// Description  : Setup contrast and brightness
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetupColorProcess(void)
{
    	CEepromLoadBriConData();
    	CEepromLoadColorTempData();
    	CAdjustBrightness();
    	CAdjustContrast();
}

//--------------------------------------------------
// Description  : Setup other setings for display
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetupEtcs(BYTE ucPar)
{
    	CMiscEnableDoubleBuffer();

    	if((bit)CScalerGetBit(_VDISP_CTRL_28, _BIT3))	//if frame sync mode enable. note by zhang_dc
        	CScalerSetBit(_VDISP_CTRL_28, ~_BIT5, 0x00);

    	CAdjustDigitalFilter(_PHASE_ACCESS_PORT, _PHASE_THD_0, _DIV_VALUE_2, ucPar);
    	CAdjustDigitalFilter(_YPBPR_ACCESS_PORT, _YPBPR_ENABLE, _DIV_VALUE_0, ucPar);
    	CAdjustDigitalFilter(_MISMATCH_ACCESS_PORT, _MISMATCH_THD_0, _DIV_VALUE_0, ucPar);

    	CMiscClearStatusRegister();
}

//--------------------------------------------------
// Description  : Get mode information from mode table
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeGetModeTableInfo(void)		//for VGA only.  Add by zhang_dc
{
    	BYTE modetemp;

    	if(GET_MODE_SEARCH_TYPE() == _PRESET_MODE_TYPE)
    	{
        	modetemp = stModeInfo.ModeCurr;
    	}
    	else if(GET_MODE_SEARCH_TYPE() == _USER_MODE_TYPE)
    	{
        	CEepromLoadUserFIFOModeData((stModeInfo.ModeCurr / 4), pData);

        	modetemp = pData[(stModeInfo.ModeCurr % 4) * 4];
    	}

    	stModeInfo.IHTotal = tINPUTMODE_PRESET_TABLE[modetemp].IHTotal;
    	stModeInfo.IHStartPos = tINPUTMODE_PRESET_TABLE[modetemp].IHStartPos;
    	stModeInfo.IHWidth = tINPUTMODE_PRESET_TABLE[modetemp].IHWidth;

    	stModeInfo.IVStartPos = tINPUTMODE_PRESET_TABLE[modetemp].IVStartPos;
    	stModeInfo.IVHeight = tINPUTMODE_PRESET_TABLE[modetemp].IVHeight;

    	// Test
    	stModeUserCenterData.CenterClock    = stModeInfo.IHTotal;
    	stModeUserCenterData.CenterHPos     = stModeInfo.IHStartPos;
    	stModeUserCenterData.CenterVPos     = stModeInfo.IVStartPos;
}

//--------------------------------------------------
// Description  : Startup settings for VGA
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeStartUpVGA(void)
{
    	WORD pixelclock;

    	CScalerSetBit(_VGIP_CTRL_05, ~(_BIT3 | _BIT2 | _BIT0), _BIT0);	//set input pixel format to Embedded ADC mode and sampling input pixels. note by zhang_dc

    	// Calculate pixel clock rate (round to MHz)
    	pixelclock  = (((LWORD)stModeInfo.IHFreq * (LWORD)stModeInfo.IHTotal) * 2 / (1000 * 10));
    	pixelclock  = (pixelclock >> 1) + (pixelclock & 0x01);

    	// To imporve the FIFO efficiency only when input data rate is slow, and display data rate is high.
    	CScalerSetBit(_VGIP_CTRL_05, ~(_BIT3 | _BIT2 | _BIT1), 0x00);	//set Input Data Capture mode to 'from analog input'.  note by zhang_dc

    	// ADC differential mode and Set ADC bandwidth to reduce high frequency noise 
    	if(pixelclock < 34)
        	CScalerSetBit(_ADC_RGB_CTRL_DC, ~(_BIT2 | _BIT1 | _BIT0), _BIT2);	//select differential ADC input. note by zhang_dc
    	else if(pixelclock < 68)
        	CScalerSetBit(_ADC_RGB_CTRL_DC, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT0));	// 150M bandwidth. note by zhang_dc
    	else
        	CScalerSetBit(_ADC_RGB_CTRL_DC, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT1));	// 300M bandwidth. note by zhang_dc

    	// Fine-tune R/G/B delay and enable the ADC frame-modulation
    	CScalerSetBit(_ADC_RED_CTRL_DD, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_RED & 0x07));
    	CScalerSetBit(_ADC_GRN_CTRL_DE, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_GREEN & 0x07));
    	CScalerSetBit(_ADC_BLU_CTRL_DF, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_BLUE & 0x07));

    	CScalerSetByte(_ADC_RED_CTRL_DD, 0x40);
    	CScalerSetByte(_ADC_GRN_CTRL_DE, 0x40);
    	CScalerSetByte(_ADC_BLU_CTRL_DF, 0x40);
    	CScalerSetByte(_ADC_VBIAS1_ED, 0x0d);
    	CScalerSetByte(_YUV2RGB_CTRL_89, 0x00);

    	// HSYNC positive/negtive tracking
    	CScalerSetBit(_PLL_DIV_CTRL_98, ~_BIT6, 0x00);
}

#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description  : Startup settings for DVI
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeStartUpDVI(void)//Update by Realtek at 20050617
{
    CScalerSetBit(_VGIP_HV_DELAY_13, 0x0f, 0x00);

    CScalerSetBit(_VGIP_CTRL_05, ~(_BIT3 | _BIT2 | _BIT0), (_BIT2 | _BIT0));

    CTimerWaitForEvent(_EVENT_IVS);

    pData[0]    = HIBYTE(stModeInfo.IHTotal - 2);
    pData[1]    = 0x02;
    pData[2]    = LOBYTE(stModeInfo.IHTotal - 2);
    pData[3]    = HIBYTE(stModeInfo.IVTotal - 2);
    pData[4]    = 0x02;
    pData[5]    = LOBYTE(stModeInfo.IVTotal - 2);
    pData[6]    = 0x00;
    pData[7]    = 0x00;
    pData[8]    = 0x00;
    pData[9]    = 0x00;
    pData[10]   = 0x03;
    pData[11]   = 0x00;
    pData[12]   = 0x00;
    pData[13]   = 0x81;
    CScalerWrite(_H_BOUNDARY_H_70, 14, pData, _AUTOINC);

    if(CTimerPollingEventProc(255, CMiscAutoMeasurePollingEvent))
    {
        CScalerRead(_V_START_END_H_7E, 6, pData, _AUTOINC);

        // IDEN horizontal Start
        stModeInfo.IHStartPos = ((((WORD)pData[3] & 0xf0) << 4) | (WORD)pData[4]) - ((CScalerGetBit(_POWER_ON_OFF_CTRL_C2, _BIT7) == _BIT7) ? 16 : 18);

        // IDEN vertical Start
        stModeInfo.IVStartPos = (((WORD)pData[0] & 0xf0) << 4) | (WORD)pData[1];
    }
    else
    {
        CScalerSetByte(_AUTO_ADJ_CTRL1_7D, 0x00);
        CModeResetMode();
    }
}
#endif  // End of #if(_TMDS_SUPPORT == _ON)

/*
//--------------------------------------------------
// Description  : Get scaling information
// Input Value  : None
// Output Value : Scaling information
//--------------------------------------------------
BYTE CModeGetScaleSetting(void)
{
    BYTE  option = 0;

#if(_DISP_INFO_BY_MODE == _ON)

    stDisplayInfo = tDISPLAY_PRESET_TABLE[stModeInfo.ModeCurr];

#else

    stDisplayInfo.DHWidth = Panel.DHWidth;
    stDisplayInfo.DVHeight = Panel.DVHeight;
    stDisplayInfo.DHTotal = Panel.DHTotal;

#endif

    // This F/W do not support V scale-up(or bypass) and H scale-down simultaneously
    if((stDisplayInfo.DVHeight >= stModeInfo.IVHeight) && (stDisplayInfo.DHWidth < stModeInfo.IHWidth))
    {
        stModeInfo.IHWidth = stDisplayInfo.DHWidth;
    }

    if(stModeInfo.IVHeight < stDisplayInfo.DVHeight)        option |= _BIT0;    // bit 0 : V scale-up
    if(stModeInfo.IVHeight > stDisplayInfo.DVHeight)        option |= _BIT1;    // bit 1 : V scale-down
    if(stModeInfo.IHWidth < stDisplayInfo.DHWidth)          option |= _BIT2;    // bit 2 : H scale-up
    if(stModeInfo.IHWidth > stDisplayInfo.DHWidth)          option |= _BIT3;    // bit 3 : H scale-down

    return option;
}
*/

//version 200D
BYTE CModeGetScaleSetting(void)
{
    BYTE  option = 0;

#if(_DISP_INFO_BY_MODE == _ON)

    stDisplayInfo = tDISPLAY_PRESET_TABLE[stModeInfo.ModeCurr];
    stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
    stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));

    // Modify Display Vertical Start Position
    stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
    stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
    if(stDisplayInfo.DVStartPos < 6)
        stDisplayInfo.DVStartPos = 6;

    // Modify OSD Reference Position
    CScalerSetByte(_OSD_REFERENCE_DEN_1E, stDisplayInfo.DVStartPos - 4);

#else
/////////////////////////////////////////////////////////////////////////////////////
  if (GET_INPUTPORT_TYPE(stSystemData.InputSource) == _DSUB_A0_PORT ||\
		GET_INPUTPORT_TYPE(stSystemData.InputSource) == _DSUB_A1_PORT)
  	{
  #if (_PANEL_TYPE == _PANEL_LQ104V1DG51 || _PANEL_TYPE==_PANEL_JIALUHUA)
      
         if ( stModeInfo.ModeCurr == _MODE_640x480_60HZ || stModeInfo.ModeCurr == _MODE_640x480_72HZ)
      	     {
              stDisplayInfo.DHWidth = Panel.DHWidth;
              stDisplayInfo.DVHeight = Panel.DVHeight - 22;
              stDisplayInfo.DHTotal = Panel.DHTotal;
  	      }
	else 
		{
	 stDisplayInfo.DHWidth = Panel.DHWidth;
    stDisplayInfo.DVHeight = Panel.DVHeight ;
    stDisplayInfo.DHTotal = Panel.DHTotal;
		}
       
   #else
             stDisplayInfo.DHWidth = Panel.DHWidth;
          stDisplayInfo.DVHeight = Panel.DVHeight ;
         stDisplayInfo.DHTotal = Panel.DHTotal;
  	  
        #endif
  	}
   else
            {
	 stDisplayInfo.DHWidth = Panel.DHWidth;
    stDisplayInfo.DVHeight = Panel.DVHeight ;
    stDisplayInfo.DHTotal = Panel.DHTotal;
		}
   
//////////////////////////////////////////////////////////////////////////////////////////
#if (_PANEL_TYPE == _PANEL_LQ104V1DG51 || _PANEL_TYPE==_PANEL_JIALUHUA)
     if ( stModeInfo.ModeCurr == _MODE_640x480_60HZ || stModeInfo.ModeCurr == _MODE_640x480_72HZ)
	{
		stDisplayInfo.DVStartPos = 30;//34;
	}
	else
		{
    stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
    stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
    if(stDisplayInfo.DVStartPos < 6)
        stDisplayInfo.DVStartPos = 6;
		}
  #else
    // Modify Display Vertical Start Position
    stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
    stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
    if(stDisplayInfo.DVStartPos < 6)
        stDisplayInfo.DVStartPos = 6;

   #endif
    // Modify OSD Reference Position
    CScalerSetByte(_OSD_REFERENCE_DEN_1E, stDisplayInfo.DVStartPos - 4);




#endif

    // This F/W do not support V scale-up(or bypass) and H scale-down simultaneously
    if((stDisplayInfo.DVHeight >= stModeInfo.IVHeight) && (stDisplayInfo.DHWidth < stModeInfo.IHWidth))
    {
        stModeInfo.IHWidth = stDisplayInfo.DHWidth;
    }

    if(stModeInfo.IVHeight < stDisplayInfo.DVHeight)        option |= _BIT0;    // bit 0 : V scale-up
    if(stModeInfo.IVHeight > stDisplayInfo.DVHeight)        option |= _BIT1;    // bit 1 : V scale-down
    if(stModeInfo.IHWidth < stDisplayInfo.DHWidth)          option |= _BIT2;    // bit 2 : H scale-up
    if(stModeInfo.IHWidth > stDisplayInfo.DHWidth)          option |= _BIT3;    // bit 3 : H scale-down

    return option;
}

//--------------------------------------------------
// Description  : Set capture window
// Input Value  : Scaling information

⌨️ 快捷键说明

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