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

📄 mode.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
📖 第 1 页 / 共 5 页
字号:
// Output Value : None
//--------------------------------------------------
void CModeSetCaptureWindow(BYTE ucOption)
{
    WORD ustemp;

    ucHStartBias = 100;

    ucVStartBias = 0;
    ucVStartBias = CAdjustIVS2DVSDelay(ucOption);

    if(ucVStartBias > stModeInfo.IVStartPos)
        ucVStartBias = stModeInfo.IVStartPos;

    // Set capture window
    ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);

    CScalerSetBit(_IPH_ACT_STA_H_09, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPH_ACT_STA_L_0A, LOBYTE(ustemp));
    CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPH_ACT_WID_L_0C, LOBYTE(stModeInfo.IHWidth));

    ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);

    CScalerSetBit(_IPV_ACT_STA_H_0D, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPV_ACT_STA_L_0E, LOBYTE(ustemp));
    CScalerSetBit(_IPV_ACT_LEN_H_0F, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPV_ACT_LEN_L_10, LOBYTE(stModeInfo.IVHeight));

    // Set internal input H sync delay
    CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);

    // Set internal input V sync delay
    CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);
}

//--------------------------------------------------
// Description  : Set scaling factor settings
// Input Value  : Scaling information
// Output Value : None
//--------------------------------------------------
void CModeSetScaling(BYTE ucOption)
{
    // Set window size before scale up
    if(ucOption & _BIT3)
    {
        // H scale-down
        pData[0] = (BYTE)((stDisplayInfo.DHWidth >> 4) & 0x70);
        pData[1] = LOBYTE(stDisplayInfo.DHWidth);
    }
    else
    {
        // No H scale-down
        pData[0] = (BYTE)((stModeInfo.IHWidth >> 4) & 0x70);
        pData[1] = LOBYTE(stModeInfo.IHWidth);
    }

    if(ucOption & _BIT1)
    {
        // V scale-down
        pData[0] = pData[0] | (HIBYTE(stDisplayInfo.DVHeight) & 0x07);
        pData[2] = LOBYTE(stDisplayInfo.DVHeight);
    }
    else
    {
        // No V scale-down
        pData[0] = pData[0] | (HIBYTE(stModeInfo.IVHeight) & 0x07);
        pData[2] = LOBYTE(stModeInfo.IVHeight);
    }

    CScalerWrite(_DWRWL_H_BSU_14, 3, pData, _AUTOINC);

    // Write coefficient for sharpness
    CAdjustSharpness();

    // Config scaling
    if(ucOption & _BIT1)
        CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT0, _BIT0);          // Turn on V scale-down
    else
        CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT0, 0x00);           // Turn off V scale-down

    if(ucOption & _BIT3)
        CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT1, _BIT1);          // Turn on H scale-down
    else
        CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT1, 0x00);           // Turn off H scale-down

    if(ucOption & _BIT0)
        CScalerSetBit(_SCALE_CTRL_19, ~_BIT1, _BIT1);               // Turn on V scale-up
    else
        CScalerSetBit(_SCALE_CTRL_19, ~_BIT1, 0x00);                // Turn off V scale-up

    if(ucOption & _BIT2)
        CScalerSetBit(_SCALE_CTRL_19, ~_BIT0, _BIT0);               // Turn on H scale-up
    else
        CScalerSetBit(_SCALE_CTRL_19, ~_BIT0, 0x00);                // Turn off H scale-up

    // Set scale-down coefficient
    if(ucOption & _BIT3)    // H scale-down
    {
        // Data[12~15]
        ((LWORD *)pData)[3] = (LWORD)131072 * stModeInfo.IHWidth / stDisplayInfo.DHWidth;

        // H scale-down factor
        pData[0] = ((((LWORD *)pData)[3] >> 16) & 0x07);
        pData[0] |= ((((LWORD *)pData)[3] * 16 / 131072 - 16) << 3);
        pData[1] = ((((LWORD *)pData)[3] >> 8) & 0xff);
        pData[2] = ((((LWORD *)pData)[3]) & 0xff);

        //CScalerSetBit(_VGIP_CTRL_04, 0xff, 0x40);    // Enable H scale-down compensation
    }
    else
    {
        pData[0] = 0x02;
        pData[1] = 0x00;
        pData[2] = 0x00;

        //CScalerSetBit(_VGIP_CTRL_04, 0xbf, 0x00);    // Diable H scale-down compensation
    }

    if(ucOption & _BIT1)    // V scale-down
    {
        // Data[12~15]
        ((LWORD *)pData)[3] = (LWORD)4096 * stModeInfo.IVHeight / stDisplayInfo.DVHeight;

        // V scale-down factor
        pData[3] = ((((LWORD *)pData)[3] >> 8) & 0xff);
        pData[4] = ((((LWORD *)pData)[3]) & 0xff);

        CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT2, 0x00);    // Diable V scale-down compensation
    }
    else
    {
        pData[3] = 0x10;
        pData[4] = 0x00;

        CScalerSetBit(_SCALE_DOWN_CTRL_22, ~_BIT2, 0x00);    // Diable V scale-down compensation
    }

    CScalerWrite(_H_SCALE_DOWN_H_23, 5, pData, _AUTOINC);

    // Set scale-up coefficient
    if(ucOption & _BIT2)    // H scale-up
    {
        // Data[12~15]
        ((LWORD *)pData)[3] = (LWORD)2 * 1048576 * stModeInfo.IHWidth / stDisplayInfo.DHWidth;
        ((LWORD *)pData)[3] = (((LWORD *)pData)[3] >> 1) + (((LWORD *)pData)[3] & 0x01);

        pData[0] = ((((LWORD *)pData)[3] >> 16) & 0x0f);
        pData[1] = ((((LWORD *)pData)[3] >> 8) & 0xff);
        pData[2] = ((((LWORD *)pData)[3]) & 0xff);
    }
    else
    {
        pData[0] = 0x0f;
        pData[1] = 0xff;
        pData[2] = 0xff;
    }

    if(ucOption & _BIT0)    // V scale-up
    {
        // Data[12~15]
        ((LWORD *)pData)[3] = (LWORD)2 * 1048576 * stModeInfo.IVHeight / stDisplayInfo.DVHeight;
        ((LWORD *)pData)[3] = (((LWORD *)pData)[3] >> 1) + (((LWORD *)pData)[3] & 0x01);

        pData[3] = ((((LWORD *)pData)[3] >> 16) & 0x0f);
        pData[4] = ((((LWORD *)pData)[3] >> 8) & 0xff);
        pData[5] = ((((LWORD *)pData)[3]) & 0xff);
    }
    else
    {
        pData[3] = 0x0f;
        pData[4] = 0xff;
        pData[5] = 0xff;
    }

    CScalerSetByte(_SF_ACCESS_PORT_1A, 0x80);
    CScalerWrite(_SF_DATA_PORT_1B, 6, pData, _NON_AUTOINC);
    CScalerSetByte(_SF_ACCESS_PORT_1A, 0x00);
}

/*
//--------------------------------------------------
// Description  : Set display
// Input Value  : Scaling information
// Output Value : None
//--------------------------------------------------
void CModeSetDisplay(BYTE ucOption)
{
    // Disable spread spectrum
    CAdjustSpreadSpectrumRange(0);

    // Calculate and set display clock frequency
    ((LWORD *)pData)[0] = (LWORD)(stDisplayInfo.DHTotal) * (LWORD)stModeInfo.IHFreq * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight / 10;

    CAdjustDPLL(((LWORD *)pData)[0]);

    // Set DH_TOTAL
    pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
    pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
    CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);

    // Calculate DV_TOTAL setting for watchdog
    ((WORD *)pData)[2] = (LWORD)stModeInfo.IVTotal * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
	pData[0] = (HIBYTE(((WORD *)pData)[2]) & 0x0f);
	pData[1] = (LOBYTE(((WORD *)pData)[2]));
    CScalerWrite(_DV_TOTAL_H_35, 2, pData, _AUTOINC);

    // Display vertical start/end
    ((WORD *)pData)[2] = Panel.DVStartPos;
    ((WORD *)pData)[3] = ((WORD *)pData)[2] + stDisplayInfo.DVHeight;

    pData[0] = HIBYTE(((WORD *)pData)[2]);
    pData[1] = LOBYTE(((WORD *)pData)[2]);
    pData[2] = HIBYTE(((WORD *)pData)[3]);
    pData[3] = LOBYTE(((WORD *)pData)[3]);
    CScalerWrite(_DV_ACT_STA_H_3A, 4, pData, _AUTOINC);

    // Turn off full-line buffer
    CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);

    CAdjustIVS2DVSDelay(ucOption);

    // Enable display timing
    CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));

    CMiscClearStatusRegister();
}
*/

//version 200D

//--------------------------------------------------
// Description  : Set display
// Input Value  : Scaling information
// Output Value : None
//--------------------------------------------------
void CModeSetDisplay(BYTE ucOption)
{
    // Disable spread spectrum
    CAdjustSpreadSpectrumRange(0);

    // Calculate and set display clock frequency
    ((LWORD *)pData)[0] = (LWORD)(stDisplayInfo.DHTotal) * (LWORD)stModeInfo.IHFreq * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight / 10;

    CAdjustDPLL(((LWORD *)pData)[0]);

    // Set DH_TOTAL
    pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
    pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
    CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);

    // Calculate DV_TOTAL setting for watchdog
    ((WORD *)pData)[2] = (LWORD)stModeInfo.IVTotal * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
	pData[0] = (HIBYTE(((WORD *)pData)[2]) & 0x0f);
	pData[1] = (LOBYTE(((WORD *)pData)[2]));
    CScalerWrite(_DV_TOTAL_H_35, 2, pData, _AUTOINC);

    // Display vertical start/end
    ((WORD *)pData)[2] = stDisplayInfo.DVStartPos;
    ((WORD *)pData)[3] = ((WORD *)pData)[2] + stDisplayInfo.DVHeight;

    pData[0] = HIBYTE(((WORD *)pData)[2]);
    pData[1] = LOBYTE(((WORD *)pData)[2]);
    pData[2] = HIBYTE(((WORD *)pData)[3]);
    pData[3] = LOBYTE(((WORD *)pData)[3]);
    CScalerWrite(_DV_ACT_STA_H_3A, 4, pData, _AUTOINC);

    // Turn off full-line buffer
    CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);

    CAdjustIVS2DVSDelay(ucOption);

    // Enable display timing
    CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));

    CMiscClearStatusRegister();
}

/*
//--------------------------------------------------
// Description  : Set digital mode capture
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetDigitalCapture(void)
{
    CScalerSetBit(_VGIP_CTRL_05, ~_BIT1, _BIT1);
    CScalerSetBit(_IPH_ACT_STA_H_09, 0xf8, 0x00);
    CScalerSetByte(_IPH_ACT_STA_L_0A, 0x00);
    CScalerSetByte(_IPV_ACT_STA_H_0D, 0x00);
    CScalerSetByte(_IPV_ACT_STA_L_0E, 0x00);
}
*/
//--------------------------------------------------
// Description  : Modify IVTotal
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeModifyVTotal(void)
{
/*
    BYTE ucTemp;

    // Force to stop auto-tracking function
    CScalerSetByte(_AUTO_ADJ_CTRL_7F, 0x00);

    CScalerSetByte(_STATUS0_01, 0x00);   // Clear Status

    ucTemp  = 8;             // Tracking timeout 80ms
    do
    {
        CTimerDelayXms(10);
        CScalerRead(_STATUS0_01, 1, pData, _NON_AUTOINC);  // Read Status

        // V101C corrected
        if(pData[0] & 0x80)
            CScalerSetByte(_STATUS0_01, 0x00);   // Clear Status
        else
            break;
    }
    while(--ucTemp);

    // Measure actual number of scan line in each frame
    CScalerCodeW(tMEASURE_IVS);

    ucTemp  = 50;    // Tracking timeout 50ms
    do
    {   
        CTimerDelayXms(1);
        CScalerRead(_AUTO_ADJ_CTRL_7F, 0x01, pData, _NON_AUTOINC);
    }
    while((pData[0] & 0x01) && (--ucTemp));

    CScalerSetByte(_AUTO_ADJ_CTRL_7F, 0x00);
    
    if(ucTemp)
    {
        CScalerRead(_VER_START_80, 0x04, pData, _AUTOINC);
        pData[0]    = pData[3] & 0x0f;
        pData[1]    = pData[2];

        stModeInfo.IVTotal   = stModeInfo.IVTotal < ((WORD *)pData)[0] ? ((WORD *)pData)[0] : stModeInfo.IVTotal;
    }
*/
}

//----------------------------------------------------------------------------------------------------
// Other Mode Functions
//----------------------------------------------------------------------------------------------------

//--------------------------------------------------
// Description  : Reset mode
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeResetMode(void)
{
        
	//x.hu, for mute, needs to update
	if (GET_MUTESTATUS() == 0){
		#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
		if (!GET_VIDEO_PN_ACTION()) {
			//b4052A = b4052B = 1;
			#if (_AUDIO_DEVICE != _AUDIO_NONE)
			CAudioSelChannel(_AUDIO_CHANNEL_NC);
			#endif
		}
		#else
			#if (_AUDIO_DEVICE != _AUDIO_NONE)
			CAudioSelChannel(_AUDIO_CHANNEL_NC);
			#endif
		#endif
	}		

    //CPowerLightPowerOff();
    COsdFxDisableOsd();//  XYW
    CAudioVolumemute();//xyw
    CPowerPanelOff();

    CAdjustDisableWatchDog(_WD_ALL);

    CScalerSetByte(_HOST_CTRL_01, 0x00);
    CScalerSetBit(_VGIP_CTRL_05, ~_BIT1, 0x00);
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
	if (!GET_VIDEO_PN_ACTION())
	{
		CModeSetFreeRun();
		//CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLOR_B);	//by x.hu
		CAdjustBackgroundColor(0, 0, 0);	//by x.hu
	}
#else
	CModeSetFreeRun();
	//CAdjustBackgroundColor(_BGND_COLOR_R, _BGND_COLOR_G, _BGND_COLO

⌨️ 快捷键说明

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