📄 post.c
字号:
/*----------------------------------------------------------------------
*
* 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 + -