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

📄 tvenc.c

📁 三星 s3c6400测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6400 Validation
*
*	Copyright 2007 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6400.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : tvenc_test.c
*  
*	File Description : This file implements the API functons for TV Encoder controller.
*
*	Author : Heemyung.noh
*	Dept. : AP Development Team
*	Created Date : 2007/01/15
*	Version : 0.1 
* 
*	History
*	- Created(Heemyung.noh 2007/01/15)
*  
**************************************************************************************/


#include <math.h>

#include "sfr6400.h"
#include "system.h"
#include "library.h"
#include "tvenc.h"
#include "intc.h"

enum TVENC_REG 
{
// TV Controller
	TVCTRL              = TVENC_BASE+0x00,
	VBPORCH             = TVENC_BASE+0x04,
	HBPORCH             = TVENC_BASE+0x08,
	HENHOFFSET          = TVENC_BASE+0x0C,
	VDEMOWSIZE          = TVENC_BASE+0x10,
	HDEMOWSIZE          = TVENC_BASE+0x14,
	INIMAGESIZE         = TVENC_BASE+0x18,

// Encoder
	PEDCTRL             = TVENC_BASE+0x1C,
	YCFILTERBW          = TVENC_BASE+0x20,
	HUECTRL             = TVENC_BASE+0x24,
	FSCCTRL             = TVENC_BASE+0x28,
	FSCDTOMANCTRL       = TVENC_BASE+0x2C,
	BGCTRL              = TVENC_BASE+0x34,
	BGHVAVCTRL          = TVENC_BASE+0x38,
	BWSrtVal  			= TVENC_BASE+0x3C,
	DCAPL  	 			= TVENC_BASE+0x40,

// Image Enhancer
	CONTRABRIGHT        = TVENC_BASE+0x44,
	CBCRGAINCTRL        = TVENC_BASE+0x48,
	DEMOWINCTRL         = TVENC_BASE+0x4C,
	FTCA  				= TVENC_BASE+0x50,
	BWTiltHDLY  			= TVENC_BASE+0x54,	
	BWGAIN              		= TVENC_BASE+0x58,
	BWStrCTRL  			= TVENC_BASE+0x5C,	
	SHARPCTRL           = TVENC_BASE+0x60,
	GAMMACTRL           = TVENC_BASE+0x64,
	FSCAUXCTRL          = TVENC_BASE+0x68,
	SYNCSIZECTRL        = TVENC_BASE+0x6C,
	BURSTCTRL           = TVENC_BASE+0x70,
	MACROBURSTCTRL      = TVENC_BASE+0x74,
	ACTVIDPOSCTRL       = TVENC_BASE+0x78,
	ENCCTRL             = TVENC_BASE+0x7C,
	MUTECTRL            = TVENC_BASE+0x80,
	MACROVISION0        = TVENC_BASE+0x84,
	MACROVISION1        = TVENC_BASE+0x88,
	MACROVISION2        = TVENC_BASE+0x8C,
	MACROVISION3        = TVENC_BASE+0x90,
	MACROVISION4        = TVENC_BASE+0x94,
	MACROVISION5        = TVENC_BASE+0x98,
	MACROVISION6        = TVENC_BASE+0x9C,
	VBIOn  				= TVENC_BASE+0xA0,
	TVConFSMState		= TVENC_BASE+0xA4,
	IPInfo				= TVENC_BASE+0xA8	
};

// tv controller control sfr set
enum TVCTRL_BIT
{
	TVC_FIFOURINT_DIS   = 0<<16,
	TVC_FIFOURINT_ENA   = 1<<16,
	TVC_FIFOURINT_OCCUR	= 1<<12,
	TVC_OUTTYPE_C       = 0<<8,
	TVC_OUTTYPE_S       = 1<<8,
	TVC_OUTFMT_NTSC_M   = 0<<4,
	TVC_OUTFMT_NTSC_J   = 1<<4,
	TVC_OUTFMT_PAL_BDG  = 2<<4,
	TVC_OUTFMT_PAL_M    = 3<<4,
	TVC_OUTFMT_PAL_NC    = 4<<4,
	TVC_OFF             = 0<<0,
	TVC_ON              = 1<<0
};

// vertical back porch control
#define VBP_VEFBPD(n)   (((n)&0x1FF)<<16)
#define VBP_VOFBPD(n)   (((n)&0xFF)<<0)
enum VBPORCH_BIT
{
	VBP_VEFBPD_NTSC     = 0x11C<<16,
	VBP_VEFBPD_PAL      = 0x14F<<16,
	VBP_VOFBPD_NTSC     = 0x15<<0,
	VBP_VOFBPD_PAL      = 0x16<<0
};

// horizontal back porch end point
#define HBP_HSPW(n)     (((n)&0xFF)<<16)
#define HBP_HBPD(n)     (((n)&0x7FF)<<0)
enum HBPORCH_BIT
{
	HBP_HSPW_NTSC       = 0x80<<16,
	HBP_HSPW_PAL        = 0x80<<16,
	HBP_HBPD_NTSC       = 0xF4<<0,
	HBP_HBPD_PAL        = 0x108<<0
};

// horizontal enhancer offset
#define HEO_VAWCC(n)    (((n)&0x3F)<<24)
#define HEO_HAWCC(n)    (((n)&0xFF)<<16)
#define HEO_DTO(n)      (((n)&0x7)<<8)
#define HEO_HEOV(n)     (((n)&0x1F)<<0)
enum HENHOFFSET_BIT
{
//	HEO_DTO_NTSC        = 0x5<<8,
//	HEO_DTO_PAL         = 0x5<<8,
	//rb1004
	HEO_DTO_NTSC        = 0x4<<8,
	HEO_DTO_PAL         = 0x4<<8,	
	
	HEO_HEOV_NTSC       = 0x1A<<0,
	HEO_HEOV_PAL        = 0x1A<<0
};


// vertical demo window size
#define VDW_VDWS(n)     (((n)&0x1FF)<<16)
#define VDW_VDWSP(n)    (((n)&0x1FF)<<0)
enum VDEMOWSIZE_BIT
{
	VDW_VDWS_DEF        = 0xF0<<16,
	VDW_VDWSP_DEF       = 0x0<<0
};

// horizontal demo window size
#define HDW_HDWEP(n)    (((n)&0x7FF)<<16)
#define HDW_HDWSP(n)    (((n)&0x7FF)<<0)
enum HDEMOWSIZE_BIT
{
	HDW_HDWEP_DEF       = 0x5A0<<16,
	HDW_HDWSP_DEF       = 0x0<<0
};

// input image size
#define IIS_HEIGHT(n)   (((n)&0x3FF)<<16)
#define IIS_WIDTH(n)    (((n)&0x7FF)<<0)

// encoder pedestal control
enum PEDCTRL_BIT
{
	EPC_PED_ON          = 0<<0,
	EPC_PED_OFF         = 1<<0
};

// yc filter bandwidth control
enum YCFILTERBW_BIT
{
	YFB_YBW_60          = 0<<4,
	YFB_YBW_38          = 1<<4,
	YFB_YBW_31          = 2<<4,
	YFB_YBW_26          = 3<<4,
	YFB_YBW_21          = 4<<4,
	YFB_CBW_12          = 0<<0,
	YFB_CBW_10          = 1<<0,
	YFB_CBW_08          = 2<<0,
	YFB_CBW_06          = 3<<0
};

// hue control
#define HUE_CTRL(n)     (((n)&0xFF)<<0)

// fsc control
#define FSC_CTRL(n)     (((n)&0x7FFF)<<0)

// fsc dto manually control enable
#define FDM_CTRL(n)     (((n)&0x7FFFFFFF)<<0)

// background control
#define BGC_BGYOFS(n)   (((n)&0xF)<<0)
enum BGCTRL_BIT
{
	BGC_SME_DIS         = 0<<8,
	BGC_SME_ENA         = 1<<8,
	BGC_BGCS_BLACK      = 0<<4,
	BGC_BGCS_BLUE       = 1<<4,
	BGC_BGCS_RED        = 2<<4,
	BGC_BGCS_MAGENTA    = 3<<4,
	BGC_BGCS_GREEN      = 4<<4,
	BGC_BGCS_CYAN       = 5<<4,
	BGC_BGCS_YELLOW     = 6<<4,
	BGC_BGCS_WHITE      = 7<<4
};

// background vav & hav control
#define BVH_BG_HL(n)    (((n)&0xFF)<<24)
#define BVH_BG_HS(n)    (((n)&0xFF)<<16)
#define BVH_BG_VL(n)    (((n)&0xFF)<<8)
#define BVH_BG_VS(n)    (((n)&0xFF)<<0)

// sync size control
#define SSC_HSYNC(n)    (((n)&0x3FF)<<0)
enum SYNCSIZECTRL_BIT
{
	SSC_HSYNC_NTSC      = 0x3D<<0,
	SSC_HSYNC_PAL       = 0x3E<<0
};

// burst signal control
#define BSC_BEND(n)     (((n)&0x3FF)<<16)
#define BSC_BSTART(n)   (((n)&0x3FF)<<0)
enum BURSTCTRL_BIT
{
	BSC_BEND_NTSC       = 0x69<<16,
	BSC_BEND_PAL        = 0x6A<<16,
	BSC_BSTART_NTSC     = 0x49<<0,
	BSC_BSTART_PAL      = 0x4A<<0
};

// macrovision burst signal control
#define MBS_BSTART(n)   (((n)&0x3FF)<<0)
enum MACROBURSTCTRL_BIT
{
	MBS_BSTART_NTSC     = 0x41<<0,
	MBS_BSTART_PAL      = 0x42<<0
};

// active video position control
#define AVP_AVEND(n)    (((n)&0x3FF)<<16)
#define AVP_AVSTART(n)  (((n)&0x3FF)<<0)
enum ACTVIDPOSCTRL_BIT
{
	AVP_AVEND_NTSC      = 0x348<<16,
	AVP_AVEND_PAL       = 0x352<<16,
	AVP_AVSTART_NTSC    = 0x78<<0,
	AVP_AVSTART_PAL     = 0x82<<0
};

// encoder control
enum ENCCTRL_BIT
{
	ENC_BGEN_DIS        = 0<<0,
	ENC_BGEN_ENA        = 1<<0
};

#define NTSC_WIDTH		(720)
#define NTSC_HEIGHT		(480)
#define PAL_WIDTH		(720)
#define PAL_HEIGHT		(576)

//////////
// Function Name : TVENC_TurnOnOff
// Function Description : TV Encoder On/Off
// Input : 	uOnOff - 1 : On
//					0 : Off
// Output : None
void TVENC_TurnOnOff(u8 uOnOff)
{
	u32 uTemp;

	uTemp = Inp32(TVCTRL);

	if (uOnOff)
		Outp32(TVCTRL, uTemp|TVC_ON);
	else
		Outp32(TVCTRL, uTemp&~TVC_ON);
}


//////////
// Function Name : TVENC_SetImageSize
// Function Description : Set the input image size
// Input : 	uWSize - Width of Input Image(Real image size * 2)
//			uHSize -	Height of nput Image
// Output : None
void TVENC_SetImageSize(u32 uWSize, u32 uHSize)
{
	Outp32(INIMAGESIZE, IIS_HEIGHT(uHSize) | IIS_WIDTH(uWSize));
}


//////////
// Function Name : TVENC_ClearUnderrunInt
// Function Description : Clear the Under-run Interrupt pending bit
// Input : None
// Output : None
void TVENC_ClearUnderrunInt(void)
{
	u32 uTemp;

	uTemp = Inp32(TVCTRL);
	Outp32(TVCTRL, uTemp|TVC_FIFOURINT_OCCUR);
}


//////////
// Function Name : TVENC_EnableMacroVision
// Function Description : Enable Macrovision
// Input : 	eTvmode - TV output format
//			ePattern - Macrovision pattern
// Output : None
void TVENC_EnableMacroVision(TV_STANDARDS eTvmode, eMACROPATTERN ePattern)
{
	switch(ePattern)
	{
		case eAGC4L : 	Outp32(MACROVISION0, 0x2115D73E);
						Outp32(MACROVISION1, 0x02050515);
						Outp32(MACROVISION2, 0x00241B1B);
						Outp32(MACROVISION3, 0x000007F8);
						Outp32(MACROVISION4, 0x01600F0F);
						Outp32(MACROVISION5, 0x0405000A);
						Outp32(MACROVISION6, 0x000003FF);
						break;
		case eAGC2L : 	Outp32(MACROVISION0, 0x25111D3E);
						Outp32(MACROVISION1, 0x00070101);
						Outp32(MACROVISION2, 0x00241B1B);
						Outp32(MACROVISION3, 0x000007F8);
						Outp32(MACROVISION4, 0x01600F0F);
						Outp32(MACROVISION5, 0x0405000A);
						Outp32(MACROVISION6, 0x000003FF);
						break;
		case eN01 	: 	Outp32(MACROVISION0, 0x2115173E);
						Outp32(MACROVISION1, 0x03050515);
						Outp32(MACROVISION2, 0x00231C19);
						Outp32(MACROVISION3, 0x7E070FF8);
						Outp32(MACROVISION4, 0x01910EF0);
						Outp32(MACROVISION5, 0x02030705);
						Outp32(MACROVISION6, 0x000003C3);
						break;
		case eN02 	: 	Outp32(MACROVISION0, 0x1A2A2F3E);
						Outp32(MACROVISION1, 0x03040236);
						Outp32(MACROVISION2, 0x001D2524);
						Outp32(MACROVISION3, 0x6DCF36B8);
						Outp32(MACROVISION4, 0x00701323);
						Outp32(MACROVISION5, 0x050A0302);
						Outp32(MACROVISION6, 0x000003A0);
						break;
		case eP01	: 	Outp32(MACROVISION0, 0x2A221A3E);
						Outp32(MACROVISION1, 0x00020522);
						Outp32(MACROVISION2, 0x00143D1C);
						Outp32(MACROVISION3, 0x015403FE);
						Outp32(MACROVISION4, 0x00607EFE);
						Outp32(MACROVISION5, 0x07040008);
						Outp32(MACROVISION6, 0x00000155);
						break;
		case eP02 	: 	Outp32(MACROVISION0, 0x2A221A3E);
						Outp32(MACROVISION1, 0x03020522);
						Outp32(MACROVISION2, 0x002B1223);
						Outp32(MACROVISION3, 0x1F4378C6);
						Outp32(MACROVISION4, 0x01F0A353);
						Outp32(MACROVISION5, 0x02030C0B);
						Outp32(MACROVISION6, 0x00000385);
						break;
		default : break;
	}
}


//////////
// Function Name : TVENC_DisableMacroVision
// Function Description : Disable Macrovision
// Input : None
// Output : None
void TVENC_DisableMacroVision(void)
{
	u32 uTemp;

	uTemp = Inp32(MACROVISION0);
	uTemp &= ~(0xFF);
	Outp32(MACROVISION0, uTemp);
}


//////////
// Function Name : TVENC_SetTvConMode
// Function Description : Set the TV output format & type
// Input : 	eTvmode - TV output format
//			tvout - TV output type
// Output : None
void TVENC_SetTvConMode(TV_STANDARDS eTvmode, eTV_CONN_TYPE eTvout)
{
	u16 usOutporttype, usOutsigtype;
	u32 uTemp;

	//FscDTOManual setting disable
	Outp32(FSCDTOMANCTRL, 0);
	
	switch (eTvmode)
	{
#if 0
		case PAL_N :
			Outp32(VBPORCH, VBP_VEFBPD_PAL|VBP_VOFBPD_PAL);
			Outp32(HBPORCH, HBP_HSPW_PAL|HBP_HBPD_PAL);
			Outp32(HENHOFFSET, HEO_DTO_PAL|HEO_HEOV_PAL);
			Outp32(PEDCTRL, EPC_PED_ON);		
			Outp32(YCFILTERBW, YFB_YBW_26|YFB_CBW_06);	
			Outp32(SYNCSIZECTRL, SSC_HSYNC_PAL);
			Outp32(BURSTCTRL, BSC_BEND_PAL|BSC_BSTART_PAL);
			Outp32(MACROBURSTCTRL, MBS_BSTART_PAL);
			Outp32(ACTVIDPOSCTRL, AVP_AVEND_PAL|AVP_AVSTART_PAL);
			break;			
#endif
		case PAL_NC : //PAL type
		case PAL_BGHID :
			Outp32(VBPORCH, VBP_VEFBPD_PAL|VBP_VOFBPD_PAL);
			Outp32(HBPORCH, HBP_HSPW_PAL|HBP_HBPD_PAL);
			Outp32(HENHOFFSET, HEO_DTO_PAL|HEO_HEOV_PAL);
			Outp32(PEDCTRL, EPC_PED_OFF);	
			Outp32(YCFILTERBW, YFB_YBW_26|YFB_CBW_06);	//rb1004....PAL_NC:3.58205MHz????
			Outp32(SYNCSIZECTRL, SSC_HSYNC_PAL);
			Outp32(BURSTCTRL, BSC_BEND_PAL|BSC_BSTART_PAL);
			Outp32(MACROBURSTCTRL, MBS_BSTART_PAL);
			Outp32(ACTVIDPOSCTRL, AVP_AVEND_PAL|AVP_AVSTART_PAL);
			//rb1004... Sub_carrier reset enable
			Outp32(FSCAUXCTRL, 0x11);
			break;

		case NTSC_443:
			Outp32(VBPORCH, VBP_VEFBPD_NTSC|VBP_VOFBPD_NTSC);
			Outp32(HBPORCH, HBP_HSPW_NTSC|HBP_HBPD_NTSC);
			Outp32(HENHOFFSET, HEO_DTO_NTSC|HEO_HEOV_NTSC);
			Outp32(PEDCTRL, EPC_PED_ON);
			Outp32(YCFILTERBW, YFB_YBW_26|YFB_CBW_06);
			Outp32(SYNCSIZECTRL, SSC_HSYNC_NTSC);
			Outp32(BURSTCTRL, BSC_BEND_NTSC|BSC_BSTART_NTSC);
			Outp32(MACROBURSTCTRL, MBS_BSTART_NTSC);
			Outp32(ACTVIDPOSCTRL, AVP_AVEND_NTSC|AVP_AVSTART_NTSC);
			//rb1004... Sub_carrier reset enable
			Outp32(FSCAUXCTRL, 0x01);
			break;

		case NTSC_J	:
			Outp32(VBPORCH, VBP_VEFBPD_NTSC|VBP_VOFBPD_NTSC);
			Outp32(HBPORCH, HBP_HSPW_NTSC|HBP_HBPD_NTSC);
			Outp32(HENHOFFSET, HEO_DTO_NTSC|HEO_HEOV_NTSC);
			Outp32(PEDCTRL, EPC_PED_OFF);
			Outp32(YCFILTERBW, YFB_YBW_21|YFB_CBW_06);
			Outp32(SYNCSIZECTRL, SSC_HSYNC_NTSC);
			Outp32(BURSTCTRL, BSC_BEND_NTSC|BSC_BSTART_NTSC);
			Outp32(MACROBURSTCTRL, MBS_BSTART_NTSC);
			Outp32(ACTVIDPOSCTRL, AVP_AVEND_NTSC|AVP_AVSTART_NTSC);
			//rb1004... Sub_carrier reset enable
			Outp32(FSCAUXCTRL, 0x01);
			break;	
			
		case PAL_M 	:	
			Outp32(VBPORCH, VBP_VEFBPD_NTSC|VBP_VOFBPD_NTSC);
			Outp32(HBPORCH, HBP_HSPW_NTSC|HBP_HBPD_NTSC);
			Outp32(HENHOFFSET, HEO_DTO_NTSC|HEO_HEOV_NTSC);
			Outp32(PEDCTRL, EPC_PED_ON);
			Outp32(YCFILTERBW, YFB_YBW_21|YFB_CBW_06);
			Outp32(SYNCSIZECTRL, SSC_HSYNC_NTSC);
			Outp32(BURSTCTRL, BSC_BEND_NTSC|BSC_BSTART_NTSC);
			Outp32(MACROBURSTCTRL, MBS_BSTART_NTSC);
			Outp32(ACTVIDPOSCTRL, AVP_AVEND_NTSC|AVP_AVSTART_NTSC);
			//rb1004... Sub_carrier reset enable
			Outp32(FSCAUXCTRL, 0x11);
			break;			
		case NTSC_M	:
		default :			
			Outp32(VBPORCH, VBP_VEFBPD_NTSC|VBP_VOFBPD_NTSC);
			Outp32(HBPORCH, HBP_HSPW_NTSC|HBP_HBPD_NTSC);
			Outp32(HENHOFFSET, HEO_DTO_NTSC|HEO_HEOV_NTSC);
			Outp32(PEDCTRL, EPC_PED_ON);
			Outp32(YCFILTERBW, YFB_YBW_21|YFB_CBW_06);
			Outp32(SYNCSIZECTRL, SSC_HSYNC_NTSC);
			Outp32(BURSTCTRL, BSC_BEND_NTSC|BSC_BSTART_NTSC);
			Outp32(MACROBURSTCTRL, MBS_BSTART_NTSC);
			Outp32(ACTVIDPOSCTRL, AVP_AVEND_NTSC|AVP_AVSTART_NTSC);
			//rb1004... Sub_carrier reset enable
			Outp32(FSCAUXCTRL, 0x01);
			break;
	}
			
	if (eTvout == eS_VIDEO)
	{
		Outp32(YCFILTERBW, YFB_YBW_60|YFB_CBW_06);
		usOutporttype = TVC_OUTTYPE_S;
	}
	else
		usOutporttype = TVC_OUTTYPE_C;

	switch (eTvmode)
	{
		case NTSC_M :
			usOutsigtype = TVC_OUTFMT_NTSC_M;
			break;
		case NTSC_J :
			usOutsigtype = TVC_OUTFMT_NTSC_J;
			break;
		case PAL_BGHID:
			usOutsigtype = TVC_OUTFMT_PAL_BDG;
			break;
		case PAL_M :
			usOutsigtype = TVC_OUTFMT_PAL_M;
			break;
		case PAL_NC :
			usOutsigtype = TVC_OUTFMT_PAL_NC;
			break;
	}

	uTemp = Inp32(TVCTRL);
	Outp32(TVCTRL, (uTemp&~(0x1F<<4))|usOutporttype|usOutsigtype);

}


//////////
// Function Name : TVENC_SetDemoWinSize
// Function Description : Set the enhancing demo window size
// Input : 	uHsz - Horizontal demo window size
//			uVsz - Vertical demo window size
//			uHst - Horizontal demo window start point
//			uVst - Vertical demo window start point
// Output : None
void TVENC_SetDemoWinSize(u32 uHsz, u32 uVsz, u32 uHst, u32 uVst)
{
	Outp32(VDEMOWSIZE, VDW_VDWS(uVsz)|VDW_VDWSP(uVst));
	Outp32(HDEMOWSIZE, HDW_HDWEP(uVsz)|HDW_HDWSP(uVst));
}


//////////
// Function Name : TVENC_SetEncPedestal
// Function Description : Control the encoder pedestal 
// Input : 	bOnOff - TRUE : pedestal on
//					FALSE : pedestal off
// Output : None
void TVENC_SetEncPedestal(bool bOnOff)
{
	if (bOnOff)
		Outp32(PEDCTRL, EPC_PED_ON);
	else
		Outp32(PEDCTRL, EPC_PED_OFF);
}


⌨️ 快捷键说明

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