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

📄 memory.c

📁 realtek LCD monitor, TV开发源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
                              (((DWORD)usHorSize * 3 * 8 / 64) + 1) :
                              ((DWORD)usHorSize * 3 * 8 / 64);// One line total pixel for SDRAM (unit : 64 bits)
#else
        ((DWORD *)pData)[0] = ((DWORD)usHorSize * usVerSize * 3 * 8 % 64) ?
                              (((DWORD)usHorSize * usVerSize * 3 * 8 / 64) + 1) :
                              ((DWORD)usHorSize * usVerSize * 3 * 8 / 64);// One Frame total pixel for SDRAM (unit : 64 bits)
#endif // End of #if(_FRC_MODE == _LINE_MODE)
    }

//Anderson 080422 for FRC End

    ulValue = CMemoryCalculateNumberAndRemain(((DWORD *)pData)[0], Length, 0);
    ulStep = CMemoryCalculateLineStepAndBlockStep(usHorSize, usVerSize);

    pData[0] = HIBYTE(stDisplayInfo.DVStartPos - 3);
    pData[1] = LOBYTE(stDisplayInfo.DVStartPos - 3);
    pData[2] = (HIBYTE(usHorSize) & 0x0F); //Anderson 080205 _P5_SDRF_MN_PXL_NUM_H_BE Support to 12bits
    pData[3] = LOBYTE(usHorSize);
    pData[4] = Length; //WTLVL
    pData[5] = 0x00; //Reserved
    pData[6] = HIBYTE(ulValue);
    pData[7] = LOBYTE(ulValue);
    pData[8] = Length;
    pData[9] = (BYTE)(ulValue >> 16);
    pData[10] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 16);
    pData[11] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 8);
    pData[12] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 0);
    pData[13] = (BYTE)(ulStep >> 24); //LINE_STEP
    pData[14] = (BYTE)(ulStep >> 16); //LINE_STEP

    CScalerPageSelect(_PAGE5);
    CScalerWrite(_P5_SDRF_MN_PRERD_VST_H_BC, 15, pData, _AUTOINC);

#if(_FIELD_MERGE_SUPPORT == _ON)

    if(GET_FIELDMERGE_MODE())
    {
        pData[0] = (BYTE)(_FRC_2ND_BLOCK_STA_ADDR >> 20);//BLOCK_STEP
        pData[1] = (BYTE)(_FRC_2ND_BLOCK_STA_ADDR >> 12);//BLOCK_STEP
    }
    else
    {
        pData[0] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 19);//BLOCK_STEP
        pData[1] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 11);//BLOCK_STEP
    }

#else
    pData[0] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 19);//BLOCK_STEP
    pData[1] = (BYTE)(_FRC_1ST_BLOCK_STA_ADDR >> 11);//BLOCK_STEP
#endif // End of #if(_FIELD_MERGE_SUPPORT == _ON)

#if(_FRC_MODE == _LINE_MODE)
    pData[2] = ((usVerSize >> 8) & 0x0f);//LINE_NUM
#else
   // pData[2] = (((usVerSize >> 8) & 0x0f) | 0x10);//LINE_NUM
    pData[2] = ((((usVerSize*2) >> 8) & 0x0f) | 0x10);//LINE_NUM
#endif // End of (_FRC_MODE == _LINE_MODE)

    pData[3] = LOBYTE((usVerSize*2));//LINE_NUM

#if(_FIELD_MERGE_SUPPORT == _ON)
    if(GET_FIELDMERGE_MODE())
    {
        pData[4] = 0x69;//DISP_CTRL
    }
    else
    {
#if(_FRC_YUV_MODE_SUPPORT == _ON)
//Anderson 080528 for FRC 16b In Start

        if(GET_FRC16BITSIN())//16 bits Input Format
        {
            pData[4] = 0xC9;//DISP_CTRL
            CLR_FRC16BITSIN();
        }
//Anderson 080528 for FRC 16b In End
        else
#endif // End of #if(_FRC_YUV_MODE_SUPPORT == _ON)
//Anderson V008_20080730 for Frame Rate Conversion Start
        {

            if(GET_FRCDOUBLEFRAME())
            {
                pData[4] = 0x49;//DISP_CTRL Double Buffer
            }
            else
            {
                pData[4] = 0x09;//DISP_CTRL Single Buffer
            }
        }
//Anderson V008_20080730 for Frame Rate Conversion End
    } // End of if(GET_FIELDMERGE_MODE())

#else // #if(_FIELD_MERGE_SUPPORT != _ON)

#if(_FRC_YUV_MODE_SUPPORT == _ON)
//Anderson 080528 for FRC 16b In Start
    if(GET_FRC16BITSIN())//16 bits Input Format
    {
        pData[4] = 0xC9;//DISP_CTRL
        CLR_FRC16BITSIN();
    }
//Anderson 080528 for FRC 16b In End
    else
#endif // End of #if(_FRC_YUV_MODE_SUPPORT == _ON)
//Anderson V008_20080730 for Frame Rate Conversion Start
    {

        if(GET_FRCDOUBLEFRAME())
        {
            pData[4] = 0x49;//DISP_CTRL Double Buffer
        }
        else
        {
            pData[4] = 0x09;//DISP_CTRL Single Buffer
        }

    }
//Anderson V008_20080730 for Frame Rate Conversion End
#endif // End of #if(_FIELD_MERGE_SUPPORT == _ON)

    pData[5] = 0x10;
    CScalerWrite(_P5_SDRF_MN_BLOCK_STEP_H_CB, 6, pData, _AUTOINC);

}

//Anderson 080512 for IVS2DVS Delay Adjust Start
//--------------------------------------------------
// Description  : Adjust IVS2DVS Delay for Aspect Ratio Function
// Input Value  : ulFreq --> DCLK
// Output Value : IVS2DVS Delay Lines
//--------------------------------------------------
BYTE CMemoryAdjustIVS2DVSDelay(DWORD ulFreq)
{
    CScalerSetByte(_DISP_ACCESS_PORT_2A, (0x80 | _DISP_DV_ACT_END_H_12));
    CScalerRead(_DISP_DATA_PORT_2B, 2, &pData[4], _NON_AUTOINC); //Read DV Active End

    ((WORD *)pData)[4] = (WORD)pData[4] << 8 | pData[5];

    ((DWORD *)pData)[0] = ((DWORD)stDisplayInfo.DHTotal * ((WORD *)pData)[4]) + _PANEL_DH_START;
    ((DWORD *)pData)[0] = ((DWORD *)pData)[0] * ulFreq /(stModeInfo.IHTotal * stModeInfo.IHFreq * 100);
    ((DWORD *)pData)[1] = ((DWORD)stModeInfo.IHTotal * (stModeInfo.IVStartPos + stModeInfo.IVHeight - (ucVStartBias + _PROGRAM_VDELAY))) + stModeInfo.IHStartPos - (ucHStartBias + _PROGRAM_HDELAY);
    ((DWORD *)pData)[1] += stModeInfo.IHTotal * 2;

    if (((DWORD *)pData)[0] > ((DWORD *)pData)[1])
    {
        //cyyeh 20080310
        //Ming-Yen modify Start 20080131
        pData[14] = 0;
        pData[15] = 0;

        CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~_BIT1, 0x00);
        CScalerSetByte(_IVS2DVS_DELAY_LINES_40, pData[14]);
        CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, pData[15]);

        return pData[14];
        //Ming-Yen modify End 20080131
    }

    ((DWORD *)pData)[0]  = ((DWORD *)pData)[1] - ((DWORD *)pData)[0];

    pData[14] = ((DWORD *)pData)[0] / stModeInfo.IHTotal;
    pData[15] = (((DWORD *)pData)[0] - ((DWORD)stModeInfo.IHTotal * pData[14])) / 16;

    if(pData[14] >= 0xFF)
    {
        pData[14] = 0xFE;
    }

    if(pData[15] >= 0xFF)
    {
        pData[15] = 0xFE;
    }
    CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~_BIT1, 0x00);
    CScalerSetByte(_IVS2DVS_DELAY_LINES_40, pData[14]);
    CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, pData[15]);

    return pData[14];

}
//Anderson 080512 for IVS2DVS Delay Adjust End

//--------------------------------------------------
// Description  : Transfer the Memory Size to Address
// Input Value  : ulTotalSize --> Total Memory size
// Output Value : Line Step Address or Block Step Address
//--------------------------------------------------
DWORD CMemoryAddressConversion(DWORD ulTotalSize)
{
    DWORD ulSize = 0; //Total Memory Soze

#if(_MEMORY_CONFIG >= _2M_32BIT_1PCE)
    ulSize = ((ulTotalSize & 0xffff00) << 1) | LOBYTE(ulTotalSize);
#else
    ulSize = ((ulTotalSize & 0x000100) << 1) | ((ulTotalSize & 0xfffe00) << 2) | LOBYTE(ulTotalSize);
#endif

    return ulSize;
}

//--------------------------------------------------
// Description  : Calculate the Line Step and Block Step
// Input Value  : usHorSize --> Horizontal size
//                usVerSize --> Vertical size
// Output Value : Line Step and Block Step
//--------------------------------------------------
DWORD CMemoryCalculateLineStepAndBlockStep(WORD usHorSize, WORD usVerSize)
{
    WORD usLine = 0; //Line Length
    DWORD ulBlock = 0; //Block Size

//Anderson 080422 for FRC Start
#if(_FRC_YUV_MODE_SUPPORT == _ON)

    if(GET_FRC422STATUS())
    {
        usLine = usHorSize * 16 / 64;
    }
    else
#endif
    {
        usLine = usHorSize * 24 / 64;
    }

    if(usLine & 0x03)
    {
        (usLine += 4 - (usLine & 0x03));
    }

    usLine = usLine * 64 / _MEMORY_BUS_WIDTH;
//Anderson 080422 for FRC End
    ulBlock = (DWORD)usVerSize * usLine;
    usLine = CMemoryAddressConversion(usLine);
    ulBlock = (CMemoryAddressConversion(ulBlock) >> 11);

    return (((DWORD)usLine << 16) | (ulBlock & 0xffff));

}
//Anderson 080512 Delete CMemoryFRCConfirm

//--------------------------------------------------
// Description  : Decide the Working Type
// Input Value  : None
// Output Value : None
//--------------------------------------------------
//Anderson 080422 for FRC Start
void CMemoryWorkingTypeDecide(void)
{

#if((_MEMORY_WORK_TYPE == _OD_ON_FRC_ON) || (_MEMORY_WORK_TYPE == _OD_OFF_FRC_ON))

#if(_FIELD_MERGE_SUPPORT == _ON)
    if((stModeInfo.IVFreq > _PANEL_MAX_FRAME_RATE) || GET_INTERLACE_MODE())
#else
    if(stModeInfo.IVFreq > _PANEL_MAX_FRAME_RATE)
#endif
    {

        if(CMemorySDRAMConfirm(_FRC_CONFIRM))//Anderson 080512
        {
            SET_FRCSTATUS();
        }
        else
        {
            ucCurrState = _NOSUPPORT_STATE;
        }

#if(_FRC_YUV_MODE_SUPPORT == _ON)
//Anderson 080528 for FRC YUV Mode Start

        if(GET_FRC422STATUS()) //Need FRC 422->444
        {
            CScalerPageSelect(_PAGE5);
            CScalerSetByte(_P5_SDRF_MN_FIFO_422_SET_E3, 0x02); //Enable FRC 422->444
        }
//Anderson 080528 for FRC YUV Mode End
#endif //End of #if(_FRC_YUV_MODE_SUPPORT == _ON)

#if(_FIELD_MERGE_SUPPORT == _ON)
        {
            DWORD Imagesize = 0;

            if(GET_INTERLACE_MODE() && (ucCurrState != _NOSUPPORT_STATE))
            {
                if(GET_FRC422STATUS())
                {
                    Imagesize = (DWORD)stModeInfo.IHWidth * stModeInfo.IVHeight * 2 * 8 * 4 / 1000000;
                }
                else
                {
                    Imagesize = (DWORD)stModeInfo.IHWidth * stModeInfo.IVHeight * 3 * 8 * 4 / 1000000;
                }

                if(_MEMORY_SIZE > Imagesize)
                {
                    SET_FIELDMERGE_MODE();
                }
                else
                {
                    CLR_FIELDMERGE_MODE();
                }

            }
            else
            {
                CLR_FIELDMERGE_MODE();
            }
        } // End of if(GET_FRC422STATUS())
#endif
    }
    else // if(stModeInfo.IVFreq <= _PANEL_MAX_FRAME_RATE)
    {
        // Issac-03-28 Begin
        CLR_FRCSTATUS();

        // Issac-03-29
        if (stDisplayInfo.DVHeight < _PANEL_DV_HEIGHT)
        {

            if(CMemorySDRAMConfirm(_FRC_CONFIRM))//Anderson 080512
            {
                SET_FRCSTATUS();
            }

        }
        // Issac-03-28 End
    }
#else // #if((_MEMORY_WORK_TYPE != _OD_ON_FRC_ON) && (_MEMORY_WORK_TYPE != _OD_OFF_FRC_ON))
    CLR_FRCSTATUS();
#endif // End of #if((_MEMORY_WORK_TYPE == _OD_ON_FRC_ON) || (_MEMORY_WORK_TYPE == _OD_OFF_FRC_ON))

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

    if(!GET_FRCSTATUS() && (((DWORD *)pData)[0] >= (DWORD)_PANEL_PIXEL_CLOCK_MAX * 1000))
    {
        // Issac-03-29 Begin

        //ucCurrState = _NOSUPPORT_STATE;
        if(CMemorySDRAMConfirm(_FRC_CONFIRM)) //Anderson 080512
        {
            SET_FRCSTATUS();
        }
        else
        {
            ucCurrState = _NOSUPPORT_STATE;
        }

        // Issac-03-29 End
    }

}
//Anderson 080422 for FRC End
#endif //End of #if(_FRC_SUPPORT == _ON)

#endif  // End of #if(_SCALER_SERIES_TYPE == _RTD2472D_SERIES)


⌨️ 快捷键说明

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