blob: 34e841ff5c21520bb13aba25e61455efae669036 [file] [log] [blame]
/*******************************************************************************
*
* Copyright (C) 2017 Xilinx, Inc. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
*******************************************************************************/
/******************************************************************************/
/**
*
* @file xavbuf.c
*
* This file implements all the functions related to the Video Pipeline of the
* DisplayPort Subsystem. See xavbuf.h for the detailed description of the
* driver.
*
* @note None.
*
* <pre>
* MODIFICATION HISTORY:
*
* Ver Who Date Changes
* ----- ---- -------- -----------------------------------------------
* 1.0 aad 06/24/17 Initial release.
* 2.0 aad 10/08/17 Some APIs to use enums instead of Macros.
* Some bug fixes.
* </pre>
*
*******************************************************************************/
/******************************* Include Files ********************************/
#include "xavbuf.h"
#include "xstatus.h"
/**************************** Constant Definitions ****************************/
const XAVBuf_VideoAttribute XAVBuf_SupportedFormats[XAVBUF_NUM_SUPPORTED];
/******************************************************************************/
/**
* This function sets the scaling factors depending on the source video stream.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param RegOffset is the register offset of the SF0 register from the
* DP BaseAddress.
* @param Scaling Factors is a pointer to the scaling factors needed for
* scaling colors to 12 BPC.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
static void XAVBuf_SetScalingFactors(XAVBuf *InstancePtr, u32 RegOffset,
u32 *ScalingFactors)
{
u32 Index = 0;
for (Index = 0; Index < 3; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
RegOffset + (Index * 4), ScalingFactors[Index]);
}
}
/******************************************************************************/
/**
* This function sets the Layer Control for Video and Graphics layers.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param RegOffset is the register offset of Video Layer or Graphics
* Layer from the base address
* @param Video is a pointer to the XAVBuf_VideoAttribute struct which
* has been configured for the particular layer
*
* @return None.
*
* @note None.
*
*******************************************************************************/
static void XAVBuf_SetLayerControl(XAVBuf *InstancePtr, u32 RegOffset,
XAVBuf_VideoAttribute *Video)
{
u32 RegVal = 0;
RegVal = (Video->IsRGB <<
XAVBUF_V_BLEND_LAYER0_CONTROL_RGB_MODE_SHIFT) |
Video->SamplingEn;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, RegOffset, RegVal);
}
/******************************************************************************/
/**
* This function applies Attributes for Live source(Video/Graphics).
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param RegConfig is a register offset for Video or Graphics config
* register
* @param Video is a pointer to the attributes of the video to be applied
*
* @return None.
*
* @note Live source can be live Video or Live Graphics.
******************************************************************************/
static void XAVBuf_SetLiveVideoAttributes(XAVBuf *InstancePtr, u32 RegConfig,
XAVBuf_VideoAttribute *Video)
{
u32 RegVal = 0;
RegVal |= Video->Value << XAVBUF_BUF_LIVE_VID_CFG_FORMAT_SHIFT;
RegVal |= Video->BPP/6 - 3;
RegVal |= Video->Swap << XAVBUF_BUF_LIVE_VID_CFG_CB_FIRST_SHIFT;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, RegConfig, RegVal);
}
/******************************************************************************/
/**
* This function applies Attributes for Non - Live source(Video/Graphics).
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param VideoSrc is the source of the Non-Live Video
* @param Video is a pointer to the attributes of the video to be applied
*
* @return None.
*
* @note Non Live source can be Non Live Video or Non Live Graphics.
******************************************************************************/
static void XAVBuf_SetNonLiveVideoAttributes(XAVBuf *InstancePtr, u32 VideoSrc,
XAVBuf_VideoAttribute *Video)
{
u32 RegVal = 0;
RegVal = XAVBuf_ReadReg(InstancePtr->Config.BaseAddr,
XAVBUF_BUF_FORMAT);
if(VideoSrc == XAVBUF_VIDSTREAM1_NONLIVE) {
RegVal &= ~XAVBUF_BUF_FORMAT_NL_VID_FORMAT_MASK;
RegVal |= Video->Value;
}
else if (VideoSrc == XAVBUF_VIDSTREAM2_NONLIVE_GFX) {
RegVal &= ~XAVBUF_BUF_FORMAT_NL_GRAPHX_FORMAT_MASK;
RegVal |= (Video->Value) <<
XAVBUF_BUF_FORMAT_NL_GRAPHX_FORMAT_SHIFT;
}
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_BUF_FORMAT,
RegVal);
}
/******************************************************************************/
/**
* This function programs the coeffitients for Color Space Conversion.
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param RegOffset is a register offset for Video or Graphics config
* register
* @param Video is a pointer to the XAVBuf_Attribute structure
*
* @return None.
*
* @note None.
******************************************************************************/
static void XAVBuf_InConvertToRGB(XAVBuf *InstancePtr, u32 RegOffset,
XAVBuf_VideoAttribute *Video)
{
u16 Index;
u16 *CSCMatrix;
u16 *OffsetMatrix;
/* SDTV Coefficients */
u16 CSCCoeffs[] = { 0x1000, 0x0000, 0x166F,
0x1000, 0x7A7F, 0x7493,
0x1000, 0x1C5A, 0x0000 };
u16 CSCOffset[] = { 0x0000, 0x1800, 0x1800 };
u16 RGBCoeffs[] = { 0x1000, 0x0000, 0x0000,
0x0000, 0x1000, 0x0000,
0x0000, 0x0000, 0x1000 };
u16 RGBOffset[] = { 0x0000, 0x0000, 0x0000 };
if(Video->IsRGB) {
CSCMatrix = RGBCoeffs;
OffsetMatrix = RGBOffset;
}
else {
CSCMatrix = CSCCoeffs;
OffsetMatrix = CSCOffset;
}
/* Program Colorspace conversion coefficients */
for (Index = 9; Index < 12; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
RegOffset + (Index * 4),
OffsetMatrix[Index - 9]);
}
/* Program Colorspace conversion matrix */
for (Index = 0; Index < 9; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
RegOffset + (Index * 4), CSCMatrix[Index]);
}
}
/******************************************************************************/
/**
* This function converts the Blender output to the desired output format.
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param RegConfig is a register offset for Video or Graphics config
* register
* @param Video is a pointer to the XAVBuf_Attribute structure
*
* @return None.
*
* @note None.
******************************************************************************/
static void XAVBuf_InConvertToOutputFormat(XAVBuf *InstancePtr,
XAVBuf_VideoAttribute *Video)
{ u32 Index = 0;
u32 RegOffset = XAVBUF_V_BLEND_RGB2YCBCR_COEFF0;
u32 ColorOffset = XAVBUF_V_BLEND_LUMA_OUTCSC_OFFSET;
u8 Value = Video->Value;
u16 *MatrixCoeff;
u16 *MatrixOffset;
/* SDTV Coeffitients */
u16 CSCCoeffs[] = { 0x04C8, 0x0964, 0x01D3,
0x7D4C, 0x7AB4, 0x0800,
0x0800, 0x7945, 0x7EB5 };
u16 CSCOffset[] = { 0x0000, 0x800, 0x800 };
u16 RGBCoeffs[] = { 0x1000, 0x0000, 0x0000,
0x0000, 0x1000, 0x0000,
0x0000, 0x0000, 0x1000 };
u16 RGBOffset[] = { 0x0000, 0x0000, 0x0000 };
if(Value) {
MatrixCoeff = CSCCoeffs;
MatrixOffset = CSCOffset;
}
else {
MatrixCoeff = RGBCoeffs;
MatrixOffset = RGBOffset;
}
for (Index = 0; Index < 9; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
RegOffset + (Index * 4), MatrixCoeff[Index]);
}
for (Index = 0; Index < 3; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
ColorOffset + (Index * 4),
(MatrixOffset[Index] <<
XAVBUF_V_BLEND_LUMA_IN1CSC_OFFSET_POST_OFFSET_SHIFT));
}
}
/******************************************************************************/
/**
* This function configures the Video Pipeline for the selected source
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param VideoSrc is a parameter which indicates which Video Source
* selected
*
* @return None.
*
* @note None.
******************************************************************************/
static int XAVBuf_ConfigureVideo(XAVBuf *InstancePtr, u8 VideoSrc)
{
u32 RegConfig = 0;
u32 ScalingOffset = 0;
u32 LayerOffset = 0;
u32 CSCOffset = 0;
XAVBuf_VideoAttribute *Video = NULL;
u32 *ScalingFactors = NULL;
Xil_AssertNonvoid(InstancePtr != NULL);
switch(VideoSrc) {
case XAVBUF_VIDSTREAM1_LIVE:
RegConfig = XAVBUF_BUF_LIVE_VID_CFG;
ScalingOffset = XAVBUF_BUF_LIVE_VID_COMP0_SF;
LayerOffset = XAVBUF_V_BLEND_LAYER0_CONTROL;
CSCOffset = XAVBUF_V_BLEND_IN1CSC_COEFF0;
Video = InstancePtr->AVMode.LiveVideo;
ScalingFactors = Video->SF;
/* Set the Video Attributes */
XAVBuf_SetLiveVideoAttributes(InstancePtr, RegConfig,
Video);
break;
case XAVBUF_VIDSTREAM2_LIVE_GFX:
RegConfig = XAVBUF_BUF_LIVE_GFX_CFG;
ScalingOffset = XAVBUF_BUF_LIVE_GFX_COMP0_SF;
LayerOffset = XAVBUF_V_BLEND_LAYER1_CONTROL;
CSCOffset = XAVBUF_V_BLEND_IN2CSC_COEFF0;
Video = InstancePtr->AVMode.LiveGraphics;
ScalingFactors = Video->SF;
/* Set the Video Attributes */
XAVBuf_SetLiveVideoAttributes(InstancePtr, RegConfig,
Video);
break;
case XAVBUF_VIDSTREAM1_NONLIVE:
RegConfig = XAVBUF_BUF_LIVE_GFX_CFG;
ScalingOffset = XAVBUF_BUF_VID_COMP0_SCALE_FACTOR;
LayerOffset = XAVBUF_V_BLEND_LAYER0_CONTROL;
CSCOffset = XAVBUF_V_BLEND_IN1CSC_COEFF0;
Video = InstancePtr->AVMode.NonLiveVideo;
ScalingFactors = Video->SF;
/* Set the Video Attributes */
XAVBuf_SetNonLiveVideoAttributes(InstancePtr, VideoSrc,
Video);
break;
case XAVBUF_VIDSTREAM2_NONLIVE_GFX:
RegConfig = XAVBUF_BUF_LIVE_GFX_CFG;
ScalingOffset = XAVBUF_BUF_GRAPHICS_COMP0_SCALE_FACTOR;
LayerOffset = XAVBUF_V_BLEND_LAYER1_CONTROL;
CSCOffset = XAVBUF_V_BLEND_IN2CSC_COEFF0;
Video = InstancePtr->AVMode.NonLiveGraphics;
ScalingFactors = Video->SF;
/* Set the Video Attributes */
XAVBuf_SetNonLiveVideoAttributes(InstancePtr, VideoSrc,
Video);
break;
case XAVBUF_VIDSTREAM1_TPG:
RegConfig |= 1 <<
XAVBUF_V_BLEND_LAYER0_CONTROL_RGB_MODE_SHIFT;
RegConfig |= 1 <<
XAVBUF_V_BLEND_LAYER0_CONTROL_BYPASS_SHIFT;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_V_BLEND_LAYER0_CONTROL,
RegConfig);
break;
default:
return XST_FAILURE;
}
/* Setting the scaling factors */
XAVBuf_SetScalingFactors(InstancePtr, ScalingOffset, ScalingFactors);
/* Layer Control */
XAVBuf_SetLayerControl(InstancePtr, LayerOffset, Video);
/* Colorspace conversion */
XAVBuf_InConvertToRGB(InstancePtr, CSCOffset, Video);
return XST_SUCCESS;
}
/******************************************************************************/
/**
* This function intializes the configuration for the AVBuf Instance.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param BaseAddr sets the base address of the AVBuf instance
* @param Deviceid is the id of the device from the design.
*
* @return None.
*
* @note Base address and DeviceId is same as the DP Core driver.
*
*******************************************************************************/
void XAVBuf_CfgInitialize(XAVBuf *InstancePtr, u32 BaseAddr, u16 DeviceId)
{
Xil_AssertVoid(InstancePtr != NULL);
InstancePtr->Config.DeviceId = DeviceId;
InstancePtr->Config.BaseAddr = BaseAddr;
}
/******************************************************************************/
/**
* This function initializes all the data structures of the XAVBuf Instance.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XAVBuf_Initialize(XAVBuf *InstancePtr)
{
Xil_AssertVoid(InstancePtr != NULL);
InstancePtr->AVMode.NonLiveVideo = NULL;
InstancePtr->AVMode.LiveVideo = NULL;
InstancePtr->AVMode.LiveGraphics = NULL;
InstancePtr->AVMode.NonLiveGraphics = NULL;
InstancePtr->AVMode.VideoSrc = XAVBUF_VIDSTREAM1_NONE;
InstancePtr->AVMode.GraphicsSrc = XAVBUF_VIDSTREAM2_NONE;
InstancePtr->AVMode.Audio = NULL;
InstancePtr->AVMode.GraphicsAudio = NULL;
InstancePtr->AVMode.AudioSrc1 = XAVBUF_AUDSTREAM1_NO_AUDIO;
InstancePtr->AVMode.AudioSrc2 = XAVBUF_AUDSTREAM2_NO_AUDIO;
InstancePtr->Blender.GlobalAlphaEn = 0;
InstancePtr->Blender.Alpha = 0;
InstancePtr->Blender.OutputVideo = NULL;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_AUD_SOFT_RST, 0);
}
/******************************************************************************/
/**
* This function selects the source for the Video and Graphics streams that are
* passed on to the blender block.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param VidStream selects the stream coming from the video sources
* @param GfxStream selects the stream coming from the graphics sources
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XAVBuf_InputVideoSelect(XAVBuf *InstancePtr, XAVBuf_VideoStream VidStream,
XAVBuf_GfxStream GfxStream)
{
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid((VidStream != XAVBUF_VIDSTREAM1_LIVE) |
(VidStream != XAVBUF_VIDSTREAM1_NONLIVE) |
(VidStream != XAVBUF_VIDSTREAM1_TPG) |
(VidStream != XAVBUF_VIDSTREAM1_NONE));
Xil_AssertVoid((GfxStream != XAVBUF_VIDSTREAM2_DISABLEGFX) |
(GfxStream != XAVBUF_VIDSTREAM2_NONLIVE_GFX) |
(GfxStream != XAVBUF_VIDSTREAM2_LIVE_GFX) |
(GfxStream != XAVBUF_VIDSTREAM2_NONE));
InstancePtr->AVMode.VideoSrc = VidStream;
InstancePtr->AVMode.GraphicsSrc = GfxStream;
u32 RegVal;
RegVal = XAVBuf_ReadReg(InstancePtr->Config.BaseAddr,
XAVBUF_BUF_OUTPUT_AUD_VID_SELECT);
RegVal &= ~(XAVBUF_BUF_OUTPUT_AUD_VID_SELECT_VID_STREAM2_SEL_MASK |
XAVBUF_BUF_OUTPUT_AUD_VID_SELECT_VID_STREAM1_SEL_MASK);
RegVal |= VidStream | GfxStream;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_BUF_OUTPUT_AUD_VID_SELECT, RegVal);
}
/******************************************************************************/
/**
* This function sets the video format for the non-live video
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param Format is the enum for the non-live video format
*
* @return XST_SUCCESS if the correct format has been set.
* XST_FAILURE if the format is invalid.
*
* @note None.
*******************************************************************************/
int XAVBuf_SetInputNonLiveVideoFormat(XAVBuf *InstancePtr,
XAVBuf_VideoFormat Format)
{
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid((Format >= CbY0CrY1) | (Format <= YV16Ci2_420_10BPC));
InstancePtr->AVMode.NonLiveVideo =
XAVBuf_GetNLiveVideoAttribute(Format);
if(InstancePtr->AVMode.NonLiveVideo == NULL)
return XST_FAILURE;
return XST_SUCCESS;
}
/******************************************************************************/
/**
* This function sets the graphics format for the non-live video
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param Format is the enum for the non-live video format
*
* @return XST_SUCCESS if the correct format has been set.
* XST_FAILURE if the format is invalid.
*
* @note None.
*******************************************************************************/
int XAVBuf_SetInputNonLiveGraphicsFormat(XAVBuf *InstancePtr,
XAVBuf_VideoFormat Format)
{
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid((Format >= RGBA8888) |( Format <= YOnly));
InstancePtr->AVMode.NonLiveGraphics =
XAVBuf_GetNLGraphicsAttribute(Format);
if(InstancePtr->AVMode.NonLiveGraphics == NULL)
return XST_FAILURE;
return XST_SUCCESS;
}
/******************************************************************************/
/**
* This function sets the video format for the live video
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param Format is the enum for the non-live video format
*
* @return XST_SUCCESS if the correct format has been set.
* XST_FAILURE if the format is invalid.
*
* @note None.
*******************************************************************************/
int XAVBuf_SetInputLiveVideoFormat(XAVBuf *InstancePtr,
XAVBuf_VideoFormat Format)
{
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid((Format >= RGB_6BPC) | (Format <= YOnly_12BPC));
InstancePtr->AVMode.LiveVideo = XAVBuf_GetLiveVideoAttribute(Format);
if(InstancePtr->AVMode.LiveVideo == NULL)
return XST_FAILURE;
return XST_SUCCESS;
}
/******************************************************************************/
/**
* This function sets the graphics format for the live video
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param Format is the enum for the non-live video format
*
* @return XST_SUCCESS if the correct format has been set.
* XST_FAILURE if the format is invalid.
*
* @note None.
*******************************************************************************/
int XAVBuf_SetInputLiveGraphicsFormat(XAVBuf *InstancePtr,
XAVBuf_VideoFormat Format)
{
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid((Format >= RGB_6BPC) | (Format <= YOnly_12BPC));
InstancePtr->AVMode.LiveGraphics =
XAVBuf_GetLiveVideoAttribute(Format);
if(InstancePtr->AVMode.LiveGraphics == NULL)
return XST_FAILURE;
return XST_SUCCESS;
}
/******************************************************************************/
/**
* This function sets the Output Video Format
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param Format is the enum for the non-live video format
*
* @return XST_SUCCESS if the correct format has been set.
* XST_FAILURE if the format is invalid.
*
* @note None.
*******************************************************************************/
int XAVBuf_SetOutputVideoFormat(XAVBuf *InstancePtr, XAVBuf_VideoFormat Format)
{
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid((Format >= RGB_6BPC) | (Format <= YOnly_12BPC));
InstancePtr->Blender.OutputVideo =
XAVBuf_GetLiveVideoAttribute(Format);
if(InstancePtr->Blender.OutputVideo == NULL)
return XST_FAILURE;
else
return XST_SUCCESS;
}
/******************************************************************************/
/**
* This function sets the Audio and Video Clock Source and the video timing
* source.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param VideoClk selects the Video Clock Source
* @param AudioClk selects the Audio Clock Source
*
* @return None.
*
* @note System uses PL Clock for Video when Live source is in use.
*
*******************************************************************************/
void XAVBuf_SetAudioVideoClkSrc(XAVBuf *InstancePtr, u8 VideoClk, u8 AudioClk)
{
u32 RegVal = 0;
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid((VideoClk != XAVBUF_PS_CLK) |
(VideoClk!= XAVBUF_PL_CLK));
Xil_AssertVoid((AudioClk != XAVBUF_PS_CLK) |
(AudioClk!= XAVBUF_PL_CLK));
if((InstancePtr->AVMode.VideoSrc != XAVBUF_VIDSTREAM1_LIVE) &&
(InstancePtr->AVMode.GraphicsSrc != XAVBUF_VIDSTREAM2_LIVE_GFX)) {
RegVal = 1 <<
XAVBUF_BUF_AUD_VID_CLK_SOURCE_VID_TIMING_SRC_SHIFT;
}
else if((InstancePtr->AVMode.VideoSrc == XAVBUF_VIDSTREAM1_LIVE) ||
(InstancePtr->AVMode.GraphicsSrc ==
XAVBUF_VIDSTREAM2_LIVE_GFX)) {
VideoClk = XAVBUF_PL_CLK;
}
RegVal |= (VideoClk <<
XAVBUF_BUF_AUD_VID_CLK_SOURCE_VID_CLK_SRC_SHIFT) |
(AudioClk <<
XAVBUF_BUF_AUD_VID_CLK_SOURCE_AUD_CLK_SRC_SHIFT);
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_BUF_AUD_VID_CLK_SOURCE, RegVal);
/*Soft Reset VideoPipeline when changing the clock source*/
XAVBuf_SoftReset(InstancePtr);
}
/******************************************************************************/
/**
* This function applies a soft reset to the Audio Video pipeline.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XAVBuf_SoftReset(XAVBuf *InstancePtr)
{
Xil_AssertVoid(InstancePtr != NULL);
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_BUF_SRST_REG,
XAVBUF_BUF_SRST_REG_VID_RST_MASK);
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_BUF_SRST_REG, 0);
}
/******************************************************************************/
/**
* This function looks up if the video format is valid or not for the non-live
* video datapath and returns a pointer to the attributes of the video.
*
* @param Format takes in the video format for which attributes are being
* requested.
*
* @return A pointer to the structure XAVBuf_VideoAttribute if the video
* format is valid, else returns NULL.
* @note None.
*******************************************************************************/
XAVBuf_VideoAttribute *XAVBuf_GetLiveVideoAttribute(XAVBuf_VideoFormat Format)
{
u8 Index = 0;
XAVBuf_VideoAttribute *VideoAttribute;
Xil_AssertNonvoid((Format >= RGB_6BPC) | (Format <= YOnly_12BPC));
for (Index = RGB_6BPC; Index <= YOnly_12BPC; Index++) {
VideoAttribute = (XAVBuf_VideoAttribute *)
&XAVBuf_SupportedFormats[Index];
if(Format == VideoAttribute->VideoFormat) {
return VideoAttribute;
}
}
return NULL;
}
/******************************************************************************/
/**
* This function looks up if the video format is valid or not and returns a
* pointer to the attributes of the video.
*
* @param Format takes in the video format for which attributes are being
* requested.
*
* @return A pointer to the structure XAVBuf_VideoAttribute if the video
* format is valid, else returns NULL.
* @note None.
*******************************************************************************/
XAVBuf_VideoAttribute *XAVBuf_GetNLiveVideoAttribute(XAVBuf_VideoFormat Format)
{
u8 Index = 0;
XAVBuf_VideoAttribute *VideoAttribute;
Xil_AssertNonvoid((Format >= CbY0CrY1) | (Format <= YV16Ci2_420_10BPC));
for (Index = CbY0CrY1; Index <= YV16Ci2_420_10BPC; Index++) {
VideoAttribute = (XAVBuf_VideoAttribute *)
&XAVBuf_SupportedFormats[Index];
if(Format == VideoAttribute->VideoFormat) {
return VideoAttribute;
}
}
return NULL;
}
/******************************************************************************/
/**
* This function looks up if the video format is valid or not and returns a
* pointer to the attributes of the video.
*
* @param Format takes in the video format for which attributes are being
* requested.
*
* @return A pointer to the structure XAVBuf_VideoAttribute if the video
* format is valid, else returns NULL.
* @note None.
*******************************************************************************/
XAVBuf_VideoAttribute *XAVBuf_GetNLGraphicsAttribute(XAVBuf_VideoFormat Format)
{
u32 Index = 0;
XAVBuf_VideoAttribute *VideoAttribute;
Xil_AssertNonvoid((Format >= RGBA8888) | (Format <= YOnly));
for(Index = RGBA8888; Index <= YOnly; Index++) {
VideoAttribute = (XAVBuf_VideoAttribute *)
&XAVBuf_SupportedFormats[Index];
if(Format == VideoAttribute->VideoFormat) {
return VideoAttribute;
}
}
return NULL;
}
/******************************************************************************/
/**
* This function configures the Video Pipeline
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
*
* @return None.
*
* @note None.
******************************************************************************/
void XAVBuf_ConfigureVideoPipeline(XAVBuf *InstancePtr)
{
Xil_AssertVoid(InstancePtr != NULL);
XAVBuf_ConfigureVideo(InstancePtr, InstancePtr->AVMode.VideoSrc);
}
/******************************************************************************/
/**
* This function configures the Graphics Pipeline
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
*
* @return None.
*
* @note None.
******************************************************************************/
void XAVBuf_ConfigureGraphicsPipeline(XAVBuf *InstancePtr)
{
Xil_AssertVoid(InstancePtr != NULL);
XAVBuf_ConfigureVideo(InstancePtr, InstancePtr->AVMode.GraphicsSrc);
}
/******************************************************************************/
/**
* This function sets the blender background color
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param Color is a pointer to the structure XAVBuf_BlenderBgClr
*
* @return None.
*
* @note None.
******************************************************************************/
void XAVBuf_BlendSetBgColor(XAVBuf *InstancePtr, XAVBuf_BlenderBgClr *Color)
{
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(Color != NULL);
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_V_BLEND_BG_CLR_0,
Color->RCr);
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_V_BLEND_BG_CLR_1,
Color->GY);
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_V_BLEND_BG_CLR_2,
Color->BCb);
}
/******************************************************************************/
/**
* This function enables or disables global alpha
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param Enable sets a software flag for global alpha
* @param Alpha sets the value for the global alpha blending
*
* @return None.
*
* @note GlobalAlphaEn = 1, enables the global alpha.
* GlobalAlphaEn = 0, disables the global alpha.
* Alpha = 0, passes stream2
* Alpha = 255, passes stream1
******************************************************************************/
void XAVBuf_SetBlenderAlpha(XAVBuf *InstancePtr, u8 Alpha, u8 Enable)
{
u32 RegVal;
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid((Enable !=0) | (Enable != 1));
InstancePtr->Blender.GlobalAlphaEn = Enable;
InstancePtr->Blender.Alpha = Alpha;
RegVal = Enable;
RegVal |= Alpha << XAVBUF_V_BLEND_SET_GLOBAL_ALPHA_REG_VALUE_SHIFT;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_V_BLEND_SET_GLOBAL_ALPHA_REG, RegVal);
}
/******************************************************************************/
/**
* This function configures the Output of the Video Pipeline
*
* @param InstancePtr is an pointer to the XAVBuf Instance.
* @param OutputVideo is a pointer to the XAVBuf_VideoAttribute.
*
* @return None.
*
* @note None.
******************************************************************************/
void XAVBuf_ConfigureOutputVideo(XAVBuf *InstancePtr)
{
u32 RegVal = 0;
XAVBuf_VideoAttribute *OutputVideo = InstancePtr->Blender.OutputVideo;
RegVal |= OutputVideo->SamplingEn <<
XAVBUF_V_BLEND_OUTPUT_VID_FORMAT_EN_DOWNSAMPLE_SHIFT;
RegVal |= OutputVideo->Value;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_V_BLEND_OUTPUT_VID_FORMAT, RegVal);
XAVBuf_InConvertToOutputFormat(InstancePtr, OutputVideo);
}
/******************************************************************************/
/**
* This function selects the source for audio streams corresponding to the
* Video and Graphics streams that are passed on to the blender
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param AudStream1 selects the audio stream source corresponding to
* the video source selected
* @param AudStream2 selects the audio stream source corresponding to
* the graphics source selected.
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XAVBuf_InputAudioSelect(XAVBuf *InstancePtr, XAVBuf_AudioStream1 AudStream1,
XAVBuf_AudioStream2 AudStream2)
{
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid((AudStream1 != XAVBUF_AUDSTREAM1_NONLIVE) |
(AudStream1 != XAVBUF_AUDSTREAM1_LIVE) |
(AudStream1 != XAVBUF_AUDSTREAM1_TPG));
Xil_AssertVoid((AudStream2 != XAVBUF_AUDSTREAM2_NO_AUDIO) |
(AudStream2 != XAVBUF_AUDSTREAM2_AUDIOGFX));
u32 RegVal;
RegVal = XAVBuf_ReadReg(InstancePtr->Config.BaseAddr,
XAVBUF_BUF_OUTPUT_AUD_VID_SELECT);
RegVal &= ~(XAVBUF_BUF_OUTPUT_AUD_VID_SELECT_AUD_STREAM2_SEL_MASK |
XAVBUF_BUF_OUTPUT_AUD_VID_SELECT_AUD_STREAM1_SEL_MASK);
RegVal |= AudStream1 | AudStream2;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_BUF_OUTPUT_AUD_VID_SELECT, RegVal);
}
/******************************************************************************/
/**
* This function sets up the scaling factor for Audio Mixer Volume Control.
*
* @param InstancePtr is a pointer to the XAVBuf instance.
* @param Channel0Volume is the volume to be set for Audio from Channel0
* @param Channel1Volume is the volume to be set for Audio from Channel1
*
*
* @return None.
*
* @note None.
*
*******************************************************************************/
void XAVBuf_AudioMixerVolumeControl(XAVBuf *InstancePtr, u8 Channel0Volume,
u8 Channel1Volume)
{
u32 Val;
Xil_AssertVoid(InstancePtr != NULL);
Val = Channel1Volume <<
XAVBUF_AUD_MIXER_VOLUME_CONTROL_VOL_CTRL_CH1_SHIFT;
Val |= Channel0Volume;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_AUD_MIXER_VOLUME_CONTROL, Val);
}
/******************************************************************************/
/**
* This function resets the Audio Pipe.
*
* @param InstancePtr is a pointer to the XAVBuf Instance.
*
* @returns None.
*
* @note Needed when non-live audio is disabled.
*
*
******************************************************************************/
void XAVBuf_AudioSoftReset(XAVBuf *InstancePtr)
{
u32 RegVal = 0;
Xil_AssertVoid(InstancePtr != NULL);
RegVal = XAVBuf_ReadReg(InstancePtr->Config.BaseAddr,
XAVBUF_AUD_SOFT_RST);
RegVal |= XAVBUF_AUD_SOFT_RST_AUD_SRST_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_AUD_SOFT_RST,
RegVal);
RegVal &= ~XAVBUF_AUD_SOFT_RST_AUD_SRST_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_AUD_SOFT_RST, 0);
}
/******************************************************************************/
/**
* This function enables End of Line Reset for reduced blanking resolutions.
*
* @param InstancePtr is a pointer to the XAVBuf Instance.
* @param Disable is to be set while using Reduced Blanking Resolutions.
*
* @returns None.
*
* @note None.
*
******************************************************************************/
void XABuf_LineResetDisable(XAVBuf *InstancePtr, u8 Disable)
{
u32 RegVal = 0;
Xil_AssertVoid(InstancePtr != NULL);
RegVal = XAVBuf_ReadReg(InstancePtr->Config.BaseAddr,
XAVBUF_AUD_SOFT_RST);
if(Disable)
RegVal |= XAVBUF_AUD_SOFT_RST_LINE_RST_DISABLE_MASK;
else
RegVal &= ~XAVBUF_AUD_SOFT_RST_LINE_RST_DISABLE_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_AUD_SOFT_RST,
RegVal);
}
/******************************************************************************/
/**
* This function enables the video channel interface between the DPDMA and the
* AVBuf
*
* @param InstancePtr is a pointer to the XAVBuf Instance.
* @param Enable sets the corresponding buffers.
*
* @returns None.
*
* @note None.
*
******************************************************************************/
void XAVBuf_EnableVideoBuffers(XAVBuf *InstancePtr, u8 Enable)
{
u8 Index;
u32 RegVal = 0;
u8 NumPlanes = InstancePtr->AVMode.NonLiveVideo->Mode;
RegVal = (0xF << XAVBUF_CHBUF0_BURST_LEN_SHIFT) |
(XAVBUF_CHBUF0_FLUSH_MASK);
for (Index = 0; Index <= NumPlanes; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_CHBUF0 + (Index * 4), RegVal);
}
if(Enable) {
RegVal = (0xF << XAVBUF_CHBUF0_BURST_LEN_SHIFT) |
XAVBUF_CHBUF0_EN_MASK;
for (Index = 0; Index <= NumPlanes; Index++) {
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr,
XAVBUF_CHBUF0 + (Index * 4), RegVal);
}
}
}
/******************************************************************************/
/**
* This function enables the graphics interface between the DPDMA and the AVBuf.
*
* @param InstancePtr is a pointer to the XAVBuf Instance.
* @param Enable sets the corresponding buffers.
*
* @returns None.
*
* @note None.
*
******************************************************************************/
void XAVBuf_EnableGraphicsBuffers(XAVBuf *InstancePtr, u8 Enable)
{
u32 RegVal = 0;
RegVal = (0xF << XAVBUF_CHBUF3_BURST_LEN_SHIFT) |
XAVBUF_CHBUF3_FLUSH_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_CHBUF3, RegVal);
if(Enable) {
RegVal = (0xF << XAVBUF_CHBUF3_BURST_LEN_SHIFT) |
XAVBUF_CHBUF0_EN_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_CHBUF3,
RegVal);
}
}
/******************************************************************************/
/**
* This function enables the audio interface between the DPDMA and the AVBuf
*
* @param InstancePtr is a pointer to the XAVBuf Instance.
* @param Enable sets the corresponding buffers.
*
* @returns None.
*
* @note None.
*
******************************************************************************/
void XAVBuf_EnableAudio0Buffers(XAVBuf *InstancePtr, u8 Enable)
{
u32 RegVal = 0;
RegVal = (0x3 << XAVBUF_CHBUF4_BURST_LEN_SHIFT) |
XAVBUF_CHBUF4_FLUSH_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_CHBUF4, RegVal);
if(Enable) {
RegVal = (0x3 << XAVBUF_CHBUF4_BURST_LEN_SHIFT) |
XAVBUF_CHBUF4_EN_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_CHBUF4,
RegVal);
}
}
/******************************************************************************/
/**
* This function enables the audio interface between the DPDMA and the AVBuf
*
* @param InstancePtr is a pointer to the XAVBuf Instance.
* @param Enable sets the corresponding buffers.
*
* @returns None.
*
* @note None.
*
******************************************************************************/
void XAVBuf_EnableAudio1Buffers(XAVBuf *InstancePtr, u8 Enable)
{
u32 RegVal = 0;
RegVal = (0x3 << XAVBUF_CHBUF5_BURST_LEN_SHIFT) |
XAVBUF_CHBUF5_FLUSH_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_CHBUF5, RegVal);
if(Enable) {
RegVal = (0x3 << XAVBUF_CHBUF5_BURST_LEN_SHIFT) |
XAVBUF_CHBUF5_EN_MASK;
XAVBuf_WriteReg(InstancePtr->Config.BaseAddr, XAVBUF_CHBUF5,
RegVal);
}
}