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

📄 sfli2310.c

📁 Fil2310.c De-interlace芯片源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	W_BottomBlank = W_BottomBlank * 2;

	fli2300_Write16(NRD_EBLNK_L_L, W_LeftBlank);
	fli2300_Write16(NRD_EBLNK_R_L, W_RightBlank);
	fli2300_Write16(NRD_EBLNK_T_L, W_TopBlank);
	if (SdtvType == Fli2300Sdtv_525I) // 525i input
		fli2300_Write16(NRD_EBLNK_B_N_L, W_BottomBlank);
	if (SdtvType == Fli2300Sdtv_625I) // 625i input
		fli2300_Write16(NRD_EBLNK_B_P_L, W_BottomBlank);

	//SOI PRINT(("Nrd FE : %d : %d : %d : %d\n",W_LeftBlank,W_RightBlank,W_TopBlank,W_BottomBlank));

} // end - fli2300_ConfigureFilmEditWindow



//*******************************************************************************
// FUNCTION:	void fli2300_ConfigureNoiseMeterWindow(Fli2300Sdtv_t SdtvType,
//									  Fli2300CaptureDesc_t *Stp_CaptureDesc,
//									  Fli2300NRDBlankDesc_t *Stp_BlankDesc)
//
// USAGE:		This module programs Noise Meter window definitions
//				Number of pixels to blanked on left - the recommended valued is 16
//				Number of pixels to blanked on right- the recommended valued is 50
//				Number of lines to blanked on top - the recommended valued is 16
//				Number of lines to blanked on bottom - the recommended valued is 12
//
// DESCRIPTION:	Horizontal window settings are wrt to HSAV pulse
//				Vertical window settings are wrt to falling edge of VREF
//				3 clocks of delay in video path wrt to SAV of HREF
//
// INPUT:		SdtvType	- sdtv type 525i or 625i
//				Stp_CaptureDesc - pointer to capture desc
//				Stp_BlankDesc - pointer to blank desc
//
// OUTPUT:		None
//
//
// USED_REGS:	
//*******************************************************************************
void fli2300_ConfigureNoiseMeterWindow(Fli2300Sdtv_t SdtvType,
									  Fli2300CaptureDesc_t *Stp_CaptureDesc,
									  Fli2300NRDBlankDesc_t *Stp_BlankDesc)
{
	WORD W_Vblank;
	WORD W_LeftBlank;
	WORD W_RightBlank;
	WORD W_TopBlank;
	WORD W_BottomBlank;
	WORD W_Hblank;

	switch (Stp_CaptureDesc->SignalType)
	{
		case Fli2300InputCtrlSig_Embedded:
			W_LeftBlank = 3 + Stp_BlankDesc->LeftBlank;
			W_RightBlank = 3 + Stp_CaptureDesc->HActive - Stp_BlankDesc->RightBlank;  

			// in this case falling edge = SAV
			W_TopBlank = Stp_BlankDesc->TopBlank;
			W_BottomBlank = Stp_CaptureDesc->VActive - Stp_BlankDesc->BottomBlank;
			break;

		case Fli2300InputCtrlSig_Ref: 
			W_LeftBlank = 3 + Stp_BlankDesc->LeftBlank;
			W_RightBlank = 3 + Stp_CaptureDesc->HActive - Stp_BlankDesc->RightBlank;  

			// remember the invert control bit is common for H and V in SDTV path
			if (Stp_CaptureDesc->VPolarity == Stp_CaptureDesc->HPolarity)
			{
				// in this case falling edge = EAV
				W_Vblank = Stp_CaptureDesc->VTotal - Stp_CaptureDesc->VActive;
				W_TopBlank = W_Vblank + Stp_BlankDesc->TopBlank;
				W_BottomBlank = W_Vblank + Stp_CaptureDesc->VActive - Stp_BlankDesc->BottomBlank;
			}
			else // not equal
			{
				// in this case falling edge = SAV
				W_TopBlank = Stp_BlankDesc->TopBlank;
				W_BottomBlank = Stp_CaptureDesc->VActive - Stp_BlankDesc->BottomBlank;
			}
			break;

	
		case Fli2300InputCtrlSig_Sync: 
		{
//SOI move to the top			WORD W_Hblank;

			W_Hblank = Stp_CaptureDesc->HActiveStart;
			if (SdtvType == Fli2300Sdtv_525I) 
			{
				if (W_Hblank >= 134)
					W_Hblank = W_Hblank - 134;
				else
					W_Hblank = 0;
			}
			if (SdtvType == Fli2300Sdtv_625I) 
			{
				if (W_Hblank >= 140)
					W_Hblank = W_Hblank - 140;
				else
					W_Hblank = 0;
			}
			W_LeftBlank = 3 + W_Hblank + Stp_BlankDesc->LeftBlank;  
			W_RightBlank = 3 + W_Hblank + Stp_CaptureDesc->HActive - Stp_BlankDesc->RightBlank;  

			// in this case internally generated VREF is active low  
			// whose falling egde is hard-coded 16lines wrt to falling edge of sync
			// remember the invert control bit is common for H and V in SDTV path
			if (Stp_CaptureDesc->VPolarity == Stp_CaptureDesc->HPolarity)
				W_Vblank = Stp_CaptureDesc->VSyncWidth + Stp_CaptureDesc->VBackPorch;
			else
				W_Vblank = Stp_CaptureDesc->VBackPorch;

			W_TopBlank =  W_Vblank + Stp_BlankDesc->TopBlank;
			if (W_TopBlank >= 16)
				W_TopBlank = W_TopBlank - 16;
			else
				W_TopBlank = Stp_CaptureDesc->VTotal - (16 - W_TopBlank);
			W_BottomBlank = W_Vblank + Stp_CaptureDesc->VActive - Stp_BlankDesc->BottomBlank;
			break;
		}

		default:
			return;
	} // end switch - Stp_CaptureDesc->SignalType

	W_RightBlank = W_RightBlank % Stp_CaptureDesc->HTotal;
	// line doubled calculation - DEBUG - Not required
	//W_TopBlank = W_TopBlank * 2; 
	//W_BottomBlank = W_BottomBlank * 2;

	fli2300_Write16(NRD_NR_NMHSTARTPOS_L, W_LeftBlank);
	fli2300_Write16(NRD_NR_NMHENDPOS_L, W_RightBlank);
	fli2300_Write16(NRD_NR_NMVSTARTPOS_L, W_TopBlank);
	if (SdtvType == Fli2300Sdtv_525I) // 525i input
		fli2300_Write16(NRD_NR_NMVENDPOS525_L, W_BottomBlank);
	if (SdtvType == Fli2300Sdtv_625I) // 625i input
		fli2300_Write16(NRD_NR_NMVENDPOS625_L, W_BottomBlank);

	//SOI PRINT(("Nrd NM : %d : %d : %d : %d\n",W_LeftBlank,W_RightBlank,W_TopBlank,W_BottomBlank));

} // end - fli2300_ConfigureNoiseMeterWindow



//*******************************************************************************
// FUNCTION:	void fli2300_ConfigureNRDLDRefTimings(Fli2300Sdtv_t SdtvType
//									  Fli2300CaptureDesc_t *Stp_CaptureDesc)
//
// USAGE:		This module programs NRD - line doubled Picture reference 
//				to subsequent block (SDI)
//				This functions should be called at every mode change or aspect
//				ratio conversion which involves cropping
//
// DESCRIPTION:	The HPIC is placed wrt to HSAV signal
//				The VPIC is placed wrt to V300Offset value which is counted from 
//				raising edge of VREF
//
// INPUT:		SdtvType	- sdtv type 525i or 625i
//
// OUTPUT:		None
//
// GLOBALS:
//
// USED_REGS:	
//*******************************************************************************
void fli2300_ConfigureNRDLDRefTimings(Fli2300Sdtv_t SdtvType,
									  Fli2300CaptureDesc_t *Stp_CaptureDesc)
{
	WORD W_Hpicstart;
	WORD W_Hpicstop;
	WORD W_Hblank;
	WORD W_Vpicstart;
	WORD W_Vpicstop;
	WORD W_Framesize;
	WORD W_Offset;
	WORD W_Vblank;
	WORD W_Blank;

	// H parameters
	{
//	WORD W_Hpicstart;
//	WORD W_Hpicstop;
//	WORD W_Hblank;

	fli2300_Write16(NRD_HACTIVE_L, Stp_CaptureDesc->HActive);
	switch (Stp_CaptureDesc->SignalType)
	{
		case Fli2300InputCtrlSig_Embedded:
		case Fli2300InputCtrlSig_Ref: 
			W_Hpicstart = 1 + Stp_CaptureDesc->CropLeft;
			W_Hpicstop = 1 + Stp_CaptureDesc->HActive - Stp_CaptureDesc->CropRight;
			break;
	
		case Fli2300InputCtrlSig_Sync: 
			W_Hblank = Stp_CaptureDesc->HActiveStart;
			if (SdtvType == Fli2300Sdtv_525I) 
			{
				if (W_Hblank >= 134)
					W_Hblank = W_Hblank - 134;
				else
					W_Hblank = 0;
			}
			if (SdtvType == Fli2300Sdtv_625I) 
			{
				if (W_Hblank >= 140)
					W_Hblank = W_Hblank - 140;
				else
					W_Hblank = 0;
			}
			W_Hpicstart = 4 + W_Hblank + Stp_CaptureDesc->CropLeft;
			W_Hpicstop = 4 + W_Hblank + Stp_CaptureDesc->HActive - Stp_CaptureDesc->CropRight;
			W_Hpicstop = W_Hpicstop % Stp_CaptureDesc->HTotal;
			break;

		default:
			return;
	} // end switch - gSt_Fli2300CaptureDesc.SignalType

	if (SdtvType == Fli2300Sdtv_525I) 
	{
		fli2300_Write16(NRD_HREF_START_N_L, W_Hpicstart);
		fli2300_Write16(NRD_HREF_STOP_N_L, W_Hpicstop);
	}
	else if (SdtvType == Fli2300Sdtv_625I) 
	{
		fli2300_Write16(NRD_HREF_START_P_L, W_Hpicstart);
		fli2300_Write16(NRD_HREF_STOP_P_L, W_Hpicstop);
	}
	else
		return;

	//SOI PRINT(("nrd LD H: %d ; %d\n",W_Hpicstart,W_Hpicstop));
	} // end - H parameters


	// V parameters
	{
//	WORD W_Vpicstart;
//	WORD W_Vpicstop;
//	WORD W_Framesize;
//	WORD W_Offset;
//	WORD W_Vblank;

	// V300offset
	fli2300_Write16(NRD_V300_OFFSET_L, gW_Fli2300NRDV300Offset);

	W_Framesize = (Stp_CaptureDesc->VTotal * 2) + 1; // DEBUG
	W_Offset = W_Framesize - gW_Fli2300NRDV300Offset;
	W_Vblank = W_Framesize - (Stp_CaptureDesc->VActive * 2);
	switch (Stp_CaptureDesc->SignalType)
	{
		case Fli2300InputCtrlSig_Embedded:
			// VPIC - wrt to raising edge VREF = EAV
			W_Vpicstart = W_Offset + W_Vblank + (Stp_CaptureDesc->CropTop * 2);
			W_Vpicstop =  (W_Framesize + W_Offset) - (Stp_CaptureDesc->CropBottom * 2);
			break;

		case Fli2300InputCtrlSig_Ref: 
			// remember the invert control bit is common for H and V in SDTV path
			if (Stp_CaptureDesc->VPolarity == Stp_CaptureDesc->HPolarity)
			{
				// VPIC - wrt to raising edge VREF = SAV
				W_Vpicstart = W_Offset + 3 + (Stp_CaptureDesc->CropTop * 2);
				W_Vpicstop =  W_Offset + 3 + ((Stp_CaptureDesc->VActive - Stp_CaptureDesc->CropBottom) * 2);
			}
			else
			{
				// VPIC - wrt to raising edge VREF = EAV
				W_Vpicstart = W_Offset + W_Vblank + (Stp_CaptureDesc->CropTop * 2);
				W_Vpicstop =  (W_Framesize + W_Offset) - (Stp_CaptureDesc->CropBottom * 2);
			}
			break;

	
		case Fli2300InputCtrlSig_Sync: 
			{
//			WORD W_Blank;
			// DEBUG
			// VPIC - internally generated VREF active low, the raising edge = EAV 
			/*
			framesize = (CaptureVTotal * 2) + 1; // TBD
			offset =  (framesize - NRDV300Offset);
			vblank = framesize - (CaptureVActive * 2);
			vpicstart = (offset + 0 + vblank + (CaptureVCropTop * 2)) % framesize;
			vpicstop = (offset + 0 - (CaptureVCropBottom * 2)) % framesize;
			*/
			// remember the invert control bit is common for H and V in SDTV path
			if (Stp_CaptureDesc->VPolarity == Stp_CaptureDesc->HPolarity)
				W_Blank = Stp_CaptureDesc->VSyncWidth + Stp_CaptureDesc->VBackPorch;
			else
				W_Blank = Stp_CaptureDesc->VBackPorch;
			W_Blank = (3 + W_Blank) * 2;

			//DEBUG	
			W_Vpicstart = W_Offset + W_Blank + (Stp_CaptureDesc->CropTop * 2);
			W_Vpicstop = W_Offset + W_Blank + ((Stp_CaptureDesc->VActive - Stp_CaptureDesc->CropBottom) * 2);
			}
			break;

		default:
			return;
	} // end switch - Stp_CaptureDesc->SignalType


	// All vertical timing registers in NRD are 1 based. Therefore 1 is added.
	W_Vpicstart = (W_Vpicstart % W_Framesize) + 1;
	// 2 is added to avoid Last line garbage seen in the output
	W_Vpicstop = ((W_Vpicstop + 2) % W_Framesize) + 1;	

	if (SdtvType == Fli2300Sdtv_525I) 
	{
		fli2300_Write16(NRD_VREF_START_N_L, W_Vpicstart);
		fli2300_Write16(NRD_VREF_STOP_N_L, W_Vpicstop);
	}
	else if (SdtvType == Fli2300Sdtv_625I) 
	{
		fli2300_Write16(NRD_VREF_START_P_L, W_Vpicstart);
		fli2300_Write16(NRD_VREF_STOP_P_L, W_Vpicstop);
	}
	else
		return;

	// The Vpulse position is placed approximately center of blank period
	W_Offset = W_Offset + (W_Vblank / 2);
	fli2300_Write16(NRD_DIN_SDI_VPULSE_LINE_L, W_Offset);
	
	//SOI PRINT(("nrd LD V: %d ; %d ; %d\n",W_Vpicstart,W_Vpicstop,W_Offset));
	} // end - Vparameters


} // end - fli2300_ConfigureNRDLDRefTimings


//SDI
#define D_SDI_DINVACTIVE_PREPEND	3
#define D_SDI_DINVACTIVE_APPEND		3

//*******************************************************************************
// FUNCTION:	void fli2300_ConfigureSDRAMInterface(Fli2300SdramChipSet_t ChipSet
//													 Fli2300SdramInit_t InitType)
//
// USAGE:		Initializes SDRAM interface of FLI2300
//				Sets Chip set confguration and does initializatin sequence
//				Three types of init sequence are supported
//					1. Fli2300SdramInit_Fixed 
//					2. Fli2300SdramInit_Micro
//				The above Initialization sequence is a common sequence appicable 
//				to most of the SDRAMs. 
//					3. Fli2300SdramInit_Cutsom
//				In case any change in sequence, call this function with option 3.
//				It skips the initialization sequence and user has to do his own.
//
// DESCRIPTION:	
//
// INPUT:		ChipSet		-	chip set type
//				InitType	-	Initialization type fixed/micro/custom
//				
// OUTPUT:		None
//
// GLOBALS:		None
//
// USED_REGS:	
//*******************************************************************************
void fli2300_ConfigureSDRAMInterface(Fli2300SdramChipSet_t ChipSet,
									 Fli2300SdramInit_t InitType)
{
	// chip set
	fli2300_Write08(SDI_CHIPSET_CFG,(BYTE)ChipSet);

	// init SDRRAM
	if (InitType == Fli2300SdramInit_Fixed)
	{
		// toggle fixed init bit
		fli2300_Write08(SDI_CTRL_1,0x00);
		fli2300_Write08(SDI_CTRL_1,0x02);
		fli2300_Write08(SDI_CTRL_1,0x00);
	}
	else if (InitType == Fli2300SdramInit_Micro)
	{
		// micro init - typical sequence - may vary with vendor
		// set micro init control
		fli2300_Write08(SDI_CTRL_1,0x04); 

		// pre-charge all banks
		fli2300_Write08(SDI_UP_A,0xFF);
		fli2300_Write08(SDI_UP_D,0x17);
		fli2300_Write08(SDI_CTRL_1,0x0C);  // Strobe
		fli2300_Write08(SDI_CTRL_1,0x04); 

		// 1st auto refresh
		fli2300_Write08(SDI_UP_A,0xFF);
		fli2300_Write08(SDI_UP_D,0x0F);
		fli2300_Write08(SDI_CTRL_1,0x0C);  // Strobe
		fli2300_Write08(SDI_CTRL_1,0x04); 
		
		// 2nd auto refresh
		fli2300_Write08(SDI_CTRL_1,0x0C);  // Strobe
		fli2300_Write08(SDI_CTRL_1,0x04); 

		// set mode
		fli2300_Write08(SDI_UP_A,0x33);
		fli2300_Write08(SDI_UP_D,0x00);
		fli2300_Write08(SDI_CTRL_1,0x0C);  // Strobe
		fli2300_Write08(SDI_

⌨️ 快捷键说明

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