
Added source files,example files, Modified .tcl file. Signed-off-by: Durga challa <vnsldurg@xilinx.com> Acked-by: Srikanth Vemula <svemula@xilinx.com>
1067 lines
33 KiB
C
Executable file
1067 lines
33 KiB
C
Executable file
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2011 - 2014 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 THE
|
|
* XILINX CONSORTIUM 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 xcresample.c
|
|
*
|
|
* This file contains the implementation of the interface functions for the
|
|
* Chroma Resampler core. Refer to the header file xcresample.h for more
|
|
* detailed information.
|
|
* <pre>
|
|
* MODIFICATION HISTORY:
|
|
*
|
|
* Ver Who Date Changes
|
|
* ----- ------ -------- ----------------------------------------------------
|
|
* 1.00a gaborz 08/04/11 Updated for CRESAMPLE V1.0
|
|
* 2.00a vyc 04/24/12 Updated for CRESAMPLE V2.00.a
|
|
* 2.00a vyc 07/25/12 Switched from Xuu3232 to u32
|
|
* 2.00a vyc 10/16/12 Switch order of functions to remove compile warning
|
|
* 4.0 adk 03/12/14 Changed the filename cresample.c to xcresample.c.
|
|
* The Following functions are removed:
|
|
* clear_coef_values, configure_444_to_422,
|
|
* configure_422_to_444, configure_422_to_420,
|
|
* configure_420_to_422, configure_444_to_420 and
|
|
* configure_420_to_444.
|
|
* Implemented the following functions :
|
|
* StubCallBack, StubErrorCallBack,
|
|
* XCresample_CfgInitialize,
|
|
* XCresample_GetVersion, XCresample_EnableDbgByPass,
|
|
* XCresample_IsDbgByPassEnabled,
|
|
* XCresample_DisableDbgByPass,
|
|
* XCresample_SetDbgTestPattern,
|
|
* XCresample_IsDbgTestPatternEnabled,
|
|
* XCresample_DisableDbgTestPattern
|
|
* XCresample_GetDbgFrameCount,
|
|
* XCresample_GetDbgLineCount,
|
|
* XCresample_GetDbgPixelCount,
|
|
* XCresample_SetActiveSize, XCresample_GetActiveSize,
|
|
* XCresample_SetFieldParity, XCresample_GetFieldParity,
|
|
* XCresample_SetChromaParity,
|
|
* XCresample_GetChromaParity
|
|
* XCresample_SetHCoefs, XCresample_GetHCoefs,
|
|
* XCresample_SetVCoefs, XCresample_GetVCoefs,
|
|
* XCresample_Clear_HCoef_Values, and
|
|
* XCresample_Clear_VCoef_Values.
|
|
*
|
|
* </pre>
|
|
*
|
|
******************************************************************************/
|
|
|
|
/***************************** Include Files *********************************/
|
|
|
|
#include "xcresample.h"
|
|
|
|
/************************** Constant Definitions *****************************/
|
|
|
|
|
|
/***************** Macros (Inline Functions) Definitions *********************/
|
|
|
|
|
|
/**************************** Type Definitions *******************************/
|
|
|
|
|
|
/************************** Function Prototypes ******************************/
|
|
|
|
static void StubCallBack(void *CallBackRef);
|
|
static void StubErrCallBack(void *CallBackRef, u32 ErrorMask);
|
|
static float XCresample_FixedToFloatConv(u32 Input);
|
|
static s32 XCresample_FloatToFixedConv(float Input);
|
|
|
|
/************************** Variable Definitions *****************************/
|
|
|
|
|
|
/************************** Function Definitions *****************************/
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function initializes the Cresample core. This function must be called
|
|
* prior to using the Cresample core. Initialization of the Cresample includes
|
|
* setting up the instance data and ensuring the hardware is in a quiescent
|
|
* state.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param CfgPtr is a reference to a structure containing information
|
|
* about a specific Chroma Resampler driver.
|
|
* @param EffectiveAddr is the device base address in the virtual memory
|
|
* address space. The caller is responsible for keeping the
|
|
* address mapping from EffectiveAddr to the device physical base
|
|
* address unchanged once this function is invoked. Unexpected
|
|
* errors may occur if the address mapping changes after this
|
|
* function is called. If address translation is not used, pass in
|
|
* the physical address instead.
|
|
*
|
|
* @return - XST_SUCCESS if initialization was successful.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
int XCresample_CfgInitialize(XCresample *InstancePtr,
|
|
XCresample_Config *CfgPtr, u32 EffectiveAddr)
|
|
{
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(CfgPtr != NULL);
|
|
Xil_AssertNonvoid(EffectiveAddr != ((u32)0x0));
|
|
|
|
/* Setup the instance */
|
|
(void)memset((void *)InstancePtr, 0, sizeof(XCresample));
|
|
(void)memcpy((void *)(&(InstancePtr->Config)), (const void *)CfgPtr,
|
|
sizeof(XCresample_Config));
|
|
InstancePtr->Config.BaseAddress = EffectiveAddr;
|
|
|
|
/*
|
|
* Set all handlers to stub values, let user configure this data later.
|
|
*/
|
|
InstancePtr->ProcStartCallBack =
|
|
(XCresample_CallBack)((void *)StubCallBack);
|
|
InstancePtr->FrameDoneCallBack =
|
|
(XCresample_CallBack)((void *)StubCallBack);
|
|
InstancePtr->ErrCallBack =
|
|
(XCresample_ErrorCallBack)((void *)StubErrCallBack);
|
|
|
|
/*
|
|
* Reset the hardware and set the flag to indicate the driver is
|
|
* ready.
|
|
*/
|
|
XCresample_Reset(InstancePtr);
|
|
InstancePtr->IsReady = (u32)(XIL_COMPONENT_IS_READY);
|
|
|
|
return (XST_SUCCESS);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function enables the bypass mode by setting bypass bit of the Control
|
|
* register to switch the core to bypass mode if debug feature is enabled in
|
|
* the core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance to be
|
|
* worked on.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_EnableDbgByPass(XCresample *InstancePtr)
|
|
{
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET))) | (XCRE_CTL_BPE_MASK)));
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the current bypass mode settings from Control register
|
|
* of the Chroma Resampler core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance to be
|
|
* worked on.
|
|
*
|
|
* @return Core debug bypass mode.
|
|
* - TRUE = Bypass mode is enabled.
|
|
* - FALSE = Bypass mode is not enabled.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
int XCresample_IsDbgByPassEnabled(XCresample *InstancePtr)
|
|
{
|
|
u32 DbgByPass;
|
|
int Status;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
DbgByPass = (XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET))) & (XCRE_CTL_BPE_MASK);
|
|
if (DbgByPass == (XCRE_CTL_BPE_MASK)) {
|
|
Status = (TRUE);
|
|
}
|
|
else {
|
|
Status = (FALSE);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function disables bypass mode of the Chroma Resampler core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance to be
|
|
* worked on.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_DisableDbgBypass(XCresample *InstancePtr)
|
|
{
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET))) & (~(XCRE_CTL_BPE_MASK))));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function enables the test-pattern mode if debug feature is enabled
|
|
* by setting test-pattern bit of the Control register of the Chroma Resampler
|
|
* core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance to be
|
|
* worked on.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_EnableDbgTestPattern(XCresample *InstancePtr)
|
|
{
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET))) | (XCRE_CTL_TPE_MASK)));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the test-pattern mode (enabled or not) from Control
|
|
* register of the Chroma Resampler core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance to
|
|
* be worked on.
|
|
*
|
|
* @return Test-pattern generator mode.
|
|
* - TRUE = Test-pattern mode is enabled.
|
|
* - FALSE = Test-pattern mode is not enabled.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
*****************************************************************************/
|
|
int XCresample_IsDbgTestPatternEnabled(XCresample *InstancePtr)
|
|
{
|
|
u32 DbgTestPattern;
|
|
int Status;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
DbgTestPattern = (XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET))) & (XCRE_CTL_TPE_MASK);
|
|
if (DbgTestPattern == (XCRE_CTL_TPE_MASK)) {
|
|
Status = (TRUE);
|
|
}
|
|
else {
|
|
Status = (FALSE);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function disables debug test pattern mode in Control register of the
|
|
* Chroma Resampler core, if Debug feature is enabled.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance to be
|
|
* worked on.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_DisableDbgTestPattern(XCresample *InstancePtr)
|
|
{
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_CONTROL_OFFSET))) & (~(XCRE_CTL_TPE_MASK))));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the version of the Chroma Resampler core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return Content of Version register is returned..
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
u32 XCresample_GetVersion(XCresample *InstancePtr)
|
|
|
|
{
|
|
u32 Data;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
|
|
Data = XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_VERSION_OFFSET));
|
|
|
|
return Data;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the number of frames processed since power-up or last
|
|
* time the core is reset.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return FrameCount is the number of frames processed since power-up.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
u32 XCresample_GetDbgFrameCount(XCresample *InstancePtr)
|
|
{
|
|
u32 FrameCount;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
/* Frame throughput monitor */
|
|
FrameCount = XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_SYSDEBUG0_OFFSET));
|
|
|
|
return FrameCount;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the number of lines processed since power-up or last
|
|
* time the core is reset.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return LineCount is the number of lines processed since power-up.
|
|
*
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
u32 XCresample_GetDbgLineCount(XCresample *InstancePtr)
|
|
{
|
|
u32 LineCount;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
/* Line throughput monitor */
|
|
LineCount = XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_SYSDEBUG1_OFFSET));
|
|
|
|
return LineCount;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the number of pixels processed since power-up or last
|
|
* time the core is reset.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return PixelCount is the number of pixels processed since power-up.
|
|
|
|
* @note Debug functionality should be enabled.
|
|
*
|
|
******************************************************************************/
|
|
u32 XCresample_GetDbgPixelCount(XCresample *InstancePtr)
|
|
{
|
|
u32 PixelCount;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
Xil_AssertNonvoid(InstancePtr->Config.HasDebug != (u16)0x0);
|
|
|
|
/* Pixel throughput monitor */
|
|
PixelCount = XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_SYSDEBUG2_OFFSET));
|
|
|
|
return PixelCount;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function sets the active H/V sizes in the Active Size register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param HSize specifies the number of Active Pixels per Scan Line
|
|
* that needs to be set (Range is 32 to 7680).
|
|
* @param VSize specifies the number of Active Lines per Frame that
|
|
* needs to be set (Range is 32 to 7680).
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_SetActiveSize(XCresample *InstancePtr, u16 HSize, u16 VSize)
|
|
{
|
|
u32 Size;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid((VSize >= (u16)(XCRE_ACT_SIZE_FIRST)) &&
|
|
(VSize <= (u16)(XCRE_ACT_SIZE_LAST)));
|
|
Xil_AssertVoid((HSize >= (u16)(XCRE_ACT_SIZE_FIRST)) &&
|
|
(HSize <= (u16)(XCRE_ACT_SIZE_LAST)));
|
|
|
|
Size = (((u32)VSize) << ((u32)(XCRE_ACTSIZE_NUM_LINE_SHIFT))) |
|
|
(HSize);
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ACTIVE_SIZE_OFFSET), Size);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function gets the number of Active Pixels per Scan line and number of
|
|
* Active Lines per Frame from the Active Size register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param HSize is a pointer to 16-bit variable in which the number of
|
|
* Active Pixels per Scan Line is returned (Range is 32 to 7680).
|
|
* @param VSize is a pointer to 16-bit variable in which the number of
|
|
* Active Lines per Frame is returned (Range is 32 to 7680).
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_GetActiveSize(XCresample *InstancePtr, u16 *HSize, u16 *VSize)
|
|
{
|
|
u32 Data;
|
|
/* Verify arguments*/
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(HSize != NULL);
|
|
Xil_AssertVoid(VSize != NULL);
|
|
|
|
Data = XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ACTIVE_SIZE_OFFSET));
|
|
|
|
/* Number of active pixels per scan line */
|
|
*HSize = (u16)(Data & (XCRE_ACTSIZE_NUM_PIXEL_MASK));
|
|
|
|
/* Number of active lines per frame */
|
|
*VSize = (u16)((Data & (XCRE_ACTSIZE_NUM_LINE_MASK)) >>
|
|
(XCRE_ACTSIZE_NUM_LINE_SHIFT));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This functions sets the field parity value of the Chroma Resampler core in
|
|
* the Encoding register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param FieldParity specifies the parity value which needs to be
|
|
* set.(0 or 1).
|
|
* - 0 - for even or bottom field.
|
|
* - 1 - for odd or top field.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note To this feature need to use interlaced video.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_SetFieldParity(XCresample *InstancePtr, u8 FieldParity)
|
|
{
|
|
/* Verify arguments*/
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.Interlaced == 1);
|
|
Xil_AssertVoid((FieldParity == (XCRE_PARITY_ODD)) ||
|
|
(FieldParity == (XCRE_PARITY_EVEN)));
|
|
|
|
/* Checking the type of field parity */
|
|
if ((FieldParity) == (XCRE_PARITY_ODD)) {
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET))) |
|
|
((u32)(XCRE_ENCODING_FIELD_MASK))));
|
|
}
|
|
if ((FieldParity) == (XCRE_PARITY_EVEN)) {
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET))) &
|
|
((u32)(~(XCRE_ENCODING_FIELD_MASK)))));
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the field parity value of the Chroma Resampler core
|
|
* from Encoding register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return Field parity value is returned.
|
|
* 0 - for even or bottom field.
|
|
* 1 - for odd or top field.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
u8 XCresample_GetFieldParity(XCresample *InstancePtr)
|
|
{
|
|
u32 Data;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
|
|
Data = ((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET))) & (XCRE_ENCODING_FIELD_MASK)) >>
|
|
(XCRE_ENCODING_FIELD_SHIFT);
|
|
|
|
return (u8)Data;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This functions sets the Chroma parity value of the Chroma Resampler core in
|
|
* the Encoding register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param ChromaParity specifies the parity value which needs to be
|
|
* set.(0 or 1).
|
|
* - 0 - Chroma information on Odd or First line.
|
|
* - 1 - Chroma information on Even lines.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_SetChromaParity(XCresample *InstancePtr, u8 ChromaParity)
|
|
{
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid((ChromaParity == (XCRE_PARITY_ODD)) ||
|
|
(ChromaParity == (XCRE_PARITY_EVEN)));
|
|
|
|
/* Checking type of ChromaParity value */
|
|
if ((ChromaParity) == (XCRE_PARITY_ODD)) {
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET),
|
|
((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET))) |
|
|
((u32)(XCRE_ENCODING_CHROMA_MASK))));
|
|
}
|
|
if ((ChromaParity) == (XCRE_PARITY_EVEN)) {
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET),
|
|
(XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET)) &
|
|
(u32)(~(XCRE_ENCODING_CHROMA_MASK))));
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function returns the value of chroma parity of the Chroma Resampler core
|
|
* from Encoding register.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return Chroma parity value is returned.
|
|
* - 0 - Chroma information on Odd or First line.
|
|
* - 1 - Chroma information on Even lines.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
u8 XCresample_GetChromaParity(XCresample *InstancePtr)
|
|
{
|
|
u32 Data;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertNonvoid(InstancePtr != NULL);
|
|
|
|
Data = ((XCresample_ReadReg(InstancePtr->Config.BaseAddress,
|
|
(XCRE_ENCODING_OFFSET))) & (XCRE_ENCODING_CHROMA_MASK)) >>
|
|
(XCRE_ENCODING_CHROMA_SHIFT);
|
|
|
|
return (u8)Data;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function sets the horizontal coefficient values of the Chroma Resampler
|
|
* core for phase 0 or phase 1 or both phases.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param Coeff is a pointer to the structure XHorizontal_Coeffs which
|
|
* has horizontal coefficients of both phases (Phase 0 and Phase 1)
|
|
* which needs to be set.
|
|
* Range of coefficient values is [-2, 2).
|
|
* @param Phases specifies number of phases needs to be set.
|
|
* - 0 - Phase 0.
|
|
* - 1 - Phase 1.
|
|
* - 2 - Phase 0 and Phase 1.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note For pre defined fixed coefficients filter values, ConvertType
|
|
* should be set with 1.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_SetHCoefs(XCresample *InstancePtr, XHorizontal_Coeffs *Coeff,
|
|
u32 Phases)
|
|
{
|
|
u32 Index1;
|
|
u32 Index2;
|
|
u32 Offset;
|
|
s32 Data;
|
|
float Value;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(Coeff != NULL);
|
|
Xil_AssertVoid(Phases <= XCRE_NUM_OF_PHASES);
|
|
Xil_AssertVoid(InstancePtr->Config.ConvertType == 1);
|
|
|
|
XCresample_Clear_HCoef_Values(InstancePtr);
|
|
if ((Phases == 0) || (Phases == 2)) {
|
|
Offset = XCRE_COEF00_HPHASE0_OFFSET;
|
|
Index1 = 0;
|
|
}
|
|
if (Phases == 1) {
|
|
Offset = XCRE_COEF00_HPHASE1_OFFSET;
|
|
Index1 = 1;
|
|
}
|
|
/* Setting horizontal coefficients based on number of Phases */
|
|
do {
|
|
for (Index2 = (u32)0x0;
|
|
Index2 < (InstancePtr->Config.NumHTaps); Index2++) {
|
|
Value = Coeff->HCoeff[Index1][Index2];
|
|
Data = XCresample_FloatToFixedConv(Value);
|
|
Data = Data & (XCRE_COEFF_MASK);
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
Offset, Data);
|
|
Offset = Offset + (XCRE_OFFSET_DIFF);
|
|
}
|
|
Index1 = 2;
|
|
if (((Phases == 1) || (Phases == 2)) && (Index1 == 0)) {
|
|
Offset = XCRE_COEF00_HPHASE1_OFFSET;
|
|
Index1 = 1;
|
|
}
|
|
}while (Index1 < XCRE_NUM_OF_PHASES);
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function gets the coefficient values from all the Horizontal Coefficient
|
|
* registers of phase0 and phase1 of the Chroma Resampler core.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param Coeff is a pointer to the structure XHorizontal_Coeffs which
|
|
* has horizontal coefficients of both phases.(Phase 0 and Phase 1)
|
|
* in which coefficients are updated.
|
|
* Range of coefficient values is [-2, 2).
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note For pre defined fixed coefficients filter values, ConvertType
|
|
* should be set with 1.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_GetHCoefs(XCresample *InstancePtr, XHorizontal_Coeffs *Coeff)
|
|
{
|
|
u32 Index1;
|
|
u32 Index2;
|
|
u32 Offset;
|
|
s32 Data;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(Coeff != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.ConvertType == 1);
|
|
|
|
Offset = (u32)(XCRE_COEF00_HPHASE0_OFFSET);
|
|
|
|
/*
|
|
* Getting coefficient values from all Horizontal Coefficient
|
|
* registers
|
|
*/
|
|
for (Index1 = (u32)0x0; Index1 < (XCRE_NUM_OF_PHASES); Index1++) {
|
|
for (Index2 = (u32)0x0; Index2 < (XCRE_NUM_HCOEFS);
|
|
Index2++ ) {
|
|
Data =
|
|
(s32)(XCresample_ReadReg(
|
|
InstancePtr->Config.BaseAddress, Offset));
|
|
Coeff->HCoeff[Index1][Index2] =
|
|
XCresample_FixedToFloatConv(Data);
|
|
Offset = Offset + (XCRE_OFFSET_DIFF);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function sets the vertical coefficient values of the Chroma Resampler
|
|
* for phase 0 or for phase 1 or for both phases.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param Coeff is a pointer to the structure XHorizontal_Coeffs which
|
|
* has vertical coefficients of both phases (Phase 0 and Phase 1)
|
|
* which needs to be set.
|
|
* @param Phases specifies number of phases needs to be set.
|
|
* - 0 - Phase 0.
|
|
* - 1 - Phase 1.
|
|
* - 2 - Phase 0 and Phase 1.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note For pre defined fixed coefficients filter values, ConvertType
|
|
* should be set with 1.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_SetVCoefs(XCresample *InstancePtr, XVertical_Coeffs *Coeff,
|
|
u32 Phases)
|
|
{
|
|
u32 Index1;
|
|
u32 Index2;
|
|
u32 Offset;
|
|
s32 Data;
|
|
float Value;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(Coeff != NULL);
|
|
Xil_AssertVoid(Phases <= XCRE_NUM_OF_PHASES);
|
|
Xil_AssertVoid(InstancePtr->Config.ConvertType == 1);
|
|
|
|
XCresample_Clear_VCoef_Values(InstancePtr);
|
|
|
|
/*
|
|
* Setting coefficient values in all Vertical
|
|
* Coefficient registers
|
|
*/
|
|
|
|
if ((Phases == 0) || (Phases == 2)) {
|
|
Offset = XCRE_COEF00_VPHASE0_OFFSET;
|
|
Index1 = 0;
|
|
}
|
|
if (Phases == 1) {
|
|
Index1 = 1;
|
|
Offset = XCRE_COEF00_VPHASE1_OFFSET;
|
|
}
|
|
/* Setting Vertical Coefficients based on number of Phases */
|
|
do {
|
|
for (Index2 = (u32)0x0;
|
|
Index2 < (InstancePtr->Config.NumVTaps); Index2++) {
|
|
Value = Coeff->VCoeff[Index1][Index2];
|
|
Data = XCresample_FloatToFixedConv(Value);
|
|
Data = Data & (XCRE_COEFF_MASK);
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
Offset, Data);
|
|
Offset = Offset + (XCRE_OFFSET_DIFF);
|
|
}
|
|
Index1 = 2;
|
|
if (((Phases == 1) || (Phases == 2)) && (Index1 == 0)) {
|
|
Index1 = 1;
|
|
Offset = XCRE_COEF00_VPHASE1_OFFSET;
|
|
}
|
|
} while (Index1 < XCRE_NUM_OF_PHASES);
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function gets the vertical coefficient values of the Chroma Resampler
|
|
* core from all Vertical Coefficient registers of phase0 and phase1.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
* @param Coeff is a pointer to the structure XVertical_Coeffs which has
|
|
* vertical coefficients of both phases.(Phase 0 and Phase 1) in
|
|
* which coefficients are updated.
|
|
* Range of coefficient values is [-2, 2).
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note For pre defined fixed coefficients filter values, ConvertType
|
|
* should be set with 1.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_GetVCoefs(XCresample *InstancePtr, XVertical_Coeffs *Coeff)
|
|
{
|
|
u32 Index1;
|
|
u32 Index2;
|
|
u32 Offset;
|
|
s32 Data;
|
|
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
Xil_AssertVoid(Coeff != NULL);
|
|
Xil_AssertVoid(InstancePtr->Config.ConvertType == 1);
|
|
|
|
Offset = (u32)(XCRE_COEF00_VPHASE0_OFFSET);
|
|
|
|
/*
|
|
* Getting coefficient values from all Vertical
|
|
* Coefficient registers
|
|
*/
|
|
for (Index1 = (u32)0x0; Index1 < (XCRE_NUM_OF_PHASES); Index1++) {
|
|
for (Index2 = (u32)0x0; Index2 < (XCRE_NUM_VCOEFS);
|
|
Index2++) {
|
|
Data =
|
|
(s32)(XCresample_ReadReg(
|
|
InstancePtr->Config.BaseAddress,
|
|
Offset));
|
|
Coeff->VCoeff[Index1][Index2] =
|
|
XCresample_FixedToFloatConv(Data);
|
|
Offset = Offset + (XCRE_OFFSET_DIFF);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function clears all horizontal coefficients of the Chroma Resampler core
|
|
* which are previously set.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_Clear_HCoef_Values (XCresample *InstancePtr)
|
|
{
|
|
u32 Index1;
|
|
u32 Index2;
|
|
u32 Offset;
|
|
|
|
/* Verify argument. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
|
|
Offset = XCRE_COEF00_HPHASE0_OFFSET;
|
|
/* Set all horizontal coefficient values to 0 */
|
|
for (Index1 = 0; Index1 < XCRE_NUM_OF_PHASES; Index1++) {
|
|
for (Index2 = 0; Index2 < XCRE_NUM_HCOEFS; Index2++) {
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
Offset, 0x00);
|
|
Offset = Offset + XCRE_OFFSET_DIFF;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This function clears all vertical coefficients of a the Chroma Resampler
|
|
* which are previously set.
|
|
*
|
|
* @param InstancePtr is a pointer to the XCresample instance.
|
|
*
|
|
* @return None.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
void XCresample_Clear_VCoef_Values (XCresample *InstancePtr)
|
|
{
|
|
u32 Index1;
|
|
u32 Index2;
|
|
u32 Offset;
|
|
/* Verify arguments. */
|
|
Xil_AssertVoid(InstancePtr != NULL);
|
|
|
|
Offset = XCRE_COEF00_VPHASE0_OFFSET;
|
|
/* Set all vertical coefficient values to 0 */
|
|
for (Index1 = 0; Index1 < XCRE_NUM_OF_PHASES; Index1++) {
|
|
for (Index2 = 0; Index2 < XCRE_NUM_VCOEFS; Index2++) {
|
|
XCresample_WriteReg(InstancePtr->Config.BaseAddress,
|
|
Offset, 0x00);
|
|
Offset = Offset + XCRE_OFFSET_DIFF;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
* This function converts 18.14 fixed point format numbers to floating point
|
|
* numbers.
|
|
*
|
|
* @param Input is a 32-bit variable which should be given in 18.14 fixed
|
|
* point number.
|
|
*
|
|
* @return Value is returned after converting 18.14 to floating point.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
static float XCresample_FixedToFloatConv(u32 Input)
|
|
{
|
|
float Value;
|
|
u32 Sign;
|
|
Sign = 0;
|
|
|
|
if ((Input & XCRE_COEFF_MASK) == XCRE_COEF_SIGN_MASK) {
|
|
return (XCRE_COEF_FIRST);
|
|
}
|
|
if ((Input & XCRE_COEF_SIGN_MASK) != 0) {
|
|
Sign = 1;
|
|
Input = (Input << XCRE_COEFF_SIGN_SHIFT) >>
|
|
(XCRE_COEFF_SIGN_SHIFT);
|
|
Input = (~Input) + 1;
|
|
}
|
|
Value = (float)((Input & XCRE_COEF_DECI_MASK) >> XCRE_COEFF_SHIFT);
|
|
Value = Value +
|
|
((float)(Input & XCRE_COEFF_FRAC_MASK) /
|
|
(float)(1 << XCRE_COEFF_SHIFT));
|
|
if (Sign == 1) {
|
|
Value = (Value) * (float)(XCRE_SIGN_MUL);
|
|
}
|
|
|
|
return Value;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
* This function converts floating point numbers to 18.14 fixed point format.
|
|
*
|
|
* @param Input is a 32-bit variable which should be given in 18.14 fixed
|
|
* point number.
|
|
*
|
|
* @return Value is returned after converting 18.14 to floating point.
|
|
*
|
|
* @note None.
|
|
*
|
|
******************************************************************************/
|
|
static s32 XCresample_FloatToFixedConv(float Input)
|
|
{
|
|
s32 Value;
|
|
Value = (s32)(Input * (float)(1 << XCRE_COEFF_SHIFT));
|
|
if ((Value & XCRE_SIGNBIT_MASK) != 0) {
|
|
Value = XCRE_MAX_VALUE + Value + 1;
|
|
}
|
|
|
|
return Value;
|
|
}
|
|
/*****************************************************************************/
|
|
/**
|
|
*
|
|
* This routine is a stub for the asynchronous callbacks. The stub is here in
|
|
* case the upper layer forgot to set the handlers. On initialization, All
|
|
* handlers except error handler are set to this callback. It is considered as
|
|
* an error for this handler to be invoked.
|
|
*
|
|
* @param CallBackRef is a callback reference passed in by the upper
|
|
* layer when setting the callback functions, and passed back to
|
|
* the upper layer when the callback is invoked.
|
|
*
|
|
* @return None.
|
|
*
|
|
******************************************************************************/
|
|
static void StubCallBack(void *CallBackRef)
|
|
{
|
|
(void)CallBackRef;
|
|
/* Verify arguments. */
|
|
Xil_AssertVoidAlways();
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**
|
|
* This routine is a stub for the asynchronous error interrupt callback. The
|
|
* stub is here in case the upper layer forgot to set the handler. On
|
|
* initialization, Error interrupt handler is set to this callback.
|
|
*
|
|
* @param CallBackRef is a callback reference passed in by the upper
|
|
* layer when setting the callback functions, and passed back to
|
|
* the upper layer when the callback is invoked.
|
|
* @param ErrorMask is a bit mask indicating the cause of the error. Its
|
|
* value equals 'OR'ing one or more XCRE_IXR_* values defined
|
|
* in xcresample_hw.h.
|
|
*
|
|
* @return None.
|
|
*
|
|
******************************************************************************/
|
|
static void StubErrCallBack(void *CallBackRef, u32 ErrorMask)
|
|
{
|
|
(void)CallBackRef;
|
|
(void)ErrorMask;
|
|
/* Verify arguments. */
|
|
Xil_AssertVoidAlways();
|
|
}
|