📄 post.c
字号:
sCh->m_uModeRegValue &= ~(0x1<<18)|(0x1<<17);
}
else
Assert(0);
}
PostOutp32( POST_MODE_CTRL, sCh->m_uModeRegValue );
}
//////////
// Function Name : POST_SetScaler
// Function Description : Set the POST proceesing scaling factor
// Input : uSrcWidth - Source Image Width
// uSrcHeight - Source Image Height
// uDstWidth - Source Image Width
// uDstHeight - Source Image Height
// sCh - POST structure base address
// Output : None
void POST_SetScaler(u32 uSrcWidth, u32 uSrcHeight, u32 uDstWidth, u32 uDstHeight, POST *sCh)
{
u32 uPreHratio, uPreVratio, uHshift, uVshift, uShFactor;
u32 uPreDstWidth, uPreDstHeight, uDx, uDy;
uPreHratio=0, uPreVratio=0, uHshift=0, uVshift=0, uShFactor=0;
uPreDstWidth=0, uPreDstHeight=0, uDx=0, uDy=0;
Assert( !(uSrcWidth >= (uDstWidth<<6)) );
Assert( !(uSrcHeight >= (uDstHeight<<6)) );
if ( uSrcWidth >= (uDstWidth<<5) )
uPreHratio = 32, uHshift= 5;
else if ( uSrcWidth >= (uDstWidth<<4) )
uPreHratio = 16, uHshift = 4;
else if ( uSrcWidth >= (uDstWidth<<3) )
uPreHratio = 8, uHshift = 3;
else if ( uSrcWidth >= (uDstWidth<<2) )
uPreHratio = 4, uHshift = 2;
else if ( uSrcWidth >= (uDstWidth<<1) )
uPreHratio = 2, uHshift = 1;
else
uPreHratio = 1, uHshift = 0;
uPreDstWidth = uSrcWidth / uPreHratio;
uDx = (uSrcWidth<<8) / (uDstWidth<<uHshift);
if ( uSrcHeight >= (uDstHeight<<5) )
uPreVratio = 32, uVshift= 5;
else if ( uSrcHeight >= (uDstHeight<<4) )
uPreVratio = 16, uVshift = 4;
else if ( uSrcHeight >= (uDstHeight<<3) )
uPreVratio = 8, uVshift = 3;
else if ( uSrcHeight >= (uDstHeight<<2) )
uPreVratio = 4, uVshift = 2;
else if ( uSrcHeight >= (uDstHeight<<1) )
uPreVratio = 2, uVshift = 1;
else
uPreVratio = 1, uVshift = 0;
uPreDstHeight = uSrcHeight / uPreVratio;
uDy = (uSrcHeight<<8) / (uDstHeight<<uVshift);
uShFactor = 10 - (uHshift + uVshift);
//rb1004
//SRC_Width = 4*Prescale_H_Ratio
//DST_Width = 2*Prescale_V_Ratio
Assert( !(uSrcWidth%(4*uPreHratio)));
Assert( !(uSrcHeight%(2*uPreVratio)));
PostOutp32( PRESCALE_RATIO, ((uPreVratio<<7)|(uPreHratio<<0)) ); //prescale
PostOutp32( PRESCALE_IMG_SIZE, ((uPreDstHeight<<12)|(uPreDstWidth<<0)) );
PostOutp32( PRESCALE_SHFACTOR, uShFactor ); //shift factor
PostOutp32( MAIN_SCALE_RATIO_H, uDx ); //main scale
PostOutp32( MAIN_SCALE_RATIO_V, uDy );
PostOutp32( SRC_IMG_SIZE, ((uSrcHeight<<12)|(uSrcWidth<<0)) ); //image size
PostOutp32( DST_IMG_SIZE, ((uDstHeight<<12)|(uDstWidth<<0)) );
}
//////////
// Function Name : POST_SetDMA
// Function Description : Set the POST proceesing about the DMA path
// Input : uSrcFullWidth - Source Image Full Width(Virtual screen size)
// uSrcFullHeight - Source Image Full Height(Virtual screen size)
// uSrcStartX - Source Image Start width offset
// uSrcStartY - Source Image Start height offset
// uSrcWidth - Source Image Width
// uSrcHeight - Source Image Height
// uSrcFrmSt - Base Address of the Source Image
// eSrcCSpace - Color Space ot the Source Image
// uDstFullHeight - Source Image Full Width(Virtual screen size)
// uSrcFullHeight - Source Image Full Height(Virtual screen size)
// uDstStartX - Source Image Start width offset
// uDstStartY - Source Image Start height offset
// uDstWidth - Source Image Width
// uDstHeight - Source Image Height
// uDstFrmSt - Base Address of the Source Image
// eDstCSpace - Color Space ot the Source Image
// uSrcFrmBufNum - Frame buffer number
// eInPath - Data path of the source image
// eOutPath - Data path of the desitination image
// sCh - POST structure base address
// uPixelSzIn - Source image Pixel byte size[bytes]
// uPixelSzOut - Destination image Pixel byte size[bytes]
// Output : None
void POST_SetDMA( u32 uSrcFullWidth, u32 uSrcFullHeight, u32 uSrcStartX, u32 uSrcStartY, u32 uSrcWidth, u32 uSrcHeight, u32 uSrcFrmSt, CSPACE eSrcCSpace,
u32 uDstFullWidth, u32 uDstFullHeight, u32 uDstStartX, u32 uDstStartY, u32 uDstWidth, u32 uDstHeight, u32 uDstFrmSt, CSPACE eDstCSpace,
u32 uSrcFrmBufNum, POST_PATH eInPath, POST_PATH eOutPath, POST *sCh,
u32 uPixelSzIn, u32 uPixelSzOut)
{
u32 uOffsetRgb, uDstStRgb, uDstEndRgb;
u32 uOutSrcStCb;
u32 uOutSrcEndCb;
u32 uOutSrcStCr;
u32 uOutSrcEndCr;
sCh->m_uLastFrmBufIdx = uSrcFrmBufNum - 1;
sCh->m_uSrcStY[0]=0;
sCh->m_uSrcEndY[0]=0;
sCh->m_uSrcStCb[0]=0;
sCh->m_uSrcEndCb[0]=0;
sCh->m_uSrcStCr[0]=0;
sCh->m_uSrcEndCr[0]=0;
if ( eInPath == POST_DMA )
{
u32 uOffsetY = (uSrcFullWidth - uSrcWidth)*uPixelSzIn;
u32 i;
u32 uOffsetCb, uOffsetCr;
sCh->m_uStPosY = (uSrcFullWidth*uSrcStartY+uSrcStartX)*uPixelSzIn;
sCh->m_uEndPosY = uSrcWidth*uSrcHeight*uPixelSzIn + uOffsetY*(uSrcHeight-1);
sCh->m_uSrcFrmStAddr[0] = uSrcFrmSt;
sCh->m_uSrcStY[0] = uSrcFrmSt + sCh->m_uStPosY;
sCh->m_uSrcEndY[0]= sCh->m_uSrcStY[0]+ sCh->m_uEndPosY;
PostOutp32( ADDR_START_Y, sCh->m_uSrcStY[0] );
PostOutp32( OFFSET_Y, uOffsetY );
PostOutp32( ADDR_END_Y, sCh->m_uSrcEndY[0] );
for ( i=1; i<uSrcFrmBufNum; i++ )
{
sCh->m_uSrcFrmStAddr[i] = sCh->m_uSrcFrmStAddr[i-1] + uSrcFullWidth*uSrcFullHeight*uPixelSzIn;
//sCh->m_uSrcStY[i] = sCh->m_uSrcEndY[i-1] + sCh->m_uStPosY;
sCh->m_uSrcStY[i] = sCh->m_uSrcFrmStAddr[i] + sCh->m_uStPosY; //rb1004????
sCh->m_uSrcEndY[i] = sCh->m_uSrcStY[i] + sCh->m_uEndPosY;
}
if ( eSrcCSpace == YC420 )
{
uOffsetCb = uOffsetCr = ((uSrcFullWidth-uSrcWidth)/2)*uPixelSzIn;
sCh->m_uStPosCb = uSrcFullWidth*uSrcFullHeight*1
+ (uSrcFullWidth*uSrcStartY/2 + uSrcStartX)/2*1;
//sCh->m_uEndPosCb = uSrcWidth/2*uSrcHeight/2*uPixelSzIn + (uSrcHeight/2-1)*uOffsetCr;
sCh->m_uEndPosCb = uSrcWidth/2*uSrcHeight/2*uPixelSzIn + (uSrcHeight/2-1)*uOffsetCb; //rb1004
sCh->m_uStPosCr = uSrcFullWidth*uSrcFullHeight*1 + uSrcFullWidth*uSrcFullHeight/4*1
+ (uSrcFullWidth*uSrcStartY/2 + uSrcStartX)/2*1;
//sCh->m_uEndPosCr = uSrcWidth/2*uSrcHeight/2*uPixelSzIn + (uSrcHeight/2-1)*uOffsetCb;
sCh->m_uEndPosCr = uSrcWidth/2*uSrcHeight/2*uPixelSzIn + (uSrcHeight/2-1)*uOffsetCr; //rb1004
sCh->m_uSrcStCb[0] = uSrcFrmSt + sCh->m_uStPosCb;
sCh->m_uSrcEndCb[0] = sCh->m_uSrcStCb[0] + sCh->m_uEndPosCb;
sCh->m_uSrcStCr[0] = uSrcFrmSt + sCh->m_uStPosCr;
sCh->m_uSrcEndCr[0] = sCh->m_uSrcStCr[0] + sCh->m_uEndPosCr;
PostOutp32( ADDR_START_CB, sCh->m_uSrcStCb[0] );
PostOutp32( OFFSET_CB, uOffsetCr );
PostOutp32( ADDR_END_CB, sCh->m_uSrcEndCb[0] );
PostOutp32( ADDR_START_CR, sCh->m_uSrcStCr[0] );
PostOutp32( OFFSET_CR, uOffsetCb );
PostOutp32( ADDR_END_CR, sCh->m_uSrcEndCr[0] );
for ( i=1; i<uSrcFrmBufNum; i++ )
{
sCh->m_uSrcFrmStAddr[i] = sCh->m_uSrcFrmStAddr[i-1] + uSrcFullWidth*uSrcFullHeight*3/2;
sCh->m_uSrcStY[i] = sCh->m_uSrcFrmStAddr[i] + sCh->m_uStPosY;
sCh->m_uSrcEndY[i] = sCh->m_uSrcStY[i] + sCh->m_uEndPosY;
sCh->m_uSrcStCb[i] = sCh->m_uSrcFrmStAddr[i] + sCh->m_uStPosCb;
sCh->m_uSrcEndCb[i] = sCh->m_uSrcStCb[i] + sCh->m_uEndPosCb;
sCh->m_uSrcStCr[i] = sCh->m_uSrcFrmStAddr[i] + sCh->m_uStPosCr;
sCh->m_uSrcEndCr[i] = sCh->m_uSrcStCr[i] + sCh->m_uEndPosCr;
}
}
}
if ( eOutPath == POST_DMA )
{
uOffsetRgb = (uDstFullWidth - uDstWidth)*uPixelSzOut;
sCh->m_uStPosRgb = (uDstFullWidth*uDstStartY + uDstStartX)*uPixelSzOut;
sCh->m_uEndPosRgb = uDstWidth*uDstHeight*uPixelSzOut + uOffsetRgb*(uDstHeight-1);
uDstStRgb = uDstFrmSt + sCh->m_uStPosRgb;
uDstEndRgb = uDstStRgb + sCh->m_uEndPosRgb;
PostOutp32( ADDR_START_RGB, uDstStRgb );
PostOutp32( OFFSET_RGB, uOffsetRgb );
PostOutp32( ADDR_END_RGB, uDstEndRgb );
if ( eDstCSpace == YC420 )
{
u32 uOutOffsetCb, uOutOffsetCr;
uOutOffsetCb = uOutOffsetCr= ((uDstFullWidth-uDstWidth)/2)*uPixelSzOut;
sCh->m_uOutStPosCb = uDstFullWidth*uDstFullHeight*1
+ (uDstFullWidth*uDstStartY/2 + uDstStartX)/2*1;
sCh->m_uOutEndPosCb = uDstWidth/2*uDstHeight/2*uPixelSzOut + (uDstHeight/2-1)*uOutOffsetCr;
//sCh->m_uOutEndPosCb = uDstWidth/2*uDstHeight/2*uPixelSzOut + (uDstHeight/2-1)*uOutOffsetCb; //rb1004
sCh->m_uOutStPosCr = uDstFullWidth*uDstFullHeight*1 + uDstFullWidth*uDstFullHeight/4*1
+ (uDstFullWidth*uDstStartY/2 + uDstStartX)/2*1;
sCh->m_uOutEndPosCr = uDstWidth/2*uDstHeight/2*uPixelSzOut + (uDstHeight/2-1)*uOutOffsetCb;
//sCh->m_uOutEndPosCr = uDstWidth/2*uDstHeight/2*uPixelSzOut + (uDstHeight/2-1)*uOutOffsetCr; //rb1004
uOutSrcStCb = uDstFrmSt + sCh->m_uOutStPosCb;
uOutSrcEndCb = uOutSrcStCb + sCh->m_uOutEndPosCb;
uOutSrcStCr = uDstFrmSt + sCh->m_uOutStPosCr;
uOutSrcEndCr = uOutSrcStCr + sCh->m_uOutEndPosCr;
PostOutp32( ADDR_START_OUT_CB, uOutSrcStCb );
PostOutp32( OFFSET_OUT_CB, uOutOffsetCb );
PostOutp32( ADDR_END_OUT_CB, uOutSrcEndCb );
PostOutp32( ADDR_START_OUT_CR, uOutSrcStCr );
PostOutp32( OFFSET_OUT_CR, uOutOffsetCr );
PostOutp32( ADDR_END_OUT_CR, uOutSrcEndCr );
}
}
}
//////////
// Function Name : POST_SetAutoLoadEnable
// Function Description : Set the AutoLoad Mode
// Input : eMode - AutoLoad Mode (Per Frame mode or Freerun mode)
// sCh - POST structure base address
// Output : None
void POST_SetAutoLoadEnable(POST_RUN_MODE eMode, POST *sCh)
{
//rb1004
PostInp32(POST_MODE_CTRL, sCh->m_uModeRegValue);
if ( eMode == FREE_RUN )
{
sCh->m_uModeRegValue |= AUTOLOAD_ENABLE;
}
else if( eMode == ONE_SHOT )
{
sCh->m_uModeRegValue &= ~AUTOLOAD_ENABLE;
}
PostOutp32( POST_MODE_CTRL, sCh->m_uModeRegValue );
}
//////////
// Function Name : POST_EnableInterrupt
// Function Description : Set the Interrupt mode
// Input : uIntLevel - Interrupt Mode (Edge Interrupt or Level Interrupt)
// sCh - POST structure base address
// Output : None
void POST_EnableInterrupt(u32 uIntLevel, POST *sCh)
{
//rb1004
PostInp32(POST_MODE_CTRL, sCh->m_uModeRegValue);
if(uIntLevel == POST_EDGE_INT)
sCh->m_uModeRegValue &= ~IRQ_LEVEL;
else if(uIntLevel == POST_LEVEL_INT)
sCh->m_uModeRegValue |= IRQ_LEVEL;
sCh->m_uModeRegValue |= POST_INT_ENABLE;
PostOutp32( POST_MODE_CTRL, sCh->m_uModeRegValue );
}
//////////
// Function Name : POST_DisableInterrupt
// Function Description : Disable Interrupt
// Input : sCh - POST structure base address
// Output : None
void POST_DisableInterrupt(POST *sCh)
{
//rb1004
PostInp32(POST_MODE_CTRL, sCh->m_uModeRegValue);
sCh->m_uModeRegValue &= ~POST_INT_ENABLE;
PostOutp32( POST_MODE_CTRL, sCh->m_uModeRegValue );
}
//////////
// Function Name : POST_InitIp
// Function Description : Initialize the POST in the External Application(Virtual screen size = Image size)
// Input : uSrcWidth - Source Image Width
// uSrcHeight - Source Image Height
// uSrcFrmSt - Base Address of the Source Image
// eSrcCSpace - Color Space ot the Source Image
// uDstWidth - Source Image Width
// uDstHeight - Source Image Height
// uDstFrmSt - Base Address of the Source Image
// eDstCSpace - Color Space ot the Source Image
// uSrcFrmBufNum - Frame buffer number
// bIsDoubleBuf - Double buffer
// eMode - POST running mode(PER_FRAME or FREE_RUN)
// sCh - POST structure base address
// Output : None
void POST_InitIp(
u32 uSrcWidth, u32 uSrcHeight, u32 uSrcFrmSt, CSPACE eSrcCSpace,
u32 uDstWidth, u32 uDstHeight, u32 uDstFrmSt, CSPACE eDstCSpace,
u32 uSrcFrmBufNum, bool bIsDoubleBuf, POST_RUN_MODE eMode, POST *sCh
)
{
POST_InitIp1(
uSrcWidth, uSrcHeight, 0, 0, uSrcWidth, uSrcHeight, uSrcFrmSt, eSrcCSpace,
uDstWidth, uDstHeight, 0, 0, uDstWidth, uDstHeight, uDstFrmSt, eDstCSpace,
uSrcFrmBufNum, bIsDoubleBuf, eMode, POST_DMA, POST_DMA, sCh
);
}
//////////
// Function Name : POST_SetDMA
// Function Description : Initialize the POST in the External Application(Virtual screen size != Image size)
// Input : uSrcFullWidth - Source Image Full Width(Virtual screen size)
// uSrcFullHeight - Source Image Full Height(Virtual screen size)
// uSrcStartX - Source Image Start width offset
// uSrcStartY - Source Image Start height offset
// uSrcWidth - Source Image Width
// uSrcHeight - Source Image Height
// uSrcFrmSt - Base Address of the Source Image
// eSrcCSpace - Color Space ot the Source Image
// uDstFullHeight - Source Image Full Width(Virtual screen size)
// uSrcFullHeight - Source Image Full Height(Virtual screen size)
// uDstStartX - Source Image Start width offset
// uDstStartY - Source Image Start height offset
// uDstWidth - Source Image Width
// uDstHeight - Source Image Height
// uDstFrmSt - Base Address of the Source Image
// eDstCSpace - Color Space ot the Source Image
// uSrcFrmBufNum - Frame buffer number
// bIsDoubleBuf - Double buffer
// eMode - POST running mode(PER_FRAME or FREE_RUN)
// eInPath - Data path of the source image
// eOutPath - Data path of the desitination image
// sCh - POST structure base address
// Output : None
void POST_InitIp1(
u32 uSrcFullWidth, u32 uSrcFullHeight, u32 uSrcStartX, u32 uSrcStartY, u32 uSrcWidth, u32 uSrcHeight, u32 uSrcFrmSt, CSPACE eSrcCSpace,
u32 uDstFullWidth, u32 uDstFullHeight, u32 uDstStartX, u32 uDstStartY, u32 uDstWidth, u32 uDstHeight, u32 uDstFrmSt, CSPACE eDstCSpace,
u32 uSrcFrmBufNum, bool bIsDoubleBuf, POST_RUN_MODE eMode, POST_PATH eInPath, POST_PATH eOutPath, POST *sCh )
{
u32 uPostModeCtrl2;
u32 uPixelSzIn, uPixelSzOut;
Assert( !bIsDoubleBuf ); // hojinz.kim
Assert( uSrcFullWidth <= 2048 || uSrcFullHeight <= 2048);
Assert( uDstFullWidth <= 2048 || uDstFullHeight <= 2048);
Assert( uSrcFullWidth >= uSrcStartX + uSrcWidth );
Assert( uSrcFullHeight >= uSrcStartY + uSrcHeight );
Assert( uDstFullWidth >= uDstStartX + uDstWidth );
Assert( uDstFullHeight >= uDstStartY + uDstHeight );
if(eSrcCSpace == YC420)
{
Assert( !(uSrcWidth%8) );
Assert( !((uSrcFullWidth-uSrcWidth)%8) );
//Assert( !(uSrcHeight%4) ); //rb1004 delete
}
else if((eSrcCSpace == RGB24) || (eSrcCSpace == ARGB24) )
{
//Nothing
}
else
{
Assert( !(uSrcWidth%2) );
Assert( !((uSrcFullWidth-uSrcWidth)%2) );
//Assert( !(uSrcHeight%2) ); //rb1004 delete
}
// m_uBaseAddr = POST_BASE; //+joon : POST class constructor has not been called, so base address has not been set. So, joon put here
sCh->m_uModeRegValue = 0;
sCh->m_eSrcCSpace = eSrcCSpace;
sCh->m_eDstCSpace = eDstCSpace;
PostOutp32( POST_START_VIDEO, POST_DISABLE );
//uPostModeCtrl2 = ADDR_CHANGE_ENABLE |CHANGE_AT_FRAME_END |SOFTWARE_TRIGGER;
uPostModeCtrl2 = ADDR_CHANGE_DISABLE |CHANGE_AT_FRAME_END |SOFTWARE_TRIGGER;
PostOutp32( POST_MODE_CTRL_2, uPostModeCtrl2 );
//--->SetClock ... rb1004
//POST_SetClock(eOutPath, sCh);
if(sCh->m_uBaseAddr == POST0_BASE)
{
POST_SetClkSrc(ePost_ClkSrc, sCh);
}
else
{
POST_SetClkSrc(eScaler_ClkSrc, sCh);
}
//--->SetDataPath
POST_SetDataPath(eInPath, eOutPath, sCh);
//--->SetDataFormat
POST_SetDataFormat(eSrcCSpace, eDstCSpace, eInPath, eOutPath, sCh, &uPixelSzIn, &uPixelSzOut);
//--->SetScaler
POST_SetScaler(uSrcWidth, uSrcHeight, uDstWidth, uDstHeight, sCh);
//--->SetDMA
POST_SetDMA( uSrcFullWidth, uSrcFullHeight, uSrcStartX, uSrcStartY, uSrcWidth, uSrcHeight, uSrcFrmSt, eSrcCSpace,
uDstFullWidth, uDstFullHeight, uDstStartX, uDstStartY, uDstWidth, uDstHeight, uDstFrmSt, eDstCSpace,
uSrcFrmBufNum, eInPath, eOutPath, sCh,
uPixelSzIn, uPixelSzOut);
//-->SetFreeRun
POST_SetAutoLoadEnable(eMode, sCh);
//POST_SetCLKVALUpdate(POST_CLKVAL_StOfFRAME, sCh);
//-->Enable Interrupt
//POST_EnableInterrupt(POST_LEVEL_INT, sCh);
}
//////////
// Function Name : POST_GetSrcStAddr
// Function Description : Get the Start Address
// Input : uSrcFrmBufIdx - Source Frame Buffer Index
// sCh - POST structure base address
// Output : uStAddr - Source Frame Buffer Address
void POST_GetSrcStAddr(u32 uSrcFrmBufIdx, u32 *uStAddr, POST *sCh)
{
Assert(uSrcFrmBufIdx <= sCh->m_uLastFrmBufIdx);
*uStAddr = sCh->m_uSrcFrmStAddr[uSrcFrmBufIdx];
}
//////////
// Function Name : POST_SetCLKVALUpdate
// Function Description : Select CLKVAL_F update timing control
// Input : uUpdate - POST_CLKVAL_ALWAYS : always,
// POST_CLKVAL_StOfFRAME : Start of a frame
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -