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

📄 post.c

📁 s3c6400 ADS下官方测试程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*----------------------------------------------------------------------
 *
 * Filename: post.cpp
 *
 * Contents: Implemention of "class POST"
 *
 * Authors: Dhrama
 *
 * Copyright (c) 2003 SAMSUNG Electronics.
 *
 *----------------------------------------------------------------------
 */

 #include <stdio.h>

#include "def.h"
#include "option.h"
#include "library.h"
#include "sfr6400.h"
#include "system.h"
#include "sysc.h"
#include "post.h"

#define PostOutp32(offset, x) Outp32(sCh->m_uBaseAddr+offset, x)
#define PostInp32(offset, x)  x = Inp32(sCh->m_uBaseAddr+offset)

//POSTENVID
#define POST_START              (0x1U<<31) // khlee
#define POST_DISABLE            (0x0U<<31) 

//MODE Control register
#define AUTOLOAD_ENABLE         (0x1<<14)
#define POST_INT_ENABLE         (0x1<<7)
#define POST_PENDING            (0x1<<6)
#define IRQ_LEVEL               (0x1<<5)
#define H_CLK_INPUT              (0x0<<2)
#define EXT_CLK_0_INPUT          (0X1<<2)
#define EXT_CLK_1_INPUT          (0x3<<2)

//MODE Control register 2
#define ADDR_CHANGE_ENABLE      (0x0<<4)
#define ADDR_CHANGE_DISABLE     (0x1<<4)
#define CHANGE_AT_FIELD_END     (0x0<<3)
#define CHANGE_AT_FRAME_END     (0x1<<3)
#define SOFTWARE_TRIGGER        (0x0<<0)
#define HARDWARE_TRIGGER        (0x1<<0)

#define TSCLK_FREQ              (27*1000000); // TV Encoder input clk.


static POST_CLK_SRC ePost_ClkSrc;
static POST_CLK_SRC eScaler_ClkSrc;
static u32 Post_ClkDivider = 1;		// default, divide 2

enum POST_REGS
{
	POST_MODE_CTRL              = 0x00,
	PRESCALE_RATIO              = 0x04,
	PRESCALE_IMG_SIZE           = 0x08,
	SRC_IMG_SIZE                = 0x0C,
	MAIN_SCALE_RATIO_H          = 0x10,
	MAIN_SCALE_RATIO_V          = 0x14,
	DST_IMG_SIZE                = 0x18,
	PRESCALE_SHFACTOR           = 0x1C,
	ADDR_START_Y                = 0x20,
	ADDR_START_CB               = 0x24,
	ADDR_START_CR               = 0x28,
	ADDR_START_RGB              = 0x2C,
	ADDR_END_Y                  = 0x30,
	ADDR_END_CB                 = 0x34,
	ADDR_END_CR                 = 0x38,
	ADDR_END_RGB                = 0x3C,
	OFFSET_Y                    = 0x40,
	OFFSET_CB                   = 0x44,
	OFFSET_CR                   = 0x48,
	OFFSET_RGB                  = 0x4C,
	EXT_FB                      = 0x50, // Reserved in V2.4
	IN_FIFO_STATUS              = 0x50, // Special in v2.3

	// Added in v2.2
	NEXT_ADDR_START_Y           = 0X54,
	NEXT_ADDR_START_CB          = 0x58,
	NEXT_ADDR_START_CR          = 0x5C,
	NEXT_ADDR_START_RGB         = 0x60,
	NEXT_ADDR_END_Y             = 0x64,
	NEXT_ADDR_END_CB            = 0x68,
	NEXT_ADDR_END_CR            = 0x6C,
	NEXT_ADDR_END_RGB           = 0x70,

	// Added in v2.3/v2.4
	ADDR_START_OUT_CB           = 0x74,
	ADDR_START_OUT_CR           = 0x78,
	ADDR_END_OUT_CB             = 0x7c,
	ADDR_END_OUT_CR             = 0x80,
	OFFSET_OUT_CB               = 0x84,
	OFFSET_OUT_CR               = 0x88,
	NEXT_ADDR_START_OUT_CB      = 0x8C,
	NEXT_ADDR_START_OUT_CR      = 0x90,
	NEXT_ADDR_END_OUT_CB        = 0x94,
	NEXT_ADDR_END_OUT_CR        = 0x98,
	POST_START_VIDEO            = 0x9c,	// khlee
	POST_MODE_CTRL_2            = 0xA0
};


//////////
// Function Name : POST_InitCh
// Function Description : Set the Register Base Address
// Input : 	eCh - POST Channel Number
//			sCh - POST structure base address
// Output : 	None
void POST_InitCh(POST_CH eCh, POST *sCh)
{
	if ( eCh == POST_A )
		sCh->m_uBaseAddr = POST0_BASE;
	else if ( eCh == POST_B )
		sCh->m_uBaseAddr = TVSCALER_BASE;
	else
		Assert(0);

	ePost_ClkSrc = HCLK;
	eScaler_ClkSrc = HCLK;
}

//////////
// Function Name : POST_InitIpForDmaInDmaOut
// Function Description : Initialize the POST(DMA to DMA)
// 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 - FALSE in POST
//			eMode - POST running mode(ONE_SHOT or FREE_RUN)
//			sCh - POST structure base address
// Output : 	None
void POST_InitIpForDmaInDmaOut(
	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_InitIpForDmaInFifoOut
// Function Description : Initialize the POST(DMA to FIFO)
// 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
//			eFifoIf - FIFO output image format
//			uSrcFrmBufNum - Frame buffer number
//			sCh - POST structure base address
// Output : 	None
void POST_InitIpForDmaInFifoOut(
	u32 uSrcWidth, u32 uSrcHeight, u32 uSrcFrmSt, CSPACE eSrcCSpace,
	u32 uDstWidth, u32 uDstHeight, POST_FIFO_IF eFifoIf, u32 uSrcFrmBufNum, POST *sCh
	)
{
	CSPACE eDstCSpace =
		(eFifoIf == RGB) ? RGB24 :
		(eFifoIf == YUV) ? YCBYCR : (CSPACE)0xffffffff;

	Assert(eDstCSpace != 0xffffffff);

	POST_InitIp1(	uSrcWidth, uSrcHeight, 0, 0, uSrcWidth, uSrcHeight, uSrcFrmSt, eSrcCSpace,
					uDstWidth, uDstHeight, 0, 0, uDstWidth, uDstHeight, 0, 			eDstCSpace, 
					uSrcFrmBufNum, false, FREE_RUN, POST_DMA, POST_FIFO, sCh);
}

//////////
// Function Name : POST_InitIpForFifoInDmaOut
// Function Description : Initialize the POST(FIFO to DMA)
// Input : 	uSrcWidth - Source Image Width
//			uSrcHeight - Source Image Height
//			uDstWidth - Source Image Width
//			uDstHeight - Source Image Height
//			uDstFrmSt - Base Address of the Source Image 
//			eDstCSpace - Color Space ot the Source Image
//			bIsDoubleBuf - FALSE in POST
//			eMode - POST running mode(ONE_SHOT or FREE_RUN)
//			sCh - POST structure base address
// Output : 	None
void POST_InitIpForFifoInDmaOut(
	u32 uSrcWidth, u32 uSrcHeight, 
	u32 uDstWidth, u32 uDstHeight, u32 uDstFrmSt, CSPACE eDstCSpace, bool bIsDoubleBuf,
	POST_RUN_MODE eMode, POST *sCh)
{
	POST_InitIp1(	uSrcWidth, uSrcHeight, 0, 0, uSrcWidth, uSrcHeight, 0, (CSPACE)0,
					uDstWidth, uDstHeight, 0, 0, uDstWidth, uDstHeight, uDstFrmSt, 
					eDstCSpace,	0, bIsDoubleBuf, eMode, POST_FIFO, POST_DMA, sCh);
}

//////////
// Function Name : POST_InitIpForFifoInFifoOut
// Function Description : Initialize the POST(FIFO to FIFO)
// Input : 	uSrcWidth - Source Image Width
//			uSrcHeight - Source Image Height
//			uDstWidth - Source Image Width
//			uDstHeight - Source Image Height
//			eFifoIf - FIFO output image format
//			eMode - POST running mode(ONE_SHOT or FREE_RUN)
//			sCh - POST structure base address
// Output : 	None
void POST_InitIpForFifoInFifoOut(
	u32 uSrcWidth, u32 uSrcHeight,
	u32 uDstWidth, u32 uDstHeight, POST_FIFO_IF eFifoIf, POST_RUN_MODE eMode, POST *sCh)
{
	CSPACE eDstCSpace =
		(eFifoIf == RGB) ? RGB24 :
		(eFifoIf == YUV) ? YCBYCR : (CSPACE)0xffffffff;

	Assert(eDstCSpace != 0xffffffff);
	
	POST_InitIp1(	uSrcWidth, uSrcHeight, 0, 0, uSrcWidth, uSrcHeight, 0, (CSPACE)0,
					uDstWidth, uDstHeight, 0, 0, uDstWidth, uDstHeight, 0, eDstCSpace,
					0, false, eMode, POST_FIFO, POST_FIFO, sCh);
}


//////////
// Function Name : POST_StartProcessing
// Function Description : Start the POST processing
// Input : 	sCh - POST structure base address
// Output : 	None
void POST_StartProcessing(POST *sCh)
{
	POST_StartProcessing1(0, 0, sCh);
}


//////////
// Function Name : POST_StartProcessing1
// Function Description : Start the POST processing
// Input : 	uSrcFrmIdx - Source Frame Index	
//			sCh - POST structure base address
// Output : 	None
void POST_StartProcessing1(u32 uSrcFrmIdx, u32 uDstBufIdx, POST *sCh)
{
	bool isInDMAMode = ( sCh->m_uModeRegValue & (1U<<31) ) ? false : true;
	
	if ( isInDMAMode   && uSrcFrmIdx != 0 ) //if DMA input (N custom buffer)
	{
		Assert( uSrcFrmIdx <= sCh->m_uLastFrmBufIdx );
		
		// Set reg.s ref. of Current Y
		PostOutp32( ADDR_START_Y, sCh->m_uSrcStY[uSrcFrmIdx] );
		PostOutp32( ADDR_END_Y, sCh->m_uSrcEndY[uSrcFrmIdx] );

		if ( sCh->m_eSrcCSpace == YC420 )
		// Set reg.s ref. of Current Cb
		{
			PostOutp32( ADDR_START_CB, sCh->m_uSrcStCb[uSrcFrmIdx] );
			PostOutp32( ADDR_END_CB, sCh->m_uSrcEndCb[uSrcFrmIdx] );

			// Set reg.s ref. of Current Cr
			PostOutp32( ADDR_START_CR, sCh->m_uSrcStCr[uSrcFrmIdx] );
			PostOutp32( ADDR_END_CR, sCh->m_uSrcEndCr[uSrcFrmIdx] );
		}
	}

	PostOutp32( POST_START_VIDEO, POST_START ); // khlee
}


//////////
// Function Name : POST_SetDataPath
// Function Description : Set the POST proceesing path
// Input : 	eInPath - Data path of the source image
//			eOutPath - Data path of the desitination image
//			sCh - POST structure base address
// Output : 	None
void POST_SetDataPath(POST_PATH eInPath, POST_PATH eOutPath, POST *sCh)
{
	//rb1004
	PostInp32(POST_MODE_CTRL, sCh->m_uModeRegValue);
	
	sCh->m_uModeRegValue &= ~(0x1<<12); // 0: progressive mode, 1: interlace mode
	if ( eInPath == POST_FIFO )
		sCh->m_uModeRegValue |= (0x1U<<31);
	else if (eInPath == POST_DMA )
		sCh->m_uModeRegValue &= ~(0x1U<<31);
	if ( eOutPath == POST_FIFO )
		sCh->m_uModeRegValue |= (0x1<<13);
	else if (eOutPath == POST_DMA )
		sCh->m_uModeRegValue &= ~(0x1<<13);
	PostOutp32( POST_MODE_CTRL, sCh->m_uModeRegValue );
}


//////////
// Function Name : POST_SetDataFormat
// Function Description : Set the POST proceesing data format
// Input : 	eSrcCSpace - Color Space ot the Source Image
//			eDstCSpace - Color Space ot the Destination Image
//			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_SetDataFormat(	CSPACE eSrcCSpace, CSPACE eDstCSpace, POST_PATH eInPath, POST_PATH eOutPath, POST *sCh,
								u32 *uPixelSzIn, u32 *uPixelSzOut)
{
	//u32 uPixelSzIn, uPixelSzOut;
	//rb1004
	PostInp32(POST_MODE_CTRL, sCh->m_uModeRegValue);
	
	sCh->m_uModeRegValue |= (0x1<<16); // R2YSel = 1;
	sCh->m_uModeRegValue |= (0x2<<10); // Wide = 0x10;
	
	if ( eInPath == POST_DMA )
	{
		if( eSrcCSpace == YC420 )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<3)|(0x1<<2));
			sCh->m_uModeRegValue |= (0x1<<8)|(0x1<<1);
			*uPixelSzIn = 1;
		}
		else if ( eSrcCSpace == CRYCBY )  
		//else if ( eSrcCSpace == YCBYCR )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<15)|(0x1<<8)|(0x1<<3)|(0x1<<0));
			sCh->m_uModeRegValue |= (0x1<<2)|(0x1<<1);
			*uPixelSzIn = 2;
		}		
		else if ( eSrcCSpace == CBYCRY )  
		//else if ( eSrcCSpace == YCRYCB )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<8)|(0x1<<3)|(0x1<<0));
			sCh->m_uModeRegValue |= (0x1<<15)|(0x1<<2)|(0x1<<1);
			*uPixelSzIn = 2;
		}		
		else if ( eSrcCSpace == YCRYCB )  
		//else if ( eSrcCSpace == CBYCRY )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<15)|(0x1<<8)|(0x1<<3));
			sCh->m_uModeRegValue |= (0x1<<2)|(0x1<<1)|(0x1<<0);
			*uPixelSzIn = 2;
		}		
		else if ( eSrcCSpace == YCBYCR )  
		//else if ( eSrcCSpace == CRYCBY )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<8)|(0x1<<3));
			sCh->m_uModeRegValue |= (0x1<<15)|(0x1<<2)|(0x1<<1)|(0x1<<0);	
			*uPixelSzIn = 2;
		}
		else if ( eSrcCSpace == RGB24 )  
		{
			sCh->m_uModeRegValue &= ~(0x1<<8);
			sCh->m_uModeRegValue |=  (0x1<<3)|(0x1<<2)|(0x1<<1);
			*uPixelSzIn = 4;
		}
		else if ( eSrcCSpace == RGB16 )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<8)|(0x1<<1));
			sCh->m_uModeRegValue |=  (0x1<<3)|(0x1<<2);
			*uPixelSzIn = 2;
		}

	}
	else if ( eInPath == POST_FIFO )
	{
		// Do nothing
 	}
	if ( eOutPath == POST_DMA )
	{
		if( eDstCSpace == YC420 )  
		{
			sCh->m_uModeRegValue &= ~(0x1<<18);
			sCh->m_uModeRegValue |= (0x1<<17);
			*uPixelSzOut = 1;
		}
		else if ( eDstCSpace == CRYCBY ) 
		//else if ( eDstCSpace == YCBYCR ) 
		{
			sCh->m_uModeRegValue &= ~((0x1<<20)|(0x1<<19)|(0x1<<18)|(0x1<<17));
			*uPixelSzOut = 2;
		}		
		else if ( eDstCSpace == CBYCRY )  
		//else if ( eDstCSpace == YCRYCB )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<19)|(0x1<<18)|(0x1<<17));
			sCh->m_uModeRegValue |= (0x1<<20);
			*uPixelSzOut = 2;
		}		
		else if ( eDstCSpace == YCRYCB )  
		//else if ( eDstCSpace == CBYCRY )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<20)|(0x1<<18)|(0x1<<17));
			sCh->m_uModeRegValue |= (0x1<<19);
			*uPixelSzOut = 2;
		}		
		else if ( eDstCSpace == YCBYCR )  
		//else if ( eDstCSpace == CRYCBY )  
		{
			sCh->m_uModeRegValue &= ~((0x1<<18)|(0x1<<17));
			sCh->m_uModeRegValue |= (0x1<<20)|(0x1<<19);	
			*uPixelSzOut = 2;
		}
		else if ( eDstCSpace == RGB24 )  
		{
			sCh->m_uModeRegValue |= (0x1<<18)|(0x1<<4);
			*uPixelSzOut = 4;
		}
		else if ( eDstCSpace == RGB16 )  
		{
			sCh->m_uModeRegValue &= ~(0x1<<4);
			sCh->m_uModeRegValue |= (0x1<<18);
			*uPixelSzOut = 2;
		}
	}
	else if ( eOutPath == POST_FIFO )
	{
		if ( eDstCSpace == RGB24 ) // Actually, RGB24 means a RGB30 of FIFO interface
		{
			sCh->m_uModeRegValue |= (0x1<<18)|(0x1<<13); // OutRGB,OutRGBFormat
			//m_uModeRegValue &= ~(0x1<<17);
		}
		else if ( eDstCSpace == YCBYCR ) // Actually, YCBYCR means a YUV444 of FIFO interface
		{
			sCh->m_uModeRegValue |= (0x1<<13);

⌨️ 快捷键说明

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