📄 sfli2310.c
字号:
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 + -