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

📄 post.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -