vprocss: Added vdma alignment fix

-Added logic to fix vdma ip alignement issues with different bit
 width at axis and aximm interface at all supported pixel/clk
 and color depth combinations
-Moved stream (input/output) validation logic scattered around
 in different blocks to a central location
-Added API to report subsystem configuration status
-Code cleanup and changed relevant prints to dbg print

Signed-off-by: Rohit Consul <rohit.consul@xilinx.com>
Reviewed-by: Andrei Simion <andreis@xilinx.com>
This commit is contained in:
Rohit Consul 2015-07-31 13:47:47 -07:00 committed by Nava kishore Manne
parent 759573e90f
commit eff8fdf3f3
4 changed files with 322 additions and 115 deletions

View file

@ -204,7 +204,7 @@ int XVprocss_VdmaWriteSetup(XAxiVdma *pVdma,
Status = XAxiVdma_DmaConfig(pVdma, XAXIVDMA_WRITE, &WriteCfg);
if (Status != XST_SUCCESS)
{
xil_printf("Write channel config failed %d\r\n", Status);
xdbg_printf(XDBG_DEBUG_GENERAL,"Write channel config failed %d\r\n", Status);
return XST_FAILURE;
}
@ -224,7 +224,7 @@ int XVprocss_VdmaWriteSetup(XAxiVdma *pVdma,
WriteCfg.FrameStoreStartAddr);
if (Status != XST_SUCCESS)
{
xil_printf("Write channel set buffer address failed %d\r\n", Status);
xdbg_printf(XDBG_DEBUG_GENERAL,"Write channel set buffer address failed %d\r\n", Status);
return XST_FAILURE;
}
}
@ -300,7 +300,7 @@ int XVprocss_VdmaReadSetup(XAxiVdma *pVdma,
Status = XAxiVdma_DmaConfig(pVdma, XAXIVDMA_READ, &ReadCfg);
if (Status != XST_SUCCESS)
{
xil_printf("Read channel config failed %d\r\n", Status);
xdbg_printf(XDBG_DEBUG_GENERAL,"Read channel config failed %d\r\n", Status);
return XST_FAILURE;
}
@ -322,7 +322,7 @@ int XVprocss_VdmaReadSetup(XAxiVdma *pVdma,
ReadCfg.FrameStoreStartAddr);
if (Status != XST_SUCCESS)
{
xil_printf("Read channel set buffer address failed %d\r\n", Status);
xdbg_printf(XDBG_DEBUG_GENERAL,"Read channel set buffer address failed %d\r\n", Status);
return XST_FAILURE;
}
}
@ -351,14 +351,14 @@ int XVprocss_VdmaStartTransfer(XAxiVdma *pVdma)
Status = XAxiVdma_DmaStart(pVdma, XAXIVDMA_WRITE);
if (Status != XST_SUCCESS)
{
xil_printf("VDMA ERR:: Start Write transfer failed %d\r\n", Status);
xdbg_printf(XDBG_DEBUG_GENERAL,"VDMA ERR:: Start Write transfer failed %d\r\n", Status);
return XST_FAILURE;
}
Status = XAxiVdma_DmaStart(pVdma, XAXIVDMA_READ);
if (Status != XST_SUCCESS)
{
xil_printf("VDMA ERR:: Start read transfer failed %d\r\n", Status);
xdbg_printf(XDBG_DEBUG_GENERAL,"VDMA ERR:: Start read transfer failed %d\r\n", Status);
return XST_FAILURE;
}
}
@ -486,7 +486,7 @@ void XVprocss_VdmaSetWinToUpScaleMode(XVprocss *pVprocss, u32 updateCh)
pVprocss->idata.PixelWidthInBits);
if(status != XST_SUCCESS)
{
xil_printf("ERR:: Unable to configure VDMA Write Channel \r\n");
xil_printf("VPROCSS ERR:: Unable to configure VDMA Write Channel \r\n");
}
}
@ -516,7 +516,7 @@ void XVprocss_VdmaSetWinToUpScaleMode(XVprocss *pVprocss, u32 updateCh)
pVprocss->idata.PixelWidthInBits);
if(status != XST_SUCCESS)
{
xil_printf("ERR:: Unable to configure VDMA Read Channel \r\n");
xil_printf("VPROCSS ERR:: Unable to configure VDMA Read Channel \r\n");
}
}
}

View file

@ -104,13 +104,33 @@ typedef struct
XVprocss_SubCores subcoreRepo; /**< Define Driver instance of all sub-core
included in the design */
/** @name VDMA Alignment required step size
*
* @{
* The following constants define various Zoom/Pip window horizontal step sizes
* that keeps the VDMA access aligned to aximm interface width, based on
* Pixels/Clock and Color Depth of the configured subsystem. This is required
* as current version of VDMA does not support DRE if interface width is
* >64bits. Software has to align the hsize and stride for all possible
* configurations supported by the subsystem.
* Current subsystem version supports the following
* - Number of components = 3 (Fixed)
* - Pixels/Clock = 1, 2, 4
* - Color Depth = 8, 10, 12, 16 (4 variations)
*/
const u16 XVprocss_PixelHStep[XVIDC_PPC_NUM_SUPPORTED][4] =
{
{16, 4, 32, 8}, //XVIDC_PPC_1
{16, 4, 64, 16}, //XVIDC_PPC_2
{32, 128, 128, 32}, //XVIDC_PPC_4
};
/************************** Function Prototypes ******************************/
static void SetPODConfiguration(XVprocss *pVprocss);
static void GetIncludedSubcores(XVprocss *pVprocss);
static int validateVidStreamConfig(XVidC_VideoStream *pStrmIn,
XVidC_VideoStream *pStrmOut);
static int ValidateSubsystemConfig(XVprocss *InstancePtr);
static int ValidateScalerOnlyConfig(XVidC_VideoStream *pStrmIn,
XVidC_VideoStream *pStrmOut);
static int SetupModeScalerOnly(XVprocss *pVprocss);
static int SetupModeMax(XVprocss *pVprocss);
@ -422,15 +442,14 @@ int XVprocss_CfgInitialize(XVprocss *InstancePtr, XVprocss_Config *CfgPtr,
memcpy((void *)&(pVprocss->Config), (const void *)CfgPtr, sizeof(XVprocss_Config));
pVprocss->Config.BaseAddress = EffectiveAddr;
/* Print the configuration selected */
switch(pVprocss->Config.Topology)
{
case XVPROCSS_TOPOLOGY_FULL_FLEDGED:
xil_printf(" [Subsystem Configuration Mode - Full]\r\n\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL," [Subsystem Configuration Mode - Full]\r\n\r\n");
break;
case XVPROCSS_TOPOLOGY_SCALER_ONLY:
xil_printf(" [Subsystem Configuration Mode - Scaler-Only]\r\n\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL," [Subsystem Configuration Mode - Scaler-Only]\r\n\r\n");
break;
default:
@ -556,7 +575,7 @@ int XVprocss_CfgInitialize(XVprocss *InstancePtr, XVprocss_Config *CfgPtr,
u32 vdmaBufReq, bufsize;
u32 Bpp; //bytes per pixel
Bpp = (pVprocss->Config.PixPrecision + 7)/8;
Bpp = (pVprocss->Config.ColorDepth + 7)/8;
//compute buffer size based on subsystem configuration
//For 1 4K2K buffer (YUV444 16-bit) size is ~48MB
@ -655,13 +674,14 @@ static void SetPODConfiguration(XVprocss *pVprocss)
XVidC_VideoStream vidStrmIn;
XVidC_VideoStream vidStrmOut;
XVidC_VideoWindow win;
u16 PixPrecisionIndex;
/* Setup Default Output Stream configuration */
vidStrmOut.VmId = XVIDC_VM_1920x1080_60_P;
vidStrmOut.ColorFormatId = XVIDC_CSF_RGB;
vidStrmOut.FrameRate = XVIDC_FR_60HZ;
vidStrmOut.IsInterlaced = FALSE;
vidStrmOut.ColorDepth = XVIDC_BPC_10;
vidStrmOut.ColorDepth = pVprocss->Config.ColorDepth;
vidStrmOut.PixPerClk = pVprocss->Config.PixPerClock;
/* Setup Default Input Stream configuration */
@ -669,19 +689,56 @@ static void SetPODConfiguration(XVprocss *pVprocss)
vidStrmIn.ColorFormatId = XVIDC_CSF_RGB;
vidStrmIn.FrameRate = XVIDC_FR_60HZ;
vidStrmIn.IsInterlaced = FALSE;
vidStrmIn.ColorDepth = XVIDC_BPC_10;
vidStrmIn.ColorDepth = pVprocss->Config.ColorDepth;
vidStrmIn.PixPerClk = pVprocss->Config.PixPerClock;
/* Setup Video Processing subsystem input/output configuration */
XVprocss_SetVidStreamIn(pVprocss, &vidStrmIn);
XVprocss_SetVidStreamOut(pVprocss, &vidStrmOut);
/* compute data width supported by vdma */
pVprocss->idata.PixelWidthInBits = pVprocss->Config.NumVidComponents *
pVprocss->VidIn.ColorDepth;
switch(pVprocss->Config.PixPerClock)
{
case XVIDC_PPC_1:
case XVIDC_PPC_2:
if(pVprocss->Config.ColorDepth == XVIDC_BPC_10)
{
/* Align the bit width to next byte boundary for this particular case
* Num_Channel Color Depth PixelWidth Align
* ----------------------------------------------------
* 2 10 20 24
* 3 10 30 32
*
* HW will do the bit padding for 20->24 and 30->32
*/
pVprocss->idata.PixelWidthInBits = ((pVprocss->idata.PixelWidthInBits + 7)/8)*8;
}
break;
default:
break;
}
/* Setup Pixel Step size for define HW configuration */
switch(pVprocss->Config.ColorDepth)
{
case XVIDC_BPC_8: PixPrecisionIndex = 0; break;
case XVIDC_BPC_10: PixPrecisionIndex = 1; break;
case XVIDC_BPC_12: PixPrecisionIndex = 2; break;
case XVIDC_BPC_16: PixPrecisionIndex = 3; break;
default: break;
}
pVprocss->idata.PixelHStepSize = XVprocss_PixelHStep[pVprocss->Config.PixPerClock>>1][PixPrecisionIndex];
if(XVprocss_IsConfigModeMax(pVprocss))
{
/* Set default Zoom Window */
win.Width = 400;
win.Height = 400;
win.StartX = win.StartY = 0;
XVprocss_SetZoomPipWindow(pVprocss,
XVPROCSS_ZOOM_WIN,
&win);
@ -1007,7 +1064,7 @@ void XVprocss_UpdateZoomPipWindow(XVprocss *InstancePtr)
}
else //Scaler Only Config
{
xil_printf("\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
}
}
@ -1044,7 +1101,7 @@ void XVprocss_SetZoomPipWindow(XVprocss *InstancePtr,
/* check if DMA includes DRE. If not then auto-align to selected bus width */
if(!InstancePtr->vdma->ReadChannel.HasDRE)
{
wordlen = InstancePtr->vdma->ReadChannel.WordLength-1;
wordlen = InstancePtr->idata.PixelHStepSize-1;
win->StartX = ((win->StartX + wordlen) & ~(wordlen));
win->Width = ((win->Width + wordlen) & ~(wordlen));
@ -1060,7 +1117,7 @@ void XVprocss_SetZoomPipWindow(XVprocss *InstancePtr,
/* check if DMA does not have DRE then auto-align */
if(!InstancePtr->vdma->WriteChannel.HasDRE)
{
wordlen = InstancePtr->vdma->WriteChannel.WordLength-1;
wordlen = InstancePtr->idata.PixelHStepSize-1;
win->StartX = ((win->StartX + wordlen) & ~(wordlen));
win->Width = ((win->Width + wordlen) & ~(wordlen));
@ -1074,7 +1131,7 @@ void XVprocss_SetZoomPipWindow(XVprocss *InstancePtr,
}
else //Scaler Only Config
{
xil_printf("\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
}
}
@ -1119,7 +1176,7 @@ void XVprocss_GetZoomPipWindow(XVprocss *InstancePtr,
}
else //Scaler Only Config
{
xil_printf("\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
}
}
@ -1155,11 +1212,11 @@ void XVprocss_SetZoomMode(XVprocss *InstancePtr, u8 OnOff)
InstancePtr->idata.ZoomEn = OnOff;
InstancePtr->idata.PipEn = FALSE;
xil_printf("\r\n :ZOOM Mode %s \r\n", status[InstancePtr->idata.ZoomEn]);
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\n :ZOOM Mode %s \r\n", status[InstancePtr->idata.ZoomEn]);
}
else //Scaler Only Config
{
xil_printf("\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
}
}
@ -1195,17 +1252,18 @@ void XVprocss_SetPipMode(XVprocss *InstancePtr, u8 OnOff)
InstancePtr->idata.PipEn = OnOff;
InstancePtr->idata.ZoomEn = FALSE;
xil_printf("\r\n :PIP Mode %s \r\n", status[InstancePtr->idata.PipEn]);
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\n :PIP Mode %s \r\n", status[InstancePtr->idata.PipEn]);
}
else //Scaler Only Config
{
xil_printf("\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\nVPROCSS ERR:: Feature not supported in Streaming Mode\r\n");
}
}
/*****************************************************************************/
/**
* This function validates the input and output stream configuration
* This function validates the input and output stream configuration for scaler
* only configuration
*
* @param pStrmIn is a pointer to the input stream
* @param pStrmOut is a pointer to the output stream
@ -1213,32 +1271,26 @@ void XVprocss_SetPipMode(XVprocss *InstancePtr, u8 OnOff)
* @return XST_SUCCESS if successful else XST_FAILURE
*
* @note This function is applicable only for Stream mode configuration of the
* subsystem. In this mode very limited functionality is possible
* subsystem. In this mode very limited functionality is available
******************************************************************************/
static int validateVidStreamConfig(XVidC_VideoStream *pStrmIn,
XVidC_VideoStream *pStrmOut)
static int ValidateScalerOnlyConfig(XVidC_VideoStream *pStrmIn,
XVidC_VideoStream *pStrmOut)
{
if(pStrmIn->IsInterlaced)
{
xil_printf("VPROCSS ERR: Interlaced Input not supported\r\n");
return(XST_FAILURE);
}
if(pStrmIn->ColorFormatId == XVIDC_CSF_YCRCB_420)
{
xil_printf("VPROCSS ERR: YUV420 Input not supported\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR: YUV420 Input not supported\r\n");
return(XST_FAILURE);
}
if(pStrmIn->ColorFormatId != pStrmOut->ColorFormatId)
{
xil_printf("VPROCSS ERR: Input & Output Stream Color Format different\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR: Input & Output Stream Color Format different\r\n");
return(XST_FAILURE);
}
if(pStrmIn->ColorDepth != pStrmOut->ColorDepth)
{
xil_printf("VPROCSS ERR: Input & Output Color Depth different\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR: Input & Output Color Depth different\r\n");
return(XST_FAILURE);
}
@ -1269,13 +1321,13 @@ static int SetupModeScalerOnly(XVprocss *pVprocss)
if((!pVprocss->vscaler) || (!pVprocss->hscaler))
{
xil_printf("VPROCSS ERR:: Scaler IP not found\r\n");
return(XST_FAILURE);
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Scaler IP not found\r\n");
return(XST_FAILURE);
}
/* check if input/output stream configuration is supported */
status = validateVidStreamConfig(&pVprocss->VidIn,
&pVprocss->VidOut);
status = ValidateScalerOnlyConfig(&pVprocss->VidIn,
&pVprocss->VidOut);
if(status == XST_SUCCESS)
{
@ -1320,7 +1372,7 @@ static int SetupModeScalerOnly(XVprocss *pVprocss)
}
else
{
xil_printf("\r\n-->Command Ignored<--\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\n-->Command Ignored<--\r\n");
}
return(status);
}
@ -1355,12 +1407,130 @@ static int SetupModeMax(XVprocss *pVprocss)
}
else
{
xil_printf("VPROCSS ERR: Subsystem Routing Table Invalid");
xil_printf("- Ignoring Configuration Request\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR: Subsystem Routing Table Invalid");
xdbg_printf(XDBG_DEBUG_GENERAL,"- Ignoring Configuration Request\r\n");
}
return(status);
}
/*****************************************************************************/
/**
* This function validates the input and output stream configuration against the
* Subsystem hardware capabilities
*
* @param InstancePtr is a pointer to the Subsystem instance to be worked on.
*
* @return XST_SUCCESS if successful else XST_FAILURE
*
******************************************************************************/
static int ValidateSubsystemConfig(XVprocss *InstancePtr)
{
XVidC_VideoStream *StrmIn = &InstancePtr->VidIn;
XVidC_VideoStream *StrmOut = &InstancePtr->VidOut;
/* Check Stream Samples/Clock against Subsystem HW Configuration */
if((StrmIn->PixPerClk != InstancePtr->Config.PixPerClock) ||
(StrmOut->PixPerClk != InstancePtr->Config.PixPerClock))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input/Output Stream Samples/Clk Not Supported \r\n");
return(XST_FAILURE);
}
/* Check Stream Color Depth against Subsystem HW Configuration */
if((StrmIn->ColorDepth != InstancePtr->Config.ColorDepth) ||
(StrmOut->ColorDepth != InstancePtr->Config.ColorDepth))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input/Output Stream ColorDepth Not Supported \r\n");
return(XST_FAILURE);
}
/* Check Stream Width is aligned at Samples/Clock boundary */
if(((StrmIn->Timing.HActive % InstancePtr->Config.PixPerClock) != 0) ||
((StrmOut->Timing.HActive % InstancePtr->Config.PixPerClock) != 0))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input/Output Width not aligned with Samples/Clk\r\n");
return(XST_FAILURE);
}
/* Check if Subsystem HW Configuration can process requested resolution*/
if(((StrmIn->PixPerClk == XVIDC_PPC_1) && (StrmIn->VmId > XVIDC_VM_3840x2160_30_P))||
((StrmOut->PixPerClk == XVIDC_PPC_1) && (StrmOut->VmId > XVIDC_VM_3840x2160_30_P)))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: 1 Sample/Clk can support Max resolution of 4K2K@30Hz \r\n");
return(XST_FAILURE);
}
/* Check for YUV422 In/Out stream width is even */
if(((StrmIn->ColorFormatId == XVIDC_CSF_YCRCB_422) && ((StrmIn->Timing.HActive % 2) != 0)) ||
((StrmOut->ColorFormatId == XVIDC_CSF_YCRCB_422) && ((StrmOut->Timing.HActive % 2) != 0)))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: YUV422 stream width must be even\r\n");
return(XST_FAILURE);
}
/* Check for YUV420 In stream width and height is even */
if(StrmIn->ColorFormatId == XVIDC_CSF_YCRCB_420)
{
if(InstancePtr->vcrsmplrIn)
{
if(((StrmIn->Timing.HActive % 2) != 0) && ((StrmIn->Timing.VActive % 2) != 0))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: YUV420 input stream width and height must be even\r\n");
return(XST_FAILURE);
}
}
else
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Vertical Chroma Resampler IP not found. YUV420 Input not supported\r\n");
return(XST_FAILURE);
}
}
/* Check for YUV420 out stream width and height is even */
if(StrmOut->ColorFormatId == XVIDC_CSF_YCRCB_420)
{
if(InstancePtr->vcrsmplrOut)
{
if(((StrmOut->Timing.HActive % 2) != 0) && ((StrmOut->Timing.VActive % 2) != 0))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: YUV420 output stream width and height must be even\r\n");
return(XST_FAILURE);
}
}
else
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Vertical Chroma Resampler IP not found. YUV420 Output not supported\r\n");
return(XST_FAILURE);
}
}
/* Check for Interlaced input limitation */
if(StrmIn->IsInterlaced)
{
if(StrmIn->ColorFormatId == XVIDC_CSF_YCRCB_420)
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Interlaced YUV420 stream not supported\r\n");
return(XST_FAILURE);
}
if(InstancePtr->deint)
{
if((StrmIn->VmId != XVIDC_VM_1080_50_I) && ((StrmIn->VmId != XVIDC_VM_1080_60_I)))
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Only 1080i 50Hz/60Hz Supported\r\n");
return(XST_FAILURE);
}
}
else
{
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Interlaced input not supported\r\n");
return(XST_FAILURE);
}
}
return(XST_SUCCESS);
}
/*****************************************************************************/
/**
* This function is the entry point into the video processing subsystem driver
@ -1374,29 +1544,27 @@ static int SetupModeMax(XVprocss *pVprocss)
* @return XST_SUCCESS if successful else XST_FAILURE
*
******************************************************************************/
int XVprocss_ConfigureSubsystem(XVprocss *InstancePtr)
int XVprocss_SetSubsystemConfig(XVprocss *InstancePtr)
{
int status = XST_SUCCESS;
/* Verify arguments */
Xil_AssertNonvoid(InstancePtr != NULL);
/* Video Processing Subsystem overrides In/Out Pixel Precision & Pixel/Clk */
InstancePtr->VidIn.ColorDepth = (XVidC_ColorDepth)InstancePtr->Config.PixPrecision;
InstancePtr->VidOut.ColorDepth = (XVidC_ColorDepth)InstancePtr->Config.PixPrecision;
InstancePtr->VidIn.PixPerClk = (XVidC_PixelsPerClock)InstancePtr->Config.PixPerClock;
/* compute data width of input stream */
InstancePtr->idata.PixelWidthInBits = InstancePtr->Config.NumVidComponents *
InstancePtr->VidIn.ColorDepth;
#ifdef DEBUG
xil_printf("\r\n****** VPROC SUBSYSTEM INPUT/OUTPUT CONFIG ******\r\n");
xil_printf("->INPUT\r\n");
XVidC_ReportStreamInfo(&InstancePtr->VidIn);
xil_printf("\r\n->OUTPUT\r\n");
XVidC_ReportStreamInfo(&InstancePtr->VidOut);
xil_printf("**************************************************\r\n\r\n");
#endif
/* validate subsystem configuration */
if(ValidateSubsystemConfig(InstancePtr) != XST_SUCCESS)
{
return(XST_FAILURE);
}
switch(InstancePtr->Config.Topology)
{
@ -1410,9 +1578,83 @@ int XVprocss_ConfigureSubsystem(XVprocss *InstancePtr)
break;
default:
xil_printf("VPROCSS ERR: Subsystem Configuration Mode Not Supported. \r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR: Subsystem Configuration Mode Not Supported. \r\n");
status = XST_FAILURE;
break;
}
return(status);
}
/*****************************************************************************/
/**
* This function reports the subsystem HW and input/output stream configuration
*
* @param InstancePtr is a pointer to the Subsystem instance to be worked on.
*
* @return None
*
******************************************************************************/
void XVprocss_ReportSubsystemConfig(XVprocss *InstancePtr)
{
char *topology[2] = {"Scaler-Only", "Full-Fledged"};
XVidC_VideoWindow win;
/* Verify arguments */
Xil_AssertVoid(InstancePtr != NULL);
xil_printf("\r\n****** Video Processing Subsystem Configuration ******\r\n");
/* Print the configuration selected */
if(InstancePtr->Config.Topology <= XVPROCSS_TOPOLOGY_FULL_FLEDGED)
{
xil_printf("\r\nTopology: %s\r\n", topology[InstancePtr->Config.Topology]);
XVprocss_ReportCoreInfo(InstancePtr);
}
else
{
xil_printf("VPROCSS ERR:: Unknown Topology\r\n");
return;
}
xil_printf("\r\nPixels/Clk = %d\r\n", InstancePtr->Config.PixPerClock);
xil_printf("Color Depth = %d\r\n", InstancePtr->Config.ColorDepth);
xil_printf("Num Video Components = %d\r\n", InstancePtr->Config.NumVidComponents);
xil_printf("Max Width Supported = %d\r\n", InstancePtr->Config.MaxWidth);
xil_printf("Max Height Supported = %d\r\n", InstancePtr->Config.MaxHeight);
xil_printf("\r\n------ SUBSYSTEM INPUT/OUTPUT CONFIG ------\r\n");
xil_printf("->INPUT\r\n");
XVidC_ReportStreamInfo(&InstancePtr->VidIn);
xil_printf("\r\n->OUTPUT\r\n");
XVidC_ReportStreamInfo(&InstancePtr->VidOut);
if(XVprocss_IsConfigModeMax(InstancePtr))
{
if(XVprocss_IsZoomModeOn(InstancePtr))
{
xil_printf("\r\nZoom Mode: ON\r\n");
XVprocss_GetZoomPipWindow(InstancePtr, XVPROCSS_ZOOM_WIN, &win);
xil_printf(" Start X = %d\r\n", win.StartX);
xil_printf(" Start Y = %d\r\n", win.StartY);
xil_printf(" Win Width = %d\r\n", win.Width);
xil_printf(" Win Height = %d\r\n", win.Height);
}
else
{
xil_printf("\r\nZoom Mode: OFF\r\n");
}
if(XVprocss_IsPipModeOn(InstancePtr))
{
xil_printf("\r\nPip Mode: ON\r\n");
XVprocss_GetZoomPipWindow(InstancePtr, XVPROCSS_PIP_WIN, &win);
xil_printf(" Start X = %d\r\n", win.StartX);
xil_printf(" Start Y = %d\r\n", win.StartY);
xil_printf(" Win Width = %d\r\n", win.Width);
xil_printf(" Win Height = %d\r\n", win.Height);
}
else
{
xil_printf("\r\nPip Mode: OFF\r\n");
}
}
xil_printf("**************************************************\r\n\r\n");
}

View file

@ -279,6 +279,7 @@ typedef struct
u8 PipEn; /**< Flag to store PIP feature state */
u16 vidInWidth; /**< Input H Active */
u16 vidInHeight; /**< Input V Active */
u16 PixelHStepSize; /**< Increment step size for Pip/Zoom window */
XVidC_ColorFormat strmCformat; /**< processing pipe color format */
XVidC_ColorFormat cscIn; /**< CSC core input color format */
XVidC_ColorFormat cscOut; /**< CSC core output color format */
@ -311,7 +312,7 @@ typedef struct
subsystem address range */
u8 Topology; /**< Subsystem configuration mode */
u8 PixPerClock; /**< Number of Pixels Per Clock processed by Subsystem */
u16 PixPrecision; /**< Processing precision of the data pipe */
u16 ColorDepth; /**< Processing precision of the data pipe */
u16 NumVidComponents; /**< Number of Video Components */
u16 MaxWidth; /**< Maximum cols supported by subsystem instance */
u16 MaxHeight; /**< Maximum rows supported by subsystem instance */
@ -499,7 +500,8 @@ int XVprocss_SetVidStreamOut(XVprocss *InstancePtr,
int XVprocss_SetStreamResolution(XVidC_VideoStream *StreamPtr,
const XVidC_VideoMode VmId);
void XVprocss_ReportCoreInfo(XVprocss *InstancePtr);
int XVprocss_ConfigureSubsystem(XVprocss *InstancePtr);
void XVprocss_ReportSubsystemConfig(XVprocss *InstancePtr);
int XVprocss_SetSubsystemConfig(XVprocss *InstancePtr);
void XVprocss_SetZoomMode(XVprocss *InstancePtr, u8 OnOff);
void XVprocss_SetPipMode(XVprocss *InstancePtr, u8 OnOff);

View file

@ -133,16 +133,12 @@ static XVprocss_ScaleMode GetScalingMode(XVprocss *pVprocss)
pVprocss->VidOut.Timing.VActive);
if(status != XST_SUCCESS)
{
xil_printf("VPROCSS ERR:: VDMA Write Channel Window Invalid \r\n");
xil_printf(" Start X = %d\r\n", win.StartX);
xil_printf(" Start Y = %d\r\n", win.StartY);
xil_printf(" Win Width = %d\r\n", win.Width);
xil_printf(" Win Height = %d\r\n", win.Height);
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: VDMA Write Channel Window Invalid \r\n");
return(XVPROCSS_SCALE_NOT_SUPPORTED);
}
else
{
xil_printf("\r\n PIP Mode ON: Scale %dx%d -> %dx%d window in output stream\r\n",
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\n PIP Mode ON: Scale %dx%d -> %dx%d window in output stream\r\n",
pStrIn->Timing.HActive,
pStrIn->Timing.VActive,
pVprocss->idata.wrWindow.Width,
@ -162,16 +158,12 @@ static XVprocss_ScaleMode GetScalingMode(XVprocss *pVprocss)
pStrIn->Timing.VActive);
if(status != XST_SUCCESS)
{
xil_printf("ERR:: VDMA Read Channel Window Invalid \r\n");
xil_printf(" Start X = %d\r\n", win.StartX);
xil_printf(" Start Y = %d\r\n", win.StartY);
xil_printf(" Win Width = %d\r\n", win.Width);
xil_printf(" Win Height = %d\r\n", win.Height);
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: VDMA Read Channel Window Invalid \r\n");
return(XVPROCSS_SCALE_NOT_SUPPORTED);
}
else
{
xil_printf("\r\n Zoom Mode ON: Scale %dx%d window from Input Stream -> %dx%d\r\n",
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\n Zoom Mode ON: Scale %dx%d window from Input Stream -> %dx%d\r\n",
pVprocss->idata.rdWindow.Width,
pVprocss->idata.rdWindow.Height,
pStrOut->Timing.HActive,
@ -247,7 +239,7 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
pCfg->ScaleMode = GetScalingMode(pVprocss);
if(pCfg->ScaleMode == XVPROCSS_SCALE_NOT_SUPPORTED)
{
xil_printf("VPROCSS ERR:: Scaling Mode not supported\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Scaling Mode not supported\r\n");
return(XST_FAILURE);
}
@ -257,44 +249,15 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
/* Check if input is I/P */
if(pStrIn->IsInterlaced)
{
if(pStrIn->ColorFormatId != XVIDC_CSF_YCRCB_420)
{
if(pVprocss->deint)
{
if((pVprocss->VidIn.VmId != XVIDC_VM_1080_60_I) &&
(pVprocss->VidIn.VmId != XVIDC_VM_1080_50_I))
{
xil_printf("VPROCSS ERR:: De-Interlacer supports only 1080i Input\r\n");
return(XST_FAILURE);
}
pTable[index++] = XVPROCSS_RTR_DEINT;
}
else
{
xil_printf("VPROCSS ERR:: De-Interlacer IP not found - Interlaced Input not supported\r\n");
return(XST_FAILURE);
}
}
else //YUV_420
{
xil_printf("VPROCSS ERR:: Interlaced 420 input not supported\r\n");
return(XST_FAILURE);
}
pTable[index++] = XVPROCSS_RTR_DEINT;
}
/* Check if input is 420 */
if(pStrIn->ColorFormatId == XVIDC_CSF_YCRCB_420)
{
if(pVprocss->vcrsmplrIn) //up-sample vertically to 422 as none of the IP supports 420
{
pTable[index++] = XVPROCSS_RTR_CR_V_IN;
pCfg->strmCformat = XVIDC_CSF_YCRCB_422;
}
else //V Chroma Resampler IP not included in design
{
xil_printf("VPROCSS ERR:: Vertical Chroma Resampler IP not found. YUV420 Input not supported\r\n");
return(XST_FAILURE);
}
//up-sample vertically to 422 as none of the IP supports 420
pTable[index++] = XVPROCSS_RTR_CR_V_IN;
pCfg->strmCformat = XVIDC_CSF_YCRCB_422;
}
switch(pCfg->ScaleMode)
@ -319,7 +282,7 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
break;
default:
xil_printf("VPROCSS ERR:: Scaling Mode cannot be determined.\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Scaling Mode cannot be determined.\r\n");
return(XST_FAILURE);
break;
}
@ -362,7 +325,7 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
break;
default: //Unsupported color format
xil_printf("VPROCSS ERR:: Input Color Format Not Supported \r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input Color Format Not Supported \r\n");
status = XST_FAILURE;
break;
}
@ -389,7 +352,7 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
break;
default: //Unsupported color format
xil_printf("VPROCSS ERR:: Input Color Format Not Supported \r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input Color Format Not Supported \r\n");
status = XST_FAILURE;
break;
}
@ -424,7 +387,7 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
break;
default: //Unsupported color format
xil_printf("VPROCSS ERR:: Input Color Format Not Supported \r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input Color Format Not Supported \r\n");
status = XST_FAILURE;
break;
}
@ -451,14 +414,14 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
break;
default: //Unsupported color format
xil_printf("VPROCSS ERR:: Input Color Format Not Supported \r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Input Color Format Not Supported \r\n");
status = XST_FAILURE;
break;
}
break;
default:
xil_printf("VPROCSS ERR:: Output Color Format Not Supported \r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"VPROCSS ERR:: Output Color Format Not Supported \r\n");
status = XST_FAILURE;
break;
}
@ -475,12 +438,12 @@ int XVprocss_BuildRoutingTable(XVprocss *pVprocss)
u32 count = 0;
//print IP Data Flow Map
xil_printf("\r\nGenerated Map: VidIn");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\nGenerated Map: VidIn");
while(count<index)
{
xil_printf(" -> %s",ipStr[pTable[count++]]);
xdbg_printf(XDBG_DEBUG_GENERAL," -> %s",ipStr[pTable[count++]]);
}
xil_printf("\r\n\r\n");
xdbg_printf(XDBG_DEBUG_GENERAL,"\r\n\r\n");
}
#endif