📄 memory.c
字号:
(((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 + -